Почему я смог удалить файл, принадлежащий пользователю root, в моем домашнем каталоге, не будучи пользователем root?

40

Поэтому сегодня я проводил некоторые операции на своем сервере и заметил, что смог удалить файл, принадлежащий пользователю root, в моем домашнем каталоге.

Я был в состоянии воспроизвести образец:

[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 20:59 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$ sudo touch file-owned-by-root
[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 21:00 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-r--r--.  1 root     root        0 Oct  5 21:00 file-owned-by-root
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$ rm file-owned-by-root
rm: remove write-protected regular empty file ‘file-owned-by-root’? y
[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 21:00 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$

У меня вопрос, как я смог удалить файл, который принадлежит пользователю root и у которого есть разрешения -rw-r--r--, а я не root?

Карл Беннетт
источник
6
Вы можете удалить запись в каталоге, которая указывает на файл, потому что у вас есть доступ для записи в каталог. Вы не можете обязательно удалить файл; файл может иметь другую жесткую ссылку где-то еще.
user253751
2
Забавное расширение: вы также можете переименовать файл или сделать жесткие ссылки на него.
Петер говорит восстановить Монику
11
Пожалуйста, пересмотрите ваш выбор для принятого ответа, потому что текущий ответ вводит в заблуждение: вам не разрешено ничего с ним делать, кроме содержимого в соответствии с разрешениями каталога .
Ктулху
@Cthulhu Готово! Спасибо всем за все комментарии к этому Q & A, определенно много полезной информации здесь!
Карл Беннетт

Ответы:

34

Права доступа, содержимое и все атрибуты являются частью индекса. Имя находится в записи каталога. Разрешения не наследуются рекурсивно (кроме случаев, когда вы используете значение по умолчанию в списках доступа Posix).

Когда вы удаляете файл, внутренне вы просто удаляете жесткую ссылку из записи каталога на индекс. Когда все жесткие ссылки будут удалены, а индекс не используется, файловая система освободит пространство. Вам нужно только разрешение на запись в папку, независимо от того, какие разрешения установлены для файла (за исключением неизменного разрешения ext). То же самое для пустой папки.

Когда вы удаляете не пустую папку, вам нужно разрешение на запись в папку, которую вы удаляете, и в ее родительскую папку.

Мирча Вуцовичи
источник
1
Таким образом, разрешения на inode или разрешения на ссылку на inode, и я просто удаляю эту ссылку (и, таким образом, удаляется единственная ссылка на нее, поэтому inode перестает существовать)?
Карл Беннетт
3
Разрешения есть на иноде. Это легко проверить, создав жесткую ссылку на файл, изменив разрешения для него, а затем проверив разрешения для оригинала.
Воутер Верхелст
но допустим, что в нем есть каталог и файл, принадлежащие root, причем каталог находится в каталоге, принадлежащем пользователю. Вы не сможете удалить их тогда, верно?
njzk2
1
Это атрибут, специфичный для ext2, ext3 и ext4. Пример: sudo touch test_file;sudo chattr +i test_file;rm -f test_fileсм .:man chattr
Мирча Вутковичи
1
Неизменяемый атрибут защищает файл от любых изменений даже от root.
Мирча Вутцовичи
19

Когда вы владеете каталогом, вам разрешается делать с ним все, что угодно, и содержимое в соответствии с разрешениями каталога. Поэтому, несмотря на то, что файл не был владельцем, вы все равно смогли удалить его, поскольку у вас было разрешение на чтение / запись в каталог, в котором находился файл.

inetknght
источник
46
Не совсем. Например, OP не сможет изменить этот корневой файл. Дело в том, что удаление файла не считается операцией над файлом, а скорее над каталогом (удаление указателя на файл), и поэтому разрешения для каталога имеют значение.
Ктулху,
1
@Cthulhu, не могли бы вы удалить корневой файл и создать новый модифицированный с тем же именем после?
KDEx
3
@ Моргорот, да, можно, но это уже не тот же файл. В другом (возможно, более очевидном) примере вы не сможете прочитать файл в вашем каталоге, если он принадлежит корневому каталогу, и только его владелец может прочитать его.
Ктулху
@inetknght Это следует уточнить. Я понимаю, что вы пытаетесь ссылаться на манипулирование самими файлами как на объекты, но это не ясно. Вы не можете изменить его содержимое, например. И вы не упоминаете атрибуты, которые могут превзойти разрешения каталога.
Майк С
1
@captcha Это потому, что viсначала файл сохраняется во временную копию, затем удаляет исходный файл и переименовывает копию в оригинал (или что-то в этом роде).
Ктулху