Вы спокойно блуждаете по директории $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, может установить или убрать атрибут.

Комментарии (11)


  1. zuborg
    06.09.2017 19:17
    +1

    Уточню, что в данном случае решающими являются права на собственно папку /home/user/left-shoe/, а не $HOME (/home/user/).

    А так да, права на содержимое файла не определяют права на его имя (или отсутствие имени) в данной папке.


    1. pansa
      06.09.2017 21:12
      +2

      Решающим являются права записи на каталог с файлом. А доступ X должен быть на всех каталогах, ведущих к файлу.
      Да, элементарные права доступа редко кто знает, на собеседовании ни один нормально не отвечал. И это еще не касаясь темы ACL.


    1. Apache02
      07.09.2017 12:29
      +1

      Гдето читал, что папка это тоже файл, но он содержит в себе список файлов которые внутри. Поэтому все логично: если можем писать в этот файл (папку) (изменять список), то можем удалять что угодно.


      1. modestguy
        07.09.2017 14:16

        В концепции linux вроде всё есть файл.


  1. BuriK666
    06.09.2017 19:29
    +6

    chmod +t /home

    Сегодня sticky bit используется в основном для каталогов, чтобы защитить в них файлы. Из такого каталога пользователь может удалить только те файлы, владельцем которых он является. Примером может служить каталог /tmp, в который запись открыта для всех пользователей, но нежелательно удаление чужих файлов. Установка атрибута производится утилитой chmod.
    ru.wikipedia.org/wiki/Sticky_bit


    1. sasha1024
      07.09.2017 19:19

      В данном случае это не поможет, потому что:

      1. Папка left_shoe тоже юзеру. Если захочет, он снимет с неё sticky_bit, удалит файл, а потом вернёт sticky_bit обратно.
      2. Мало того, даже снимать sticky_bit необязательно. Я сейчас этому был несказанно удивлён, но:
        user@desktop:~$ mkdir shoe
        user@desktop:~$ chmod +t shoe
        user@desktop:~$ ls -ld shoe
        drwxrwxr-t 2 user user 4096 вер  7 19:14 shoe
        user@desktop:~$ sudo -s
        [sudo] password for user: 
        root@desktop:~# touch shoe/rock
        root@desktop:~# exit
        exit
        user@desktop:~$ ls -l shoe
        total 0
        -rw-r--r-- 1 root root 0 вер  7 19:16 rock
        user@desktop:~$ rm -f shoe/rock 
        user@desktop:~$ echo $?
        0
        user@desktop:~$ ls -l shoe
        total 0
        

        Вероятно, дело в том, что система «понимает», что владелец папки может и снять sticky_bit, поэтому не накладывает на него это ограничение, он может удалять в ней всё (ну, не буквально «понимает», а просто при проектировании системы прав это учли).


  1. CaptainFlint
    06.09.2017 20:16

    Самое весёлое — это если кому-то, кто не знает про такие трюки, создать подобный файлик и предложить его удалить. Главное, ls никакого криминала не показывает, файл не залочен, а удалить даже рутом — фиг.


  1. imwode
    06.09.2017 23:31
    +6

    Рок Теймер — укротитель камушков же или лучше в данном контексте Повелитель Камней


  1. Yarique
    07.09.2017 12:28
    -1

    Шикарно


  1. Kalashmatik
    07.09.2017 13:00

    Выше правильно указали, корректно использовать «стики-бит» на папке, чем +i аттрибут на файле, насколько помню он (immutable) вообще завязан на типе ФС и не во всех работает. И да, из-за приколистов типа chattr +a, у меня уже рефлекс чекать файлы через lsattr

    P.S. Не пускайте Чакка Норриса в консоль, а то и это не поможет :)