Linux

linux 讀取環境變數的能力?

  • May 24, 2020

我想以非特權使用者的身份執行服務,但它需要綁定到系統埠號(即小於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_getenvusing 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

引用自:https://serverfault.com/questions/1018418