Читаючи це , я знайшов наступний подвиг:
% 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), ви будете вдячні за цю маленьку вигадку.