setUid 루트 C 프로그램에서 스크립트 호출 - 스크립트는 루트로 실행되지 않습니다.
문제
Bash 스크립트를 루트 (Passwordless Sudo 또는 Su는 실용적이지 않음)로 실행해야하며 Linux에서 스크립트를 설정할 수 없으므로 실행 파일에서 전화를 걸고 제작하는 것에 대해 생각했습니다. 그것 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) 만 변경합니다. getuid()
반환 및 제한 외에도 suid
해석 된 스크립트 (#!
"), 일부 껍질이 좋아요 bash
추가 안전 조치 가이 경우 EUID를 RUID로 되돌릴 것이므로 전화를 사용해야합니다. setuid(0)
스크립트를 실행하기 전에 C 코드에서
참조 man
페이지의 페이지 setuid
, seteuid
, getuid
, 그리고 geteuid
실제적이고 효과적인 UID의 정확한 의미를 배우기 위해.
(경고) 물론 이것은 제한이 suid
많은 UNIX 시스템, 쉘 및 통역사의 스크립트는 이유가 있습니다. 즉, 스크립트가 입력과 환경 상태를 실행할 때 환경 상태를 소독하는 데 신중하지 않으면 위험하고 보안 에스컬레이션을 위해 악용 될 수 있기 때문입니다. . 이 작업을 수행 할 때 매우 조심하십시오. 스크립트와 래퍼에 대한 액세스를 최대한 엄격하게 설정하고 실행하려는 매우 특정 스크립트 만 허용하고 스크립트를 시작하기 전에 C 프로그램 내에서 환경을 지우고 다음과 같은 환경 변수를 설정하십시오. PATH
올바른 순서로 필요한 것을 정확히 포함하고 다른 사람에게 쓸 수있는 디렉토리가 없습니다.
다른 팁
여기서 주목해야 할 또 다른 사항은 여기서 제한이 *닉스 시스템 자체가 아니라 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
Bash와 함께 :
$ 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
그럼에도 불구하고 Tom의 답변은 일반적으로 Suid Root 프로그램을위한 래퍼를 만드는 방법입니다.
스크립트에 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와 경로를 실행하기 전에 설정하는 데 취약합니다.
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를 소독합니다.