Вы спокойно блуждаете по директории $HOME
, думая о своих делах.
$ whoami
> user
$ pwd
> /home/user
Но что-то вас беспокоит. Это как маленький камушек (little rock), попавший в ботинок. Вы снимаете обувь, чтобы посмотреть, в чём дело.
$ ls -lah ./left-shoe
---------- 1 root root 4 May 30 13:20 little-rock
Странно. Он здесь, но как будто не принадлежит вам. Его оставил root
, Рок Теймер, и только он решает его судьбу.
# bash -c "echo 'You stay here' > /home/user/left-shoe/little-rock"
# chmod 0000 /home/user/left-shoe/little-rock
Вы лезете в карман за телефоном, чтобы быстро позвонить ему через sudo
. Неожиданно вы чувствуете прилив сил (из-за просмотра «Гладиатора» прошлым вечером) и решаете отложить телефон, чтобы испытать свою мощь.
$ rm -f ./left-shoe/little-rock
$ ls -lah ./left-shoe/little-rock
ls: cannot access little-rock: No such file or directory
Вы опускаете взгляд на дрожащие руки, пытаясь понять: это всё произошло на самом деле? Да. Вы действительно это сделали. Без Рока Теймера. Но как?
Маленький камушек в вашем ботинке понятия не имел, что его ждёт. Как видно из его реинкарнации, ни у кого не было на него никаких разрешений (--- --- ---
). Ни чтений, ни записей, никаких действий ни от кого (владелец, группа, другие).
Подвох
Что здесь произошло, так это Рок Теймер забыл, что вы даже более могучи, чем он сам, когда вы находитесь в $HOME
. И вот почему.
Чтобы иметь возможность сделать что-нибудь с файлом, первым делом нужно найти его в директории. Листинг содержимого директории контролируется флагом выполнения. Если у пользователя есть разрешение на выполнение в этой директории, он может посмотреть её содержимое. Также флаг выполнения для директории даёт доступ к дескрипторам inode
для файлов в этой папке, что имеет решающее значение в этом контексте, поскольку процесс удаления отсоединяет файл.
Затем, процесс удаления. Переименование или перемещение файла не предусматривает системного вызова write()
. На практике нам не нужны никакие разрешения для удаления файла и нам нет дела, кто его владелец. Единственное требование — иметь разпрешения на запись в родительскую директорию (и флаг выполнения для родительской директории).
Директория $HOME
естественным образом соответствует обоим этим требованиям с точки зрения пользователя.
Анти-подвох
Если Рок Теймер действительно не хотел, чтобы посторонние трогали его камушки, то сделал бы следующее:
# chattr +i /home/user/left-shoe/little-rock
Эта операция гарантирует неизменность файла, что, среди прочего, предотвращает его удаление. Выдержка из мануала:
Файл с атрибутом 'i' не может быть изменён: его нельзя удалить или переименовать, на этот файл нельзя создать ссылку и в него нельзя записать никакие данные. Только суперпользователь или процесс, владеющий CAP_LINUX_IMMUTABLE, может установить или убрать атрибут.
Автор: m1rko