Случайное удаление файлов root

Вы когда-нибудь сталкивались с ситуацией, когда в вашем домашнем каталоге валяется какой-то непонятный файл, принадлежащий 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’а! Он же защищён!

Не тут-то было. Флаги доступа к самому файлу не влияют на возможность его удаления. Они нужны для чтения, записи и исполнения самого файла. А удаление — это операция над структурой директории. И вот здесь начинается магия.

Блокировка учетных записей пользователей в ОC UNIX
Блокировка учетных записей пользователей в ОC UNIX

Где был подвох?

  • Файл был создан root’ом.
  • Права были сняты полностью: chmod 0000.
  • Обычно пользователь просто не может с таким ничего сделать… но не в случае удаления!

Потому что удаление — это не изменение файла, а изменение директории. И если у вас есть write/execute на директорию — вы можете его убрать. Просто потому, что можете редактировать список файлов в этой папке.

Как защититься?

Если вы действительно не хотите, чтобы кто-то трогал ваши файлы — даже если они лежат в чужой домашней директории — используйте:

# chattr +i /путь/к/файлу

Этот атрибут делает файл immutable — неизменным. Ни удалить, ни перезаписать его уже нельзя будет даже root’у, пока вы не снимете этот флаг.

Интересно, правда? Получается, даже если root оставит “камень” в вашем ботинке — вы всё равно можете его выбросить. Главное — быть хозяином ботинка.

Мораль

Не думайте, что файл с правами 0000 — недосягаем. Если он находится в вашей директории, вы можете его удалить без sudo. Это особенность Unix, которая может стать как удобной штукой, так и серьёзной ошибкой безопасности.

А если вы root — не забывайте использовать chattr +i, когда важно сохранить файл любой ценой.

Nazario

Я — Nazario, тот самый человек, который больше десяти лет ковыряется в Linux и Windows системах не ради хобби, а потому что это — работа и жизнь. Всё, что вы читаете на Setiwik.ru, — это не пересказ справки из мануала, а результат десятков реальных кейсов, выстраданных конфигов и ночных перезагрузок.

Я не претендую на истину в последней инстанции. Но если мой опыт может кому-то упростить работу — значит, всё это не зря. Здесь нет «магии», только практика: от настроек сервера до неожиданных багов, которые не гуглятся с первого раза.

Setiwik.ru — это место, где IT становится чуть менее хаотичным. Заходите почаще — будем разбираться вместе.

Добавить комментарий