2017-01-04 5 views
0

Мой вопрос исходит из чтения APUE.Как и когда «exec» изменяет эффективный идентификатор пользователя, когда для пользователя будет установлен идентификатор set-файла

В Unix или Linux, когда процесс выполняет исполняемый файл, вызвав функцию exec, если установлен бит-идентификатор пользователя устанавливается для исполняемого файла, exec изменяет эффективный идентификатор пользователя для владельца файла.

  1. Каким образом exec сменить действительный идентификатор пользователя?

    exec внести изменения, позвонив по телефону setuid или с помощью какой-либо другой функции?

  2. Когда exec изменить действующий идентификатор пользователя?

    ли exec изменить эффективный идентификатор пользователя процесса перед тем или после ядро ​​выполняет проверку разрешений на ли процесс разрешено выполняет этот файл?

    Эквивалентный на поставленный выше вопрос, прямо перед тем, ядро ​​выполняет проверку разрешений на процессе , разрешен ли запускает файл, является эффективным идентификатором процесса один перед тем или послеexec изменяют ID пользователя владельцу файла?

Спасибо.

+1

Я думаю, вы путать 'execve (2)' (системный вызов) с 'ехес (3)' (библиотека функции). 'exec' будет вызывать' execve', который является системным вызовом и будет выполняться ядром. –

ответ

2

Согласно википедии https://en.wikipedia.org/wiki/Setuid:

  1. я думаю (не уверен), что никакие другие системные вызовы не являются явно вовлечены; но exec(), вероятно, сделает внутренний вызов setuid-кода.

  2. exec() изменяет действительный идентификатор пользователя после, решив, что файл может быть выполнен. В противном случае это было бы бессмысленным.

2

Обложка UNIX V7 здесь. Есть десятки версий UNIX, но их реализация exec очень похожа.

Действующий uid является полем в per-process user structure и поддерживается синхронно с аналогичным полем в process structure. В V7, изменяя эффективный идентификатор осуществляется с помощью двух простых операторов присваивания:

/* 
* set SUID/SGID protections, if no tracing 
*/ 
if ((u.u_procp->p_flag&STRC)==0) { 
    if(ip->i_mode&ISUID) 
     if(u.u_uid != 0) { 
      u.u_uid = ip->i_uid; 
      u.u_procp->p_uid = ip->i_uid; 
     } 
    if(ip->i_mode&ISGID) 
     u.u_gid = ip->i_gid; 
} 

[Упражнение: что делает чек на (u.u_uid != 0) ветер делает, и почему он был исключен из ехес кода в последующих версиях UNIX? ]

Первое, что нужно сделать exec, это проверить разрешения, позвонив по телефону access, в котором используется эффективный uid и gid процесса. Он делает это задолго до того, как бит setuid файла даже посмотрел.

if ((ip = namei(uchar, 0)) == NULL) 
    return; 
if(access(ip, IEXEC)) 
    goto bad; 

Изменение uid выполняется после того, как выполнены все разрешения и проверка магического числа и выделение памяти. Как видно из кода говорит незадолго до установки выделения и UID:

/* 
* allocate and clear core 
* at this point, committed 
* to the new image 
*/ 

 Смежные вопросы

  • Нет связанных вопросов^_^