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
에 추가했습니다 .house
xyz
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는 다른 파일을 루트로 실행할 수 있는 컴파일된 파일에서 작동합니다.