李 揚 戴紫彬 李軍偉
(信息工程大學 河南 鄭州 450001)
代碼重用攻擊[1]作為一種新型軟件攻擊,已嚴重威脅到嵌入式設備的安全。針對代碼重用攻擊,許多檢測方案將硬件監(jiān)控單元集成在處理器的流水線中[2-5],將檢測所需的信號從不同流水線階段轉發(fā)到硬件監(jiān)控單元,硬件監(jiān)控單元利用這些信號檢測控制流的完整性,一些方案是在被測系統(tǒng)的指令集中擴展特殊指令來完成檢測[6-9],這些方案都需要改動處理器流水線。但是在一些特殊場景,并不能通過修改處理器流水線部署安全機制,例如某些第三方處理器供應商禁止修改處理器內(nèi)部邏輯,或者修改處理器內(nèi)部邏輯會耗費較高的成本。這時許多方案利用現(xiàn)有的調(diào)試接口監(jiān)視程序的行為,這些方案符合SoC的設計規(guī)則,能夠以低成本實現(xiàn)。
目前,已有眾多學者在不修改處理器結構的基礎上,提出了檢測方案。Corey等[10]利用性能計數(shù)器計數(shù)結果之間的數(shù)學關系,建立模型來區(qū)分正常程序和惡意程序,但是建模過程復雜,檢測精度較低;Wang等[11]將檢測代碼固化在Boot ROM中,在加載固件時檢測代碼重用攻擊,能夠確保固件執(zhí)行的完整性,但是不能夠保證應用程序執(zhí)行的完整性。現(xiàn)有的利用性能計數(shù)器檢測代碼重用攻擊的方案基本都是純軟件實現(xiàn),需要借助軟件工具在可執(zhí)行文件中插樁檢測代碼。除了利用性能計數(shù)器,許多方案利用調(diào)試接口部署檢測策略,Lee等[12]觀測到ARM CoreSight調(diào)試器能夠生成的控制流跟蹤信息僅僅包括間接分支目標地址,為了部署硬件影子堆棧,還需要獲取分支類型和源地址,為此,通過離線分析二進制文件生成需補充的元數(shù)據(jù)。Lee等[13]通過ARM的核心調(diào)試接口CDI(Core Debug Interface)實施跟蹤檢測,CONVERSE使用IEEE-ISTO Nexus 5001標準調(diào)試接口部署檢測策略[14]。利用調(diào)試架構檢測通常需要補充元數(shù)據(jù),并且容易產(chǎn)生跟蹤丟失。此外,對設備調(diào)試接口規(guī)范的屬性具有依賴性,例如CDI作為高級調(diào)試接口較少在低端嵌入式設備中使用。
本文將性能計數(shù)器檢測方法與調(diào)試接口檢測方法相結合,提出一種面向代碼重用攻擊檢測的安全調(diào)試架構,制定了函數(shù)級檢測方案,能夠在不修改處理內(nèi)部邏輯、不插樁的前提下完成檢測,克服了現(xiàn)有技術的不足。
代碼重用攻擊利用漏洞改變程序在內(nèi)存中原有代碼、執(zhí)行順序來達到攻擊的目的。代碼重用攻擊通常通過緩存溢出部署,通過覆蓋返回地址或其他參數(shù)重定向控制流,鏈接具有不同功能的短指令片段完成惡意操作。本文假設攻擊者能夠反匯編庫文件和可執(zhí)行文件,能夠查找到可被用于構建攻擊的短指令片段,假設用于編寫應用程序的高級語言中存在可被攻擊者利用的漏銅。這些漏洞是廣泛存在的,這也是代碼重用攻擊種類多、防御困難和發(fā)展迅速的主要原因。同時假設加載進內(nèi)存的代碼不可修改,數(shù)據(jù)不可執(zhí)行,例如系統(tǒng)受到NX(No eXecute)機制的保護[15],能夠防御代碼注入攻擊[16]。
代碼重用攻擊能夠利用程序漏洞修改基本塊末尾條件分支指令的條件變量,在程序控制流圖CFG(Control Flow Graph)有效路徑之內(nèi)改變執(zhí)行方向,如圖1中虛線a所示;或改變循環(huán)執(zhí)行的次數(shù),如圖中1虛線b所示,例如LOP(Loop Oriented Programming)攻擊[17];此外,代碼重用攻擊能夠通過修改基本塊末尾代碼指針,執(zhí)行不在程序控制流圖有效路徑限定內(nèi)的非法路徑,如圖中1虛線c所示,例如ROP(Return Oriented Programming)攻擊[18]和JOP(Jump Oriented Programming)攻擊[19]。

