У меня есть корневой файл setuid, with_sudo.bin
, со следующим исходным кодом:
/* with_sudo.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
system("/usr/bin/sudo cat /root/key.txt");
return 0;
}
akshay@bluebox ~ $ ls -l with_sudo.bin
-rwsr-sr-x 1 root root 8684 Feb 1 22:09 with_sudo.bin
Несмотря на то, что это корневой файл setuid, запрашивается пароль sudo.
akshay@bluebox ~ $ ./with_sudo.bin
ruid : 1000 euid : 0
[sudo] password for akshay:
Когда я запускаю другой бинарный файл без sudo
в system()
, он запускается с привилегиями суперпользователя.
/* without_sudo.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
system("cat /root/key.txt");
return 0;
}
akshay@bluebox ~ $ ls -l without_sudo.bin
-rwsr-sr-x 1 root root 8677 Feb 1 22:09 without_sudo.bin
akshay @ bluebox ~ $ ./without_sudo.bin
Руид: 1000 Еуид: 0
::: this_is_a_secret_key:::
Когда Real UID
был установлен 0
вместе с Effective UID
используя setreuid(geteuid(), 0);
бинарный файл работал с привилегиями суперпользователя, не запрашивая пароль sudo, даже если был использован sudo
.
/* with_sudo_ruid_elevated.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
setreuid(0, geteuid());
printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
system("/usr/bin/sudo cat /root/key.txt");
return 0;
}
Я читал, что EUID
используется для оценки привилегий процесса для выполнения определенного действия. Тогда почему sudo
запрашивает пароль sudo на основе RUID
даже если EUID
равен 0
?