自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析A-CFI技術(shù):如何利用硬件防御ROP

安全 黑客攻防
控制流完整性(Control Flow Integrity, CFI)是由加州大學(xué)和微軟公司于2005年提出的一種防御控制流劫持攻擊的安全機(jī)制。通過(guò)監(jiān)視程序運(yùn)行過(guò)程中的控制流轉(zhuǎn)移過(guò)程,使其始終處于原有控制流圖所限定的合法范圍內(nèi)。

0x00 前言

隨著漏洞緩解技術(shù)的不斷發(fā)展,常用的一些漏洞利用手段如ROP變得越來(lái)越困難,來(lái)自ENDGAME的Cody Pierce發(fā)表了一篇[博客],稱ROP的末日已經(jīng)來(lái)臨,新的漏洞緩解技術(shù)將有效應(yīng)對(duì)未知的漏洞威脅,并宣布他們實(shí)現(xiàn)了一種全新利用硬件輔助的控制流完整性的防御機(jī)制——HA-CFI。

不過(guò)這種論調(diào)向來(lái)是要打自己臉的,因?yàn)榭傆行碌穆┒蠢梅绞匠鰻t,永遠(yuǎn)不能低估黑客的想象力。比如Flash推出的一系列漏洞緩解機(jī)制中仍然存在漏洞,這就很尷尬了(CVE-2016-4249,詳情可參考古河在HitCon上的演講)。

知己知彼,百戰(zhàn)不殆。只有充分了解新的漏洞緩解機(jī)制,才能有更好的思路去繞過(guò),才能對(duì)未來(lái)發(fā)展新的防御機(jī)制更有啟發(fā)。

0x01 控制流完整性

控制流完整性(Control Flow Integrity, CFI)是由加州大學(xué)和微軟公司于2005年提出的一種防御控制流劫持攻擊的安全機(jī)制。通過(guò)監(jiān)視程序運(yùn)行過(guò)程中的控制流轉(zhuǎn)移過(guò)程,使其始終處于原有控制流圖所限定的合法范圍內(nèi)。

具體的做法是分析程序的控制流圖,重點(diǎn)關(guān)注間接轉(zhuǎn)移指令,如間接跳轉(zhuǎn)、間接調(diào)用和函數(shù)返回等指令,獲取相應(yīng)的白名單。在程序運(yùn)行過(guò)程中對(duì)間接轉(zhuǎn)移指令的目標(biāo)進(jìn)行檢查核對(duì),而攻擊者對(duì)控制流的劫持會(huì)導(dǎo)致目標(biāo)不在白名單中,此時(shí)CFI可迅速進(jìn)行阻斷,保證系統(tǒng)安全。

一般來(lái)說(shuō),控制流完整性可分為細(xì)粒度和粗粒度兩種實(shí)現(xiàn)方式。細(xì)粒度CFI嚴(yán)格檢查每一個(gè)間接轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo),但會(huì)嚴(yán)重影響程序的執(zhí)行效率;粗粒度CFI將一組或相近類(lèi)型的目標(biāo)歸到一起進(jìn)行檢查,可在一定程度上降低開(kāi)銷(xiāo),但會(huì)使安全性降低。

0x02 基于硬件的CFI

早期一些CFI思路是基于二進(jìn)制插樁的,最簡(jiǎn)單粗暴的方式是在每條控制流轉(zhuǎn)移指令前插入檢驗(yàn)代碼,判斷目標(biāo)地址的合法性。但這種方式的開(kāi)銷(xiāo)實(shí)在太大,難以在實(shí)際中部署。因此研究人員提出的一些改進(jìn)方法均在效率上進(jìn)行了妥協(xié),放寬了檢查條件。實(shí)質(zhì)上都是粗粒度的CFI,實(shí)際效果會(huì)打折扣,可被攻擊者利用繞過(guò)。

既然CFI受制于效率,那么是否可以引入硬件機(jī)制來(lái)提高效率呢?畢竟相比二進(jìn)制插樁的方式,硬件的開(kāi)銷(xiāo)幾乎是可以忽略的,但前提是我們必須找到可行的實(shí)施方案。這就需要對(duì)處理器平臺(tái)上的一些技術(shù)細(xì)節(jié)有所了解。

