capsh를 사용하는 방법 : 최소한의 기능으로 권한이없는 ping을 실행하려고합니다.


13

Debian Gnu / Linux에서 기능을 실험하고 있습니다.

/ bin / ping을 현재 작업 디렉토리에 복사했습니다. 예상대로 작동하지 않아 원래 setuid 루트였습니다.

그런 다음을 수행하여 핑에 최소한의 기능 (루트가 아닌)을 제공하고 sudo /sbin/setcap cap_net_raw=ep ./ping예상대로 핑이 작동합니다.

그런 다음 sudo /sbin/setcap -r ./ping해당 기능을 취소하십시오. 이제 예상대로 작동하지 않습니다.

이제을 사용하여 ping 작업을 시도합니다 capsh.

capsh 권한이 없으므로 루트로 실행해야하지만 루트와 다른 모든 권한을 삭제하십시오.

나는 또한 필요하다고 생각한다 secure-keep-caps.이 문서화되어 있지 capsh않지만 기능 매뉴얼에있다. 에서 비트 번호를 받았습니다 /usr/include/linux/securebits.h. 출력에 --print이러한 비트가 올바른 것으로 표시 되므로 올바른 것으로 보입니다 .

나는 몇 시간 동안 애 쓰고 있었고 지금까지 나는 이것을 가지고있다.

sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"

그러나의 ping오류 ping: icmp open socket: Operation not permitted는 기능이없는 경우에 발생합니다. 또한 --printCurrent: =p cap_net_raw+i는 이것으로 충분하지 않습니다 e.

sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"이 기능을 Current: = cap_net_raw+eip올바르게 설정 하지만 우리를로 남겨 둡니다 root.

편집 -1

나는 지금 시도했다 sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"

이것은 다음을 생성합니다.

touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted

첫 번째 오류는 예상되지만 두 번째 오류 secure-noroot: yes 는 아닙니다Current: = cap_net_raw+eip

편집 -2

==앞에 두면 --print이제가 표시 Current: = cap_net_raw+i되어 이전 오류를 설명하지만 루트에서 전환 할 때 기능을 잃어 버린 이유는 아닙니다 secure-keep-caps. 하지만 해결해야합니다.

편집 -3

내가 볼 수 있듯이 exec가 호출 될 때 Effective (e) 및 Permitted (p)를 잃어 버렸습니다. 이것은 예상되지만 보안 유지 캡이 손실을 막아야한다고 생각했습니다. 뭔가 빠졌습니까?

편집 -4

더 많은 연구를하고 매뉴얼을 다시 읽었습니다. 다음 e과 같은 경우에는 일반적으로 p기능이 손실되는 것 같습니다. 사용자에서 전환 root하거나 적용 secure-noroot하여 루트를 일반 사용자로 만드는 경우 이는 다음으로 대체 될 수 있습니다 secure-keep-caps. 당신이 전화 할 때 exec, 이것이 변하지 않는 것을 말할 수있는 한.

내가 알 수있는 한, 그것은 매뉴얼에 따라 작동합니다. 내가 알 수있는 한 유용한 기능을 수행 할 수있는 방법이 없습니다 capsh. 내가 알 수있는 한, 기능을 사용하려면 다음을 수행해야합니다. 파일 기능을 사용하거나 사용하지 않는 기능 인식 프로그램이 있어야합니다 exec. 따라서 권한있는 래퍼가 없습니다.

그래서 지금 내 질문은 내가 뭘 놓쳤는 지, 무엇을 capsh위한 것입니다.

편집 -5

주변 기능에 대한 답변을 추가했습니다. 어쩌면 capsh또한 상속 기능을 사용할 수 있지만 이러한 실행 파일에 설정 될 필요가 유용 할 수 있습니다. 주변 기능이 없거나 상속 된 기능을 허용하지 않고 capsh가 유용한 기능을 수행하는 방법을 알 수 없습니다.


버전 :

  • capsh패키지 libcap2-bin버전에서1:2.22-1.2
  • 편집하기 전에 3에서 최신을 capsh가져 git://git.debian.org/collab-maint/libcap2.git와서 사용하기 시작했습니다.
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux 사용자 영역은 32 비트입니다.

1
이후 업스트림 릴리스 에서 Lekensteyn의 예제를 사용해 보셨습니까 ? 얻기 capsh도 공동-MAINT의 REPO에서하면 "최신"을 부여하지 않았을 capsh, 데비안 패키지는 여전히 주변 기능을 지원하지 않습니다. 업스트림 2.27이 수행합니다.
Stephen Kitt

1
@StephenKitt를 아는 것이 좋지만, 원래 질문은 capsh주변이 없을 때 (원래대로) 사용이 무엇인지 입니다. 내가 뭘 놓 쳤어? 사용해야합니다.
ctrl-alt-delor

답변:


11

기능은 프로세스의 속성입니다. 전통적으로 세 가지 세트가 있습니다.

  • 허용 능력 ( p ) : 현재 프로세스에서 "활성화"될 수있는 기능.
  • 유효 기능 ( e ) : 현재 프로세스에서 현재 사용할 수있는 기능입니다.
  • 상속 가능한 기능 ( i ) : 상속 될 수있는 파일 기능.

