Eu tenho andado por aí um pouco desde que publiquei esta pergunta pela primeira vez.
De acordo com o descobridor original do bug, o bash antes do patch CVE-2014-6271 importou uma função como:
foo=() {
code
}
substituindo o sinal de igual por um espaço e interpretando-o ... o que significa que a interpretação além da definição da função era possível.
O patch para CVE-2014-6271 introduziu um modo especial da função parse_and_execute () para limitar a avaliação à definição da função, e não além dela.
No entanto, conforme explicado em este tópico , a variável de ambiente especialmente criada da vulnerabilidade CVE-2014-7169 teste é projetado para 1) confundir o analisador até a morte 2) deixar recados no buffer 3) mudar completamente o que o comando bash original faz quando combina com os recados que já estão no buffer.
Então, para dissecar a variável de ambiente:
X='() { (a)=>\'
- O analisador analisará
() { (a)=>\
. Note que\
faz parte da string; é não escapando da simples citação.
() {
- O analisador identifica isso como uma definição de função.
(a)=
- Isso confunde o analisador até a morte.
>\
- O analisador deixa os dois últimos caracteres no buffer.
>\[NEWLINE]
- Em algum momento antes da execução do comando
sh
, uma nova linha é colocada no buffer.
>\[NEWLINE]echo date
- Quando
sh
é chamado (o que é provavelmente um link simbólico para bash nesse caso), ele adiciona seus argumentos de comando,echo date
, aos caracteres já existentes no buffer.
>echo date
- Como a nova linha é escapada, o bash analisará o buffer como
>echo date
, que tem o mesmo efeito quedate > echo
. Um arquivo chamadoecho
é criado e o stdout do comandodate
é redirecionado para ele.
; cat echo
- O segundo comando simplesmente exibe o conteúdo do arquivo recém-criado.