Давайте немного углубимся в разрешения процессов. Помните, я говорил вам, что когда вы запускаете команду passwd с включенным битом разрешения SUID, вы будете запускать программу от имени root? Это правда. Однако означает ли это, что, поскольку вы временно являетесь root, вы можете изменять пароли других пользователей? Нет, к счастью, нет!
Это связано со множеством UID, которые реализует Linux. С каждым процессом связаны три UID:
Когда вы запускаете процесс, он выполняется с теми же разрешениями, что и пользователь или группа, которые его запустили. Это известно как эффективный идентификатор пользователя (effective user ID). Этот UID используется для предоставления прав доступа процессу. Таким образом, естественно, если Боб запустил команду touch, процесс будет выполняться от его имени, и любые созданные им файлы будут принадлежать ему.
Существует еще один UID, называемый реальным идентификатором пользователя (real user ID). Это идентификатор пользователя, который запустил процесс. Они используются для отслеживания того, кто является пользователем, запустившим процесс.
Последний UID — это сохраненный идентификатор пользователя (saved user ID). Он позволяет процессу переключаться между эффективным UID и реальным UID и наоборот. Это полезно, потому что мы не хотим, чтобы наш процесс постоянно работал с повышенными привилегиями; это просто хорошая практика — использовать специальные привилегии в определенное время.
Теперь давайте объединим все это, еще раз взглянув на команду passwd.
При запуске команды passwd ваш эффективный UID — это ваш идентификатор пользователя; допустим, сейчас это 500. О, но подождите, помните, что команда passwd имеет включенное разрешение SUID. Поэтому, когда вы ее запускаете, ваш эффективный UID теперь равен 0 (0 — это UID root). Теперь эта программа может получать доступ к файлам как root.
Допустим, вы немного почувствовали власть и хотите изменить пароль Салли. Салли имеет UID 600. Что ж, вам не повезет. К счастью, процесс также имеет ваш реальный UID, в данном случае 500. Он знает, что ваш UID равен 500, и поэтому вы не можете изменить пароль UID 600. (Это, конечно, всегда обходится, если вы являетесь суперпользователем на машине и можете контролировать и изменять все).
Поскольку вы запустили passwd, процесс начнется с использованием вашего реального UID, и он сохранит UID владельца файла (эффективный UID), чтобы вы могли переключаться между ними. Нет необходимости изменять все файлы с доступом root, если это не требуется.
В большинстве случаев реальный UID и эффективный UID совпадают, но в таких случаях, как команда passwd, они будут меняться.