linux的哪個組件在執行setuid程序時刪除過濾器環境變數?
據觀察,當執行一個設置了 setuid 位的程序時,它不會收到在 shell 上設置的一些環境變數(bash 等)。以這種方式刪除的幾個環境變數是
LD_PRELOAD, LD_LIBRARY_PATH, LD_ORIGIN_PATH, LD_DEBUG_OUTPUT, LD_PROFILE, LD_USE_LOAD_BIAS, GCONV_PATH
.如here和this 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
變數的某些功能在這種情況下不可用。