Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

ld.so 顯示「object from LD_PRELOAD cannot be preloaded」?先找出注入者,再修改程式庫

警告只證明動態載入器拒絕了被要求的物件,沒有說明誰提出要求或為何失敗。先保留命令、追查所有預載來源、比較執行檔與物件的 ELF 身分,再只改真正負責的設定。

追蹤 LD_PRELOAD 從程序環境、啟動器與系統檔進入動態載入器的圖
示意圖:修改程式庫前先找出注入物件的設定。 Watch at Ease

訊息由動態載入器在程式完整啟動前輸出,表示附加物件被要求卻遭忽略;它不能證明所有共享程式庫都遺失,也不能證明前景程式建立了要求。

建立「擁有者到物件」證據帳本:先確認來自程序環境、啟動器、服務或 /etc/ld.so.preload,再依路徑、ELF 身分、映射與安全執行證據分流。

1. 固定警告與執行情境

保存完整 ld.so 訊息、物件字串、括號原因、命令、執行檔路徑、身分、目錄與時間;cannot open、failed to map 與安全模式移除是不同結論。

只有在安全時才重現一次,並記錄是 shell、包裝器、服務、容器入口或特權程式。不要先重裝尚未證明擁有者的程式庫。

2. 找出所有預載擁有者

檢查程序環境、shell 啟動檔、包裝器、服務 Environment/EnvironmentFile 與容器設定;另查 /etc/ld.so.preload,它會全系統生效。

若 unset LD_PRELOAD 後仍警告,代表存在另一擁有者,不是載入器必定故障。編輯前保留每個值及來源。

3. 分類路徑、存取與物件身分

依載入器解析方式核對字串,記錄存在、類型、擁有者、權限與掛載環境。目錄、斷鏈、不可讀檔或被分隔符拆開的字串都不是有效物件。

以 file 和 readelf 比較執行檔與物件的 ELF 類別、資料編碼、OS/ABI 與機器欄位;不要為了檢查而執行不可信物件。

4. 分開映射、重新定位與安全執行

路徑與身分相符後,在相同非特權測試收集載入器診斷,查映射、相依、重新定位、符號或版本,不要全當成缺檔。

set-ID 或帶 capability 的程式會限制 LD_PRELOAD;不要削弱權限或把任意物件複製進可信目錄來繞過。

5. 修復擁有者並驗證

只修正已證明的 shell、包裝器、服務、容器或 /etc/ld.so.preload;只有證明套件擁有物件且 ABI 相符後才安裝或還原。

對同一執行檔先做無預載測試,再測需要的已驗證物件;警告消失、載入狀態與功能正確且其他程序不變才通過。

區分 LD_PRELOAD 路徑、ELF、映射與安全執行失敗的決策圖
示意圖:依證據分流,只改真正拒絕物件的層次。 Watch at Ease