В чем смысл использования EUID? Если RUID и EUID процесса равны 1000, 0 и если мы запускаем любую команду, то она запускается с уровнем привилегий 1000, почему?

В чем смысл использования EUID? Если RUID и EUID процесса равны 1000, 0 и если мы запускаем любую команду, то она запускается с уровнем привилегий 1000, почему?

Насколько я понимаю,

  • РУИД: uid вызывающего процесса называется реальным uid.
  • EUID: эффективный uid означает разрешенные привилегии для этого процесса.
// setuid_file.c
#include<stdio.h>
int main(void)
{
        int uid;
        uid=getuid();
        printf("RUID : getuid() : %d\n",uid);
        uid=geteuid();
        printf("EUID : geteuid() : %d\n",uid);

        system("whoami");
        system("cat /etc/sudoers"); //only root user can access. here we can write any command which only root user can execute.
}
 
gcc setuid_file.c -o euid_zero
chmod ug+s euid_zero

Итак, на терминале root я установил suid и guid для исполняемого файла euid_zero. Теперь, если я попытаюсь запустить исполняемый файл с помощью обычного пользователя, то ниже приведен вывод.

ll euid_zero
-rwsr-sr-x 1 root root 16768 Dec 30 00:59 euid_zero

whoami
kali

id
uid=1000(kali) gid=1000(kali) groups=1000(kali)

./euid_zero

RUID : getuid() : 1000
EUID : geteuid() : 0
kali
cat: /etc/sudoers: Permission denied
                                      

Итак, здесь EUID равен нулю, тогда мы также не можем получить привилегии root. Итак, это означает, что у нас есть привилегия доступа согласно RUID, тогда в чем смысл EUID, если EUID не используется?

решение1

Это позволяет процессувременноповышать и понижать привилегии по мере необходимости.

Например, файл-серверный демон (smbd, ftpd) запускается как root, но затем устанавливает seteuid() на EUID вошедшего в систему пользователя. Теперь он может работать большую часть времени с EUID вошедшего в систему пользователя, позволяя ядру применять проверки доступа к файлам, но при этом иметь возможность повышать свои привилегии обратно до EUID 0 для определенных операций.

Но учтите, что при использовании system(), команда вызывается через /bin/sh,и оболочка Bash намеренно снижает привилегиивсякий раз, когда он обнаруживает несоответствие UID/EUID. Ваш собственный процесс setuidмогна самом деле /etc/shadowвсе нормально открывается — не смогут этого сделать только инструменты, запущенные через system().

Если вы замените все вызовы system() на fork+exec или даже на простой open("/etc/shadow", O_RDONLY), вы увидите, что наличие RUID=1000, но EUID=0 позволяет вам получить доступ к файлу. (Кроме того, вы также увидите idсообщение об обоих наборах UID/GID.)

решение2

В целом EUID сам по себе работает так, как вы ожидаете, "проблема" здесь с system(3)и shего использованием. Смотрите руководство (man 3 system):

system()Фактически, не будет работать должным образом из программ с привилегиями set-user-ID или set-group-ID в системах, на которых /bin/shустановлена bash​​версия 2: в качестве меры безопасности bash2 отменяет привилегии при запуске. (Debian использует другую оболочку, dash(1), которая не делает этого при вызове как sh.)

Оказывается, руководство неактуально. В настоящее времяdashведет себя какbash. Честно говоря, я не знаю, какую оболочку использует ваша ОС sh(вы отметили, Ubuntu использует dash; но kaliв вашем вопросе может предполагаться Kali, я не уверен, что Kali использует). Проверьте с ls -l /bin/sh, это, вероятно dash. Независимо от того, что это, скорее всего, он роняет привилегии, и это причина того, что Permission deniedвы наблюдали.

Даже если вы shне сбросили привилегии, system()это не было бы хорошей идеей. В уже указанном руководстве это явно не рекомендуется:

Не используйте system()из привилегированной программы (программы set-user-ID или set-group-ID или программы с возможностями), поскольку странные значения для некоторых переменных среды могут быть использованы для нарушения целостности системы.

Связанный контент