Насколько я понимаю,
- РУИД: 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: в качестве меры безопасностиbash
2 отменяет привилегии при запуске. (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 или программы с возможностями), поскольку странные значения для некоторых переменных среды могут быть использованы для нарушения целостности системы.