圖1 代碼重用攻擊分類
在SoC中集成基礎調(diào)試架構,能夠深入了解執(zhí)行軟件的系統(tǒng),掌握軟件在芯片上具體的執(zhí)行情況。一個高效強大的調(diào)試系統(tǒng)可以大大縮短系統(tǒng)的開發(fā)周期。現(xiàn)今異構多核設計給軟件開發(fā)人員帶來了新的挑戰(zhàn),跨多個CPU和硬件加速器執(zhí)行并發(fā)軟件、復雜的I/O接口交互和嚴格的實時要求是新常態(tài),由此產(chǎn)生許多新型漏洞,例如競爭條件、死鎖和嚴重的性能降級。查找此類錯誤,斷點調(diào)試已不適用,因為設置斷點會干擾不同執(zhí)行線程之間的時間關系,發(fā)生“探測效應”,導致原始問題的消失。這些問題也會干擾對代碼重用攻擊的檢測。為了解決以上問題,現(xiàn)有的調(diào)試架構基本都支持非侵入式的跟蹤調(diào)試,將觀察結果傳輸?shù)狡猓缓笤谄庵亟ǔ绦蛄鞑⒎治龀绦蛐袨椤?/p>
目前大多數(shù)芯片供應商提供的基礎調(diào)試架構主要遵循兩種規(guī)范:ARM CoreSight[20]或NEXUS 5001(官方稱為“IEEE-ISTO 5001”)[21],都支持運行控制調(diào)試和跟蹤調(diào)試。但是這兩種規(guī)范都不是開源的,需要支付費用才可以使用,這阻礙了增強調(diào)試架構功能的研究。
開源調(diào)試架構OSD(Open SoC Debug)的出現(xiàn)解決了這個問題[22]。OSD是一項完全開源的規(guī)范,無需任何委員會成員資格或支付許可使用費,任何人都可以自由分享和修改規(guī)范本身,以及出于任何目的創(chuàng)建和分發(fā)規(guī)范的實現(xiàn)。OSD是一種可擴展的模塊化規(guī)范,如圖2所示,規(guī)范中定義了具有不同功能的調(diào)試模塊組件:
(1) SCM SCM(Subnet Control Module)主要用于提供系統(tǒng)信息,例如調(diào)試網(wǎng)絡中調(diào)試模塊的數(shù)量,子網(wǎng)絡編號和支持調(diào)試數(shù)據(jù)包的大小。其還能夠復位子網(wǎng)絡或復位處理器。
(2) CDM CDM(Core Debug Module)主要用于運行控制調(diào)試,調(diào)試前需要掛起處理器,調(diào)試過程中,能夠通過訪問處理器中的特殊寄存器控制處理器的運行,這些特殊寄存器中包括了性能計數(shù)器的使能寄存器、復位寄存器和計數(shù)寄存器。調(diào)試結束后,解除處理器的掛起。
(3) CTM CTM(Core Trace Module)主要用于跟蹤模式(機器模式和用戶模式)的更改和函數(shù)的執(zhí)行。CTM通過跟蹤調(diào)用指令和返回指令的執(zhí)行,以及這些指令的PC指針值(內(nèi)存地址),在elf可執(zhí)行文件中查找指令位置后,能夠跟蹤函數(shù)的調(diào)用和返回。
(4) MAM MAM(Memory Access Module)提供訪問系統(tǒng)內(nèi)存的接口,與CDM配合使用。
(5) HAM HAM(Host Authentication Module)主要用于令牌匹配和身份認證。調(diào)試架構會將系統(tǒng)內(nèi)部信號暴露,為了防止攻擊者濫用調(diào)試架構,需要經(jīng)過HAM的認證,主機接口模塊才能夠與HAM以外的調(diào)試模塊通信。

