CVE-2013-0333 (RoR json-> inserción objeto YAML) Análisis de Vulnerabilidad

original fecha: 01/29/2013

Datos básicos

CVE: CVE-2013-0333
Afecta: Ruby on Rails
Versiones afectadas: 2.3.x, 3.0.x
no afectada : 3.1.x, 3.2.x, las aplicaciones que utilizan la gema yajl
Versiones fijas:. 3.0.20, 2.3.16
Asesor: https://groups.google.com/forum/?fromgroups = #! topic/rubyonrails-security/1h2DR63ViGo

Detalles Técnicos

Ruby on ActiveSupport de Rail :: JSON incluye varios diferentes bibliotecas de análisis de JSON. Uno de estos programas de análisis permite la conversión de JSON a YAML, que es el backend de manera predeterminada. El código fuente afectada en yaml.rb implica analizar directamente el usuario de entrada JSON en el analizador YAML (ejemplo 1)

Ejemplo 1 (2.3.8):.
ActiveSupport # archivo / lib / active_support / json / backend / yaml.rb, línea 11
11: decodificar def (JSON)
12: YAML.load (convert_json_to_yaml (JSON))

13: ; rescate ArgumentError => e
14: aumentar ParseError,
15: ; final

Ejemplo 1 (3.0.9):
# Archivo ActiveSupport / lib / active_support / json / backend / YAML. rb, línea 18
18: decodificar def (JSON)
19: si json.respond_to (?: leer)
20: json = json.read
21: end
22: YAML.load (convert_json_to_yaml (JSON))
23: Rescate * EXCEPCIONES => e
24: aumentar ParseError, «Invalid string JSON: ‘% s'»% json
25: termina

Como la línea en negrita nos muestra, el JSON controlada por el usuario arbitrario se convierte en YAML con sólo conversión símbolo JSON-> YAML. Eso significa que no hay validación de que el JSON es válido y no se filtra aparte de las conversiones básicas JSON-> YAML. Esto permite a un atacante crear una petición POST con los datos para manipular el analizador YAML para permitir la ejecución remota de código.

El exploit público es muy sencillo de utilizar. Se crea una petición POST con una cadena de ataque construido como:

[code]
escaped_payload = «foo nend n # {carga} n__END__ n . «
encoded_payload = escaped_payload.to_yaml.sub (‘—‘,») chomp
YAML =% {
— ruby ​​/ picadillo: ActionController :: Routing :: RouteSet :: NamedRouteCollection /> : ruby ​​/ struct impagos /> : acción: crear
: Controlador: foos
required_parts: []
Requisitos:
: la acción: crear
: Controlador: foos
segment_keys:
– Formato

} despojar encoded_yaml = yaml.gsub (‘:’, ‘. u003a ‘)
[/code]

El código de explotación es la parte más interesante de todo esto. Tienes que tener JSON que sobrevive a la conversión semi-YAML (como el 🙂 y que todavía permiten la ejecución de código

rubí / almohadilla:.! permite una clase arbitraria para ser utilizado con cualquier parámetros. Aquí vemos la ActionController :: Routing :: RouteSet :: NamedRouteCollection de clase que se utiliza. Esta clase sigue una cadena de llamadas bastante largo hasta que llega al module_eval La función que permite a nuestro ejecución de código arbitrario. Antes de eso, tenemos que asegurarnos de que podemos llegar a la module_eval La función, que requiere la satisfacción de las llamadas anteriores. Para ello existe una configuración de estructura con ! Rubí / struct que satisface la clase de ruta. Por último, ciertas cosas deben ser modificados para sobrevivir a la JSON para conversiones YAML. El __END__ se usa para tratar el resto de la entrada como de datos en línea. A continuación, los dos puntos se convierten en diferentes equivalentes de codificación. La conversión de los dos puntos son diferentes para las distintas versiones de rubí. Tienes% 3a, x3a y u003a.

Existen exploits públicos aquí https://gist.github.com/4660248 y esta prueba de concepto ya se ha convertido en un módulo de Metasploit. Un parche ha sido la liberación de las versiones afectadas. Para evitar que usted las futuras vulnerabilidades YAML sería recomendable que cambie a la gema safe_YAML.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *