Ataque de Deserialización Yaml (DES-Yaml); Explicación y PoC

    Un ataque de deserialización YAML (DES-YAML) es una vulnerabilidad que puede surgir en aplicaciones Python que utilizan YAML (Yet Another Markup Language) para convertir objetos en un formato que se pueda almacenar o transmitir y viceversa.

    Este problema de seguridad ocurre cuando un atacante logra manipular los datos YAML que son procesados por una función de deserialización en la aplicación. Si el código de la aplicación no verifica de manera adecuada la validez y la integridad de los datos YAML recibidos, existe la posibilidad de que el atacante pueda introducir código malicioso en el objeto que será deserializado.

    Una vez que el objeto se ha deserializado, cualquier código malicioso incluido en él puede ser ejecutado dentro del contexto de la aplicación. Esto podría permitir al atacante tomar el control del sistema, acceder a información sensible o incluso ejecutar código de forma remota.

    La deserialización YAML implica reconstruir objetos de Python a partir de los datos YAML. Si los datos YAML no son validados adecuadamente por la aplicación antes de este proceso, un atacante puede introducir código malicioso en los objetos deserializados. Este código malicioso puede ejecutarse en el contexto de la aplicación una vez que se completa la deserialización.

    El impacto de un ataque de deserialización YAML puede ser grave y variado. Desde la ejecución de código arbitrario dentro de la aplicación hasta la toma completa del control del sistema, dependiendo de la naturaleza del código malicioso y los privilegios de la aplicación.

    Para mitigar estos riesgos, es esencial implementar medidas de seguridad sólidas. Esto incluye validar y filtrar cuidadosamente los datos YAML antes de deserializarlos, evitando la deserialización automática de objetos no confiables y aplicando técnicas de mitigación de riesgos como la limitación de recursos para prevenir ataques de denegación de servicio (DoS).

    Además, la conciencia sobre la seguridad en el desarrollo de software y el seguimiento de buenas prácticas son fundamentales. Los desarrolladores deben estar al tanto de los riesgos asociados con la deserialización YAML y utilizar bibliotecas y marcos de trabajo que implementen medidas de seguridad robustas en este proceso. La capacitación y la concientización sobre la seguridad son cruciales para abordar estos riesgos de manera efectiva en el desarrollo de aplicaciones Python.



PoC
    
    Esta aplicación está utilizando un objeto serializado yaml para mostrar el contenido en el HTML. Como podemos ver la cadena codificada base64 indica la carga como parte de la URL.


    Vemos una cadena en base64 en la url, si la decodeamos;


    La aplicación funciona cargando la cadena codificada Base64 para ser procesada por la aplicación y usar YAML para analizar el valor de la clave para mostrar el contenido en la aplicación.

    Si le echamos un vistazo al código, vemos que el parámetro de la cadena de consulta de entrada se utiliza para leer el valor de entrada, pero está bajo el control de los usuarios, por lo que confía en la entrada del usuario ;


    Si nosotros como atacantes creamos una cadena y a encodeamos en base64;


La pegamos en el buscador vemos como la decodifica y la carga sin ningun tipo de sanitización;


    Las  inyecciones de YAML en Python es posible al invocar un subproceso que nos permitirá ejecutar comandos.

    Vamos a crearnos un archivo con la siguiente estructura;


    Este fragemento de YAML es una forma ed serializar(representar en un formato legible para la maquima), y utiliza la llamada a la funcion  "subprocess.check_output" para ejecutar el comando "id";


    Vemos como hemos sido capaz de inyectar comandos a través del objeto YAML, y a iniciado el subproceso para ejecutar el comando "id".



Os dejo el video explicativo en mi canal de YouTube



No hay comentarios:

Publicar un comentario