setUid 루트 C 프로그램에서 스크립트 호출 - 스크립트는 루트로 실행되지 않습니다.

StackOverflow https://stackoverflow.com/questions/556194

  •  05-09-2019
  •  | 
  •  

문제

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를 소독합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top