실행 파일에서 setgid의 의미

실행 파일에서 setgid의 의미

나는 setuid바이너리 실행 파일을 통해 프로세스가 바이너리 소유자의 유효한 uid를 얻을 수 있다는 것을 발견했습니다. 내가 이해할 수 없는 것은 특정 실행 파일의 setuid비트가 꺼져 있는데 setgid비트가 켜져 있는 경우 어떤 일이 발생하는지입니다. 이 상황에서는 어떻게 되나요?

예: 다음 권한이 있다고 가정합니다.

ls -l my_bin
r-xr-s--- root wheel my_bin

이제 사용자가 userA그룹의 구성원이라고 가정합니다 wheel. 이 프로그램을 실행하려고 하면 userA어떻게 되나요 ?

프로세스의 유효 사용자 ID는 uid이름이 지정된 사용자와 동일 할 것이라고 가정합니다 wheel. 이것은 인위적인 예이지만 그룹 권한이 유효 uid를 어떻게 변경하는지 또는 유효 uid에 어떤 영향을 미치는지 혼란스럽습니다.

답변1

setgid 비트는 setuid 비트와 동일하게 작동하지만 그룹 ID에 대해 작동합니다. 따라서 프로세스는 효율적인 방식으로 실행됩니다.그룹휠 ID. 유효한(그리고 사실)사용자ID는 여전히 프로그램을 시작한 사용자의 ID입니다.

어느 쪽이든 사용자의 그룹 멤버십은 중요하지 않습니다.

편집: 샘플 C 프로그램을 사용하여 어떻게 작동하는지 시험해 볼 수 있습니다. 이식성은 없지만 다른 시스템에 채택하기 쉽습니다.

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>

int main() {
    int ruid, euid, suid;
    int rgid, egid, sgid;

    if (0 != getresuid(&ruid, &euid, &suid)) {
        perror("getresuid");
        return 1;
    }
    if (0 != getresgid(&rgid, &egid, &sgid)) {
        perror("getresgid");
        return 1;
    }
    printf("ruid = %i, euid = %i, suid = %i\nrgid = %i, egid = %i, sgid = %i\n",
            ruid, euid, suid, rgid, egid, sgid);
    return 0;
}

답변2

setgid 비트는 디렉토리에서도 작동합니다. 디렉토리에 setgid 비트가 있고 그룹 쓰기가 가능한 경우, 다른 기본 그룹(디렉토리 소유자가 아닌)의 사용자가 디렉토리에 파일을 쓰지만 디렉토리를 소유하는 그룹에 추가 멤버십이 있는 경우 새 파일은 디렉터리와 동일한 그룹 소유권을 갖게 됩니다. 파일을 쓰는 사용자의 기본 그룹이 아닙니다. 어떤 상황에서는 매우 편리합니다.

예를 들어 foo와 bar라는 두 명의 사용자가 있습니다. foo의 기본 그룹도 foo입니다. bar의 기본 그룹은 bar이지만 foo의 보조 멤버이기도 합니다.

foo@valhalla:~$ id
uid=1002(foo) gid=1002(foo) groups=1002(foo)

bar@valhalla:~$ id
uid=1003(bar) gid=1003(bar) groups=1003(bar),1002(foo)

foo@valhalla:~$ grep foo /etc/group
foo:x:1002:bar
foo@valhalla:~$ grep bar /etc/group
foo:x:1002:bar
bar:x:1003:

/tmp/foodir 디렉토리를 생성하고 setgid 및 그룹 쓰기 가능으로 설정하겠습니다.

foo@valhalla:~$ mkdir /tmp/foodir
foo@valhalla:~$ chmod g+ws /tmp/foodir
foo@valhalla:~$ ls -ld /tmp/foodir
drwxrwsr-x 2 foo foo 4096 Jun  6 19:30 /tmp/foodir

이제 사용자 표시줄로 /tmp/foodir에 있는 파일을 터치하겠습니다.

bar@valhalla:~$ touch /tmp/foodir/barfile
bar@valhalla:~$ ls -l /tmp/foodir/barfile 
-rw-r--r-- 1 bar foo 0 Jun  6 19:32 /tmp/foodir/barfile

/tmp/foodir/barfile의 그룹 소유권은 사용자 bar의 기본 그룹 bar가 아니라 foo입니다.

이제 우리는 반대 접근 방식을 시도하지만 foo는 bar 그룹의 구성원이 아닙니다.

bar@valhalla:~$ mkdir /tmp/bardir
bar@valhalla:~$ chmod g+ws /tmp/bardir
bar@valhalla:~$ ls -ld /tmp/bardir
drwxrwsr-x 2 bar bar 4096 Jun  6 19:34 /tmp/bardir

foo로 파일을 터치하려고 하면 어떤 일이 발생하는지 확인하세요. 이것이 바로 권한 오류입니다.

foo@valhalla:~$ touch /tmp/bardir/foofile
touch: cannot touch '/tmp/bardir/foofile': Permission denied

마지막 단계. 우리는 /tmp(bar가 쓸 수 있는 설정되지 않은 gid 디렉토리)의 파일을 bar로 사용합니다.

 bar@valhalla:~$ ls -ld /tmp/barfile
-rw-r--r-- 1 bar bar 0 Jun  6 19:36 /tmp/barfile

소유자와 그룹 모두 바입니다.

관련 정보