Rop是借鑒淘寶開發(fā)平臺實(shí)現(xiàn)的全功能Rest Web Service 開源框架,提供了請求/響應(yīng)序列化、數(shù)據(jù)檢驗(yàn)、會話管理、安全管理等高級主題的東西。 前言 隨著漏洞緩解技術(shù)的不斷發(fā)展,常用的一些漏洞利用手段如ROP變得越來越困難,來自ENDGAME的Cody Pierce發(fā)表了一篇[博客],稱ROP的末日已經(jīng)來臨,新的漏洞緩解技術(shù)將有效應(yīng)對未知的漏洞威脅,并宣布他們實(shí)現(xiàn)了一種全新利用硬件輔助的控制流完整性的防御機(jī)制——HA-CFI。 不過這種論調(diào)向來是要打自己臉的,因?yàn)榭傆行碌穆┒蠢梅绞匠鰻t,永遠(yuǎn)不能低估黑客的想象力。比如Flash推出的一系列漏洞緩解機(jī)制中仍然存在漏洞,這就很尷尬了(CVE-2016-4249,詳情可參考古河在HitCon上的演講)。 知己知彼,百戰(zhàn)不殆。只有充分了解新的漏洞緩解機(jī)制,才能有更好的思路去繞過,才能對未來發(fā)展新的防御機(jī)制更有啟發(fā)。 控制流完整性 控制流完整性(Control Flow Integrity, CFI)是由加州大學(xué)和微軟公司于2005年提出的一種防御控制流劫持攻擊的安全機(jī)制。通過監(jiān)視程序運(yùn)行過程中的控制流轉(zhuǎn)移過程,使其始終處于原有控制流圖所限定的合法范圍內(nèi)。 具體的做法是分析程序的控制流圖,重點(diǎn)關(guān)注間接轉(zhuǎn)移指令,如間接跳轉(zhuǎn)、間接調(diào)用和函數(shù)返回等指令,獲取相應(yīng)的白名單。在程序運(yùn)行過程中對間接轉(zhuǎn)移指令的目標(biāo)進(jìn)行檢查核對,而攻擊者對控制流的劫持會導(dǎo)致目標(biāo)不在白名單中,此時(shí)CFI可迅速進(jìn)行阻斷,保證系統(tǒng)安全。 一般來說,控制流完整性可分為細(xì)粒度和粗粒度兩種實(shí)現(xiàn)方式。細(xì)粒度CFI嚴(yán)格檢查每一個(gè)間接轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo),但會嚴(yán)重影響程序的執(zhí)行效率;粗粒度CFI將一組或相近類型的目標(biāo)歸到一起進(jìn)行檢查,可在一定程度上降低開銷,但會使安全性降低。 基于硬件的CFI 早期一些CFI思路是基于二進(jìn)制插樁的,最簡單粗暴的方式是在每條控制流轉(zhuǎn)移指令前插入檢驗(yàn)代碼,判斷目標(biāo)地址的合法性。但這種方式的開銷實(shí)在太大,難以在實(shí)際中部署。因此研究人員提出的一些改進(jìn)方法均在效率上進(jìn)行了妥協(xié),放寬了檢查條件。實(shí)質(zhì)上都是粗粒度的CFI,實(shí)際效果會打折扣,可被攻擊者利用繞過。 既然CFI受制于效率,那么是否可以引入硬件機(jī)制來提高效率呢?畢竟相比二進(jìn)制插樁的方式,硬件的開銷幾乎是可以忽略的,但前提是我們必須找到可行的實(shí)施方案。這就需要對處理器平臺上的一些技術(shù)細(xì)節(jié)有所了解。 Intel為了讓用戶能夠更好的對應(yīng)用程序的性能進(jìn)行優(yōu)化,提供了一系列輔助調(diào)試的硬件支持,這里著重介紹LBR(Last Branch Record)、BTS(Branch Trace Store)和PMU(Performance Monitoring Unit),早期的一些研究都是在這些基礎(chǔ)上開展的。 LBR LBR是Intel提供的一組用于記錄和追蹤程序最近的若干次跳轉(zhuǎn)信息的循環(huán)寄存器組,這些寄存器的數(shù)量與Intel處理器的微架構(gòu)相關(guān),在早幾年的Haswell架構(gòu)中有16個(gè)這樣的寄存器,也就是說可以記錄程序最近的16條跳轉(zhuǎn)指令的信息(包括從哪跳轉(zhuǎn)過來的,將要跳轉(zhuǎn)到哪去),而在最新的Skylake架構(gòu)中有32個(gè)。LBR寄存器的強(qiáng)大之處在于其定制性很強(qiáng),能夠過濾掉一些不重要的跳轉(zhuǎn)指令,而保留需要重點(diǎn)關(guān)注的跳轉(zhuǎn)指令。 BTS BTS是另一個(gè)用于記錄程序分支信息的功能單元,但與LBR不同的是,BTS不會將程序的跳轉(zhuǎn)指令信息存儲到寄存器中,而是將其存儲至CAR(cache-as-RAM)中或是系統(tǒng)的DRAM中,這里就沒有條數(shù)的限制了,只要空間足夠,BTS可以存儲大量跳轉(zhuǎn)指令的信息。 但另一方面,BTS的時(shí)間開銷要比LBR高出許多。 PMU PMU是Intel引入的用于記錄處理器事件的功能單元。PMU事件有好幾百個(gè),非常詳盡,包含了處理器在運(yùn)行過程中可能遇到的所有情形,例如指令計(jì)數(shù)、浮點(diǎn)運(yùn)算指令計(jì)數(shù)、L2緩存未命中的時(shí)鐘周期等。當(dāng)然其中也有一個(gè)在HA-CFI中非常有用的事件,分支預(yù)測失敗事件。 HA-CFI基本思路 如果大家對計(jì)算機(jī)體系結(jié)構(gòu)稍有了解就會知道,現(xiàn)代處理器都是采用流水線的方式執(zhí)行指令,而分支預(yù)測是保證其高效的一個(gè)非常重要的技術(shù)。 當(dāng)包含流水線技術(shù)的處理器處理分支指令時(shí)會遇到一個(gè)問題,根據(jù)判定條件的真/假的不同,有可能會產(chǎn)生轉(zhuǎn)跳,而這會打斷流水線中指令的處理,因?yàn)樘幚砥鳠o法確定該指令的下一條指令。流水線越長,處理器等待的時(shí)間便越長,因?yàn)樗仨毜却种е噶钐幚硗戤叄拍艽_定下一條進(jìn)入流水線的指令。分支預(yù)測就是預(yù)測一條可能的分支,讓處理器沿著這條分支流水執(zhí)行下去而不用等待。若預(yù)測成功,那么皆大歡喜,處理器繼續(xù)執(zhí)行下去即可;若預(yù)測失敗,處理器則需要回退到分支位置,重新沿著正確的分支方向執(zhí)行。 分支預(yù)測有許多種策略,如靜態(tài)預(yù)測和動態(tài)預(yù)測等,當(dāng)然學(xué)術(shù)界還有很多其他非常高端的方法。但無論采用何種方式進(jìn)行分支預(yù)測,攻擊者劫持指令流后,其目標(biāo)地址顯然不是處理器能夠預(yù)測到的,必然會產(chǎn)生一個(gè)分支預(yù)測失敗的PMU事件,這相當(dāng)于一個(gè)預(yù)警信息,接下來要做的就是從這類PMU事件中甄別出哪些是正常的分支預(yù)測失敗,哪些是由于攻擊者劫持指令流造成的分支預(yù)測失敗。 僅僅預(yù)警是不夠的,HA-CFI還希望能夠準(zhǔn)確定位指令流被劫持的位置,并及時(shí)進(jìn)行阻斷。此時(shí)PMU就幫不上什么忙了,因?yàn)镻MU只負(fù)責(zé)報(bào)告處理器事件,而不記錄產(chǎn)生該事件的具體指令。當(dāng)某一時(shí)刻PMU報(bào)告一個(gè)分支預(yù)測失敗的事件時(shí),此時(shí)的指令指針可能早已越過了跳轉(zhuǎn)指令,很難回溯定位發(fā)生分支預(yù)測失敗的指令位置。 因此,為了精確定位造成分支預(yù)測失敗的指令,還需要借助LBR的幫助。當(dāng)分支預(yù)測失敗的PMU事件觸發(fā)中斷服務(wù)程序(ISR, Interrupt Service Routines)時(shí),ISR將從LBR中取出最新的若干條間接跳轉(zhuǎn)指令,其中必然包含造成分支預(yù)測失敗的間接跳轉(zhuǎn)指令。而且LBR中還記錄了更為詳細(xì)的信息,可方便ISR核對該間接跳轉(zhuǎn)指令的目標(biāo)地址是否在白名單中。若跳轉(zhuǎn)指令的目標(biāo)不在白名單之中,說明指令流可能遭到劫持,可及時(shí)阻斷。示意圖如下所示:
HA-CFI示意圖 此外,為了進(jìn)一步保證HA-CFI的效率,可以根據(jù)當(dāng)前進(jìn)程的重要性選擇性的開啟或關(guān)閉PMU,如當(dāng)前進(jìn)程為IE或Firefox瀏覽器時(shí),開啟PMU;若當(dāng)前進(jìn)程為Calc.exe這樣不太容易遭受攻擊的進(jìn)程,則關(guān)閉PMU,如圖所示:
選擇性開啟PMU 效果與展望 Cody Pierce等人選取了多個(gè)經(jīng)典的CVE漏洞,與EMET進(jìn)行了比較:
實(shí)驗(yàn)結(jié)果1
實(shí)驗(yàn)結(jié)果2 可以肯定的是,隨著對抗的不斷升級,未來漏洞利用的門檻將越來越高,與防御機(jī)制斗法也將也成為常態(tài)。 除了剛才提到的微軟的EMET,Intel在今年6月發(fā)布了一份關(guān)于CET的技術(shù)前瞻:[Control-flow Enforcement Technology Preview],準(zhǔn)備從硬件層面入手防止ROP和JOP攻擊。通過引入一個(gè)shadow stack(類似的[想法]幾年前也有人提出),專門用于存儲返回地址,每當(dāng)發(fā)生函數(shù)調(diào)用時(shí),除了向當(dāng)前線程棧內(nèi)壓入返回地址,還要向shadow stack中壓入返回地址。返回時(shí)需要檢查線程棧中的返回地址是否與shadow stack中一致,若不一致,說明線程棧可能遭到攻擊者破壞,程序中止。此外,shadow stack處于層層嚴(yán)密防護(hù)之中,普通代碼是無法修改shadow stack的,除非攻擊者能控制內(nèi)核,當(dāng)然這并非不可能,只是攻擊門檻變得很高了。 CET目前仍是一個(gè)前瞻性的技術(shù),距離真正實(shí)現(xiàn)還需要時(shí)間。即使實(shí)現(xiàn)了,也不意味著高枕無憂,HA-CFI也是如此,總有能繞過的方法,總有其未考慮到的情況,甚至可能它本身也存在著缺陷。 |
免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系我們及時(shí)修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!
掃一掃,關(guān)注站長網(wǎng)微信