Запрашивать пароль sudo в корневом каталоге setuid
У меня есть корень двоичного файла 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
is used to evaluate privileges of the process to perform a particular action. Then why is sudo
prompting for sudo password based on the RUID
even when the EUID
является 0
?
1 ответ
Это немного сложно. Ядро операционной системы использует эффективные UID и GID процесса для определения его привилегий / полномочий; они используются для
- разрешение / запрещение обычных операций файловой системы (например, open, link / unlink) на основе правил пользователя / группы / других,
- настройка владельца вновь создаваемых файлов,
- определение того, на какие другие процессы процесс может отправлять сигналы, и
- решить, может ли процесс монтировать и размонтировать файловые системы, изменить дату, завершить работу системы и т. д.
и, вероятно, другие вещи. Но подвох в том, что когда программе необходимо принять какое-то решение о доступе / авторизации, ей обычно нужно использовать реальные UID и GID. Подумайте: когда ваш with_sudo.c
программа выполняется sudo
эффективный UID - это root (0), а реальный UID - это вы (1000), как продемонстрировали ваши printf
, Но это точно так же, как то, что происходит, если вы запускаете sudo
из непривилегированной оболочки. Всякий раз, когда sudo
работает, эффективный UID 0 - так sudo
не могу использовать это, чтобы решить, как себя вести. Он должен использовать реальный UID, чтобы выяснить, кто вы на самом деле, чтобы он мог определить, что вам разрешено делать в sudo
, Только если реальный UID равен 0, sudo
сделать вывод, что вы "действительно" являетесь пользователем root или, по крайней мере, он не может надежно определить вашу настоящую личность, поэтому он не знает, какие ограничения к вам применяются, и просто выполняет cat
без запроса какой-либо дополнительной аутентификации у вас.