圖2 OSD調(diào)試架構
OSD遵循IP復用技術,通過復用OSD規(guī)范中的組件、接口和軟件工具,能夠完成定制設計。OSD的開源特性也使其非常具有競爭力,未來必然會被廣泛使用,所以本文以OSD為基礎調(diào)試架構設計一款面向代碼重用攻擊檢測的安全調(diào)試架構。
性能計數(shù)器幾乎被集成在所有的主流處理器中,本質(zhì)是一組特殊寄存器,能夠在處理器運行程序的過程中,對處理器內(nèi)部某些硬件相關的動作進行計數(shù),配合處理器外部調(diào)試接口,設立時間斷點,可以獲得處理器的性能參數(shù)。性能計數(shù)器通常被用于硬件系統(tǒng)的性能評估和低功耗優(yōu)化。
本文將性能計數(shù)器用于安全檢測,是基于現(xiàn)代RISC處理器中提供的性能計數(shù)器基本都能夠?qū)崿F(xiàn)實時的事件響應和精確無漏的采樣。本文通過性能計數(shù)器與調(diào)試架構的配合,利用性能計數(shù)器在執(zhí)行正常程序和異常程序產(chǎn)生計數(shù)結果的差異,檢測代碼重用攻擊。本文選用具備嵌入式設備典型特征的PULPino SoC平臺作為實驗平臺[23],如表1所示,PULPino中RISC處理器性能計數(shù)器能夠?qū)κ畟€事件進行計數(shù),計數(shù)結果分別存儲在名稱為PCCR0-PCCR10的寄存器中。

