seteuid / geteuid: у программы всегда есть root ID - PullRequest
3 голосов
/ 05 апреля 2011

В настоящее время я пытаюсь выяснить, как работают SUID-бит и соответствующие функции seteuid и geteuid. Итак, я написал эту маленькую программу:

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

int main(int argc, char **argv) {

    printf("oldid %d\n", geteuid());
    if(seteuid(0) == -1)
        perror("seteuid faied");
    printf("newid %d\n", geteuid());

    return 0;

}

Скомпилировал его, изменил владельца на root и s-bit для владельца файла:

[chris@myhost Test]$ ls -l test
-rwsr-xr-x 1 root root 4830 Apr  5 07:56 test

Но тогда полученная продукция выглядит так:

[chris@myhost Test]$ ./test
oldid 0
newid 0

И это то, чего я не понимаю. В соответствии с тем, что я обнаружил, первый вызов geteuid должен фактически возвращать идентификатор пользователя, вызывающего эту программу (т.е. chris - мой идентификатор будет 1000), но программа показывает root в качестве эффективного идентификатора пользователя. Может кто-нибудь объяснить мне, почему это так?

1 Ответ

7 голосов
/ 05 апреля 2011

Со страницы справочника geteuid() на моем Mac (OS X 10.6.7):

Настоящий идентификатор пользователя - это пользователь, который вызвал программу.Поскольку эффективный идентификатор пользователя дает процессу дополнительные разрешения при выполнении процессов в режиме `` set-user-ID '', getuid () используется для определения реального идентификатора пользователя вызывающего процесса.

Поскольку вы установили бит suid, эффективный идентификатор пользователя программы является владельцем файла (root) с начала выполнения.

...