Архитектура операционной системы UNIX


         

КОД ИДЕНТИФИКАЦИИ ПОЛЬЗОВАТЕЛЯ ПРОЦЕССА - часть 2


На приведена программа, демонстрирующая использование функции setuid. Предположим, что исполняемый файл, полученный в результате трансляции исходного текста программы, имеет владельца с именем "maury" (код идентификации 8319) и установленный бит setuid; право его исполнения предоставлено всем пользователям. Допустим также, что пользователи "mjb" (код идентификации 5088) и "maury" являются владельцами файлов с теми же именами, каждый из которых доступен только для чтения и только своему владельцу. Во время исполнения программы пользователю "mjb" выводится следующая информация: uid 5088 euid 8319 fdmjb -1 fdmaury 3 after setuid(5088): uid 5088 euid 5088 fdmjb 4 fdmaury -1 after setuid(8319): uid 5088 euid 8319

Системные функции getuid и geteuid возвращают значения реального и исполнительного кодов идентификации пользователей процесса, для пользователя "mjb" это, соответственно, 5088 и 8319. Поэтому процесс не может открыть файл "mjb" (ибо он имеет исполнительный код идентификации пользователя (8319), не разрешающий производить чтение файла), но может открыть файл "maury". После вызова функции setuid, в результате выполнения которой в поле исполнительного кода идентификации пользователя ("mjb") заносится значение реального кода идентификации, на печать выводятся значения и того, и другого кода идентификации пользователя "mjb": оба равны 5088. Теперь процесс может открыть файл "mjb", поскольку он исполняется под кодом идентификации пользователя, имеющего право на чтение из файла, но не может открыть файл "maury". Наконец, после занесения в поле исполнительного кода идентификации значения, сохраненного функцией setuid (8319), на печать снова выводятся значения 5088 и 8319. Мы показали, таким образом, как с помощью программы setuid процесс может изменять значение кода идентификации пользователя, под которым он исполняется.

#include <fcntl.h> main() { int uid,euid,fdmjb,fdmaury;

uid = getuid(); /* получить реальный UID */ euid = geteuid(); /* получить исполнительный UID */ printf("uid %d euid %d\n",uid,euid);

fdmjb = open("mjb",O_RDONLY); fdmaury = open("maury",O_RDONLY); printf("fdmjb %d fdmaury %d\n",fdmjb,fdmaury);

setuid(uid); printf("after setuid(%d): uid %d euid %d\n",uid, getuid(),geteuid());

fdmjb = open("mjb",O_RDONLY); fdmaury = open("maury",O_RDONLY); printf("fdmjb %d fdmaury %d\n",fdmjb,fdmaury);

setuid(uid); printf("after setuid(%d): uid %d euid %d\n",euid, getuid(),geteuid()); }

<


Содержание  Назад  Вперед