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
'programing' 카테고리의 다른 글
모든 Excel 시트를 C#의 DataSet으로 가져오는 방법 (0) | 2023.10.10 |
---|---|
이 비트 와이즈 AND 연산자는 어떻게 숫자의 하위 7개 차수 비트를 마스킹합니까? (0) | 2023.10.10 |
mysql 데이터베이스에 몇 개의 테이블을 만들 수 있습니까? (0) | 2023.10.05 |
Python에서 빠른 푸리에 변환 플롯팅 (0) | 2023.10.05 |
사용자 지정 패키지에 대한 Composer 설치 경로 (0) | 2023.10.05 |