Intel為了讓用戶能夠更好的對(duì)應(yīng)用程序的性能進(jìn)行優(yōu)化,提供了一系列輔助調(diào)試的硬件支持,這里著重介紹LBR(Last Branch Record)、BTS(Branch Trace Store)和PMU(Performance Monitoring Unit),早期的一些研究都是在這些基礎(chǔ)上開(kāi)展的。

LBR

LBR是Intel提供的一組用于記錄和追蹤程序最近的若干次跳轉(zhuǎn)信息的循環(huán)寄存器組,這些寄存器的數(shù)量與Intel處理器的微架構(gòu)相關(guān),在早幾年的Haswell架構(gòu)中有16個(gè)這樣的寄存器,也就是說(shuō)可以記錄程序最近的16條跳轉(zhuǎn)指令的信息(包括從哪跳轉(zhuǎn)過(guò)來(lái)的,將要跳轉(zhuǎn)到哪去),而在最新的Skylake架構(gòu)中有32個(gè)。LBR寄存器的強(qiáng)大之處在于其定制性很強(qiáng),能夠過(guò)濾掉一些不重要的跳轉(zhuǎn)指令,而保留需要重點(diǎn)關(guān)注的跳轉(zhuǎn)指令。

BTS

BTS是另一個(gè)用于記錄程序分支信息的功能單元,但與LBR不同的是,BTS不會(huì)將程序的跳轉(zhuǎn)指令信息存儲(chǔ)到寄存器中,而是將其存儲(chǔ)至CAR(cache-as-RAM)中或是系統(tǒng)的DRAM中,這里就沒(méi)有條數(shù)的限制了,只要空間足夠,BTS可以存儲(chǔ)大量跳轉(zhuǎn)指令的信息。

但另一方面,BTS的時(shí)間開(kāi)銷(xiāo)要比LBR高出許多。

PMU

PMU是Intel引入的用于記錄處理器事件的功能單元。PMU事件有好幾百個(gè),非常詳盡,包含了處理器在運(yùn)行過(guò)程中可能遇到的所有情形,例如指令計(jì)數(shù)、浮點(diǎn)運(yùn)算指令計(jì)數(shù)、L2緩存未命中的時(shí)鐘周期等。當(dāng)然其中也有一個(gè)在HA-CFI中非常有用的事件,分支預(yù)測(cè)失敗事件。

0x03 HA-CFI基本思路

如果大家對(duì)計(jì)算機(jī)體系結(jié)構(gòu)稍有了解就會(huì)知道,現(xiàn)代處理器都是采用流水線的方式執(zhí)行指令,而分支預(yù)測(cè)是保證其高效的一個(gè)非常重要的技術(shù)。

當(dāng)包含流水線技術(shù)的處理器處理分支指令時(shí)會(huì)遇到一個(gè)問(wèn)題,根據(jù)判定條件的真/假的不同,有可能會(huì)產(chǎn)生轉(zhuǎn)跳,而這會(huì)打斷流水線中指令的處理,因?yàn)樘幚砥鳠o(wú)法確定該指令的下一條指令。流水線越長(zhǎng),處理器等待的時(shí)間便越長(zhǎng),因?yàn)樗仨毜却种е噶钐幚硗戤?,才能確定下一條進(jìn)入流水線的指令。分支預(yù)測(cè)就是預(yù)測(cè)一條可能的分支,讓處理器沿著這條分支流水執(zhí)行下去而不用等待。若預(yù)測(cè)成功,那么皆大歡喜,處理器繼續(xù)執(zhí)行下去即可;若預(yù)測(cè)失敗,處理器則需要回退到分支位置,重新沿著正確的分支方向執(zhí)行。

分支預(yù)測(cè)有許多種策略,如靜態(tài)預(yù)測(cè)和動(dòng)態(tài)預(yù)測(cè)等,當(dāng)然學(xué)術(shù)界還有很多其他非常高端的方法。但無(wú)論采用何種方式進(jìn)行分支預(yù)測(cè),攻擊者劫持指令流后,其目標(biāo)地址顯然不是處理器能夠預(yù)測(cè)到的,必然會(huì)產(chǎn)生一個(gè)分支預(yù)測(cè)失敗的PMU事件,這相當(dāng)于一個(gè)預(yù)警信息,接下來(lái)要做的就是從這類(lèi)PMU事件中甄別出哪些是正常的分支預(yù)測(cè)失敗,哪些是由于攻擊者劫持指令流造成的分支預(yù)測(cè)失敗。

