Вы когда-нибудь сталкивались с ситуацией, когда в вашем домашнем каталоге валяется какой-то непонятный файл, принадлежащий root’у? И при этом он не читается, не пишется и даже на него нельзя нормально посмотреть — права вообще все закрыты: ———-? А вы всё равно его удалили. Просто так. Как будто никто и ничего не мог поделать. И это сработало.
Честно говоря, я сам недавно попал в такую ситуацию. Сидел себе, разбирал старые папки, а тут такой “камушек” завёлся. Права — 0000, ни у кого нет доступа. Вроде бы, казалось бы, root поставил замок, а ты только глазами полюбовался и пошёл дальше. Но я не удержался.
$ rm -f ./left-shoe/little-rock
$ ls -lah ./left-shoe/little-rock
ls: cannot access little-rock: No such file or directory
Да, я его удалил. Без sudo. Без root-доступа. Просто взял и убрал. Как такое возможно?
Почему это вообще сработало?
Всё дело в том, как UNIX-подобные системы обрабатывают удаление файлов. Дело не в самом файле, а в директории, где он лежит. Чтобы удалить или переименовать файл, нужно иметь право записи (write) и выполнения (execute) на родительскую папку.
А моя домашняя директория ($HOME
) мне принадлежит. Там у меня есть все права. То есть, даже если внутри лежит файл от root’а, но с правами 0000 — мне всё равно можно его удалить. Потому что я могу изменять содержимое своей собственной папки.
Но как так?! Он же root’а! Он же защищён!
Не тут-то было. Флаги доступа к самому файлу не влияют на возможность его удаления. Они нужны для чтения, записи и исполнения самого файла. А удаление — это операция над структурой директории. И вот здесь начинается магия.

Где был подвох?
- Файл был создан root’ом.
- Права были сняты полностью:
chmod 0000
. - Обычно пользователь просто не может с таким ничего сделать… но не в случае удаления!
Потому что удаление — это не изменение файла, а изменение директории. И если у вас есть write/execute на директорию — вы можете его убрать. Просто потому, что можете редактировать список файлов в этой папке.
Как защититься?
Если вы действительно не хотите, чтобы кто-то трогал ваши файлы — даже если они лежат в чужой домашней директории — используйте:
# chattr +i /путь/к/файлу
Этот атрибут делает файл immutable — неизменным. Ни удалить, ни перезаписать его уже нельзя будет даже root’у, пока вы не снимете этот флаг.
Интересно, правда? Получается, даже если root оставит “камень” в вашем ботинке — вы всё равно можете его выбросить. Главное — быть хозяином ботинка.
Мораль
Не думайте, что файл с правами 0000 — недосягаем. Если он находится в вашей директории, вы можете его удалить без sudo. Это особенность Unix, которая может стать как удобной штукой, так и серьёзной ошибкой безопасности.
А если вы root — не забывайте использовать chattr +i
, когда важно сохранить файл любой ценой.