Мне нужно написать код, который может получить корневые привилегии и выполнить операции на системном уровне. Вот что я написал (это не фактический код, просто чтобы проверить, если я делаю вещи правильно или нет):setuid (0) не выполняется для корневой программы
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int current_uid = getuid();
printf("My UID is: %d. My GID is: %d\n", current_uid, getgid());
system("/usr/bin/id");
if (setuid(0))
{
perror("setuid");
return 1;
}
//I am now root!
printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
system("/usr/bin/id");
//Time to drop back to regular user privileges
setuid(current_uid);
printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
system("/usr/bin/id");
return 0;
}
После выполнения gcc -o setuid setuid.c
, я бегу Ls -AL на это, чтобы получить следующие результаты :
[email protected]:~$ ls -al setuid
-rwxr-xr-x 1 tarun tarun 9792 2009-10-03 18:09 setuid
[email protected]:~$
Попытка запустить приложение приводит:
[email protected]:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted
я изменить владельца к корню и установите липкие биты соответственно:
[email protected]:~$ su - root
Password:
staging:~# cd /home/tarun
staging:/home/tarun# chown root.root setuid
staging:/home/tarun# chmod +s setuid
staging:/home/tarun# ls -al setuid
-rwsr-sr-x 1 root root 9792 2009-10-03 18:09 setuid
staging:/home/tarun# exit
logout
[email protected]:~$
Выполнение программы теперь дает:
[email protected]:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted
Хотя в идеале она должна быть полностью выполнена и изменили мой uid
0. Что я делаю неправильно?
Мне показалось странным, что ваш файл с 2009 года, так или иначе, шаги, которые вы следовали, должны работать и, действительно, они работали на моей машине. –
@ Rafael Я предполагаю, что это, должно быть, проблема с моей системой. Вил, если я смогу понять, что с этим не так. –
Проверьте вывод mount, чтобы узнать, включено ли suid. Возможно, раздел монтируется с помощью nosuid. –