庫注入在 Linux 上不如 Windows 上常見,但它仍然是一個問題。下來看看它們如何工做的,以及如何鑑別它們。html
儘管在 Linux 系統上幾乎見不到,但庫(Linux 上的共享目標文件)注入還是一個嚴峻的威脅。在採訪了來自 AT&T 公司 Alien 實驗室的 Jaime Blasco 後,我更加意識到了其中一些攻擊是多麼的易實施。linux
在這篇文章中,我會介紹一種攻擊方法和它的幾種檢測手段。我也會提供一些展現攻擊細節的連接和一些檢測工具。首先,引入一個小小的背景信息。git
DLL 和 .so 文件都是容許代碼(有時候是數據)被不一樣的進程共享的共享庫文件。公用的代碼能夠放進一個文件中使得每一個須要它的進程能夠從新使用而不是屢次被重寫。這也促進了對公用代碼的管理。github
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
是在進程啓動時加載共享庫的最簡單且最受歡迎的方法。能夠將此環境變量配置到共享庫的路徑,以便在加載其餘共享對象以前加載該共享庫。」ruby
爲了展現有多簡單,我建立了一個極其簡單的共享庫而且賦值給個人(以前不存在) LD_PRELOAD
環境變量。以後我使用 ldd
命令查看它對於經常使用 Linux 命令的影響。bash
$ 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.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 社區。
儘管庫注入是一個嚴重的威脅,但瞭解一些優秀的工具來幫助你檢測它是否存在是頗有幫助的。
重要的參考和工具的連接:
via: www.networkworld.com/article/340…
做者:Sandra Henry-Stocker 選題:lujun9972 譯者:LuuMing 校對:wxy