인터프리터 바이너리를 setcap하지 않고도 스크립트에서 기능을 사용할 수 있습니까?


14

지금 cap_net_bind_service MY_USERNAME은 /etc/security/capability.conf에서 사용 하고 있습니다.
이제 libcap [-ng]를 통해 효과적인 세트 cap_net_bind_service+i에 추가 할 수 있도록 내가 좋아하는 스크립팅 언어의 인터프리터 를 설정 하면 CAP_NET_BIND_SERVICE됩니다 .

이것은 잘 작동하지만 인터프리터 바이너리에 캡을 설정하지 않고 동일한 것을 달성 할 수있는 방법이 있는지 궁금합니다. 큰 문제는 아니지만 (다른 사용자 계정에는 캡이 없으므로 인터프리터 바이너리에 설정된 비트로도 사용할 수 없습니다) 인터프리터가있을 때마다 플래그를 다시 설정해야하기 때문에 다소 성가시다 업데이트되었습니다.

답변:


4

일반적으로 기능은 자식에게 상속됩니다. 맨 페이지에 명시된 바와 같이 :

fork (2)를 통해 생성 된 자식은 부모 기능 집합의 복사본을 상속합니다.

스크립트의 문제점은 직접 실행할 수 없다는 것입니다. 커널은 검사 목록을 봅니다 (커널 코드는 fs / binfmt _ *. c에 있습니다). 그중 하나는 "binfmt_script.c"입니다. 첫 번째 행에서 shebang을 확인한 다음 스크립트로 인수로 실제 통역사 (shebang에있는 것)를 호출합니다. 따라서 표준 / 공통 인터프리터가 호출되고 단순히 스크립트를 인수로 읽습니다.

즉, 스크립트가 아닌 인터프리터에서 기능을 설정해야합니다. suid비트 및 기타 특수 플래그 에도 동일하게 적용됩니다 .

따라서 통역사 사본을 만들고, 원하는 기능을 설정하고 (chmod / chown을 통해 아무도 접근 할 수 없는지 확인), 복사 된 통역사를 shebang에서 호출하십시오. 스크립트에서 setcap 논리를 수행 할 수도 있습니다.


좋아, 질문이 2 년 전에 요청 된 것을 보지 못했지만 닫히지 않았습니다 ... 또한, unix.stackexchange.com/questions/87348/…
Adrien M.

그러나 i(상속) 만 , exec를 지납니다. 그리고 i자체적으로 아무것도하지 않습니다. 파일에 일치하는 i것이있는 경우에만 작동 하며 e(스크립트 / 실행 파일이 설정하지 않는 한) 비트가 효과적입니다. setuid보다 더 복잡합니다. 이것은 스크립트 효과가 아닙니다.
ctrl-alt-delor

1
쉘이 아니라 커널에서 shebang을 읽은 것으로 생각 했습니까? ( stackoverflow.com/questions/3009192/how-does-the-shebang-work/… )
Philip Couling

당신이 옳았어요. 나중에 이해 한 오해였습니다. 스크립트 실행을위한 커널 코드의 위치에 대한 힌트로 수정했습니다.
Adrien M. 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.