Detección de deserialización de YAML con Snyk Code
Calum Hutton
23 de febrero de 2023
0 minutos de lecturaRealicé una investigación para intentar identificar problemas de inyección de YAML en proyectos de código abierto con Snyk Code. Aunque la vulnerabilidad en sí no es nueva, el impacto potencial de la inyección de YAML es alto, por lo que resultó ser una buena candidata para la investigación. Esta investigación permitió descubrir varios problemas en proyectos de código abierto escritos en Python, PHP y Ruby. Este artículo se centra en el problema encontrado en geokit-rails versión 2.3.2, un complemento para Ruby on Rails
YAML
YAML es mucho más que un simple formato de intercambio de datos como JSON. La especificación describe varias funciones avanzadas que lo convierten en un buen candidato para investigar su seguridad, como las siguientes:
Etiquetas personalizadas (por ejemplo, PyYAML)
Anclas y alias
Atributos combinados
Flujos de varios documentos
YAML también se puede usar para serializar datos binarios y objetos arbitrarios en distintos lenguajes, lo que puede dar lugar a vulnerabilidades de deserialización. Estas vulnerabilidades son el objetivo de esta investigación, ya que su explotación suele permitir la ejecución remota de código (RCE).
Deserialización de YAML en Ruby
En Ruby, el análisis de YAML está integrado en el lenguaje, así que no se necesitan bibliotecas adicionales. Si una aplicación usa el analizador YAML integrado de Ruby, es vulnerable a ataques de deserialización si se usa YAML.load() o YAML.load_file() en lugar de YAML.safe_load() o YAML.safe_load_file(), respectivamente. El proyecto SafeYAML ofrece un analizador alternativo de YAML seguro de forma predeterminada.
El siguiente script y su salida muestran una forma insegura de cargar YAML con YAML.load().
La variable var contiene un hash simple de Ruby, y la variable yaml contiene el hash equivalente serializado en formato YAML. Ambas instrucciones puts muestran el mismo hash, porque la variable yaml se deserializó de una cadena YAML a un hash mediante YAML.load(). También es posible serializar y deserializar objetos más complejos de esta manera.
Durante las etapas iniciales de esta investigación, encontré un gadget universal de deserialización de YAML para Ruby que funcionaba en las versiones 2.x a 3.x de Ruby y que, al deserializarse, ejecutaba comandos arbitrarios.
La carga útil de YAML anterior ejecutará el comando id al deserializarse, si se analiza mediante YAML.load() o YAML.load_file().
Caso de estudio: geokit-rails (2.3.2)
La gema geokit-rails es un complemento para Ruby on Rails que proporciona servicios de ubicación a la aplicación. El complemento usa el método inseguro YAML.load() mediante el método retrieve_location_from_cookie_or_service() en geokit-rails/ip_geocode_lookup.rb:
Los datos que llegan al método inseguro YAML.load() provienen del parámetro cookies de Ruby on Rails, que contiene las cookies enviadas en la solicitud. Esto es una buena noticia para un atacante, ya que puede controlar directamente las cookies si crea la solicitud HTTP adecuada.
Prueba de concepto
Configuré una aplicación de Rails que ejecutaba el complemento geokit-rails (versión 2.3.2) en Ruby 3.0.0. Envié la siguiente solicitud HTTP a la aplicación para explotar el problema. Incluye la carga útil de YAML codificada en URL en la cookie geo_location.
En la aplicación de Rails, la carga útil se deserializó y ejecutó, y el comando id se ejecutó para demostrar que era posible ejecutar comandos.
En un sistema que use geokit-rails, un atacante que explotara esta vulnerabilidad podría iniciar una ejecución remota de código (RCE), lo que potencialmente le permitiría tomar el control total del sistema.
Corrección
Este problema se comunicó de manera responsable a la persona encargada del mantenimiento de geokit-rails y se corrigió en la versión 2.5.0 del software, reemplazando con JSON el YAML que contenía la información de coordenadas. A partir de esta investigación, se mejoraron y ampliaron las reglas de Snyk Code para detectar inyecciones de YAML, por lo que ahora deberían poder detectarse más de estos problemas en los proyectos de los usuarios.
Comienza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.


