Чому некористовий користувач може видаляти файли, створені root?


24

Враховуючи некорінного користувача "joshua", як root я створив файл під назвою "foo" в домашньому каталозі joshua (/ home / johsua /); це виглядає приблизно так:

-rw-r--r--  1 root   root       0 12-19 21:00 foo

а потім видаліть її як Джошуа, я можу її успішно видалити.

Я б очікував, що Джошуа не має достатнього дозволу, щоб видалити його. Це якесь "спадкування дозволів"? Моя платформа - Debian 5.0.7.


1) Це поза темою. 2) Я дуже сумніваюся, що ви змогли видалити це як некоріозний користувач без sudoабо іншої ескалації привілеїв. Ви, мабуть, щось не помітили.
DarkDust

16
@DarkDust Файл - це запис у його батьківському каталозі. Якщо у вас є права запису в каталозі, ви можете видалити файли в ньому незалежно від того, хто належить до файлів (якщо в каталозі також не встановлено липкий біт)
нос

@nos: Дурне мені, ти маєш рацію.
DarkDust

1
Запис у його батьківському каталозі - це посилання на файл. Це не сам файл. (Інакше, як файл може бути жорстко пов'язаний з більш ніж однією каталогом?)
Девід Шварц

@DavidSchwartz це правда, але видалення файлу з каталогу - це видалення посилання в структурі каталогу.
mc0e

Відповіді:


43

Користувач не видалив файл, система зробила. Користувач просто видалив файл зі свого каталогу. Система видалила файл, тому що його кількість посилань знизилася до нуля. Це просто випадок, коли користувач, який вилучає файл із каталогу, випадково знизив його до нуля. (Якби файл був жорстко пов'язаний з іншим каталогом або було відкрито ручку до файлу, його не було б видалено.)

Система видаляє файли автоматично, коли кількість посилань знижується до нуля. Власник файлу не має значення. Існує багато способів, коли хтось, окрім власника файлу, може знизити посилання на нуль.

Видалення файлу з каталогу (називається "від’єднання") - це операція над каталогом. Від’єднання файлу зменшує його кількість посилань.

Аналогічно, користувач, окрім власника, може закрити останню ручку до файлу, який не пов'язаний з жодними каталогами. Закриття цієї ручки також видалить файл, оскільки знову кількість посилань знизиться до нуля.


1
І звичайно rmкоманда трохи замулює води, тому що rmце абревіатура "видалити", і користувачі навчаються мислити rmяк операцію "видалити". Багато користувачів користуються rmщодня, не знаючи, що операція, яку вона фактично виконує, - це "від’єднання", а не "видалення". Як наслідок, насправді не дивно, що багато користувачів вважають цю поведінку дивною, коли вперше стикаються з нею.
Даніель Приден

Це, безумовно, дивує багатьох людей. Принаймні rmкоманда фактично видаляє файл або каталог з каталогу. Це гірше для Windows, де викликається команда del, оскільки вона використовувалась для видалення файлу, але на сучасних машинах Windows (починаючи з NT4), це також операція відключення.
Девід Шварц

"Користувач не видалив файл, система зробила" Це не має сенсу. "Система" не може вносити зміни, які потребують привілейованого доступу від імені непривілейованого користувача. Таким чином, ця відповідь не зможе пояснити, чому той самий користувач не може зробити те ж саме, якщо поточний каталог був власником +, що його можна писати тільки root. Відповідь нижче від @kerrek є точною та стислою.
FractalSpace

@FractalSpace Так? Система може вносити зміни, які потребують привілейованого доступу від імені непривілейованого користувача, і робить це постійно. Наприклад, зміна байтів на диску вимагає привілейованого доступу. Однак якщо користувач може змінити файл, система вирішить змінити деякі байти на диску, навіть якщо користувач не має дозволу сам змінювати ці байти. Користувач не може змінювати пам'ять ядра, але ядро ​​може виконувати його від імені користувача. Системи працюють, вирішуючи виконувати операції, які їх користувачі не можуть безпосередньо авторизувати.
Девід Шварц

Так. І зрештою все робиться "системою". Але не перед тим, як пройти суворі правила розділення привілеїв, встановлені для конкретного "простору користувача". У такому випадку, наприклад, "система" не робить дії як загальне правило, але вона дотримується дозволів, встановлених у "батьківському каталозі". Ключова частина цього питання в питанні про ОП.
FractalSpace

0

Перша здогадка: для видалення файлу потрібні дозволи на запис у папку, що містить. Тому спробуйте / home / johsua / foo / bar, дайте 755 foo та 644 - bar.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.