追溯 Linux 上的庫注入
庫注入在 Linux 上不如 Windows 上常見,但它仍然是一個問題。下來看看它們如何工作的,以及如何鑑別它們。
儘管在 Linux 系統上幾乎見不到,但庫(Linux 上的共享目標檔案)注入仍是一個嚴峻的威脅。在採訪了來自 AT&T 公司 Alien 實驗室的 Jaime Blasco 後,我更加意識到了其中一些攻擊是多麼的易實施。
在這篇文章中,我會介紹一種攻擊方法和它的幾種檢測手段。我也會提供一些展示攻擊細節的連結和一些檢測工具。首先,引入一個小小的背景資訊。
共享庫漏洞
DLL 和 .so 檔案都是允許程式碼(有時候是資料)被不同的程式共享的共享庫檔案。公用的程式碼可以放進一個檔案中使得每個需要它的程式可以重新使用而不是多次被重寫。這也促進了對公用程式碼的管理。
Linux 程式經常使用這些共享庫。(顯示共享物件依賴的)ldd
命令可以對任何程式檔案顯示其共享庫。這裡有一些例子:
$ ldd /bin/date
linux-vdso.so.1 (0x00007ffc5f179000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f02bea15000)
/lib64/ld-linux-x86-64.so.2 (0x00007f02bec3a000)
$ ldd /bin/netstat
linux-vdso.so.1 (0x00007ffcb67cd000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f45e5d7b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45e5b90000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f45e5b1c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f45e5b16000)
/lib64/ld-linux-x86-64.so.2 (0x00007f45e5dec000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f45e5af5000)
linux-vdso.so.1
(在一些系統上也許會有不同的名字)是核心自動對映到每個程式地址空間的檔案。它的工作是找到並定位程式所需的其他共享庫。
對庫載入機制加以利用的一種方法是通過使用 LD_PRELOAD
環境變數。正如 Jaime Blasco 在他的研究中所解釋的那樣,“LD_PRELOAD
是在程式啟動時載入共享庫的最簡單且最受歡迎的方法。可以將此環境變數配置到共享庫的路徑,以便在載入其他共享物件之前載入該共享庫。”
為了展示有多簡單,我建立了一個極其簡單的共享庫並且賦值給我的(之前不存在) LD_PRELOAD
環境變數。之後我使用 ldd
命令檢視它對於常用 Linux 命令的影響。
$ export LD_PRELOAD=/home/shs/shownum.so
$ ldd /bin/date
linux-vdso.so.1 (0x00007ffe005ce000)
/home/shs/shownum.so (0x00007f1e6b65f000) <== 它在這裡
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e6b458000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1e6b682000)
注意,僅僅將新的庫賦給 LD_PRELOAD
就影響到了執行的任何程式。
通過設定 LD_PRELOAD
指定的共享庫首先被載入(緊隨 linux-vdso.so.1),這些庫可以極大程度上改變一個程式。例如,它們可以重定向系統呼叫到它們自己的資源,或對程式執行的行為方式進行意想不到的更改。
osquery 工具可以檢測庫注入
osquery
工具(可以在 osquery.io下載)提供了一個非常獨特的檢視 Linux 系統的方式。它基本上將作業系統視作一個高效能的關聯式資料庫。然後,也許你會猜到,這就意味著它可以用來查詢並且生成 SQL 表,該表提供了諸如以下的詳細資訊:
- 執行中的程式
- 載入的核心模組
- 開啟的網路連結
一個提供了程式資訊的核心表叫做 process_envs
。它提供了各種程式使用環境變數的詳細資訊。Jaime Blasco 提供了一個相當複雜的查詢,可以使用 osquery
識別出使用 LD_PRELOAD
的程式。
注意,這個查詢是從 process_envs
表中獲取資料。攻擊 ID(T1055)參考 Mitre 對攻擊方法的解釋。
SELECT process_envs.pid as source_process_id, process_envs.key as environment_variable_key, process_envs.value as environment_variable_value, processes.name as source_process, processes.path as file_path, processes.cmdline as source_process_commandline, processes.cwd as current_working_directory, 'T1055' as event_attack_id, 'Process Injection' as event_attack_technique, 'Defense Evasion, Privilege Escalation' as event_attack_tactic FROM process_envs join processes USING (pid) WHERE key = 'LD_PRELOAD';
注意 LD_PRELOAD
環境變數有時是合法使用的。例如,各種安全監控工具可能會使用到它,因為開發人員需要進行故障排除、除錯或效能分析。然而,它的使用仍然很少見,應當加以防範。
同樣值得注意的是 osquery
可以互動使用或是作為定期查詢的守護程式去執行。瞭解更多請查閱文章末尾給出的參考。
你也能夠通過檢視使用者的環境設定來定位 LD_PRELOAD
的使用。如果在使用者賬戶中使用了 LD_PRELOAD
,你可以使用這樣的命令來檢視(假定以個人身份登入後):
$ env | grep PRELOAD
LD_PRELOAD=/home/username/userlib.so
如果你之前沒有聽說過 osquery
,也別太在意。它正在成為一個更受歡迎的工具。事實上就在上週,Linux 基金會宣佈打造了新的 osquery 基金會以支援 osquery 社群。
總結
儘管庫注入是一個嚴重的威脅,但瞭解一些優秀的工具來幫助你檢測它是否存在是很有幫助的。
擴充套件閱讀
重要的參考和工具的連結:
- 用 osquery 追尋 Linux 庫注入,AT&T Cybersecurity
- Linux:我的記憶體怎麼了?,TrustedSec
- 下載 osquery
- osquery 模式
- osqueryd(osquery 守護程式)
- Mitre 的攻擊框架
- 新的 osquery 基金會成立
via: https://www.networkworld.com/article/3404621/tracking-down-library-injections-on-linux.html
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:LuuMing 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- iOS逆向--注入framework庫到appiOSFrameworkAPP
- MySQL資料庫注入基礎MySql資料庫
- 【封神臺】資料庫注入 wp資料庫
- 追溯 React Hot Loader 的實現React
- Golang 依賴注入設計哲學|12.6K 🌟 的依賴注入庫 wireGolang依賴注入
- linux動態注入(含視訊演示)Linux
- Linux 上的 NVMeLinux
- .Net依賴注入神器Scrutor(上)依賴注入
- Rustyinject是Rust的編譯時依賴注入DI庫Rust編譯依賴注入
- 探索 Linux 上的 /runLinux
- 使用Linux 上的 ChromebookvLinuxChrome
- 使用Linux 上的 ChromebookLinuxChrome
- 追溯 MySQL Statement Cancellation TimerMySql
- 使用微軟Detours庫進行DLL注入微軟
- 攻擊JavaWeb應用——3、sql注入(上)JavaWebSQL
- SiMDA全新標準MES產品上市,追溯助手7天即可完成上線
- linux 上 redis的安裝LinuxRedis
- Kettle 在 linux 上的部署Linux
- 【配置上線】Linux克隆安裝Oracle資料庫軟體LinuxOracle資料庫
- 分解uber依賴注入庫dig-使用篇依賴注入
- linux下的靜態庫與動態庫Linux
- Spring注入:配置注入(set注入和構造器注入)與註解注入Spring
- 前端人員如何在linux伺服器上搭建npm私有庫前端Linux伺服器NPM
- Spring set注入和構造注入的區別Spring
- Free Star木馬分析與追溯
- 分解uber依賴注入庫dig-原始碼分析依賴注入原始碼
- 偶然發現的bug————越權訪問漏洞追溯
- 用世界上最好的語言開發自動化注入工具
- 關於 sqlmap 注入的疑惑,sqlmap 是如何拿到資料庫資料的呢?SQL資料庫
- SQL 注入:聯合注入SQL
- 程式注入之DLL注入
- sql注入之union注入SQL
- GitHub 上的面試題庫Github面試題
- Linux上的redis的安裝和配置LinuxRedis
- 簡述Linux下的靜態庫和動態庫Linux
- Linux動態庫Linux
- Linux刪庫跑路Linux
- helux,一個鼓勵服務注入的響應式react狀態庫UXReact