제한된 매개변수/환경/컨텍스트만 사용하여 suid exe를 실행하도록 허용하는 방법은 무엇입니까?

제한된 매개변수/환경/컨텍스트만 사용하여 suid exe를 실행하도록 허용하는 방법은 무엇입니까?

사용자가 특정 매개변수, 환경 변수 설정 및 컨텍스트 설정을 통해서만 실행할 수 있는 suid-to-root 실행 파일이 있습니다. exe를 수정할 수 없습니다.

허용되는 각 매개변수화, 환경 및 컨텍스트 설정에 대해 하나씩 매개변수 없는 스크립트로 exe를 래핑하겠습니다. 문제는 사용자가 이러한 스크립트를 실행할 수 있도록 허용하지만 그렇지 않으면 exe를 실행하지 못하게 하는 방법입니다.

아래에 제안하는 솔루션이나 더 나은 대안에 보안 문제가 있습니까?

polkit이나 sudo가 이 작업을 수행할 수 있는지는 모르겠지만, 방법을 아는 사람이 있다면 관심이 있을 것입니다.

세 가지 해결책이 있습니다.

  1. 마운트 네임스페이스를 사용합니다. exe nosuid를 전역적으로 마운트합니다(euid=0을 실행하지 않는 경우 즉시 종료). 개인 마운트 네임스페이스를 생성하고 exe suid를 다시 마운트합니다. 개인 네임스페이스로 이동하여 권한을 제거하고 스크립트를 실행하는 arg = 래퍼 스크립트 이름으로 작은 suid exe를 작성합니다. 래퍼 스크립트는 모두 전용 디렉터리(/usr/local/bin/safescripts)에 보관되며 새로운 작은 suid exe로 하드코드됩니다. 새 exe는 항상 이 디렉터리의 스크립트만 호출하며 여기에는 다른 내용이 포함되어 있지 않습니다.

  2. "vault" 디렉토리를 사용하십시오. 상위-하위 디렉터리 쌍 /usr/local/lock 및 /usr/local/lock/vault를 만듭니다. 둘 다 root:root가 소유하고 있으며 /usr/local/lock은 750, /usr/local/lock/vault는 755입니다. 사용자는 도움 없이는 금고에 들어갈 수 없습니다. 하지만 일단 Vault에 들어가면 사용자는 해당 콘텐츠에 액세스할 수 있습니다. 원본 suid exe를 /usr/local/lock/vault로 이동합니다. 스크립트 중 하나인 chdirs의 기본 이름을 /usr/local/lock/vault로 가져와 권한을 제거하고 스크립트를 실행하는 작은 suid exe를 작성합니다. 래퍼 스크립트의 설정은 1과 동일하지만 cwd(라이브러리)에 남아 있는 동안 "./" 접두사가 붙은 경로 이름을 사용하여 원본 exe를 호출해야 합니다.

  3. 높은 권한(euid=0)으로 전환합니다. 원본 exe에서 suid 비트를 제거합니다. 스크립트 중 하나(예: 위의 1 및 2)의 기본 이름을 취하고 권한을 제거하지 않고(#!/bin/bash -p가 있어야 함) 해당 스크립트를 호출하고 원래 exe 자체를 제거할 수 있는 작은 suid exe를 작성하면 권한이 있습니다.

스크립트를 포함하여 많은 것들이 euid=0에서 실행되기 때문에 3은 너무 위험하다고 생각합니다.

1과 2의 작은 실행 파일을 비교하면 2는 euid=0인 chdir만 수행하는 반면(얼마나 나쁜가요?) 1은 바인드 마운트된 suid 네임스페이스를 열고 setns를 해당 fd로 설정합니다. 여전히 작지만 결과는 더 복잡합니다. 또한 1의 설정에는 suid 마운트 네임스페이스를 생성하고 이를 어딘가에 바인드 마운트하는 서비스도 필요합니다. 많지는 않지만 뭔가. 또는 새 exe가 마운트 네임스페이스 자체를 생성할 수 있지만 이로 인해 상황이 더 복잡해집니다. 높은 권한으로 unshare 및 mount를 호출해야 하며 둘 다 open 및 setns보다 더 많은 옵션이 있습니다.

나는 볼트 설정이 투박해 보이지만 가장 안전하고 쉬운 것 같은 2쪽으로 기울고 있습니다. 누군가가 더 나은 접근 방식을 제공하거나 2의 문제를 볼 수 없다면.

답변1

네임스페이스 마운트는 작동하지만 필요 이상으로 복잡합니다.

잠금/볼트 디렉토리 트릭은 안전하지 않습니다. 볼트 내 프로세스의 /proc/PID/cwd 매직 심볼릭 링크를 통해 다른 프로세스가 볼트에 들어갈 수 있기 때문입니다(동일한 uid/gid가 있는 경우).

솔루션 3과 유사하지만 대신 sgid를 사용합니다. 작은 sgid exe를 작성합니다. 구성원이 없는 전용 시스템 그룹을 사용합니다. 이를 mygr이라고 합니다. 원래 suid exe를 root:mygr 4750으로 변경합니다. 이제 원본 suid exe는 mygr의 구성원에 의해서만 호출될 수 있으며 이는 새로운 작은 sgid-to-mygr을 호출하는 것에 지나지 않습니다. 새로운 작은 sgid exe는 여전히 suid exe의 사용을 제어하여 허용되는 몇 가지 대상 스크립트 중 하나를 실행합니다. 원래 suid exe는 완전히 일반적인 방식(선택됨)으로 권한을 제거하기 때문에 egid를 다시 rgid로 설정하고 euid를 다시 ruid로 설정하므로 egid=mygr은 일시적입니다.

대상 suid exe를 실행하기 전에 egid=mygr이 실행 취소되지 않도록 스크립트는 여전히 #!/bin/bash -p여야 합니다.

새로운 작은 exe는 쓸모없는 그룹(mygr)에 sgid되어 있기 때문에 권한 상승을 위해 악용될 가능성은 루트에 있는 경우보다 훨씬 적습니다.

관련 정보