나는 이 놀라운 책을 넘기고 있다 The Linux Programming Interface
. 15장, 섹션 15.4, 304페이지는 다음과 같습니다.
그렇기 때문에 권한이 없는 프로세스(권한이 없는 프로세스)가 실행될 때CAP_FSETID파일의 그룹 ID가 프로세스의 유효 그룹 ID 또는 보조 그룹 ID(또는 기능)와 동일하지 않으면
chmod()
커널은 항상 set-group-ID 권한 비트를 지웁니다 .fchmod()
이는 사용자가 자신이 구성원이 아닌 그룹에 대해 그룹 ID 설정 프로그램을 생성하는 것을 방지하기 위한 보안 조치입니다.
이 경우 권한이 없는 프로세스가 파일 생성 중에 mode
매개변수에 set-group-ID 플래그를 지정할 수 있다고 생각됩니다 open()
. 이 경우 커널은 set-group-ID 비트를 지우지 않습니다. 내가 이해하는 한, 커널은 위에서 언급한 이유로 이 작업을 수행해야 합니다. 이 동작은 왜 에만 적용됩니까 chmod()
?
답변1
핵심그룹 실행 권한과 함께 사용되는 경우 이 플래그를 지웁니다.. 다음 프로그램을 사용하여 이를 테스트할 수 있습니다.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc < 2) {
exit(1);
}
if (open(argv[1], O_RDWR | O_CREAT, 02755) < 0) {
perror("open");
}
}
디렉토리를 생성하고 이를 귀하의 그룹으로 변경하세요아니요여기서 생성된 파일이 해당 그룹의 소유가 되도록 setgid로 설정합니다. 그런 다음 위 프로그램을 실행하여 실행 파일을 생성하면 권한이 2755가 아닌 755로 끝나는 것을 볼 수 있습니다.
프로그램의 권한을 02644로 변경하면 결과 파일은 권한 2644를 갖게 되지만 이는 Linux에 아무런 도움이 되지 않습니다.