루트로 실행되는 프로그램은 항상 완전히 허용되고 효과적인 기능을 갖기 때문에 더 많은 기능을 "추가"해도 눈에 띄는 효과는 없습니다. (상속 가능한 기능 세트는 일반적으로 비어 있습니다.) setcap cap_net_raw+ep ping기본적으로이 프로그램을 실행하는 모든 사용자에 대해이 기능을 사용하십시오.

불행히도 이러한 기능은 실행 된 파일에 바인딩되며 새 자식 프로세스를 실행 한 후에는 유지되지 않습니다. Linux 4.3에는 자식 프로세스에서 기능을 상속 할 수있는 Ambient 기능 이 도입되었습니다 . (참고 가 execve () 동안의 변형 능력) 기능 (7 ).

기능을 다룰 때 다음과 같은 함정에주의하십시오.

  • 사용자를 루트에서 루트가 아닌 것으로 변경하면 유효하고 허용되는 기능이 지워집니다 ( 기능의 기능대한 사용자 ID 변경의 영향 (7) 참조 ). --keep=1옵션을 사용 capsh하여 세트를 지우지 않도록 할 수 있습니다 .
  • 사용자 또는 그룹 ID를 변경하면 주변 기능 세트가 지워집니다. 솔루션 : 사용자 ID를 변경 한 하위 프로세스 실행 하기 전에 주변 기능 추가하십시오 .
  • 기능이 이미 허용 된 기능 세트와 상속 가능한 기능 세트에 모두있는 경우에만 주변 기능 세트에 기능을 추가 할 수 있습니다.

capshlibcap 2.25 의 프로그램에는 아직 앰비언트 기능을 수정하는 기능이 없지만 이후 릴리스에서는 새로운 옵션이 추가되었습니다. 옵션 순서는 중요합니다. 사용법 예 :

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

팁 : 명령 줄의 --print아무 곳에 나 옵션을 추가 capsh하고 현재 기능 상태를 볼 수 있습니다.

참고 : cap_setpcap필요합니다 --addamb동안 cap_setuid,cap_setgid에 필요한 --user옵션을 선택합니다.


6

Lekensteyn의 대답은 정확하고 완전 해 보이지만 주변 기능이 해결하는 문제를 강조하기 위해 다른 각도에서 다른 설명을 제공하려고 노력할 것입니다.

실행할 때 sudo capsh --user=<some_user> --기능이 다시 계산되고 잠재적으로 삭제되는 2 개의 시스템 호출이 있습니다.

  1. setuid:에 따르면 man capabilities:

SECBIT_KEEP_CAPS이 플래그를 설정하면 하나 이상의 UID가있는 스레드가 모든 UID를 0이 아닌 값으로 전환 할 때 해당 기능을 유지할 수 있습니다. 이 플래그를 설정하지 않으면 이러한 UID 스위치로 인해 스레드가 모든 기능을 잃게됩니다.

즉, capsh위 의 명령에서 setuid시스템 호출 중에 SECBIT_KEEP_CAPS가 설정되어 있는지 확인해야합니다 . 그렇지 않으면 모든 기능이 손실됩니다. 이것이하는 일 --keep=1입니다. 이제 명령은sudo capsh --user=<some_user> --keep=1 --

  1. execve: 우리가 사용하는 경우 --keep=1옵션을, 모든 기능 세트를 보존 (효과는 상속 허용) 까지execve 그러나, 시스템 호출 execve뿐만 아니라 (루트가 아닌 사용자) 다시 계산하는 기능을 야기하고, 이렇게 명확하지 않다 방법. 간단히 말해서, 앰비언트 기능 세트를 추가하기 전에 , 기능이 execve호출 후 스레드의 "허용 된"세트에있게하려면 다음 중 하나를 수행하십시오.

    • 파일은 "허용 된"세트에 해당 기능이 있어야합니다 . 이 작업을 수행 할 수 있습니다 setcap cap_net_raw+p /bin/bash. 이렇게하면 스레드의 기능 세트 (경계 세트 이외)가 더 이상 영향을 미치지 않으므로 전체 연습이 쓸모 없게됩니다.
    • 파일과 스레드 모두 "상속 가능한"세트에 해당 기능이 있어야합니다 . setcap cap_net_raw+i그 트릭 을 할 것이라고 생각할 수도 있지만 execve권한이없는 사용자 (현재 감사합니다 setuid) 가 호출 할 때 스레드의 불가분 한 권한이 삭제되는 것으로 나타났습니다 . 따라서 권한이없는 사용자로서이 조건을 만족시킬 방법이 없습니다.

리눅스 4.3에 도입 된 주변 기능은 가능한 스레드 심지어 후 그 기능을 유지 할 수 있도록 setuid다음에 권한이없는 사용자로 execve, 파일의 기능에 의존하지 않고.


2

커널에 버그 / 기능이있을 수 있습니다. 몇 가지 토론이있었습니다 :

나는 아무것도 할 것이 없다면 그것을 고칠 생각이 없다.

나를 잘못 이해하지 마십시오-현재의 행동은 안전합니다. 그러나 너무 안전하여 작동하는 것처럼 보일 수 있습니다.

편집 : http://man7.org/linux/man-pages/man7/capabilities.7.html 에 따르면 새로운 기능 세트 Ambient가 있습니다 (Linux 4.3부터). 이것이 필요한 것을 허용하는 것처럼 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.