Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 10


старая программа exec новая программа ruid -->----------------->---> ruid

uid -->--------*-------->---> uid (new) | выполняемый файл i_uid (st_uid)

Как видно из этой схемы, реальный идентификатор хозяина процесса наследуется. Эффективный идентификатор обычно также наследуется, за исключением одного случая: если в кодах доступа файла (i_mode) выставлен бит S_ISUID (set-uid bit), то значение поля u_uid в новом процессе станет равно значению i_uid файла с программой:

/* ... во время exec ... */ p_suid = u_uid; /* спасти */ if( i_mode & S_ISUID ) u_uid = i_uid; if( i_mode & S_ISGID ) u_gid = i_gid;

т.е. эффективным владельцем процесса станет владелец файла. Здесь gid - это идентификаторы группы владельца (которые тоже есть и у файла и у процесса, причем у процесса - реальный и эффективный).

Зачем все это надо? Во-первых затем, что ПРАВА процесса на доступ к какому-либо файлу проверяются именно для эффективного владельца процесса. Т.е. например, если файл имеет коды доступа

mode = i_mode & 0777; /* rwx rwx rwx */

и владельца i_uid, то процесс, пытающийся открыть этот файл, будет "проэкзаменован" в таком порядке:

if( u_uid == 0 ) /* super user */ то доступ разрешен; else if( u_uid == i_uid ) проверить коды (mode & 0700); else if( u_gid == i_gid ) проверить коды (mode & 0070); else проверить коды (mode & 0007);

Процесс может узнать свои параметры:

unsigned short uid = geteuid(); /* u_uid */ unsigned short ruid = getuid(); /* u_ruid */ unsigned short gid = getegid(); /* u_gid */ unsigned short rgid = getuid(); /* u_rgid */

а также установить их:

setuid(newuid); setgid(newgid);

Рассмотрим вызов setuid. Он работает так (u_uid - относится к процессу, издавшему этот вызов):

if( u_uid == 0 /* superuser */ ) u_uid = u_ruid = p_suid = newuid; else if( u_ruid == newuid p_suid == newuid ) u_uid = newuid; else неудача;

Поле p_suid позволяет set-uid-ной программе восстановить эффективного владельца, который был у нее до exec-а.




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