¿Seguro YAML parser?

8

Recientemente leí que YAML no estaba " diseñado para manejar comentarios de usuarios maliciosos ", porque una entrada YAML maliciosa "puede crear instancias de todas las clases definidas en la aplicación Rails dirigida". Wikipedia también explica que

  

YAML permite etiquetas específicas del idioma para que un analizador que admita esas etiquetas pueda crear objetos locales arbitrarios. Cualquier analizador YAML que permita la ejecución sofisticada de instancias de objetos abre el potencial de un ataque de inyección.

En consecuencia, parece que es potencialmente inseguro analizar entradas no confiables utilizando algunos analizadores YAML.

¿Puede alguien explicar cómo analizar de forma segura la entrada YAML no confiable, en Rails, Python y Perl? ¿Hay bibliotecas de análisis de YAML que sean seguras o formas de invocarlas que garanticen que son seguras incluso si la entrada proviene de una fuente no confiable?

    
pregunta D.W. 09.01.2013 - 07:04
fuente

2 respuestas

6

Justo ahí, en ese mismo artículo de Wikipedia, está la respuesta que estás buscando:

  

Tenga en cuenta que la capacidad de construir un objeto de Python arbitrario puede ser peligrosa si recibe un documento YAML de una fuente no confiable, como Internet. La función yaml.safe_load limita esta capacidad a objetos Python simples como enteros o listas.

( énfasis añadido )

La especificación YAML permite la serialización y deserialización de total fidelidad de estructuras de datos arbitrarias , que incluye la capacidad de deserializar (y, por lo tanto, instanciar) cualquier objeto definido en la aplicación. Piense en ello como la rutina de serialización incorporada de python pickle , solo con una sintaxis diferente.

El método safe_load en PyYAML se creó específicamente para abordar el hecho de que esto es intrínsecamente desastroso y peligroso. Le permite deserializar solo a tipos universales simples orientados a datos que se sabe que no tienen efectos secundarios (es decir, número, cadena, lista, etc.).

En cuanto a las implementaciones en otros idiomas, pueden estar restringidas (es decir, "seguras") de forma predeterminada, o pueden no estar restringidas de forma predeterminada. Tendrías que consultar la documentación asociada. Solo sé sobre la implementación de Python.

    
respondido por el tylerl 09.01.2013 - 08:16
fuente
6

Desafortunadamente, no hay un modo seguro incorporado para Ruby. Escribí la gema SafeYAML para tapar este agujero por ahora; y hay una discusión en curso sobre cómo agregar esta funcionalidad a Psych, el motor de análisis de YAML de Ruby a partir de 1.9.2 .

Por ahora, si eres un desarrollador de aplicaciones de Ruby, es probable que tu mejor apuesta sea usar SafeYAML o encontrar una biblioteca similar que se adapte a tus necesidades.

    
respondido por el Dan Tao 31.01.2013 - 16:44
fuente

Lea otras preguntas en las etiquetas