Mentre leggevo questo , ho trovato il seguente exploit:
% 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)
Questo frammento mostra che possiamo facilmente eludere le autorizzazioni di esecuzione del filesystem come un normale utente senza privilegi. L'ho eseguito su un Ubuntu 12.04.
Mentre il caricatore di Linux è un oggetto condiviso secondo il file (1), ha anche un punto di ingresso che consente di eseguirlo direttamente. Se eseguito in questo modo, il caricatore di Linux funge da interprete per i binari ELF.
Sulla mia macchina OpenBSD, tuttavia, questo exploit non è efficace, perché non è possibile eseguire il caricatore come programma. La pagina del manuale di OpenBSD dice: "ld.so è esso stesso un oggetto condiviso inizialmente caricato dal kernel.".
Prova questo su Solaris 9 e otterrai un segfault. Non sono sicuro di cosa succede altrove.
Le mie domande sono quindi:
- Perché il caricatore di Linux (se eseguito direttamente) non controlla gli attributi del filesystem prima di interpretare un binario ELF?
- Perché implementare un meccanismo progettato non consente l'esecuzione di file, se è così banalmente evitato? Ho perso qualcosa?
libc
(l'ho fatto una volta, aggiornando una scatola Arch), sarai grato per questa piccola stranezza.