日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Security Module逆向分析实战

發(fā)布時(shí)間:2025/3/21 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Security Module逆向分析实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Linux Security Module逆向分析實(shí)戰(zhàn)

本文記錄了對某發(fā)行版Linux中一個(gè)安全模塊(LSM)的逆向過程,該LSM對系統(tǒng)中待運(yùn)行的程序進(jìn)行安全校驗(yàn),數(shù)據(jù)流穿越內(nèi)核態(tài)與用戶態(tài),涉及系統(tǒng)內(nèi)核及系統(tǒng)服務(wù)。此LSM對系統(tǒng)安全性的增強(qiáng)效果明顯,其設(shè)計(jì)思路值得防守方研究學(xué)習(xí),可于個(gè)人終端或服務(wù)器安全防護(hù)中應(yīng)用。特此對逆向內(nèi)容記錄,希望能為讀者在終端防護(hù)方面拓寬思路,同時(shí)歡迎感興趣的師傅們交流學(xué)習(xí)。

一. LSM框架簡介

Linux安全模塊(Linux Security Module,LSM)框架是Linux操作系統(tǒng)內(nèi)核提供的一種安全機(jī)制,它通過內(nèi)核擴(kuò)展實(shí)現(xiàn)hook函數(shù)以完成多種安全檢查,通常用于強(qiáng)制訪問控制(Mandatory Access Control)。雖然被稱作“模塊”,但不同于LKM,這些擴(kuò)展并不是可加載的內(nèi)核模塊,而是和內(nèi)核代碼一起編譯在內(nèi)核文件(vmlinuz)中。可以通過如下命令查看本機(jī)啟用的LSM,cat /sys/kernel/security/lsm。常見的LSM包括SELinux、Yama等。

LSM框架的hook點(diǎn)設(shè)置于內(nèi)核訪問關(guān)鍵對象前,通過調(diào)用LSM中實(shí)現(xiàn)的hook函數(shù),判斷是否可以進(jìn)行訪問。如果有多個(gè)LSM,則會根據(jù)初始化的順序依次判斷,都允許才能進(jìn)行訪問。上述關(guān)鍵對象包括程序、進(jìn)程、套接字、文件系統(tǒng)等,可在/usr/src/linux-headers-YOURSYSTEMVERSION/include/linux/lsm_hooks.h中查看詳細(xì)的hook說明。

這里以程序啟動過程為例,簡單說明LSM工作的機(jī)制。當(dāng)通過execve系統(tǒng)調(diào)用執(zhí)行一個(gè)新程序時(shí),內(nèi)核最終會執(zhí)行到__do_execve_file函數(shù)完成相關(guān)工作,在這里會調(diào)用prepare_binprm函數(shù)填充struct linux_binprm,填充前會調(diào)用security_bprm_set_creds進(jìn)行安全檢查。security_bprm_set_creds就是LSM框架提供的hook,它會依次調(diào)用注冊在這個(gè)鉤子上的回調(diào)函數(shù),完成安全檢查。此流程上相關(guān)代碼以及此鉤子的說明如下。

LSM開發(fā)時(shí),通過如下函數(shù)定義安全模塊的hook函數(shù),逆向時(shí)通過此函數(shù)可快速定位具體的LSM以及相關(guān)回調(diào)函數(shù)。

二. 安全模塊逆向分析

2.1 分析準(zhǔn)備
本次分析的對象為某發(fā)行版Linux,此系統(tǒng)提供了可執(zhí)行文件的簽名校驗(yàn)功能,僅有簽名的程序可以被執(zhí)行,本次逆向的目標(biāo)就是試圖還原校驗(yàn)功能的框架和邏輯。由于此安全檢查的存在,提權(quán)、后門等程序因?yàn)榇藱C(jī)制的存在而無法直接運(yùn)行,從某種程度提高了操作系統(tǒng)的安全性。編譯一個(gè)hello world程序,運(yùn)行,會提示無法通過系統(tǒng)安全校驗(yàn)?zāi)壳安荒苓\(yùn)行。strace跟一下,看到在execve時(shí)就被干掉了(如下圖),可以肯定是在內(nèi)核中完成這個(gè)動作的,大概率是通過內(nèi)核擴(kuò)展實(shí)現(xiàn)。

