권한이 없는 사용자로 서비스를 실행하고 싶었지만 시스템 포트 번호(예: 1024 미만)에 바인딩해야 했기 때문에 해당 서비스를 제공했고 setcap 'cap_net_bind_service=+ep' <path for service>
모든 것이 좋았습니다.
문제는 시작 시 서비스가 환경 변수를 읽고 어떤 이유로 cap_net_bind_service
.cap_net_bind_service
환경 변수를 읽을 수 있는 기본 기능 세트가 있는 것과 같지만 이를 제공하면 exe에서 해당 기능을 잃게 됩니다 cap_net_bind_service
. 그런가요, 아니면 다른 일이 벌어지고 있나요? 환경 변수를 읽을 수 있도록 이 서비스에 어떤 추가 기능을 제공해야 합니까? 안에는 아무것도 없어능력.h"환경 변수 읽기 허용" 팝업이 뜹니다.
답변1
나는 그것의 바닥에 도달했습니다. 즉, 바이너리는 다음을 사용하고 있습니다.secure_getenv
환경 변수에 액세스합니다. 바이너리가 "안전한 실행" 모드( )에서 실행될 때 null
변수에 액세스하는 대신 반환됩니다. AT_SECURE=1
기능을 설정하면 이 모드에서 실행됩니다.
바이너리가 사용되고 있는지 확인 secure_getenv
하세요 readelf
.
readelf -a <path for service> | grep getenv
00000040ac28 004b00000007 R_X86_64_JUMP_SLO 0000000000000000 secure_getenv@GLIBC_2.17 + 0
00000040ad90 007a00000007 R_X86_64_JUMP_SLO 0000000000000000 getenv@GLIBC_2.2.5 + 0
75: 0000000000000000 0 FUNC GLOBAL DEFAULT UND secure_getenv@GLIBC_2.17 (6)
122: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getenv@GLIBC_2.2.5 (2)
LD_DEBUG=all
환경 변수(얼마나 아이러니한지!) 및/또는 LD_SHOW_AUXV
(참조 )를 사용하여 안전한 실행 모드에서 실행 중인지 확인하세요.man ld.so
).
그렇지 않은 경우 LD_SHOW_AUXV
0으로 설정된 출력이 생성됩니다. 안전 실행 모드로 실행하면 출력이 없습니다 AT_SECURE
.LD_SHOW_AUXV
LD_DEBUG
일반적으로 안전 실행 모드에서 실행 중이거나 실행되지 않을 때에도 출력이 있거나 없습니다. 그러나 /etc/suid-debug
존재하는 경우(터치로 생성된 빈 파일) LD_DEBUG
안전 실행 모드에서 실행될 때 출력이 생성됩니다.
바라보다man getauxval
AT_SECURE
안전 실행 모드 에 대한 추가 정보