리눅스 setuid가 작동하지 않습니다

리눅스 setuid가 작동하지 않습니다

나는 Linux suid를 배우고 있으므로 테스트하기 위해 다음을 포함하는 작은 C 프로그램을 작성했습니다.

#include<stdio.h>
int main(){
system("echo 100 >> test.txt");
return 0;
}
-rwsr-xr-x 1 root root 8004 Sep 10 16:19 test

test.txt루트만 수정할 수 있는 파일입니다.

-rw-r----- 1 root root 

100사용자 계정을 사용하여 테스트 프로그램을 실행하면 빈 파일에 추가되어야 합니다 . 그러나 결과는 다음과 같이 나왔습니다.

sh:test.txt:Permission denied

왜?

답변1

귀하의 시나리오는 저에게 완벽하게 작동합니다.

$ ls -l test*
-rwsr-xr-x 1 root  root  6776 Jan 24 17:18 test
-rw-r--r-- 1 chris chris   74 Jan 24 17:18 test.c
-rw-r----- 1 root  root     0 Jan 24 17:20 test.txt
$ ./test
ls -l test.txt
-rw-r----- 1 root root 4 Jan 24 17:21 test.txt
$ sudo cat test.txt
100

setuid 실행 파일을 허용하지 않는 파일 시스템에서 프로그램을 테스트하는 것이 가능합니까? 명령을 실행 하고 다음과 같이 mount파일 시스템에 대해 찾습니다 .nosuid

tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime)

답변2

문제는 함수를 호출하면 system()쉘이 호출된다는 것입니다 /bin/sh. 그리고 쉘은 /bin/shsuid 비트를 설정하지 않습니다. 이것이 바로 Permission denied메시지가 인쇄되는 이유입니다.

이 부분은 순수 C 코드로 작성해야 합니다.

int main() {
  FILE *fd = fopen("test.txt", "a");
  fprintf(fd, "%s", "100");
  fclose(fd);
  return 0;
}

관련 정보