1

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

1 ответ1

3

Это немного сложно.  Ядро операционной системы использует эффективные 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 без с просьбой о дальнейшей аутентификации у вас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .