setuid가 작동하지 않는 이유는 무엇입니까? [복사]

setuid가 작동하지 않는 이유는 무엇입니까? [복사]

xyz루트 권한이 있는 사용자 만 내 프로그램을 실행할 수 있도록 하고 싶습니다 . 이를 위해 setuid 비트를 설정했습니다.

chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh

추가적으로 루트만 program1.sh를 실행할 수 있도록 사용자를 그룹 xyz에 추가했습니다 .housexyz

program1.sh에는

id -u

이렇게 하면 유효한 ID가 표시됩니다.

루트로 실행하면 program1.sh표시되지만 root해당 xyz계정을 실행하면 표시됩니다 .xyz. 루트 권한으로 실행되고 있지 않은 것 같습니다. 여기서 무엇이 잘못되었는지 모르겠습니다.

답변1

setuid 비트(예: rwsr-xr-x 권한)를 사용하여 셸 스크립트를 실행할 때 스크립트는 이를 소유한 사용자가 아니라 스크립트를 실행하는 사용자로 실행됩니다. 이는 setuid가 바이너리(예: /usr/bin/passwd)를 처리하는 방식(예: /usr/bin/passwd)과 대조됩니다. 이 바이너리는 실행하는 사용자에 관계없이 바이너리를 소유한 사용자로 실행됩니다.

이 페이지를 확인하세요: https://access.redhat.com/site/solutions/124693

이는 운영 체제에서 취하는 보안 조치입니다. 스크립트를 사용해야합니다스도대신에.

스크립트에서 setuid를 꼭 사용해야 하는 경우 해당 작업을 수행하는 바이너리를 만들 수 있습니다. 새 파일 "program.c"를 만들고 다음 코드를 복사합니다.

   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/types.h>
   #include <unistd.h>
     
   int main()
   {
     setuid(0);
     system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
     return 0;
   }

다음 명령을 사용하여 코드를 컴파일하고 실행합니다.

$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program

그게 다야. setuid는 다른 파일을 루트로 실행할 수 있는 컴파일된 파일에서 작동합니다.

관련 정보