[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Бит установки идентификатора пользователя и setuid(2)

При входе в систему идентификаторы пользователя и группы
устанавливается из файла /etc/passwd. Реальные и эффективные
идентификаторы для процесса первоначально совпадают. Эффективный
идентификатор пользователя и список групп доступа (показываемый
getgroups(2)) используются для определения прав доступа к файлам.
Владелец любого файла, созданного процессом, определяется эффективным
идентификатором пользователя, а группа файла - эффективным
идентификатором группы.
Единственный способ выполнения программы - не ее владельцем - это
запустить программу (a.out) с установленным битом установки
идентификатора пользователя или группы. Если бит установлен, тогда
эффективный идентификатор пользователя и/или группы становится таким
же, как и у владельца и/или группы данной программы. Благодаря этому
механизму можно стать "заместителем" или "представителем"
привилегированной группы. Бит установки идентификатора пользователя
или группы устанавливается с помощью chmod(1) или chmod(2).
Используя программы с битом установки идентификатора пользователя,
можно получить доступ к файлам и устройствам, которые обычным образом
недостижимы. Например, если файл доступен по чтению и записи только
для владельца, другие пользователи не могут получить доступ к этому
файлу. Если же владелец данного файла (с ограниченными правами
доступа) напишет программу доступа к этому файлу и установит бит
установки идентификатора пользователя, тогда все пользователи данной
программы смогут получить доступ к файлу, ранее недостижимому. Патент
на механизм установки идентификатора пользователя принадлежит Дэннису
Ричи.
Биты установки идентификатора пользователя и группы показываются
командой ls -l буквой 's' на месте обычного расположения 'x'.
Некоторые команды ОС UNIX имеют бит установки идентификатора
пользователя. Например, информация о паролях находится в файле
/etc/shadow. Этот файл может читать только владелец -
привилегированный пользователь (root).  Тем не менее каждый
пользователь может изменить свой пароль. Это возможно, несмотря на то,
что владельцем программы изменения пароля /bin/passwd является root,
потому что у этой программы установлен бит установки идентификатора
пользователя. Другой пример - /bin/ps. Благодаря этой программе
пользователь может читать файл /dev/kmem, обычно недоступный по
чтению.
Программа с битом установки идентификатора пользователя или группы
будет иметь эффективный идентификатор отличный от реального либо до
конца времени выполнения процесса, либо до применения setuid(2) или
setgid(2). С помощью этих системных вызовов эффективный идентификатор
вновь становится равным реальному. Эффективный идентификатор
пользователя может снова стать равным идентификатору владельца
программы с помощью вызова setuid(2). setuid(2) или setgid(2)
используются в программе, если владелец программы хочет предоставить
пользователю возможность быть его "представителем", но в программе
есть часть, где нет необходимости в специальных привилегиях.
Суперпользователь может применять setuid(2) для установки
идентификатора, равному идентификатору любого пользователя в системе.
Другие пользователи могут использовать только свои идентификаторы.
Программа /bin/login, с владельцем bin, использует числовые
идентификаторы пользователя и группы, обнаруженные в файле
/etc/passwd, как аргументы setuid(2) и setgid(2) для установки
реального идентификатора пользователей, входящих в систему.
Системная  команда   su  является  единственным  способом  модификации
реальных идентификаторов.
        БИТ УСТАНОВКИ ИДЕНТИФИКАТОРА ПОЛЬЗОВАТЕЛЯ И setuid(2)

.    доступ к ресурсам основывается на эффективном идентификаторе
пользователя и группы.
.    с помощью механизма установки идентификатора пользователь может
быть чьим-то "представителем".
.    бит установки идентификатора для a.out устанавливается с помощью
chmod(1), chmod(2) и open(2)
      установка идентификатора пользователя

04711                         восьмеричное число
u+s                           символьная запись для chmod(1)
rws--x--x                     выводит ls -l

      установка идентификатора группы

02711                         восьмеричное число
g+s                           символьная запись для chmod(1)
rws--s--x                     выводит ls -l

.    Действует от начала исполнения процесса до конца или до
использования setuid(2).



setuid(2)
ИМЯ
      setuid, setgid - установка идентификаторов пользователя и группы

ИСПОЛЬЗОВАНИЕ
      #include <sys/types.h>
      #include <unistd.h>

      int  setuid (uid_t uid);

      int  setgid (gid_t gid);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
      успех - 0

      неуспех - -1 и errno установлена