• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      操作系統(tǒng)和虛擬化安全知識

      2023-05-30 11:57:00闞哲
      計算機與網(wǎng)絡(luò) 2023年3期
      關(guān)鍵詞:控制流堆棧內(nèi)核

      闞哲

      控制流限制

      正交防線是調(diào)節(jié)操作系統(tǒng)的控制流。通過確保攻擊者無法將控制權(quán)轉(zhuǎn)移到他們選擇的代碼上,即使不刪除內(nèi)存錯誤,也會使利用內(nèi)存錯誤變得更加困難。最好的例子被稱為控制流完整性(CFI),現(xiàn)在許多編譯器工具鏈(如LLVM和微軟的VisualStudio),于2017年以ControlFlowGuard的名義并入Windows內(nèi)核。

      從概念上講,CFI非常簡單:確保代碼中的控制流始終遵循靜態(tài)控制流圖。例如,一個函數(shù)的返回指令應(yīng)該只允許返回到它的調(diào)用站點,而使用C中的函數(shù)指針或C++中的虛函數(shù)的間接調(diào)用應(yīng)該只能夠定位它應(yīng)該能夠調(diào)用的合法函數(shù)的入口點。為了實現(xiàn)這種保護,可以標記間接控制轉(zhuǎn)移指令的所有合法目標(返回、間接調(diào)用和間接跳轉(zhuǎn)),并將這些標簽添加到特定于此指令的集合。在運行時,檢查指令即將進行的控制轉(zhuǎn)移是否為集合中的目標。否則,CFI會發(fā)出警報。

      與ASLR一樣,CFI有多種“口味”,從粗粒度到細粒度,從上下文敏感到上下文不敏感。就像在ASLR中一樣,今天的大多數(shù)實現(xiàn)只采用最簡單、最粗粒度的保護。粗粒度CFI意味著為了性能而稍微放寬規(guī)則。例如,它不是將函數(shù)的返回指令限制為可能調(diào)用此函數(shù)的僅目標合法調(diào)用站點,而是可以針對任何調(diào)用站點。雖然不如細粒度CFI安全,但它仍然極大地限制了攻擊者的回旋余地,并且可以更快地在運行時檢查。

      在現(xiàn)代機器上,某些形式的CFI甚至(或?qū)⒁┑玫接布闹С?。例如,英特爾控制流強制技術(shù)(CET)支持影子堆棧和間接分支跟蹤,以幫助強制實施退貨和前向控制傳輸?shù)耐暾裕ㄒ苑浅4至6鹊姆绞剑RM也不甘示弱,它提供了指針身份驗證,以防止對指針值進行非法修改———主要是通過使用指針的上位來存儲指針身份驗證代碼(PAC),其功能類似于加密指針值上的簽名(除非獲得正確的PAC,否則指針無效)。

      遺憾的是,CFI只能通過破壞返回地址、函數(shù)指針和跳轉(zhuǎn)目標等控制數(shù)據(jù)來幫助抵御改變控制流的攻擊,但對非控制數(shù)據(jù)攻擊卻無能為力。例如,它無法阻止覆蓋當前進程的權(quán)限級別并將其設(shè)置為“root”的內(nèi)存損壞(例如通過將有效用戶ID設(shè)置為root用戶的ID)。但是,如果對控制流的限制在實踐中如此成功,您可能想知道數(shù)據(jù)流是否也可以進行類似的限制。事實上,它們確實如此,這被稱為數(shù)據(jù)流完整性(DFI)。在DFI中,靜態(tài)地確定每個加載指令(即從內(nèi)存中讀取的指令)存儲指令可能合法地產(chǎn)生了數(shù)據(jù),并且標記這些指令并將這些標簽保存在一組中。在運行時,對于內(nèi)存中的每個字節(jié),記住該位置最后一個存儲的標簽。當遇到加載指令時,會檢查該地址的最后一個存儲是否在合法存儲集中,如果不是,會發(fā)出警報。與CFI不同,DFI在實踐中并未被廣泛采用,可能是因為其顯著的性能開銷。

      信息隱藏

      大多數(shù)當前操作系統(tǒng)的主要防線之一是隱藏攻擊者可能感興趣的任何內(nèi)容。具體來說,通過隨機化所有相關(guān)內(nèi)存區(qū)域(在代碼、堆、全局數(shù)據(jù)和堆棧中)的位置,攻擊者將不知道在哪里轉(zhuǎn)移控制流,也無法發(fā)現(xiàn)哪個地址包含敏感數(shù)據(jù)等。術(shù)語地址空間布局隨機化(ASLR)是在PaX安全補丁發(fā)布時創(chuàng)造的,該補丁在2001年為Linux內(nèi)核實現(xiàn)了這種隨機化。很快,類似的努力出現(xiàn)在其他操作系統(tǒng)中,第一個默認啟用ASLR的主流操作系統(tǒng)是2003年的OpenBSD和2005年的Linux。Windows和MacOS在2007年緊隨其后。然而,這些早期的實現(xiàn)只是隨機化了用戶程序中的地址空間,隨機化直到大約10年后才到達主要操作系統(tǒng)的內(nèi)核。

      如今,大多數(shù)實現(xiàn)都采用粗粒度隨機化:它們隨機化代碼、堆或堆棧的基本位置,但在這些區(qū)域中,每個元素都與基本元素處于固定偏移量。這很簡單,而且非???,然而,一旦攻擊者設(shè)法通過信息泄漏獲得哪怕一個代碼指針,他們就會知道每條指令的地址。對于堆、堆棧等,也是如此,因此,毫不奇怪,這些信息泄漏是當今攻擊者高度重視的目標。

      更細粒度的隨機化也是可能的。例如,可以在頁面級別或功能級別進行隨機化。如果在內(nèi)存區(qū)域中打亂函數(shù)的順序,即使知道內(nèi)核代碼的基礎(chǔ)對于攻擊者來說也是不夠的。事實上,我們可以更細粒度地洗牌基本塊、指令(可能帶有從不執(zhí)行或無效的垃圾指令)甚至寄存器分配。許多細粒度隨機化技術(shù)都是以空間和時間開銷為代價的,例如,由于局部性和碎片化減少。

      除了代碼之外,還可以對數(shù)據(jù)進行細粒度隨機化。例如,研究表明,堆棧上的堆分配、全局變量甚至變量都可以分散在內(nèi)存中。當然,這樣做會產(chǎn)生性能和內(nèi)存方面的成本。

      考慮到KASLR,尤其是粗粒度的KASLR,作為抵御內(nèi)存錯誤攻擊的第一道防線,這不會離目標太遠。不幸的是,它也是一個非常薄弱的防御,許多出版物表明,通過從內(nèi)存、側(cè)信道等泄漏數(shù)據(jù)和(或)代碼指針,KASLR可以相當容易地被破解。

      保護環(huán)

      Multics引入的最具革命性的想法之一是保護環(huán)的概念———一種特權(quán)的分層,其中內(nèi)環(huán)(環(huán)0)是最有特權(quán)的,并且外環(huán)的特權(quán)最低。因此,不受信任的用戶進程在外環(huán)中執(zhí)行,而直接與硬件交互的受信任和特權(quán)內(nèi)核在環(huán)0中執(zhí)行,其他環(huán)可用于或多或少特權(quán)的系統(tǒng)進程。

      保護環(huán)通常采用硬件支持,這是當今大多數(shù)通用處理器提供的功能,盡管保護環(huán)的數(shù)量可能有所不同。例如,霍尼韋爾6180支持多達8個環(huán),英特爾的x86支持4個,ARMv7支持3個(加上TrustZone的額外1個)和PowerPC的2個。但是,故事變得有點混亂,因為一些現(xiàn)代處理器也引入了更多不同的處理器模式;大多數(shù)常規(guī)操作系統(tǒng)只使用2個環(huán):一個用于操作系統(tǒng),一個用于用戶進程。

      每當權(quán)限較低的代碼需要更多權(quán)限的函數(shù)時,它就會“調(diào)用”下環(huán)以請求將此函數(shù)作為服務(wù)執(zhí)行。因此,只有受信任的特權(quán)代碼才能執(zhí)行最敏感的指令或操作最敏感的數(shù)據(jù)。除非具有較少權(quán)限的進程誘騙更多特權(quán)的代碼執(zhí)行它不應(yīng)該做的事情(作為困惑的副手),否則環(huán)會提供強大的保護。Multics的最初想法是,環(huán)之間的轉(zhuǎn)換將通過實施嚴格控制和調(diào)解的特殊呼叫門進行。例如,外環(huán)中的代碼不能調(diào)用內(nèi)環(huán)中的任何指令,而只能調(diào)用第一個調(diào)用的預(yù)定義入口點經(jīng)過審查,看它及其參數(shù)是否違反任何安全策略。

      雖然像x86這樣的處理器仍然支持呼叫門,但很少有操作系統(tǒng)使用它們,因為它們相對較慢。相反,用戶進程通過執(zhí)行操作系統(tǒng)處理的軟件中斷(陷阱),或更常見的是通過特殊的高效操作過渡到操作系統(tǒng)內(nèi)核(系統(tǒng)調(diào)用)。系統(tǒng)調(diào)用指令(如SYSCALL、SYSENTER、SVC、SCALL等,具體取決于體系結(jié)構(gòu))。許多操作系統(tǒng)將系統(tǒng)調(diào)用的參數(shù)放在一組預(yù)定義的寄存器中。與調(diào)用門一樣,陷阱和系統(tǒng)調(diào)用指令也確保在操作系統(tǒng)中的預(yù)定義地址繼續(xù)執(zhí)行,代碼在其中檢查參數(shù),然后調(diào)用相應(yīng)的系統(tǒng)調(diào)用函數(shù)。

      除了用戶進程調(diào)用操作系統(tǒng)外,大多數(shù)操作系統(tǒng)還允許內(nèi)核調(diào)用用戶進程。例如,基于UNIX的系統(tǒng)支持操作系統(tǒng)用來通知用戶程序“有趣的事情”的信號:錯誤、過期的計時器、中斷、來自另一個的消息工藝等,如果用戶進程為信號注冊了一個處理程序,操作系統(tǒng)將停止進程的當前執(zhí)行,將其所有處理器狀態(tài)存儲在進程堆棧上,形成所謂的信號,并在信號處理程序上繼續(xù)執(zhí)行。當信號處理程序返回時,進程執(zhí)行sigreturn系統(tǒng)調(diào)用,使操作系統(tǒng)接管,還原堆棧上的處理器狀態(tài)并繼續(xù)執(zhí)行進程。

      安全域(如操作系統(tǒng)內(nèi)核和用戶空間進程)之間的邊界是檢查系統(tǒng)調(diào)用本身及其安全性參數(shù)的好地方。例如,在基于功能的操作系統(tǒng)中,內(nèi)核將驗證功能,而在MINIX3等操作系統(tǒng)中,只允許特定進程進行特定調(diào)用,因此任何嘗試撥打不在預(yù)先批準列表中的呼叫將被標記為違規(guī)。同樣,基于Windows和UNIX的操作系統(tǒng)必須檢查許多系統(tǒng)調(diào)用的參數(shù)。例如,考慮常見的讀寫系統(tǒng)調(diào)用,通過這些調(diào)用,用戶請求將數(shù)據(jù)從文件或套接字讀取到緩沖區(qū)中,或者從緩沖區(qū)分別到文件或套接字中。在執(zhí)行此操作之前,操作系統(tǒng)應(yīng)檢查要寫入或讀取的內(nèi)存是否實際歸進程所有。

      執(zhí)行系統(tǒng)調(diào)用后,操作系統(tǒng)將控制權(quán)返回給進程,操作系統(tǒng)還必須注意不要返回危及系統(tǒng)安全性的結(jié)果。例如,如果一個進程使用mmap系統(tǒng)調(diào)用請求操作系統(tǒng)將更多內(nèi)存映射到其地址空間,則操作系統(tǒng)應(yīng)確保它返回的內(nèi)存頁不再包含來自另一個進程的敏感數(shù)據(jù)(如首先將每個字節(jié)初始化為零)。

      零初始化問題可能非常微妙,如編譯器經(jīng)常在數(shù)據(jù)結(jié)構(gòu)中引入填充字節(jié)以對齊。由于這些填充字節(jié)在編程語言級別根本不可見,因此編譯器可能認為沒有理由將它們初始化為零。但是,當操作系統(tǒng)返回此類數(shù)據(jù)結(jié)構(gòu)以響應(yīng)系統(tǒng)調(diào)用并且單元化填充包含來自內(nèi)核或其他進程的敏感數(shù)據(jù)時,就會發(fā)生安全違規(guī)。

      即使是UNIX系統(tǒng)中的信令子系統(tǒng)也是一個有趣的安全案例。回想一下,sigreturn采用堆棧上的任何處理器狀態(tài)并恢復(fù)該狀態(tài)。假設(shè)攻擊者能夠破壞進程的堆棧并在堆棧上存儲虛假信號幀,如果攻擊者能夠觸發(fā)sigreturn,或可以設(shè)置整個處理器狀態(tài)(包括所有寄存器值),這樣在熟練的攻擊者手中就提供了一個強大的基元,被稱為sigreturn導(dǎo)向編程(SROP)。

      如前所述,為此,添加了看起來像底部額外戒指的東西。由于在x86處理器上,術(shù)語ring0已成為“操作系統(tǒng)內(nèi)核”的同義詞(以及“環(huán)”與“用戶進程”的同義詞),因此這種新的虛擬機管理程序環(huán)通常稱為ring-1。它還指示其各自虛擬機中的操作系統(tǒng)可以繼續(xù)在本地執(zhí)行環(huán)0指令。嚴格來說,它的目的與原始戒指大不相同,雖然環(huán)-1這個名字已經(jīng)卡住了,但它可能有點像用詞不當。

      為了完整起見,應(yīng)該提到的事情可能會變得更加復(fù)雜,因為一些現(xiàn)代處理器仍然具有其他模式。例如,x86提供所謂的系統(tǒng)管理模式(SMM)。當系統(tǒng)啟動時,固件控制硬件,并為操作系統(tǒng)接管系統(tǒng)做好準備。但是,啟用SMM后,固件會在向CPU發(fā)送特定中斷時重新獲得控制權(quán)。例如,固件可以指示每當按下電源按鈕時它都希望接收中斷,在這種情況下,常規(guī)執(zhí)行將停止,固件將接管。例如,可以保存處理器狀態(tài),執(zhí)行任何需要執(zhí)行的操作,然后恢復(fù)操作系統(tǒng)以進行有序關(guān)閉。在某種程度上,SMM有時被視為比其他環(huán)(環(huán)-2)低的水平。

      英特爾甚至以英特爾管理引擎(ME)的形式增加了環(huán)-3。ME是一個完全自主的系統(tǒng),現(xiàn)在幾乎存在于英特爾的所有芯片組中。它在單獨的微處理器上運行一個秘密且完全獨立的固件,并且始終處于活動狀態(tài):在啟動過程中,當機器運行時,當它處于睡眠狀態(tài)時,即斷電。只要計算機連接到電源,就可以通過網(wǎng)絡(luò)與ME通信,如安裝更新。雖然非常強大,但它的功能在很大程度上是未知的,除了運行自己的小型操作系統(tǒng),研究人員發(fā)現(xiàn)其中包含漏洞。主CPU附帶的附加處理器(無論是ME還是Apple的T2和Google的Titan芯片等相關(guān)處理器)都提出了一個有趣的點———在主CPU上運行的操作系統(tǒng)是否能夠滿足當今的安全要求?至少,這種趨勢似乎通過專用系統(tǒng)(硬件和軟件)來增強它的安全性。

      低端設(shè)備和物聯(lián)網(wǎng)

      上述許多功能都可以在大多數(shù)通用處理器體系結(jié)構(gòu)中找到。然而,在物聯(lián)網(wǎng)或一般的嵌入式系統(tǒng)中不一定如此,并且通常使用定制的操作系統(tǒng)。簡單的微控制器通常沒有MMU,有時甚至沒有MPU、保護環(huán)或在常見操作系統(tǒng)中依賴的任何高級功能。系統(tǒng)通常很小(減少攻擊面),應(yīng)用程序受信任(并可能經(jīng)過驗證)。然而,設(shè)備的嵌入式性質(zhì)使其很難檢查甚至測試其安全性,并且無論它們在安全敏感活動中發(fā)揮作用的何處,安全性隔離/遏制和調(diào)解的手段應(yīng)由環(huán)境在外部強制執(zhí)行。更廣泛的物聯(lián)網(wǎng)問題在網(wǎng)絡(luò)物理系統(tǒng)安全CyBOK知識領(lǐng)域得到解決。

      猜你喜歡
      控制流堆棧內(nèi)核
      萬物皆可IP的時代,我們當夯實的IP內(nèi)核是什么?
      強化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      抵御控制流分析的Python 程序混淆算法
      工控系統(tǒng)中PLC安全漏洞及控制流完整性研究
      電子科技(2021年2期)2021-01-08 02:25:58
      抵御控制流分析的程序混淆算法
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
      Linux內(nèi)核mmap保護機制研究
      嵌入式軟件堆棧溢出的動態(tài)檢測方案設(shè)計*
      基于堆棧自編碼降維的武器裝備體系效能預(yù)測
      基于控制流隱藏的代碼迷惑
      左云县| 沙湾县| 子洲县| 兴山县| 鹤庆县| 古蔺县| 乌兰县| 宣武区| 英超| 陇南市| 隆林| 昌黎县| 和平区| 商都县| 霍州市| 尚义县| 南宫市| 永胜县| 大足县| 枣阳市| 邮箱| 威信县| 巴林左旗| 九龙城区| 福泉市| 封丘县| 内乡县| 正镶白旗| 民勤县| 咸丰县| 奈曼旗| 岳池县| 常州市| 马关县| 婺源县| 静宁县| 蒙阴县| 南投市| 罗源县| 泸西县| 鄂托克前旗|