Запрашивать пароль 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 без запроса какой-либо дополнительной аутентификации у вас.

Другие вопросы по тегам