2016-08-28 4 views
2

я следующий код:УИП() возвращает 0, но не имеет никакого эффекта

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

void main(int argc, char* argv[]) { 
    printf("uid=%u euid=%u\n", getuid(), geteuid()); 
    printf("%d = setuid(euid)\n", setuid(geteuid())); 
    printf("uid=%u euid=%u\n", getuid(), geteuid()); 
} 

Составитель и запустить этот путь:

[email protected]:/tmp $ sudo gcc foo.c 
[email protected]:/tmp $ sudo chown dev-misc:dev-misc a.out 
[email protected]:/tmp $ sudo chmod u+s a.out 
[email protected]:/tmp $ ./a.out 
uid=1000 euid=1006 
0 = setuid(euid) 
uid=1000 euid=1006 

Почему UID, остаются неизменными? И почему setuid сообщает об успехе? (согласно странице руководства, 0 означает успех)

ответ

1

setuid() устанавливает эффективный идентификатор пользователя, а не идентификатор реального процесса. От manual:

setuid() устанавливает эффективный идентификатор пользователя вызывающего процесса. Если фактический UID является корневым (точнее: если вызывающий абонент имеет возможность CAP_SETUID), то устанавливаются реальный UID и сохраненный идентификатор пользователя .

Для того чтобы изменить реальный идентификатор пользователя, процесс должен иметь действующий идентификатор пользователя, равный 0. Так как это не так в вашем примере, оно не изменяется. setuid() преуспевает, потому что вы просто устанавливаете его на тот же эффективный идентификатор пользователя, который уже существует.