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

그래서 루트 터미널에서 euid_zero 실행 파일에 대해 suid와 guid를 설정했습니다. 이제 일반 사용자를 사용하여 실행 파일을 실행하려고 하면 아래에 출력이 표시됩니다.

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가 0이면 루트 권한을 얻을 수도 없습니다. 그렇다면 이는 RUID에 따라 접근 권한이 있다는 뜻인데, EUID를 사용하지 않는다면 EUID의 의미는 무엇입니까?

답변1

이는 프로세스를 다음과 같이 허용합니다.일시적으로필요에 따라 권한을 높이거나 낮춥니다.

예를 들어, 파일 서버 데몬(smbd, ftpd)은 루트로 시작하지만 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()실제로 버전 2 /bin/sh인 시스템에서 set-user-ID 또는 set-group-ID 권한이 있는 프로그램에서는 제대로 작동하지 않습니다 bash. 보안 조치로 bash2는 시작 시 권한을 삭제합니다. (데비안은 다른 쉘인 를 사용하는데, dash(1)이는 로 호출될 때 이 작업을 수행하지 않습니다 sh.)

매뉴얼이 최신이 아닌 것으로 나타났습니다. 요즘에는dash다음과 같이 행동한다bash. 솔직히 말해서 귀하의 OS가 어떤 쉘을 사용하는지 모르겠습니다 sh(당신이 태그했습니다)., 우분투는 dash; 그러나 kali귀하의 질문에서 Kali를 제안할 수 있습니다. Kali가 무엇을 사용하는지 잘 모르겠습니다.) 으로 확인해보세요 . ls -l /bin/sh아마도 입니다 dash. 그것이 무엇이든 관계없이 권한이 박탈될 가능성이 높으며 이것이 귀하가 관찰한 이유입니다 Permission denied.

sh권한을 삭제하지 않더라도 좋은 system()생각은 아닙니다. 이미 링크된 매뉴얼에서는 명시적으로 이를 권장하지 않습니다.

system()일부 환경 변수에 대한 이상한 값이 시스템 무결성을 파괴하는 데 사용될 수 있으므로 권한이 있는 프로그램(set-user-ID 또는 set-group-ID 프로그램 또는 기능이 있는 프로그램)에서는 사용하지 마십시오 .

관련 정보