프로그램이 필요한 기능을 얻을 수 없습니다(원시 소켓).

프로그램이 필요한 기능을 얻을 수 없습니다(원시 소켓).

참고: 이것은 부분적으로 프로그래밍에 관한 질문이지만 제 직감으로는 이것이 Linux의 보안 기능 프레임워크와 더 관련이 있다는 것입니다.일반적으로 말하면, 따라서 StackOverflow 대신 여기에 게시하세요.

원시 소켓과 패킷 캡처를 사용해야 하는 프로그램이 있습니다 cap_net_raw. 제가 사용하고 있는 시스템은 Debian 11과 Linux 5.16.0-6-amd64입니다.

cap_net_admin바이너리에 기능을 부여했습니다( )

% sudo /sbin/setcap 'cap_net_raw,cap_net_admin+eip' ./program

(참고: 사용자 cap_setfcap에게 기능을 부여했지만 /etc/security/capability.conf여전히 sudo 없이는 할 수 없습니다)setcap

최소한 필요한 만큼만 캡이 적용되었는지 확인하세요.

% /sbin/getcap ./program
./program cap_net_admin,cap_net_raw=eip

capsh --print내 사용자가 표시한 bash 실행 결과

% /sbin/capsh --print
Current: cap_setpcap,cap_net_admin,cap_net_raw,cap_sys_ptrace,cap_setfcap=i
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =
Current IAB: cap_setpcap,cap_net_admin,cap_net_raw,cap_sys_ptrace,cap_setfcap
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
 secure-no-ambient-raise: no (unlocked)
uid=1001(johndoe) euid=1001(johndoe)
gid=1001(johndoe)
groups=27(sudo),1001(johndoe)
Guessed mode: UNCERTAIN (0)

이제 아무 문제 없이 사용자와 핑을 실행할 수 있습니다. 데비안에서 ping은 기능을 인식하는 것으로 보입니다. 즉, 바이너리에는 필수 기능이 있습니다.

% /sbin/getcap `which ping`
/usr/bin/ping cap_net_raw=ep

그리고 ping소스 코드에서 (https://sources.debian.org/src/iputils/3%3A20210202-1/ping/ping.c/) 런타임의 기능이 개선되지 않은 것으로 나타났습니다. 즉, 파일 기능이 예상대로 작동하기에 충분합니다. 내 결론은 실행 파일이 적절한 기능을 갖고 있는 한 내 프로그램이 똑같이 잘 실행되어야 한다는 것입니다.

그러나 그것은 사실이 아닌 것 같습니다. 프로그램 파일에 필요한(내가 아는 한) 기능을 설정했지만 실행하면 EPERM.

프로세스를 디버깅하고 소켓 생성을 중단하고 프로세스 기능을 확인하면 프로세스에 유효한 필수 기능이 없음이 표시됩니다.

 % grep Cap /proc/`pidof program`/status                     
CapInh: 0000000080083100
CapPrm: 0000000000000000
CapEff: 0000000000000000 
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

CapInh및 를 확인 CapBnd하면 capsh --decode=...비트가 예상한 대로(이전 capsh --print출력과 일치) 표시됩니다. 그러나 허용된 집합과 유효한 집합( CapPrmCapEff각각)은 내가 기대하는 것과 다릅니다(어쩌면 내 예외가 완전히 잘못되었을 수도 있습니다). 허용되는 세트는 cap_net_raw및 이라고 가정합니다 cap_net_admin.

cap_net_raw이 상황을 해결하기 위해 소켓을 생성하기 전에 프로그램에서 활성화를 시도했습니다 .

cap_value_t needed[] = { CAP_NET_RAW };
cap_t caps = cap_get_proc();

cap_set_flag(caps, CAP_EFFECTIVE, std::size(needed), needed, CAP_SET);
if (cap_set_proc(caps))
{
    // handle failure
}

EPERM그러나 지금 "예상"된 것처럼 이는 비참하게 실패합니다( ). 또한 첫 번째 비트에 비트를 추가하려고 시도했지만 CAP_PERMITTED수정 결과가 다시 나타났습니다.cap_set_proc()EPERM

여기서 내가 무엇을 놓치고 있거나 오해하고 있습니까? 내 프로그램에 대한 원시 소켓 액세스를 활성화하려면 또 무엇을 해야 합니까?

데비안 11에는 다른 시스템에 비해 더 엄격한 규칙과 제한이 있나요?

참고: 사용 가능한 Raspberry Pi OS(Debian 10) 시스템을 확인했는데 사용자의 설정이 동일 capsh하다고 보고되었습니다 ( 설정이 전혀 없음). Afaik, 시스템은 기본적으로 실행되므로 내 결론은 Raspberry Pi OS/Debian 10이 기능 측면에서 기본적으로 더 허용적/허용적 보안 모델을 가지고 있다는 것입니다.piCurrentBoundingAmbient

이것이 네임스페이스와 관련이 있나요? 파일 소유권/권한?

관련 정보