Eu suspeito que um ataque como este funcionaria, onde «algo» é um módulo do kernel que tentará carregar após a montagem do rootfs:
$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko
Observe também que você pode usar outros nomes, dependendo dos aliases declarados no módulo. Suponho que ele não será carregado até que o depmod seja executado, o que acontecerá na próxima vez que houver uma atualização do kernel - portanto mkdir
, nem será exibido recentemente no log do sudo.
Existem muitas coisas no / etc que lêem todos os arquivos em um diretório, às vezes recursivamente. Pior ainda, alguns desses diretórios não existem por padrão, e a única maneira de conhecê-los é ler a página de manual, scripts de inicialização etc. para o programa que os utiliza. Alguns, ainda pior, são itens obsoletos de compatibilidade com versões anteriores e podem nem ser mais documentados.
edit: Pensado em mais alguns diretórios, estes em /usr/local
:
/usr/local/lib/perl/5.14.2
(difere dependendo da versão do Perl, tente perl -V
descobrir). Crie um File
subdiretório lá e coloque um Find.pm
nele. Agora, sempre que alguém usar File::Find
, estará usando a versão do atacante. Da mesma forma, faça o mesmo com Getopt::Long
. Os utilitários do sistema geralmente são escritos em Perl, portanto, isso provavelmente gera raiz. (Tente ack-grep --color -a 'use.+::' /usr/sbin | less -R
)
- Eu acho que Python, Ruby, etc. têm diretórios semelhantes. Os utilitários de sistema também são escritos em Python.
- Subverter muitas coisas que alguém compila com subdiretórios de
/usr/local/include
.