TensorFlow, un popular proyecto de aprendizaje automático e inteligencia artificial basado en Python desarrollado por Google, ha dejado de admitir YAML para parchear una vulnerabilidad crítica de ejecución de código.
YAML u Yet Another Markup Language es una opción conveniente entre los desarrolladores que buscan un lenguaje de serialización de datos legible por humanos para manejar archivos de configuración y datos en tránsito.
Vulnerabilidad de deserialización no confiable en TensorFlow
Los encargados de mantenimiento detrás de TensorFlow y Keras, un proyecto contenedor para TensorFlow, han parcheado una vulnerabilidad de deserialización que no es de confianza y que surgió de un análisis no seguro de YAML.
Rastreada como CVE-2021-37678, la falla crítica permite a los atacantes ejecutar código arbitrario cuando una aplicación deserializa un modelo de Keras proporcionado en el formato YAML.
Las vulnerabilidades de deserialización suelen ocurrir cuando una aplicación lee datos mal formados o maliciosos que se originan en fuentes no auténticas.
Después de que una aplicación lee y deserializa los datos, puede bloquearse y provocar una condición de denegación de servicio (DoS) o, peor aún, ejecutar el código arbitrario del atacante.
El investigador de seguridad Arjun Shibu informó responsablemente a los mantenedores de TensorFlow de esta vulnerabilidad de deserialización de YAML, calificada con una gravedad de 9.3 .
¿Y la fuente de la falla, preguntas? La notoria función «yaml.unsafe_load ()» en el código de TensorFlow:
Se sabe que la función «unsafe_load» deserializa los datos YAML de manera bastante liberal: resuelve todas las etiquetas , «incluso aquellas que se sabe que no son seguras en entradas que no son de confianza».
Esto significa que, idealmente, «unsafe_load» solo debería invocarse en una entrada que provenga de una fuente confiable y se sepa que está libre de cualquier contenido malicioso.
Si ese no fuera el caso, los atacantes pueden aprovechar el mecanismo de deserialización para ejecutar el código de su elección inyectando una carga útil maliciosa en los datos YAML que aún no se han serializado.
Un ejemplo de exploit de prueba de concepto (PoC) compartido en la vulnerabilidad aviso de demuestra precisamente esto:
de modelos de importación de tensorflow.keras carga útil = '' ' !! python / objeto / nuevo: tipo args: ['z', !! python / tuple [], {'extender': !! python / name: exec}] listitems: "__import __ ('os'). system ('cat / etc / passwd')" '' ' models.model_from_yaml (carga útil)
TensorFlow elimina YAML por completo a favor de JSON
Después de que se informó de la vulnerabilidad, TensorFlow decidió eliminar por completo la compatibilidad con YAML y usar la deserialización JSON en su lugar.
«Dado que el soporte del formato YAML requiere una cantidad significativa de trabajo, lo hemos eliminado por ahora», dicen los mantenedores del proyecto en el mismo aviso.
«Los métodos` Model.to_yaml () `y` keras.models.model_from_yaml` han sido reemplazados para generar un `RuntimeError`, ya que se puede abusar de ellos para provocar la ejecución de código arbitrario,» también explican las notas de la versión asociadas con la corrección .
«Se recomienda utilizar la serialización JSON en lugar de YAML o, una mejor alternativa, serializar a H5».
Vale la pena señalar que TensorFlow no es el primer ni el único proyecto que utiliza unsafe_load de YAML . El uso de la función es bastante frecuente en proyectos de Python.
GitHub muestra miles de resultados de búsqueda que hacen referencia a la función, y algunos desarrolladores proponen mejoras:
Se espera que la corrección para CVE-2021-37678 llegue a la versión 2.6.0 de TensorFlow y también se incorporará a las versiones anteriores 2.5.1, 2.4.3 y 2.3.4, afirman los mantenedores.
Fuente: www.bleepingcomputer.com