Linux에는 환경 변수를 읽을 수 있는 기능이 있습니까?

Linux에는 환경 변수를 읽을 수 있는 기능이 있습니까?

권한이 없는 사용자로 서비스를 실행하고 싶었지만 시스템 포트 번호(예: 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_AUXV0으로 설정된 출력이 생성됩니다. 안전 실행 모드로 실행하면 출력이 없습니다 AT_SECURE.LD_SHOW_AUXV

LD_DEBUG일반적으로 안전 실행 모드에서 실행 중이거나 실행되지 않을 때에도 출력이 있거나 없습니다. 그러나 /etc/suid-debug존재하는 경우(터치로 생성된 빈 파일) LD_DEBUG안전 실행 모드에서 실행될 때 출력이 생성됩니다.

바라보다man getauxvalAT_SECURE안전 실행 모드 에 대한 추가 정보

관련 정보