Привілейований доступ до файлів і каталогів насправді визначається можливостями, а не лише наявністю root
чи ні. На практиці, root
як правило, є всі можливі можливості, але бувають ситуації, коли всі / багато з них можуть бути відкинуті, або деякі передані іншим користувачам (їхні процеси).
Якщо коротко, ви вже описали, як перевірки контролю доступу працюють на привілейований процес. Ось як різні можливості насправді впливають на це:
Основна можливість тут полягаєCAP_DAC_OVERRIDE
в тому , що процес, який має в ньому, може "обходити читання, запис файлів і виконання перевірок файлів". Це включає читання та запис у будь-які файли, а також читання, запис та доступ до каталогів.
Насправді це не стосується виконання файлів, які не позначені як виконувані. Про це йдеться в коментаріgeneric_permission
( fs/namei.c
) перед тим, як перевірити доступ до файлів
Читання / запис ЦАПів завжди можна замінити. Виконані DAC-адреси перезаписуються, коли є щонайменше один біт exec.
І код перевіряє наявність принаймні одного x
біта, якщо ви намагаєтеся виконати файл. Я підозрюю, що це лише зручна функція, щоб запобігти випадковому запуску випадкових файлів даних та отримання помилок або незвичайних результатів.
У будь-якому випадку, якщо ви можете змінити дозволи, ви можете просто зробити виконувану копію та запустити її. (Хоча це може змінити теорію для встановлених файлів процесу, здатних змінити права доступу до файлів ( CAP_DAC_OVERRIDE
), але не мали інших пов'язаних можливостей ( CAP_FSETID
/ CAP_FOWNER
/ CAP_SETUID
). Але, маючи CAP_DAC_OVERRIDE
можливість редагування /etc/shadow
та подібних матеріалів, це приблизно однаково просто мати повний доступ до кореня.)
Є також CAP_DAC_READ_SEARCH
можливість, яка дозволяє читати будь-які файли та отримувати доступ до будь-яких каталогів, але не виконувати та записувати їх; і CAP_FOWNER
це дозволяє процесу робити речі, які зазвичай зарезервовані лише для власника файлу, як-от зміна бітів дозволу та групи файлів.
Переосмислення липкого біта в каталогах згадується лише під CAP_FOWNER
, тому, здається, цього CAP_DAC_OVERRIDE
було б недостатньо, щоб ігнорувати це. (Це дасть вам дозвіл на написання, але зазвичай у клейких каталогах у вас це все-таки є і +t
обмежує.)
(Я думаю, що тут спеціальні пристрої вважаються "файлами". Принаймні, generic_permission()
є лише перевірка типу каталогів, але я не перевіряв поза цим ".)
Звичайно, все ж є ситуації, коли навіть можливості не допоможуть вам змінити файли:
- деякі файли
/proc
і /sys
, оскільки вони насправді не фактичні файли
- SELinux та інші модулі захисту, які можуть обмежувати root
chattr
незмінні +i
та додавати лише +a
прапори на ext2 / ext3 / ext4, обидва вони зупиняють навіть root, а також запобігають перейменуванню файлів тощо.
- мережевих файлових систем, де сервер може здійснювати власний контроль доступу, наприклад,
root_squash
в NFS карти нікому не кореняться
- FUSE, який, я думаю, міг би зробити все, що завгодно
- кріплення лише для читання
- пристрої лише для читання
capabilities(7)
головній сторінці - розгляньте можливість подання звіту про помилку!