setuid(0) с CAP_SETUID
Я пытаюсь изменить свой 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 ответа
Решение
Только что обнаружил, что возможности файлов должны быть включены в командной строке ядра с file_caps=1.
setuid()
устанавливает эффективный идентификатор пользователя процесса, но getuid()
получает реальный идентификатор пользователя.
Изменить getuid()
в geteuid()
и это должно работать.