Entendo o teste original do CVE-2014-6271, que foi:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Mas estou confuso com o teste atualizado e a saída correspondente 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
Alguém poderia explicar brevemente o que está acontecendo aqui e como ele ignora o patch do CVE-2014-6271?
Respostas:
Venho pesquisando um pouco na Web desde que postei essa pergunta pela primeira vez.
De acordo com o descobridor original do bug, o bash anterior ao patch CVE-2014-6271 importou uma função como:
substituindo o sinal de igual por um espaço e interpretando-o ... o que significava que era possível interpretar além da definição da função.
O patch para o 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 neste encadeamento , a variável de ambiente especialmente criada do teste de vulnerabilidade CVE-2014-7169 foi projetada para 1) confundir o analisador até a morte 2) deixar restos no buffer 3) alterar completamente o que o comando bash original faz quando combina com as sobras já existentes no buffer.
Então, para dissecar a variável de ambiente:
X='() { (a)=>\'
() { (a)=>\
. Observe que\
faz parte da string; que é não escapando a cotação única fuga.() {
(a)=
>\
>\[NEWLINE]
sh
execução do comando, uma nova linha é colocada no buffer.>\[NEWLINE]echo date
sh
é chamado (que provavelmente é um link simbólico para bash neste caso), ele adiciona seus argumentos de comando,,echo date
aos caracteres já existentes no buffer.>echo date
>echo date
, que tem o mesmo efeito quedate > echo
. Um arquivo chamadoecho
é criado e o stdout dodate
comando é redirecionado para ele.; cat echo
fonte
Ele não fornece uma boa saída limpa, mas demonstra o erro.
Sem erros, a variável de ambiente
X
deve ser ignorada, o bash deve ser executadoecho date
e o gato deve reclamar que não há arquivo chamado eco. Por exemplo, considere como o traço se comporta:Não repetirei a saída que você mostra na sua pergunta e não pretendo entender como ela funciona, mas o bash está sendo executado
date
e colocando a saída em um arquivo chamado 'eco'. Você pode brincar com alternativas paradate
se convencer de que isso é utilizável e perigoso.fonte