Pular para o conteúdo
Todos os conceitos

Função escondida numa variável de ambiente

O Bash antigo importava funções de variáveis de ambiente e executava o que vinha depois delas.

Uma variável de ambiente é um par nome e valor que um processo passa aos processos que ele inicia. O Bash tinha um recurso para exportar funções por ambiente: um valor como () { ... } virava uma função no shell filho.

No Shellshock (CVE-2014-6271), o bug era não parar na chave } de fechamento. Um valor como () { :; }; echo oi definia uma função vazia e, logo em seguida, executava echo oi ao iniciar o shell. Servidores web com CGI copiam cabeçalhos do pedido para variáveis de ambiente (User-Agent vira HTTP_USER_AGENT), então um cabeçalho com essa forma rodava comando no servidor.

O conserto passou a importar função só quando o NOME da variável tem um envelope especial (BASH_FUNC_x%%) e a nunca executar o que vem depois do corpo. A lição: dado de fora nunca deve alcançar um interpretador de comandos.

cabecalho User-Agent -> vira variavel de ambiente HTTP_USER_AGENT= () { :; } ; echo cgi-shell-open funcao vazia (a isca) depois do } (o ataque) Bash antigo define a funcao e ainda roda o comando depois do }
Um cabeçalho vira a variável HTTP_USER_AGENT com () { :; }; echo ...; o Bash antigo define a função e ainda roda o comando depois do }.

Aparece nestes desafios