Чому виконувані файли в напр. / Usr / sbin записуються коренем?


31

Чи можете ви пояснити, чому двійковий компільований файл (наприклад, /usr/sbin) має дозвіл на запис rootкористувача?

Для мене це складено. Це означає, що пряме записування не має користі і може якось піднести файл до якоїсь проблеми безпеки.

Сценарій (наприклад, bashфайл) може бути записаний, оскільки це в основному текстовий файл, але чому він однаковий для компільованого файлу, де записування насправді не потрібно, наскільки я знаю?

Заздалегідь дякую за відгуки.


6
Просто для уточнення вам цікаво, чому користувач rootмає дозвіл на запис на бінарний файл? Якщо нічого іншого, це допомогло б при оновленні цього пакету.
Ерік Ренуф

5
Зауважте, що іронічно бінарні файли - це єдині файли, які ми зазвичай записуємо / редагуємо безпосередньо на диску. Ми не можемо цього зробити з текстовими файлами, такими як сценарії, оскільки модифікація тексту передбачає не запис у файл, а додавання зайвих байтів у середині файлу або видалення байтів у середині файлу. Це неможливо зробити з fseek fwrite. Отже, для текстових файлів ми зазвичай читаємо в ОЗУ, потім видаляємо старий файл і записуємо вміст ОЗУ на диск (тобто перезаписуємо). Крім того, під час встановлення, переміщення або заміни виконуваних файлів ви записуєте на диск, тому вам потрібні дозволи на запис.
slebetman

1
@slebetman: Ви можете безпосередньо редагувати текстові файли. Наприклад, відкрийте файл, розгорніть його, карту пам’яті, використовуйте memmove()для переміщення останньої частини до кінця та відкрийте отвір, а потім вставте новий текст у отвір. Або ви можете використовувати серію pread()/ pwrite()зробити те саме.
Зан Лінкс

6
@EricRenouf Власне, для оновлення пакета, який він містить, не потрібно дозволу на запис у двійковий файл . При оновленні пакету старий двійковий файл не записується; насправді це неможливо, якщо бінарний файл працює зараз (пошук ETXTBSY). Натомість старий двійковий файл видаляється , а новий двійковий файл записується в новий однойменний файл. Видалення файлів не вимагає дозволу на запис на них, а лише в каталозі, що містить (тобто /usr/sbin/).
marcelm

1
@marcelm: Якщо ви не говорите про те, що ви не просто використовуєте fseek і write, ви залишок заливаєте на RAM. Ви можете також залишити буфер в інший файл. Або ви можете написати новий вміст у новий файл. Жоден з яких не дозволяє розширювати текстові файли без якогось великого буфера.
slebetman

Відповіді:


50

Насправді не важливо, чи файли в /bin(або будь-який інший стандартний каталог, де зберігаються виконувані файли), корінні для запису чи ні. На сервері Linux, який я використовую, вони записуються під корінь, але на моїй версії OpenBSD - ні.

До тих пір, поки вони не підлягають запису ні групою, ні "іншими"!

Немає жодних проблем із безпекою, наприклад,

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls

Якщо хтось хотів перезаписати його, він повинен був би бути root, а якщо вони є rootі перезаписати його, то вони є або

  1. встановлення нової версії, або
  2. незграбний, або
  3. нападник з правами root вже є .

Ще одна річ, яку слід врахувати, це те, що корінь може записувати у файл незалежно від того, захищений він чи ні, тому що ... root.

Зауважте також, що "скрипт" є настільки ж виконуваним, як і двійковий файл. Сценарій не потребує запису, "оскільки це текстовий файл". У будь-якому випадку, ймовірно, він повинен мати той самий дозвіл, що й інші виконувані файли в тій же папці.

Не продовжуйте змінювати дозволи на все зараз! Це може спричинити загрозу різного роду та потенційно заплутати менеджерів пакетів, які можуть переконатися, що дозволи встановлені правильно. Це також може зробити систему вразливою, якщо ви випадково змінили дозволи невірно в критичному для безпеки додатку.

