Podczas czytania tego znalazłem następujący 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)
Ten fragment pokazuje, że możemy w trywialny sposób ominąć uprawnienia systemu plików do wykonywania jako normalny nieuprzywilejowany użytkownik. Uruchomiłem to na Ubuntu 12.04.
Podczas gdy moduł ładujący Linux jest obiektem współdzielonym zgodnie z plikiem (1), ma również punkt wejścia, który pozwala na jego bezpośrednie wykonanie. Po wykonaniu w ten sposób moduł ładujący systemu Linux działa jako interpreter dla plików binarnych ELF.
Jednak na moim komputerze OpenBSD ten exploit nie jest skuteczny, ponieważ nie możesz uruchomić programu ładującego jako programu. Strona podręcznika OpenBSD mówi: „Sam ld.so jest współdzielonym obiektem, który jest początkowo ładowany przez jądro.”.
Wypróbuj to na Solaris 9, a otrzymasz awarię. Nie jestem pewien, co dzieje się gdzie indziej.
Moje pytania są zatem:
- Dlaczego moduł ładujący systemu Linux (gdy jest wykonywany bezpośrednio) nie sprawdza atrybutów systemu plików przed interpretacją pliku binarnego ELF?
- Po co wdrażać mechanizm, który ma uniemożliwiać wykonywanie plików, jeśli jest tak trywialnie odsunięty? Czy coś przeoczyłem?
libc
(raz zrobiłem, uaktualniając Arch Archa), będziesz wdzięczny za to małe dziwactwo.