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:
foo=() {
code
}
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)=>\'
- El analizador analizará
() { (a)=>\. Tenga en cuenta que \es parte de la cadena; se no escapa la cita única salida.
() {
- El analizador identifica esto como una definición de función.
(a)=
- Esto confunde al analizador hasta la muerte.
>\
- El analizador deja los dos últimos caracteres sentados en el búfer.
>\[NEWLINE]
- En algún momento antes de
shejecutar el comando, se coloca una nueva línea en el búfer.
>\[NEWLINE]echo date
- Cuando
shse llama (que probablemente sea un enlace simbólico para bash en este caso), agrega sus argumentos de comando echo datea los caracteres que ya existen en el búfer.
>echo date
- Como se escapa la nueva línea, bash analizará el búfer como
>echo date, lo que tiene el mismo efecto que date > echo. Se echocrea un archivo llamado y el stdout del datecomando se redirige a él.
; cat echo
- El segundo comando simplemente muestra el contenido del archivo recién creado.