表1 計數(shù)寄存器的名稱及描述
利用性能計數(shù)器檢測代碼重用攻擊分為離線階段和在線階段,離線階段收集并存儲檢測點正常的性能事件值,在線階段跟蹤程序的執(zhí)行,執(zhí)行到檢測點時,通過比較實際性能事件值與正常性能事件值判斷是否遭受到攻擊。為了有效檢測代碼重用攻擊,需要解決以下四方面的問題:
(1) 性能事件的選擇 代碼重用攻擊不會明顯影響所有的性能事件,為了有效區(qū)分正常程序和異常程序的執(zhí)行,需選擇合適的性能事件。通常實施代碼重用攻擊,首先會通過緩存區(qū)溢出劫持控制流,覆蓋程序中原有的局部變量,若變量為分支判定條件,則會使程序偏離原有的執(zhí)行路徑,從而影響程序中采取的條件分支指令數(shù)BTAKEN。又因為代碼重用攻擊的shellcode是由連續(xù)的以返回指令、跳轉指令或分支指令結尾的短指令片段組成,在完成惡意操作之前,無條件跳轉的指令數(shù)JUMP和分支指令數(shù)BRANCH會明顯增加。此外,由于代碼重用攻擊的配件分散在整個內(nèi)存空間,不具備空間局部性,分支預測的成功率大大降低。因此,本文還選取等待取指的時鐘周期數(shù)IMISS來檢測代碼重用攻擊。
(2) 收集性能事件值的粒度 性能計數(shù)器在實際運用中,即使沒有被攻擊,執(zhí)行相同代碼也會出現(xiàn)不同的性能計數(shù)值,這是由于各個性能事件發(fā)生的次數(shù)會受多種不確定因素的影響,例如程序被加載到內(nèi)存不同的位置執(zhí)行,程序中產(chǎn)生了隨機數(shù)或計數(shù)過程中產(chǎn)生噪聲,都會造成計數(shù)結果的不同。
代碼重用攻擊的shellcode通常由100多條指令組成,對性能事件值的影響通常集中在完成惡意操作前,因此將整個應用程序作為計數(shù)單位,產(chǎn)生的誤差較大。同一函數(shù)內(nèi)的指令種類差異較小,性能事件值變化較小,如果受到攻擊,將會產(chǎn)生明顯差異,因此本文以函數(shù)粒度收集性能事件值。
(3) 觸發(fā)檢測的時機 如果在每次調(diào)用函數(shù)前都執(zhí)行檢測,則檢測效率低。通過研究發(fā)現(xiàn),無論是哪種代碼重用攻擊,最終都要利用操作系統(tǒng)提供的執(zhí)行命令、訪問文件和網(wǎng)絡通信等功能,才能達到控制系統(tǒng)或竊取敏感信息的目的。本文將系統(tǒng)調(diào)用前的一個函數(shù)作為敏感函數(shù)進行檢測,定義敏感函數(shù)集并監(jiān)控程序的執(zhí)行,在調(diào)用系統(tǒng)函數(shù)前,檢測性能事件值是否存在異常。
(4) 檢測閾值的確定 如上所述,性能事件值會受到多種干擾因素的影響,并不是一個確定值,需要通過統(tǒng)計分析,確定性能計數(shù)值的正常范圍,在正常范圍之外的計數(shù)結果視為系統(tǒng)遭受攻擊。本文借助“盒須圖”統(tǒng)計模型來確定檢測閾值。
面向代碼重用攻擊檢測的安全調(diào)試架構以OSD為基礎設計得到,但不代表本設計適用范圍局限,大多數(shù)調(diào)試規(guī)范都具備與OSD一樣的功能,本設計同樣適用于其他調(diào)試規(guī)范。此外,開源調(diào)試規(guī)范OSD功能全面,與現(xiàn)有的商用調(diào)試規(guī)范相比,具有強大的市場競爭力,未來OSD會得到廣泛使用,本文研究增強了OSD的功能,研究具有前瞻性,未來用戶可根據(jù)需要在OSD中添加檢測代碼重用攻擊的組件。同時,本文選擇的PULPino SoC具備嵌入式設備的典型特征,PULPino結構簡單,其性能計數(shù)器跟蹤的事件類型,大多數(shù)嵌入式設備都能夠跟蹤。因此本文利用性能計數(shù)器執(zhí)行檢測的方案也適用于其他設備。
圖3為安全調(diào)試架構的總體架構,圖左側為被測SoC系統(tǒng)。本文在原有OSD基礎調(diào)試架構中添加了ATM(AXI Trace Module)和TDMCU(Trace Detecting Micro Controller Unit),如圖3陰影部分所示。在對OSD的研究過程中,發(fā)現(xiàn)沒有跟蹤總線的調(diào)試模塊。片上系統(tǒng)訪存操作都需要訪問總線,通過ATM引出的總線信號,可以檢測到非授權訪問,用于防御代碼重用攻擊的部署。TDMCU用于跟蹤檢測敏感函數(shù)的性能事件值是否異常,可用于檢測代碼重用攻擊的實施。

圖3 安全調(diào)試架構總體架構
代碼重用攻擊者能夠利用內(nèi)存泄漏,從內(nèi)存中查找和定位用于構建攻擊的短指令片段。內(nèi)存中數(shù)據(jù)和指令具有極大的關聯(lián)性,真正控制指令執(zhí)行的還是數(shù)據(jù),攻擊者利用程序漏洞對控制轉移指令的目標地址和條件分支指令的條件進行篡改,使程序不按照原始路徑執(zhí)行。
在攻擊模型假設中已分析到,攻擊者能夠注入數(shù)據(jù)的地方只能是普通數(shù)據(jù)段和地址段,但是由于普通數(shù)據(jù)段和地址段在內(nèi)存中存儲的方式?jīng)]有差別,空間上沒有分離,這就給攻擊者篡改的機會,導致代碼重用攻擊的發(fā)生。內(nèi)存訪問控制能夠防止越界訪存,有效防御了代碼重用攻擊。執(zhí)行內(nèi)存訪問控制需要從總線中提取訪存信號,ATM為跟蹤AXI總線上的信號提供了接口,為執(zhí)行內(nèi)存訪問控制提供了便利。如圖4所示為ATM、AXI總線和內(nèi)存訪問控制模塊三者之間的關系,ATM能夠?qū)XI總線上的信號進行行為分析,判斷當前訪問的讀或?qū)懶袨椋⒏櫟降目偩€信息以數(shù)據(jù)包的形式發(fā)送到Debug接口,內(nèi)存訪問控制模塊從Debug接口接收信息,并執(zhí)行邊界檢查,一旦發(fā)現(xiàn)越界訪存,利用調(diào)試接口中的BREAK功能立即停止設備的運行。本文重點研究檢測代碼重用攻擊,因此不對內(nèi)存訪問控制模塊進行介紹。

