그룹 멤버쉽 및 setuid / setgid 프로세스


10

프로세스 드 이관을 통해 권한 setuid()setgid()uid가 / GID가 설정의 그룹 구성원을 상속하지 않는 것.

권한있는 포트를 열려면 루트로 실행해야하는 서버 프로세스가 있습니다. 특정 행 그것은 그 역 이관 후에 비 privilleged UID / GID, 1 - 예를 들어, 사용자의 fooUID (73). 사용자 foo는 그룹의 구성원입니다 bar.

> cat /etc/group | grep bar
bar:x:54:foo

따라서로 로그인하면 다음 특성을 가진 foo파일 /test.txt을 읽을 수 있습니다 .

> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar  8 16:22 /test.txt

그러나 std=gnu99루트를 실행할 때 다음 C 프로그램 (compile ) :

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main (void) {
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}   

항상 권한 거부가보고 됩니다. 나는 이것이 비 로그인 프로세스와 관련이 있다고 생각하지만 권한이 작동하는 방식과 같은 종류의 햄스트링입니다.


1. 서버에 자주 사용되는 SOP인데, 아파치와 함께하는 누군가 의 보고서 를 찾았을 때이 문제를 해결할 방법이 있어야한다고 생각합니다. 아파치가 오디오 그룹에 추가되어 사운드 시스템을 사용할 수 있습니다. 물론 이것은 원래 프로세스가 아닌 포크에서 발생할 수 있지만 실제로는 내 상황에서 동일합니다 (setuid 호출 후 포크되는 하위 프로세스입니다).


setuid()/ setgid()통화를 전환하십시오 .
vonbrand

@vonbrand ROTFL 나는 거기에 페이스 팜에 있다고 생각했지만 동일한 결과이므로 빨간색 청어를 제거하기 위해 질문을 편집 할 것입니다.
goldilocks

1
setgid(54)대신 setgid(73)(에서 /etc/groups와 같이 그룹 bar에 gid 54가 있음) 대신 사용 하면 작동합니까?
lgeorget

@lgeorget는 물론 그 목적을 무너 뜨립니다. 프로세스는 다른 이유로 자체 GID가 필요하며, 마찬가지로 해당 파일에 권한이 있어야합니다. 예를 들어, 당신이 경우 어떻게 - 그룹 복수의 구성원이 필요한 이유 사용자가 필요로이 작업을 수행 할 수있다. 당신은 할 수 없습니다 setuid()흠 ... 난 당신이 할 수있는 생각, 당신이 그것을 다시 후 ...하지만 seteuid()...
금발 미녀

1
내 질문은 어딘가에 숨겨진 다른 미묘한 문제가 없는지 확인하는 것이 었습니다. :-)
lgeorget

답변:


14

문제는이다 setuid하고이 setgid 프로세스에게 그것이 필요로하는 모든 자격 증명을 제공하기에 충분하지 않다. 프로세스의 권한은

  • UID
  • 그 GID
  • 보충 그룹
  • 그 기능.

man 7 credentials더 자세한 개요를 얻으려면 참조하십시오 . 따라서 귀하의 경우 문제는 UID와 GID를 올바르게 설정하지만 프로세스의 보충 그룹을 설정하지 않는다는 것입니다. 그리고 그룹 bar에는 GID 54가 있고 73이 없으므로 프로세스가 속한 그룹으로 인식되지 않습니다.

당신은해야

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>

int main (void) {
    gid_t supplementary_groups[] = {54};

    setgroups(1, supplementary_groups);
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}  

1
그것은 많은 사람들에게 실제로 유용 할 수 있기 때문에 더 많은 투표를 받아야 할 흥미로운 질문이었습니다. :-)
lgeorget

그래서 직렬 포트와 비슷한 문제가있었습니다. 나는 dialout그룹을 위해 이것을 구현 했고 처음으로 일했다.
tl8

0

좋아, 그물 주위를 약간 트롤링했다. 나는 처음에 APUE 가 모든 답을 보유 할 것이라고 생각 했지만 실수했습니다. 그리고 제 사본 (구판)이 작동하고 있습니다. 유닉스와 리눅스 관리 핸드북 5 장은 유망 해 보이지만 그것을 얻지 못했습니다.

내가 찾은 작은 자료 ( "daemon writing unix"용 Google)는 모두 tty와의 분리 방법과 같은 중요한 단계에 대해 이야기하지만 UID / GID에 대해서는 아무것도 없습니다. 이상하게도 http://tldp.org 의 광범위한 HOWTO 컬렉션조차도 세부 사항이없는 것 같습니다. 제이슨 쇼트 (Jason Short)의 리눅스 데몬 ( London Daemon)-1 부 . SUID / SGID와 그 혼란이 어떻게 작동하는지에 대한 자세한 내용은 Chen, Wagner 및 Dean의 SUID를 미 신화했습니다 (USENIX 2002의 논문). 그러나 Linux에는 추가 UID 인 FSUID가 있습니다 (Wolter의 Unix 비 호환성 노트 : 토론에 대한 UID 설정 기능 참조 ).

프로세스를 데몬 화하는 것은 희미한 마음을위한 것이 아닙니다. 일반적인 보안 고려 사항은 D. Wheeler의 Linux 및 Unix HOWTO 용 보안 프로그래밍-보안 소프트웨어 만들기에 나와 있습니다. Systemd 는 그 대부분을 단순화하고 (따라서 보안 문제를 일으키는 실수에 대한 공간을 줄이겠다 고 약속합니다 .) 데몬 매뉴얼을 참조하십시오 .


1
문제는 데몬 화에 관한 것이 아닙니다. 프로세스에 실행 파일 소유자의 권한을 부여하는 SUID 비트와 setuid()프로세스를 임의로 혼동하여 UID를 임의로 변경할 수 있습니다. SUID는 일반적으로 권한 에스컬레이션 (비 privilleged-> privilleged) 을 허용하는 반면 setuid()반대의 경우에만 가능합니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.