У меня есть корневой файл 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 ?
