programing

setuid root C 프로그램에서 스크립트 호출 - 스크립트가 root으로 실행되지 않음

topblog 2023. 10. 5. 21:06
반응형

setuid root C 프로그램에서 스크립트 호출 - 스크립트가 root으로 실행되지 않음

bash 스크립트를 root(암호가 없는 sudo 또는 su가 실행 가능하지 않음)으로 실행해야 하는데 Linux에서는 스크립트를 setuid로 설정할 수 없기 때문에 실행 파일에서 호출하여 setuid로 만들까 생각했습니다.

$ cat wrapper.c
int main(void)
{
        system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$

스크립트를 올바르게 실행하는 것처럼 작동하지만 스크립트는 "/wrapper"를 실행하는 사용자로 실행됩니다.

왜죠? 그리고 어떻게 하면 이를 올바르게 구현할 수 있을까요?

감사합니다!

그 이후로suid실행 파일에 대한 비트는 실행 파일이 실행될 유효 UID(EUID)만 변경하고 실제 UID(RUID)는 변경하지 않습니다.getuid()반환 및 에 대한 제한 외에suid인터프리티드 스크립트("로 시작하는 모든 실행 파일#!"), 등의 조개껍질.bash이 경우 EUID를 RUID로 다시 설정하는 추가적인 안전 조치가 이루어지므로 통화를 사용해야 합니다.setuid(0)스크립트를 실행하기 전에 C 코드에 입력합니다.

참조.man페이지들setuid,seteuid,getuid,그리고.geteuid실제적이고 효과적인 UID의 정확한 의미론을 학습합니다.

(WARNING) 물론, 이것은 다음과 같은 제한을 언급하기에 적절한 지점입니다.suid많은 유닉스 시스템, 셸 및 인터프리터에 스크립트가 존재하는 이유는 스크립트가 실행될 때 입력 및 환경 상태를 검사하는 데 매우 신중하지 않으면 위험하고 보안 상승에 악용될 수 있기 때문입니다.그래서 이 작업을 할 때는 매우 조심해야 합니다.스크립트와 래퍼에 대한 액세스를 가능한 한 엄격하게 설정하고 실행하려는 이 매우 특정한 스크립트만 허용하며 스크립트를 시작하기 전에 C 프로그램 내의 환경을 지우고 다음과 같은 환경 변수를 설정합니다.PATH올바른 순서로 필요한 것을 정확하게 포함하고 다른 사람이 쓸 수 있는 디렉토리는 포함하지 않습니다.

여기서 또 하나 주목할 점은 여기서의 한계는 *nix 시스템 자체가 아니라 bash에서 비롯되었다는 것입니다.Bash는 실제로 SUID 스크립트에 대한 검증을 수행하여 EUID 루트로만 실행합니다.오래된 껍질을 벗기면 상자에서 원하는 것을 얻을 수 있습니다.예를 들어, sh는 다음과 같은 종류의 검증을 하지 않습니다.

$ cat wrapper.c
int main(void)
{
            system("/bin/sh -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:15 wrapper
$ ./wrapper
root

배시 포함:

$ cat wrapper.c
int main(void)
{
            system("/bin/bash -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:18 wrapper
$ ./wrapper
skinp

그럼에도 불구하고 톰의 대답은 일반적으로 SUID 루트 프로그램을 위한 래퍼를 만드는 방법입니다.

스크립트에 setuid(0)을 추가하고 준수합니다.이 후에 작동할 것입니다.

$ cat wrapper.c 
int main(void) 
{ 
        setuid(0);
        system("/bin/bash ./should_run_as_root.sh"); 
} 
$ gcc -o wrapper wrapper.c 
$ sudo chown root wrapper 
$ sudo chmod ug+s wrapper 
$ ll wrapper 
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper 
$ 

이 예들은 심각하게 안전하지 않으며 두 가지 지식을 가진 사람이라면 누구나 setuid 사용자로서 자신이 원하는 프로그램을 실행할 수 있습니다.

환경을 먼저 검사하지 않는 한 셸을 통과하지 마십시오. 여기에 표시된 대부분의 예제는 IFS 및 PATH를 실행하기 전에 설정하는 것에 취약합니다.

왜 sudo는 실행가능하지 않습니까?다음과 같은 심각한 보안 문제를 방지할 수 있습니다.

bash-3.2$ cat test
#!/bin/bash
echo ima shell script durp durp
bash-3.2$ chmod +x test
bash-3.2$ ./test
heh heh
bash-3.2$ 

환경이 적절하게 위생되지 않기 때문에(예: 이 경우):

export echo='() { builtin echo heh heh; }'

sudo는 이 케이스와 다른 엣지 케이스와 gotchas를 소독합니다. 그것은 맞춤형 suid 포장지에 쓰지 않는 것이 좋을 것입니다.

언급URL : https://stackoverflow.com/questions/556194/calling-a-script-from-a-setuid-root-c-program-script-does-not-run-as-root

반응형