圖4 ATM、AXI總線和內(nèi)存訪問控制模塊的關系
調(diào)試架構中的組件能夠從片上系統(tǒng)內(nèi)部提取用于執(zhí)行檢測策略的內(nèi)部信號,性能計數(shù)器能夠跟蹤記錄程序執(zhí)行過程中各個事件類型發(fā)生的次數(shù)。安全調(diào)試架構的工作原理是:在系統(tǒng)功能模式下,利用調(diào)試架構在程序運行過程中的特定時機獲取性能事件值,將實時獲取的性能事件值與離線分析正常的參照性能事件值進行比較,從而達到檢測攻擊的目的。TDMCU作為安全調(diào)試架構的核心,控制整個檢測過程的進行,其主要功能包括:
(1) TDMCU與被測系統(tǒng)通信,通過配置OSD中的CTM,TDMCU能夠從CTM接收跟蹤數(shù)據(jù)包,跟蹤程序中函數(shù)的執(zhí)行,當發(fā)現(xiàn)執(zhí)行到敏感函數(shù)入口時,TDMCU通過配置OSD中的CDM復位CPU的性能計數(shù)器,該過程需要掛起CPU。然后解除CPU掛起,繼續(xù)執(zhí)行程序,性能計數(shù)器開始計數(shù)。
(2) TDMCU跟蹤函數(shù)的執(zhí)行,當發(fā)現(xiàn)執(zhí)行到敏感函數(shù)出口時,控制CDM掛起CPU,并讀取性能計數(shù)器的值。
(3) 將讀取的性能事件值與預存的性能事件值進行比較,如果滿足閾值要求,則解除CPU掛起,繼續(xù)執(zhí)行程序;如果不滿足閾值要求,配置OSD產(chǎn)生BREAK停止設備的運行。
本文設計充分利用了調(diào)試架構的跟蹤、訪存、通信和BREAK等功能,通過TDMCU的控制,在不修改處理器和不插樁的前提下,完成對運行在系統(tǒng)上程序的代碼重用攻擊檢測。OSD的調(diào)試接口中包含一個FIFO存儲器,在TDMCU讀取跟蹤信息之前,F(xiàn)IFO能夠緩存跟蹤信息。如果沒有足夠快地讀取信息,F(xiàn)IFO會被填滿,導致跟蹤信息的丟失。雖然OSD能夠?qū)G失的數(shù)據(jù)包進行計數(shù),當能夠再次傳輸數(shù)據(jù)時,發(fā)送代表溢出的數(shù)據(jù)包,但是包中不含有跟蹤信息,無法進行檢測。TDMCU從FIFO提取跟蹤數(shù)據(jù)包的速率受到被測系統(tǒng)執(zhí)行函數(shù)的速率、FIFO存儲深度和調(diào)試接口位寬等因素的影響。為了分析跟蹤丟失的情況,定義以下變量:
Rb:被測系統(tǒng)執(zhí)行函數(shù)的最大速率。這取決于被測系統(tǒng)上運行的程序和被測系統(tǒng)中處理器的工作頻率。
B:調(diào)試接口的位寬。OSD調(diào)試接口的位寬為16位,所以稱OSD的調(diào)試字為16位。TDMCU能夠通過調(diào)試接口從FIFO中提取數(shù)據(jù)。
Re:TDMCU從FIFO提取跟蹤信息的最大速率。
Rp:TDMCU處理跟蹤信息的平均速率。TDMCU的功能包括復位性能計數(shù)器和讀取比較性能事件值,因此Rp被定義為平均速率,Rp取決于TDMCU的工作頻率和采用的檢測方法,例如需要比較的性能事件值個數(shù),個數(shù)越多,速率越小。
定義TDMCU工作的最大速率為Rf=min(Re×B,Rp)。即TDMCU的工作速率受提取速率和處理速率的限制。綜上可得,分支丟失速率Rdrop存在式(1)的關系。當Rf>Rb時,不會產(chǎn)生跟蹤丟失的情況;其他情況時,Rdrop與Rb呈線性關系。為了防止跟蹤丟失,Rf應大于Rb,Rf中的B為固定值,所以應提高Re和Rp,即TDMCU的工作頻率應大于處理器的時鐘頻率。
(1)
實驗的硬件平臺為Zedboard開發(fā)板,在開發(fā)板FPGA部分搭建了如圖3所示的硬件結構,整個硬件系統(tǒng)包括PULPino和安全調(diào)試架構,PULPino為32位系統(tǒng)。安全調(diào)試架構中的ATM和TDMCU采用Verilog硬件描述語言編寫,TDMCU位寬為32位。實驗的軟件部分為FreeRToS實時操作系統(tǒng)。系統(tǒng)選用C Tuning套件中的程序作為測試例程[24],并利用測試例程中的代碼構建代碼重用攻擊,在實驗平臺上執(zhí)行正常測試例程和包含攻擊的例程,驗證設計的功能。
實驗結果顯示,安全調(diào)試架構能夠檢測到模擬構建的多種代碼重用攻擊,達到設計預期的功能。在65 nm工藝庫下,使用Design Compiler綜合工具對PULPino中的CPU、安全調(diào)試架構中的ATM和TDMCU進行了綜合分析,其等效門數(shù)和頻率結果如表2所示。由表可見ATM和TDMCU等效門總數(shù)比CPU小,因此當ATM和TDMCU被添加進整個SoC時,產(chǎn)生的資源開銷在可接受的范圍之內(nèi)。由于本文選擇了4個性能事件進行檢測,所以復位性能計數(shù)器會使被測系統(tǒng)產(chǎn)生6個時鐘周期的延遲。TDMCU的工作頻率是被測系統(tǒng)工作頻率的兩倍多,不會出現(xiàn)跟蹤丟失的情況,確保每個敏感函數(shù)都能夠得到檢測驗證,但是檢測性能事件值會使被測系統(tǒng)產(chǎn)生8個時鐘周期的延遲。雖然本設計會產(chǎn)生延遲,但是相對于利用軟件工具對程序插樁來檢測代碼重用攻擊所花費的時間,本設計能夠節(jié)省較高的檢測和開發(fā)成本。

