Почему пользователь без полномочий root может удалять файлы, созданные пользователем root?

24

Учитывая пользователя без полномочий root «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полномочий root без какого- либо повышения привилегий. Вы, наверное, что-то упустили.
DarkDust
16
@DarkDust Файл - это запись в родительском каталоге. Если у вас есть права на запись в каталог, вы можете удалять файлы в нем независимо от того, кому принадлежат файлы (если в каталоге также не установлен бит закрепления)
nos
@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.

Евгений Рик
источник