Darwin은 해시뱅 실행 중에 통역사에서 setuid를 제거합니다.

Darwin은 해시뱅 실행 중에 통역사에서 setuid를 제거합니다.

이것은 해시 폭발을 실행하는 방법에 대한 전적으로 문제가 아닙니다.스크립트.

이 경우 해당 u+s권한이 있는(반드시 그런 것은 아님) 해시 폭발 스크립트가 있습니다. 대신, 인터프리터에는 가 있고 u+s스크립트는 해당 인터프리터를 지정합니다: #!/path/to/interpreter.

Mac OS에서는 이 경우 지정된 인터프리터그 자체암시된 setuid가 부여되지 않았습니다.내 자신의직접 실행하는 것과 마찬가지로 권한 비트입니다. 실제 유효 사용자 ID는 해시뱅 스크립트를 실행하는 사용자의 ID입니다.

해결책이 있나요?통역사가 다시 실행되는 것을 포함하지 않습니까?

작업을 다시 실행합니다.

Kazs-Mac-Pro:txr kaz$ uname -a
Darwin Kazs-Mac-Pro.local 11.0.0 Darwin 커널 버전 11.0.0: 2011년 4월 8일 금요일 20:29:42 PDT 루트: xnu-1699.22.36~1/RELEASE_X86_64 x86_64
Kazs-Mac-Pro:txr kaz$ 고양이 setuid.tl
#!./txr --reexec
(입력 라인 `gids:@(getegid)@(getgid)`)
(입력 라인 `uids:@(geteuid)@(getuid)`)
(입력 라인 `groups: @(getgroups)`)
(seteuid 0) ;;가능하지 않으면 던짐
Kazs-Mac-Pro:txr kaz$ ls -l txr setuid.tl
-rwsr-xr-x 1 루트 차크라 163 5월 5일, 15:18 setuid.tl
-rwsr-xr-x 1 루트 차크라 1334500 5월 5일 15:17 txr
Kazs-Mac-Pro:txr kaz$ ./setuid.tl
행 수: 20 20
UID: 0 501
그룹: 20 402 401 12 33 61 79 80 81 98 100 204

하는 일은 --reexec호출 프로그램 execvp의 경로 이름 과 --reexec, poof, setuid 권한이 다시 돌아온 것뿐입니다. 하지만 추악합니다.

그렇지 않은 경우 --rexec동작은 다음과 같습니다.

Kazs-Mac-Pro:txr kaz$ ./setuid.tl
행 수: 20 20
사용자 ID: 501 501
그룹: 20 402 401 12 33 61 79 80 81 98 100 204
./txr: 처리되지 않은 시스템 오류 유형 예외:
./txr: seteuid 실패: 1/"작업이 허용되지 않습니다"
./txr: ./setuid.tl:4 양식 평가 중(seteuid 0)

( u+s시스템 관점에서 볼 때 스크립트에 있는 내용은 관련이 없습니다. 통역사는 이를 스크립트의 소유권과 함께 사용하여 스크립트 setuid를 실행할지 또는 권한을 영구적으로 제거한 다음 실행할지 여부를 결정합니다. 물론 우리는 작업의 인터프리터가 이러한 작업을 수행하고 실행이 요청된 모든 코드에 맹목적으로 높은 권한을 부여하는 것을 모르고 setuid를 사용하고 싶지 않습니다.

답변1

보안상의 이유로 대부분의 Unix 변형은 스크립트에서 setuid를 비활성화합니다. 자세한 내용은 다음을 참조하세요.쉘 스크립트에 setuid 설정 허용

이전 버전의 OS X에는 setuid 스크립트를 허용하는 설정이 있었지만 sysctl kernl.sugid_scripts=1,10.9에는 문서가 표시되지 않습니다.. 아직도 존재하는지는 모르겠지만 문서화되지 않았고, 아직도 존재한다면 안전한지 모르겠습니다.

setuid 스크립트를 실행하는 일반적인 방법은 를 사용하는 것입니다 sudo. 이는 setuid 스크립트의 일부 보안 문제, 특히 환경 정리를 해결할 수 있습니다. sudo 규칙을 추가합니다( visudosudo config 편집 실행).

ALL ALL = (target_user : target_group) /path/to/script

이를 통해 누구나 (모든 매개변수를 사용하여) 실행할 수 있습니다 sudo -u target_user -g target_group /path/to/script …. 첫 번째 항목을 구성원에게만 허용 ALL으로 바꿉니다 .%original_grouporigininal_group

이를 투명하게 하려면 sudo필요에 따라 호출되는 래퍼 스크립트를 작성하세요.

#!/bin/sh
exec sudo -u target_user -g target_group /path/to/script "$@"

관련 정보