Entiendo la prueba original para CVE-2014-6271, que fue:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Pero estoy confundido por la prueba actualizada y la salida correspondiente para CVE-2014-7169:
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
¿Podría alguien explicar brevemente lo que está sucediendo aquí y cómo omite el parche para CVE-2014-6271?
Respuestas:
He estado cavando por las webs un poco desde que publiqué esta pregunta por primera vez.
Según el descubridor original del error, bash antes del parche CVE-2014-6271 importó una función como:
reemplazando el signo igual con un espacio e interpretándolo ... lo que significaba que era posible interpretar más allá de la definición de la función.
El parche para CVE-2014-6271 introdujo un modo especial de la función parse_and_execute () para limitar la evaluación a la definición de la función, y no más allá.
Sin embargo, como se explica en este hilo , la variable de entorno especialmente diseñada de la prueba de vulnerabilidad CVE-2014-7169 está diseñada para 1) confundir el analizador a la muerte 2) dejar restos en el búfer 3) cambiar completamente lo que hace el comando bash original cuando se combina con los desechos que ya están en el búfer.
Entonces, para diseccionar la variable de entorno:
X='() { (a)=>\'
() { (a)=>\
. Tenga en cuenta que\
es parte de la cadena; se no escapa la cita única salida.() {
(a)=
>\
>\[NEWLINE]
sh
ejecutar el comando, se coloca una nueva línea en el búfer.>\[NEWLINE]echo date
sh
se llama (que probablemente sea un enlace simbólico para bash en este caso), agrega sus argumentos de comandoecho date
a los caracteres que ya existen en el búfer.>echo date
>echo date
, lo que tiene el mismo efecto quedate > echo
. Seecho
crea un archivo llamado y el stdout deldate
comando se redirige a él.; cat echo
fuente
No le da un resultado limpio, pero demuestra el error.
Sin errores, la variable de entorno
X
debe ignorarse, bash debe ejecutarseecho date
y cat debe quejarse de que no hay un archivo llamado echo. Por ejemplo, considere cómo se comporta el guión:No repetiré el resultado que muestra en su pregunta, y no pretendo entender cómo funciona, pero bash se está ejecutando
date
y coloca el resultado en un archivo llamado 'echo'. Puedes jugar con alternativas paradate
convencerte de que esto es útil y peligroso.fuente