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

如何實(shí)現(xiàn) HTTP 協(xié)議的安全性
電池的安全性測(cè)試項(xiàng)目有哪些?

評(píng)論