Просто припустіть, що дозволи на виконані файли встановлені правильно, якщо ви не знайдете те, що виглядає дійсно дивним, і в цьому випадку вам, мабуть, слід звернутися до відповідного сервісного пакета, щоб перевірити, а не починати змінювати речі.


З коментарів та чату пролунав заклик до деякої історії.

Історія дозволів на бінарні файли в Linux - це не все, про що я нічого не знаю. Можливо, можна припустити, що вони просто успадкували дозволи з каталогу або просто з типового umaskLinux, але я справді не знаю.

Що я знаю, це те, що OpenBSD встановлює бінарні файли в базовій системі 1 в режимі дозволу 555 за замовчуванням ( -r-xr-xr-x). Це вказано в фрагменті Makefile, в /usr/share/mk/bsd.own.mkякому встановлено BINMODE555 (якщо це вже встановлено). Пізніше це використовується під час встановлення виконуваних файлів під час make buildв /usr/src.

Я ознайомився з анотованим журналом CVS для цього файлу і виявив, що цей рядок у файлі незмінний, оскільки він був імпортований з NetBSD у 1995 році.

У NetBSD файл був вперше введений у CVS у 1993 році, з BINMODE555.

Проект FreeBSD, щонайменше , використовує той самий файл, що і NetBSD, щонайменше з 1994 року , а з більш пізньою версією додає натяк у повідомленні про те, що старі файли походили з версії 4.4BSD версії програмного забезпечення Berkeley Software Distribution.

Крім того, CSRG в Берклі зберігав джерела в SCCS, але їх сховище доступне у Git формі на GitHub 2 . Файл , який ми даємо на forencic тут для просочення , здається, було скоєно по Keith Бостік (або хто - то в безпосередній близькості від нього) в 1990 році.

Так це та історія. Якщо ви хочете чому , то, гадаю, нам доведеться запитати Кіта. Я якось сподівався побачити повідомлення про зміну, яке говорить про " це має бути 555, тому що ... ", але ні.

1 Системи BSD мають більш жорсткий поділ на "базову систему" та "сторонні пакети" (порти / пакети), ніж Linux. Базова система - це цілісний блок, який забезпечує повний набір засобів для роботи операційної системи, тоді як порти або пакети розглядаються як "місцеве програмне забезпечення" і встановлюються під /usr/local.

2 Також доступне більш вичерпне сховище GitHub Unix-версій з 70-х років .


1
Дякую за відповідь. Дозвіл на запис є нормальним, оскільки він не має значення як користувач root (він може робити все). Але, як це насправді не має значення, чому б ми не поставили дозвіл на написання, якщо це те саме з самого початку? Це довільне рішення?
t1m0th33

1
@ t1m0th33 Я вірю, що це може бути довільне рішення, яке хтось прийняв, так. Як я вже говорив, у моїй системі OpenBSD файли в цих місцях не можуть бути записані root.
Kusalananda

1
Я не думаю, що це хтось свідоме рішення. Менеджер пакунків за замовчуванням встановлює файл з бітами дозволу, з якими вони закінчилися в процесі збирання; під час створення лінкера створювали файли з дозволами 755, тому що це ви отримуєте, коли ви віднімаєте umask від 777, і корінь umask (на машинах побудови постачальника ОС) мав під час створення 022, оскільки 022 - умоутворення umask для всіх і створення це буде 222 для root було б безглуздою додатковою роботою.
Геннінг Макгольм

8
+1 для "Не змінюйте дозволів на все зараз!" Я бачу так багато питань , як , що на ASK Ubuntu , де користувач зробив chmod -R на /usrабо /var, і здивування - їх sudoне працює , або ще що - то не працює.
Сергій Колодяжний

4
Історично відсутність дозволу на запис для root не матиме ефекту (root може chmod що завгодно, і навіть не потрібно, тому що root ніколи не отримує EPERM у відкритому або записуваному вигляді). Цікаво, чи почалося це 555 матеріали, оскільки насправді стало можливим обмеження кореня (коли вперше з'явилися
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.