Ao ler isso , encontrei a seguinte exploração:
% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
Esse trecho mostra que podemos evitar trivialmente as permissões de execução do sistema de arquivos como um usuário normal sem privilégios. Eu executei isso em um Ubuntu 12.04.
Embora o carregador do Linux seja um objeto compartilhado de acordo com o arquivo (1), ele também possui um ponto de entrada que permite sua execução direta. Quando executado dessa maneira, o carregador do Linux atua como um intérprete para os binários ELF.
Na minha máquina OpenBSD, no entanto, essa exploração não é eficaz, porque você não pode executar o carregador como um programa. A página de manual do OpenBSD diz: "ld.so é um objeto compartilhado que é inicialmente carregado pelo kernel.".
Tente isso no Solaris 9, e você receberá um segfault. Não tenho certeza do que acontece em outros lugares.
Minhas perguntas são, portanto:
- Por que o carregador do Linux (quando executado diretamente) não verifica os atributos do sistema de arquivos antes de interpretar um binário ELF?
- Por que implementar um mecanismo projetado para impedir a execução de arquivos, se for tão trivialmente contornado? Perdi alguma coisa?
libc
(fiz uma vez, atualizando uma caixa do Arch), ficará agradecido por essa pequena peculiaridade.