A preocupação de segurança é que, se um bash for iniciado com um conjunto de variáveis de ambiente malicioso, esse bash executará o código na variável.
Por exemplo, digamos que você tenha um servidor da Web que chame /bin/foo bar
. Vamos dizer que este aplicativo foo
também usa uma variável de ambiente chamada baz
, e o valor dessa variável vem da entrada fornecida pelo usuário. Portanto, o aplicativo do servidor da web define o ambiente e, em seguida, concede a saída para foo bar
. Bem, quando bash
ler as variáveis de ambiente, se essa variável fornecida tiver código malicioso, bash
executará a variável.
Normalmente isso não é uma preocupação. Variáveis de ambiente devem ser completamente seguras. Se o aplicativo que usa essa variável se comportar mal, isso é outra questão. Mas bash
não usa a variável baz
na situação acima.
Por exemplo:
testscript.sh
export BAZ='() { :;}; echo MALICIOUS CODE'
echo starting sleep
/bin/bash -c 'sleep 1'
Ao executá-lo, obtemos o seguinte
$ /bin/dash testscript.sh
starting sleep
MALICIOUS CODE
Então, simplesmente tendo esse conjunto de variáveis, podemos obter o bash para executar código arbitrário.
Aqui está outro exemplo que não usa shell explícito e não faz menção ao bash:
$ perl -e '$ENV{"BAZ"}="() { :;}; echo MALICIOUS CODE"; print("starting sleep\n"); system("/bin/sleep 1;");'
starting sleep
MALICIOUS CODE
(para que isso funcione, /bin/sh
precisa ser bash)