表2 ASIC綜合結果
為了驗證代碼重用攻擊對選擇的性能事件影響較大,而對其他事件影響較小,還進行了對比實驗。圖5為執(zhí)行正常例程和包含代碼重用攻擊的例程收集到的性能事件值,結果以盒須圖表示。BTANEN和BRANCH為本文選擇的性能事件值,CYC和LD為隨機選擇的其他事件。盒須圖的縱坐標為性能事件值,橫坐標包含樣本“1”和 “2”。樣本“1”表示執(zhí)行正常例程時收集的性能事件值,樣本“2”表示執(zhí)行包含代碼重用攻擊的例程時收集的性能事件值。由圖可見,本文選擇的性能事件值能夠明顯區(qū)分正常例程和包含攻擊例程的執(zhí)行狀況,而對于隨機選擇的性能事件,在執(zhí)行正常例程和包含攻擊的例程時,計數(shù)結果有重疊的區(qū)域,因此不能夠用來區(qū)分程序的執(zhí)行狀況。

圖5 代碼重用攻擊對不同性能事件的影響
本文提出了面向代碼重用攻擊檢測的安全調(diào)試架構,設計了總線跟蹤模塊ATM和檢測跟蹤微控制單元TDMCU,研究了基于性能計數(shù)器的函數(shù)級代碼重用攻擊檢測方法,包括離線收集正常的性能事件值。通過配置TDMCU,在運行過程中自動檢測程序是否遭受代碼重用攻擊,并且無需修改處理器內(nèi)部邏輯和對程序進行插樁。目前的設計僅支持檢測單核系統(tǒng),下一步計劃利用通用基礎調(diào)試架構中可擴展的模塊化屬性,使設計的安全調(diào)試架構支持多核系統(tǒng)的代碼重用攻擊檢測。