下面嘗試定位此內(nèi)核擴(kuò)展。lsmod看一眼,沒有發(fā)現(xiàn)明顯相關(guān)的。查看此系統(tǒng)的所有LSM,有一個(gè)名為elfverify的模塊,通過此命名可以推斷,就是此模塊完成了程序的校驗(yàn)功能。

由于LSM是被編譯在內(nèi)核中的,因此接下來需要獲取到此系統(tǒng)的內(nèi)核文件。系統(tǒng)的內(nèi)核文件通??梢栽?boot目錄中找到,其中vmlinuz的文件是壓縮后的內(nèi)核,可以通過extract-vmlinux工具提取未壓縮的內(nèi)核文件vmlinux進(jìn)行分析。然而提取后的文件是沒有符號的,符號信息存儲在同目錄下System.map文件中。這里推薦使用vmlinux-to-elf這個(gè)工具完成提取與符號修復(fù)工作,通過此工具可輸出一個(gè)帶符號的ELF文件,方便逆向分析。

2.2 LSM分析

反編譯查看恢復(fù)后的內(nèi)核,在elfverify的初始化函數(shù)elfverify_init()中,security_add_hooks()的第二個(gè)參數(shù)count為5,即此LSM一共注冊了5個(gè)hook函數(shù);跟蹤一下第一個(gè)參數(shù)security_hook_list,可得到所有實(shí)現(xiàn)的回調(diào)函數(shù),總結(jié)如下。


可以看出此LSM還對套接字、設(shè)備掛載進(jìn)行了安全校驗(yàn),這里專注于程序運(yùn)行的校驗(yàn),鎖定hook_bprm_set_creds進(jìn)行進(jìn)一步分析。

跟進(jìn)hook_bprm_set_creds,該函數(shù)首先對一些參數(shù)進(jìn)行檢查,接著判斷是否開啟了開發(fā)者模式(判斷依據(jù)是某個(gè)文件的內(nèi)容),如果符合條件則放行(返回0),否則調(diào)用access_verify進(jìn)行進(jìn)一步判斷。此函數(shù)的參數(shù)類型是struct linux_binprm, 源碼中此結(jié)構(gòu)體被標(biāo)記為__randomize_layout,這是Linux內(nèi)核中的一項(xiàng)防御機(jī)制,有此標(biāo)記的結(jié)構(gòu)體其中的元素將作亂序排列,從而攻擊者難以找到偏移具體對應(yīng)的元素。因此通過靜態(tài)分析,也暫時(shí)無法確定傳遞給access_verify的參數(shù)。

在access_verify中,會將當(dāng)前進(jìn)程通過add_wait_queue掛起等待,并將90-pid-UNKNOWN信息寫入某個(gè)設(shè)備中,這里的90應(yīng)該是LSM開發(fā)者自定義的一個(gè)“魔數(shù)”(socket校驗(yàn)中是91),而第三段的內(nèi)容由于結(jié)構(gòu)體的隨機(jī)化也暫時(shí)無法確定(之后分析會知道其實(shí)是程序路徑)。之后再從此設(shè)備中讀取信息,根據(jù)內(nèi)容選擇是否繼續(xù)執(zhí)行,并從隊(duì)列中移除進(jìn)程。

LSM中關(guān)于elf校驗(yàn)的流程到這個(gè)函數(shù)基本就結(jié)束了,并不包含具體的校驗(yàn)邏輯,只是將待校驗(yàn)的進(jìn)程信息寫入某個(gè)設(shè)備并等待結(jié)果,可見校驗(yàn)應(yīng)該是在另一處完成。經(jīng)過跟蹤分析,此LSM注冊了一個(gè)雜項(xiàng)設(shè)備(在register_elf_verifier_dev()中),名為elf_verifier。下一步找到了誰從這個(gè)設(shè)備中讀取信息,大概率就能定位到完成校驗(yàn)的具體代碼。

然而,在內(nèi)核中并沒有找到相關(guān)的代碼,下一步得去用戶態(tài)的程序找找。

