setuid (0) с CAP_SETUID - PullRequest
       48

setuid (0) с CAP_SETUID

2 голосов
/ 29 сентября 2010

Я пытаюсь изменить свой uid на 0 как не-root с возможностью CAP_SETUID. У меня есть следующая программа:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>
#include <sys/prctl.h>

int main(int argc, char *argv[])
{
    printf("cap setuid in bset: %d\n", prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0));
    printf("%s\n", cap_to_text(cap_get_file(argv[0]), NULL));
    printf("%s\n", cap_to_text(cap_get_proc(), NULL));
    printf("uid: %d\n", (int) getuid());
    setresuid(0, 0, 0);
    printf("uid: %d\n", (int) getuid());
    return 0;
}

Я назначаю возможность setuid следующим образом:

sudo /sbin/setcap cap_setuid=ep ./capsetuid

И я получаю следующий вывод

cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000

Я ожидаю, что вторая функция printf () также покажет возможность CAP_SETUID. Каким-то образом мой процесс не получает возможности файла setuid. Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 30 сентября 2010

Только что обнаружил, что возможности файлов должны быть включены в командной строке ядра с file_caps = 1.

0 голосов
/ 30 сентября 2010

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

Изменение getuid()на geteuid() и оно должно работать.

...