linux 讀取環境變數的能力?
我想以非特權使用者的身份執行服務,但它需要綁定到系統埠號(即小於1024),所以我給它
setcap 'cap_net_bind_service=+ep' <path for service>
,一切都好。問題是,在啟動時,服務會讀取環境變數,並且由於某種原因,它在具有
cap_net_bind_service
. 所以,有兩份執行檔,一份有cap_net_bind_service
,一份沒有,只有一份沒有可以讀取環境變數。好像有一組預設功能允許讀取環境變數,但是當我給它時 exe 失去了該功能
cap_net_bind_service
。是這樣嗎,還是有其他事情發生?我可能需要為服務提供哪些額外功能,以便它可以讀取環境變數?在capability.h中沒有任何內容會跳出為“允許讀取環境變數”?
我到了它的底部。簡而言之,二進製文件
secure_getenv
用於訪問環境變數。當二進製文件以“安全執行”模式 ( ) 執行時,這將返回
null
,而不是訪問變數AT_SECURE=1
。設置任何功能,都會使其在此模式下執行。確認二進製文件正在使用
secure_getenv
usingreadelf
: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