2.3 安全校驗(yàn)邏輯分析
查看一下系統(tǒng)進(jìn)程,發(fā)現(xiàn)一條程序名為*-elf-verify,其ppid為1,看了下是系統(tǒng)服務(wù),推斷這就是處理雜項(xiàng)設(shè)備中數(shù)據(jù)的程序了。為驗(yàn)證推斷,將此服務(wù)停止,運(yùn)行一個(gè)自己編譯的程序,待運(yùn)行的進(jìn)程“僵死”,推斷應(yīng)該是LSM將進(jìn)程送入等待隊(duì)列后,沒有從雜項(xiàng)設(shè)備中讀到校驗(yàn)結(jié)果,就造成了一直掛起的局面。這也確認(rèn)了正是這個(gè)程序處理設(shè)備數(shù)據(jù)并給與返回結(jié)果,校驗(yàn)邏輯應(yīng)當(dāng)就在其中。

對此系統(tǒng)服務(wù)程序進(jìn)行分析與調(diào)試,在進(jìn)行ELF文件安全校驗(yàn)時(shí),它會循環(huán)的從/dev/elf_verifier這個(gè)設(shè)備中讀取內(nèi)容,讀取到的內(nèi)容包括PID和完整的程序路徑,并依據(jù)此信息進(jìn)行校驗(yàn),其主要檢查如下兩點(diǎn):

判斷此路徑的程序是否在白名單或黑名單中

在ELF文件頭的特殊節(jié)中提取簽名(PKCS7),然后進(jìn)行驗(yàn)證(證書在系統(tǒng)某路徑中)
上述的黑白名單位于系統(tǒng)/usr目錄下,僅root用戶可編輯。而ELF文件頭中的特殊節(jié)在其他普通的ELF文件中不會出現(xiàn),應(yīng)當(dāng)是在對ELF文件進(jìn)行簽名時(shí)加上的,而將簽名信息添加到文件頭中又不會對程序的正常運(yùn)行造成影響。如果能夠順利讀取到簽名信息,則調(diào)用openssl的相關(guān)函數(shù)進(jìn)行校驗(yàn)。校驗(yàn)完成后,將檢驗(yàn)結(jié)果寫入/dev/elf_verifier,通知內(nèi)核進(jìn)行后續(xù)動作;同時(shí)如果校驗(yàn)不通過,會通過dbus通知GUI彈出提示告知用戶。

至此,一次校驗(yàn)完成,整個(gè)簽名校驗(yàn)功能的脈絡(luò)基本摸清了。在其中還有一些細(xì)節(jié)檢查,例如文件格式、ELF文件頭等等,就不一一展開介紹了。

三. 總結(jié)

該系統(tǒng)的可執(zhí)行程序簽名校驗(yàn)功能,通過安全模塊(LSM)elfverify、系統(tǒng)服務(wù)聯(lián)合完成,二者通過雜項(xiàng)設(shè)備/dev/elf_verifier傳遞數(shù)據(jù),完成了用戶態(tài)和內(nèi)核態(tài)的交互。在內(nèi)核中,通過實(shí)現(xiàn)LSM的security_bprm_set_creds鉤子在程序運(yùn)行前獲取到待運(yùn)行程序的完整路徑,將進(jìn)程暫時(shí)掛起,同時(shí)將信息寫入設(shè)備中;用戶態(tài)程序從設(shè)備中讀取到信息后,判斷此路徑程序是否在黑白名單、程序是否是經(jīng)過簽名的ELF程序,并將判斷結(jié)果寫入設(shè)備;內(nèi)核LSM根據(jù)返回的結(jié)果確定是否允許執(zhí)行。

整個(gè)過程涉及LSM、設(shè)備、ELF文件格式、簽名校驗(yàn)等知識,有深有淺,本文記錄的比較簡單,歡迎感興趣的師傅深入交流。同時(shí),該方式利用LSM框架提供的鉤子,對某些操作進(jìn)行安全校驗(yàn),同時(shí)將復(fù)雜的校驗(yàn)邏輯在用戶態(tài)完成,通過設(shè)備完成數(shù)據(jù)傳遞,此類模式在終端安全防護(hù)上亦可借鑒。

最后

關(guān)注私我,獲取【網(wǎng)絡(luò)安全學(xué)習(xí)攻略

總結(jié)

以上是生活随笔為你收集整理的Linux Security Module逆向分析实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。