Читая это , я обнаружил следующий эксплойт:
% 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)
Этот фрагмент показывает, что мы можем тривиально обойти разрешения на выполнение файловой системы как обычный непривилегированный пользователь. Я запустил это на Ubuntu 12.04.
Хотя загрузчик Linux является общим объектом в соответствии с файлом (1), он также имеет точку входа, которая позволяет выполнять его напрямую. При выполнении таким способом загрузчик Linux действует как интерпретатор для двоичных файлов ELF.
Однако на моем компьютере с OpenBSD этот эксплойт не эффективен, поскольку вы не можете запускать загрузчик как программу. На странице руководства OpenBSD написано: «ld.so сам по себе является общим объектом, который изначально загружается ядром».
Попробуйте это на Solaris 9, и вы получите ошибку. Я не уверен, что происходит в другом месте.
Поэтому мои вопросы:
- Почему загрузчик Linux (при непосредственном выполнении) не проверяет атрибуты файловой системы перед интерпретацией двоичного файла ELF?
- Зачем реализовывать механизм, предназначенный для запрета выполнения файлов, если он так тривиально обходится? Я что-то пропустил?
libc
(я однажды делал это, обновляя коробку Arch), вы будете благодарны за эту небольшую причуду.