Linux

linux的哪個組件在執行setuid程序時刪除過濾器環境變數?

  • March 14, 2022

據觀察,當執行一個設置了 setuid 位的程序時,它不會收到在 shell 上設置的一些環境變數(bash 等)。以這種方式刪除的幾個環境變數是LD_PRELOAD, LD_LIBRARY_PATH, LD_ORIGIN_PATH, LD_DEBUG_OUTPUT, LD_PROFILE, LD_USE_LOAD_BIAS, GCONV_PATH.

herethis question中所述,這是預期的行為。這樣做的原因是減少攻擊向量。的手冊頁ld.so (8)也說明了這一點。

問題是,Linux 作業系統的哪個組件會刪除這樣的環境變數?

  • 是殼嗎?
  • 執行命令時,它是一個類似於 shell 內部呼叫fork()的函式嗎?execve()
  • ld.so嗎?

注意:任何答案都會有所幫助。但是,如果您可以指導我哪些資源包含有關此問題的資訊,例如我應該閱讀哪些手冊頁,那將更有幫助。

這些變數中的大多數用於動態連結器或 C 庫的其他組件,並且是動態連結器在啟動 setuid 二進製文件時負責刪除它們。這記錄在(對於 GNU C 庫)的“環境”部分:man ld.so

出於安全原因,如果動態連結器確定二進製文件應以安全執行模式執行,則某些環境變數的影響將被取消或修改,並且這些環境變數會從環境中剝離,因此程序甚至不會見定義。其中一些環境變數會影響動態連結器本身的操作,如下所述。以這種方式處理的其他環境變數包括: GCONV_PATH, GETCONF_DIR, HOSTALIASES, LOCALDOMAIN, LOCPATH, MALLOC_TRACE, NIS_PATH, NLSPATH, RESOLV_HOST_CONF, RES_OPTIONS, TMPDIR, 和TZDIR.

ld.so影響變數分別記錄:

此變數在安全執行模式下被忽略。

出現在每個此類變數的文件中。

完整列表也可以在 GNU C 庫的原始碼中看到,刪除程式碼本身也可以看到,包括動態連結的二進製文件靜態連結的二進製文件中的動態連結

對於他們關心的變數,其他 C 庫的動態連結器的行為方式類似;例如,musl 文件

在呼叫 setuid、setgid 或具有其他提升功能的程序中,此變數完全被忽略。

對於許多變數(LD_PRELOAD, LD_LIBRARY_PATH, MUSL_LOCPATH),並且該TZ變數的某些功能在這種情況下不可用。

引用自:https://unix.stackexchange.com/questions/694263