Tracee是一個用于Linux的運行時安全性和取證的開源項目,用于解決常見的Linux安全性問題。通過利用Linux擴展的Berkeley Packet Filter (eBPF)的技術(shù)優(yōu)勢,在內(nèi)核運行時跟蹤系統(tǒng)和應(yīng)用程序,以便獲取相應(yīng)的數(shù)據(jù)信息。Tracee分析收集的事件可以用來檢測可疑的行為模式,在本文中,我將分享從使用eBPF和Linux安全模塊(LSM)鉤子的角度,來分析在解決Linux漏洞(如TOCTOU類型)中學(xué)到的經(jīng)驗教訓(xùn)。
設(shè)計LSM鉤子來提升安全性
在正在運行的應(yīng)用程序中,通常是通過系統(tǒng)調(diào)用與操作系統(tǒng)進行交互。出于這個原因,安全從業(yè)者會使用系統(tǒng)調(diào)用來分析運行中的應(yīng)用程序的行為。重點在于選擇收集系統(tǒng)調(diào)用的方法,因為獲取到的參數(shù)值和操作系統(tǒng)實際使用的參數(shù)值之間可能存在差距。
eBPF允許在無需更改內(nèi)核源代碼或加載內(nèi)核模的情況下,在Linux內(nèi)核中運行沙盒程序。通過使用kprobes附加到Linux Security Module (LSM)掛鉤上,我們可以收集內(nèi)核實際使用的參數(shù)值。下面是具體使用LSM鉤子需要克服的一些問題:
準確理解相對路徑
在Linux中,當從用戶程序中讀取信息時,path參數(shù)可以包含一個相對路徑。
例如,當調(diào)用一個程序時,Tracee可以使用以下參數(shù)獲取一個系統(tǒng)調(diào)用:
·open(“。./。./directory/file”, O_RDONLY)
·open(“。/test/。./。./directory/file”, O_RDONLY)
這些系統(tǒng)調(diào)用中的路徑可能指向相同的位置,但問題來了,根據(jù)給定的參數(shù),很難精確定位絕對且始終唯一的規(guī)范路徑。在構(gòu)建安全策略時,規(guī)范路徑的重要性變得更加明顯,因為相對路徑的意圖和效果可能太過模糊。
找出鏈接文件
例如,用戶程序給出的某個文件的參數(shù)值可能會包含指向其他文件的鏈接。在Linux中,我們可以創(chuàng)建到一個文件的符號鏈接,其方式是一個文件充當另一個文件或目錄的引用。操作系統(tǒng)使用符號鏈接到達被鏈接的文件,并執(zhí)行給定的命令。請看下面的例子,創(chuàng)建了一個名為python的文件,并將其鏈接到一個惡意的二進制文件my_malware:
當運行python時,我們可以看到Tracee跟蹤了兩個事件。其一是帶有參數(shù)值的系統(tǒng)調(diào)用 。/python。但實際上,python是象征性地鏈接到~/bin/my_malware,第二個就是被Tracee捕獲的security_bprm_check事件返回了實際執(zhí)行的文件的路徑名。
TOCTOU分析
當試圖獲取用戶程序的參數(shù)值時,如果只分析系統(tǒng)調(diào)用參數(shù),結(jié)果可能會受到條件競爭的影響而錯過關(guān)鍵細節(jié)。這是因為在獲取信息后,用戶程序可以基于另一個并發(fā)線程,來進行更改系統(tǒng)調(diào)用參數(shù)。
例如,當調(diào)用一個程序時,Tracee可以使用以下參數(shù)獲取一個系統(tǒng)調(diào)用:
execve(“/bin/ls”, NULL, 0)
在進程中某一線程和內(nèi)核調(diào)用執(zhí)行Syscall之間會存在同一時間點。在這個時間點開始階段,通過使用指向進程地址空間中內(nèi)存位置的指針,pathname參數(shù)被傳遞給內(nèi)核。在這個期間,進程的另一個線程可以快速更改路徑名,最后內(nèi)核來更新路徑名。
繼續(xù)我們的例子,另一個線程可以將第一個參數(shù)從/bin/ls更改為/bin/malicious,后者將由內(nèi)核執(zhí)行,而前者將由Tracee記錄。這個場景被稱為TOCTOU競態(tài)。攻擊者可以利用它來影響檢查和真正使用之間的記錄值,這樣會導(dǎo)致收集到的數(shù)據(jù)不準確,并誤導(dǎo)安全研究人員或自動檢測工具。
基于上面的原因,決定在Tracee中連同Syscall數(shù)據(jù)一起使用LSM鉤子來進行追蹤。像security_file_open這樣的事件,包含內(nèi)核實際使用的路徑名,并與上報的常規(guī)Syscall事件交叉引用。
簡化分析過程
我們都知道在Linux中,Everything is a file這句著名的口號(https://en.wikipedia.org/wiki/Everything_is_a_file),是的,所有東西都是文件,需要使用文件描述符才能與之交互。當打開一個文件時(例如使用open),你會收到一個文件描述符。使用這些系統(tǒng)調(diào)用openat, unlinkat, execveat, accept, connect, bind, listen等等來與打開的文件進行交互。由于這個原因,如果我們想要分析在一個文件上執(zhí)行的操作,那就必須跟蹤其打開的文件描述符,而Socket允許在不同的程序之間傳遞打開的文件描述符,這樣就會使分析更加困難。
對于使用Tracee的LSM鉤子事件,跟蹤文件描述符變得無關(guān)重要,因為LSM事件已經(jīng)包含了相關(guān)的數(shù)據(jù),比如完整的路徑名。這使得在分析問題時可以避免上述的影響,更加簡化分析流程。
結(jié)論
Tracee是一個易于使用的Linux運行時安全和取證工具,采用了目前最為火熱功能更為強大的eBPF技術(shù),可以讓我們更好地理解程序的運行時行為,并打破對類似安全軟件構(gòu)成困難和挑戰(zhàn)的桎梏,為安全分析人員提供進一步深入分析的方案。
原文標題:利用LSM鉤子打破系統(tǒng)調(diào)用跟蹤桎梏
文章出處:【微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209332 -
源代碼
+關(guān)注
關(guān)注
96文章
2945瀏覽量
66730 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3265瀏覽量
57678
原文標題:利用LSM鉤子打破系統(tǒng)調(diào)用跟蹤桎梏
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論