僅僅預(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ù)測(cè)失敗的事件時(shí),此時(shí)的指令指針可能早已越過(guò)了跳轉(zhuǎn)指令,很難回溯定位發(fā)生分支預(yù)測(cè)失敗的指令位置。

因此,為了精確定位造成分支預(yù)測(cè)失敗的指令,還需要借助LBR的幫助。當(dāng)分支預(yù)測(cè)失敗的PMU事件觸發(fā)中斷服務(wù)程序(ISR, Interrupt Service Routines)時(shí),ISR將從LBR中取出最新的若干條間接跳轉(zhuǎn)指令,其中必然包含造成分支預(yù)測(cè)失敗的間接跳轉(zhuǎn)指令。而且LBR中還記錄了更為詳細(xì)的信息,可方便ISR核對(duì)該間接跳轉(zhuǎn)指令的目標(biāo)地址是否在白名單中。若跳轉(zhuǎn)指令的目標(biāo)不在白名單之中,說(shuō)明指令流可能遭到劫持,可及時(shí)阻斷。示意圖如下所示:

HA-CFI示意圖

此外,為了進(jìn)一步保證HA-CFI的效率,可以根據(jù)當(dāng)前進(jìn)程的重要性選擇性的開(kāi)啟或關(guān)閉PMU,如當(dāng)前進(jìn)程為IE或Firefox瀏覽器時(shí),開(kāi)啟PMU;若當(dāng)前進(jìn)程為Calc.exe這樣不太容易遭受攻擊的進(jìn)程,則關(guān)閉PMU,如圖所示:

選擇性開(kāi)啟PMU

0x04 效果與展望

Cody Pierce等人選取了多個(gè)經(jīng)典的CVE漏洞,與EMET進(jìn)行了比較:

實(shí)驗(yàn)結(jié)果1

實(shí)驗(yàn)結(jié)果2

可以肯定的是,隨著對(duì)抗的不斷升級(jí),未來(lái)漏洞利用的門(mén)檻將越來(lái)越高,與防御機(jī)制斗法也將也成為常態(tài)。

除了剛才提到的微軟的EMET,Intel在今年6月發(fā)布了一份關(guān)于CET的技術(shù)前瞻:[Control-flow Enforcement Technology Preview],準(zhǔn)備從硬件層面入手防止ROP和JOP攻擊。通過(guò)引入一個(gè)shadow stack(類(lèi)似的[想法]幾年前也有人提出),專門(mén)用于存儲(chǔ)返回地址,每當(dāng)發(fā)生函數(shù)調(diào)用時(shí),除了向當(dāng)前線程棧內(nèi)壓入返回地址,還要向shadow stack中壓入返回地址。返回時(shí)需要檢查線程棧中的返回地址是否與shadow stack中一致,若不一致,說(shuō)明線程??赡茉獾焦粽咂茐?,程序中止。此外,shadow stack處于層層嚴(yán)密防護(hù)之中,普通代碼是無(wú)法修改shadow stack的,除非攻擊者能控制內(nèi)核,當(dāng)然這并非不可能,只是攻擊門(mén)檻變得很高了。

CET目前仍是一個(gè)前瞻性的技術(shù),距離真正實(shí)現(xiàn)還需要時(shí)間。即使實(shí)現(xiàn)了,也不意味著高枕無(wú)憂,HA-CFI也是如此,總有能繞過(guò)的方法,總有其未考慮到的情況,甚至可能它本身也存在著缺陷。

責(zé)任編輯:武曉燕 來(lái)源: 紅黑聯(lián)盟
相關(guān)推薦

2010-09-13 09:20:21

2013-12-11 09:51:33

2017-03-14 15:37:28

2014-06-26 11:33:42

2011-04-07 14:26:06

2010-09-27 08:46:53

2016-09-29 22:54:55

2017-06-08 19:19:10

2013-11-04 09:15:58

2023-07-26 17:13:38

2009-09-24 17:01:06

Javascript獲

2010-04-08 16:11:39

Unix操作系統(tǒng)

2015-06-12 09:58:51

2011-08-10 09:13:22

2011-09-30 10:34:03

無(wú)線

2022-11-24 14:46:14

網(wǎng)絡(luò)社區(qū)發(fā)現(xiàn)

2015-09-22 09:43:31

2009-06-23 18:09:22

2013-04-18 09:52:56

2021-07-14 10:21:55

物聯(lián)網(wǎng)智慧城市IoT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)