一篇讓你掌握Linux內(nèi)核,漏洞安全與虛擬內(nèi)存管理(值得大神們收藏)
Linux內(nèi)核面試常見高頻問題如下:
高速側(cè)信道攻擊的原理機(jī)制?
CPU熔斷漏洞攻擊?
CPU“幽靈”漏洞變體攻擊原理機(jī)制?
一、CPU熔斷/幽靈漏洞解決方案
側(cè)信道攻擊(SCA):密碼學(xué)中常見暴力攻擊。針對加密電子設(shè)備在運(yùn)行過程中時間消耗、功率消耗、電磁輻射之類的側(cè)信道信息泄露而對加密設(shè)備進(jìn)行攻擊。L1高速緩存是靠近CPU核心,它的訪問速度是最快。(大約300個時鐘周期,時間差異來進(jìn)行攻擊)。
通過視圖來研究:高級緩存?zhèn)刃诺拦糁衅平鈹?shù)據(jù)的流程,具體如下:
攻擊者清空user_probe對應(yīng)的高速緩存行;
攻擊者訪問受限地址attacked_mem_addr,CPU發(fā)生異?,F(xiàn)象;
由于亂序執(zhí)行,CPU預(yù)取了attacked_mem_addr的值;
根據(jù)預(yù)取的值來訪問user_probe,CPU把數(shù)據(jù)加載到高速緩存行里;
遍歷User_probe數(shù)據(jù),測量訪問時間來推測attacked_mem_addr的值。

亂序執(zhí)行、異常處理及地址空間(熔斷漏洞和計(jì)算機(jī)架構(gòu)緊密相關(guān))
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!??!前100名進(jìn)群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)??
?

亂序執(zhí)行流水線中有兩個功能:
消除指令之間的寄存器讀后寫(WAR)相關(guān)和寫后寫(WAW)相關(guān);
當(dāng)指令發(fā)生例外或者轉(zhuǎn)移指令猜測錯誤而取消后面的指令時,可用來保證現(xiàn)場精確。
我們從處理器角度分析,指令順序發(fā)車,亂序超車,順序歸隊(duì),這個容器就是保留站,這種亂執(zhí)行的機(jī)制就是我們所講的亂序執(zhí)行。
// 物理地址到虛擬地址轉(zhuǎn)換由這個宏__va來完成的




從上面的流程:就是物理地址轉(zhuǎn)換成虛擬地址就完成,其實(shí)加上一個大小為0xffff888000000000的偏移量即可。
虛擬地址到物理地址的轉(zhuǎn)換就更簡單,直接將偏移量減掉就可以。



二、PAS/mm_struct詳解
malloc()是用戶態(tài)常用的分配內(nèi)存接口函數(shù),mmap()是用戶態(tài)用于建立文件映射或匿名映射的函數(shù)。 比如進(jìn)程地址空間在內(nèi)核中用struct vm_area_struct數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述,簡稱為VMA,也被稱為進(jìn)程地址空間或進(jìn)程線性區(qū)。因?yàn)檫@些地址空間歸屬用戶進(jìn)程,所以在用戶進(jìn)程的struct mm_struct數(shù)據(jù)結(jié)構(gòu)也有相應(yīng)的成員。
1、PAS(進(jìn)程地址空間):指進(jìn)程可尋址的虛擬地址空間
在32位CPU當(dāng)中,進(jìn)程可以尋址4GB的地址空間,但是進(jìn)程沒有權(quán)限去尋址內(nèi)核空間的虛擬地址,只能通過系統(tǒng)調(diào)用的方式間接訪問。內(nèi)存區(qū)域包含內(nèi)容:代碼段映射、數(shù)據(jù)段映射、用戶進(jìn)程的棧、堆映射區(qū)域、MMAP映射區(qū)域。
2、內(nèi)核描述符mm_struct
Linux內(nèi)核需要管理每個進(jìn)程所有的內(nèi)存區(qū)域及它們對應(yīng)的頁表映射,所以必須抽象出一個數(shù)據(jù)結(jié)構(gòu)(mm_struct)。進(jìn)程的進(jìn)程控制塊(PCB)數(shù)據(jù)結(jié)構(gòu)task_struct中有一個指針mm指向這個mm_struct數(shù)據(jù)結(jié)構(gòu)。
A、task_struct(進(jìn)程描述符)內(nèi)核對應(yīng)源碼分析如下:
我們從進(jìn)程的角度來看內(nèi)存管理 ,直接沿著mm_struct數(shù)據(jù)結(jié)構(gòu)進(jìn)行進(jìn)一步延伸和思考,具體結(jié)構(gòu)視圖如下:

B.VMA管理(vm_area_struct)
三、malloc系統(tǒng)調(diào)用
在C語言程序設(shè)計(jì)當(dāng)中,malloc()是志專門用于內(nèi)存分配函數(shù)。假設(shè)系統(tǒng)中有進(jìn)程X和進(jìn)程Y,分別使用FuncX和FuncY函數(shù)分配對應(yīng)內(nèi)存。
malloc()函數(shù)-->Linux內(nèi)核系統(tǒng)調(diào)用brk向系統(tǒng)申請內(nèi)存。在32位Linux內(nèi)核中,每個用戶進(jìn)程擁有3GB的虛擬空間。用戶進(jìn)程的可執(zhí)行文件由代碼和數(shù)據(jù)段組成,數(shù)據(jù)段包括所有的靜態(tài)分配的數(shù)據(jù)空間,比如全局變量、靜態(tài)局部變量等。這些空間在可執(zhí)行文件裝載時,內(nèi)核就為其分配好這些空間,包括虛擬地址和物理頁面。Linux內(nèi)核brk系統(tǒng)調(diào)用視圖如下:

處理器的MMU硬件單元處理最小單元為頁,所以內(nèi)核分配內(nèi)存、建立虛擬地址和物理地址映射關(guān)系都以頁為單位,PAGE_ALIGN(addr)宏讓地址addr按頁面大小對齊。
Linux內(nèi)核malloc函數(shù)實(shí)現(xiàn)流程視圖如下:

