倪昀澤
【摘 要】為了研究移動(dòng)智能終端安全漏洞攻防技術(shù),通過對(duì)近年披露的移動(dòng)智能終端的安全漏洞及利用方法進(jìn)行分析,將安全漏洞按照觸發(fā)原理進(jìn)行了分類總結(jié),同時(shí),闡述了最新的漏洞利用緩解機(jī)制并指出其不足,通過分析得知,安全漏洞的攻防技術(shù)相互促進(jìn)發(fā)展,使攻擊的難度不斷提升。
【關(guān)鍵詞】信息安全 移動(dòng)智能終端 安全漏洞
1 引言
隨著移動(dòng)互聯(lián)網(wǎng)技術(shù)及業(yè)務(wù)的發(fā)展,在終端業(yè)務(wù)用戶需求的驅(qū)動(dòng)下,移動(dòng)終端的功能日漸豐富,從傳統(tǒng)的語音電話、短信,到拍照、電子郵件、定位服務(wù)、網(wǎng)頁瀏覽,再到能夠安裝第三方應(yīng)用的智能終端及移動(dòng)支付,功能的增多、應(yīng)用的豐富增加了用戶多維度的個(gè)人信息在終端的錄入和存儲(chǔ),個(gè)人的信息安全也更加依賴于終端的安全。同時(shí),伴隨著終端系統(tǒng)和應(yīng)用代碼量的增加,引入的攻擊面和漏洞數(shù)量也隨之增加。Pegasus、Vault 7等間諜工具和文件的曝光,使無論iOS還是Android平臺(tái)的智能終端信息安全形勢更加嚴(yán)峻。另一方面,終端廠商等防御方也在不斷努力減少漏洞,同時(shí)增強(qiáng)漏洞利用緩解機(jī)制。本文將就移動(dòng)智能終端的安全漏洞進(jìn)行分類研究,并闡述相應(yīng)的漏洞利用緩解機(jī)制。
2 常見漏洞類型
從漏洞的觸發(fā)原理分類,常見的軟件漏洞類型有:棧溢出漏洞、堆溢出漏洞、格式化字符串漏洞、整數(shù)溢出漏洞、釋放后重用漏洞、雙重釋放漏洞、邏輯設(shè)計(jì)類漏洞、類型混淆漏洞等。
2.1 棧緩沖區(qū)溢出漏洞
棧緩沖區(qū)溢出漏洞(SOF,Stack Buffer Overflow)是一類歷史悠久的內(nèi)存類破壞漏洞。SOF的原理比較簡單,即棧上的緩沖區(qū)在拷貝數(shù)據(jù)時(shí)沒有合理檢查目的緩沖區(qū)的長度和源數(shù)據(jù)的長度,導(dǎo)致數(shù)據(jù)拷貝過程中,目的緩沖區(qū)之外的其它數(shù)據(jù)被覆蓋,比較經(jīng)典的利用方式是覆蓋函數(shù)的返回地址、指針變量、SEH異常處理函數(shù)指針。早些年的時(shí)候,軟件針對(duì)棧上的內(nèi)存保護(hù)機(jī)制較少,且操作系統(tǒng)中的保護(hù)機(jī)制還不是很完善,棧緩沖區(qū)漏洞能夠比較穩(wěn)定地利用,當(dāng)時(shí),很多網(wǎng)絡(luò)服務(wù)程序中存在的漏洞導(dǎo)致了蠕蟲大量傳播。表1展示了2002年至2008年間利用棧緩沖區(qū)漏洞攻擊的重大安全事件。
目前,對(duì)棧返回地址攻擊的棧溢出漏洞幾乎已經(jīng)消亡了,但是,利用棧上的其他結(jié)構(gòu)溢出覆蓋的攻擊仍然存在。
2.2 堆緩沖區(qū)溢出漏洞
堆緩沖區(qū)溢出漏洞(HOF,Heap Buffer Overflow)與SOF原理類似,都是因?yàn)閿?shù)據(jù)復(fù)制拷貝時(shí)沒有對(duì)其長度及范圍進(jìn)行充分檢查造成的。但是因?yàn)槎焉系臄?shù)據(jù)結(jié)構(gòu)相對(duì)靈活,且堆上的內(nèi)存分配、釋放、回收等問題相對(duì)棧上要更復(fù)雜,很多程序都對(duì)堆進(jìn)行了單獨(dú)優(yōu)化,因此堆溢出與棧溢出相比利用技術(shù)更多、更復(fù)雜。因此,堆上的內(nèi)存攻防仍是目前研究的熱點(diǎn)。
2.3 整數(shù)溢出漏洞
整數(shù)是在包括C\C++\JAVA等語言中最常見的數(shù)據(jù)類型,常見的變量類型,如short、unsigned short、int、unsigned int等都可能發(fā)生整數(shù)溢出。因?yàn)橐粋€(gè)整數(shù)變量在內(nèi)存中是以固定的長度存儲(chǔ)的,所以它能存儲(chǔ)的數(shù)據(jù)范圍也是有限的。如x86_32架構(gòu)Windows操作系統(tǒng)中的int所占內(nèi)存大小為4子節(jié),數(shù)據(jù)范圍是區(qū)間[-2147483648, 2147483647]內(nèi)的所有整數(shù)。當(dāng)對(duì)整數(shù)進(jìn)行一次或多次加減乘除等操作而沒有考慮數(shù)據(jù)范圍,將可能會(huì)導(dǎo)致整數(shù)溢出。因?yàn)樵谀壳爸髁骶幾g器遵循的ISOC99標(biāo)準(zhǔn)中規(guī)定,整數(shù)溢出將會(huì)產(chǎn)生“不能確定的行為”,所以,整數(shù)溢出是會(huì)被編譯器忽略的,并且在運(yùn)行時(shí)也不會(huì)拋出異常,而且由于整數(shù)溢出不符合人類的自然認(rèn)知,所以這類漏洞較為隱蔽并時(shí)常發(fā)生。之前,Android曝出很多stagefright的漏洞大多是整數(shù)溢出漏洞。
本文總結(jié)了四類可能導(dǎo)致整數(shù)溢出漏洞的整數(shù)操作:
(1)無符號(hào)的整數(shù)溢出:在操作無符號(hào)整數(shù)時(shí)沒有充分考慮其數(shù)據(jù)范圍。
(2)有符號(hào)數(shù)的整數(shù)溢出:操作有符號(hào)數(shù)時(shí)沒有考慮他的最大值,導(dǎo)致變量溢出為負(fù)數(shù),如果該變量被用于數(shù)組索引,肯定會(huì)造成一個(gè)非常嚴(yán)重的漏洞。
(3)數(shù)據(jù)截?cái)嗯c擴(kuò)展:把一個(gè)占用內(nèi)存較大的數(shù)據(jù)賦值給一個(gè)占用內(nèi)存較小的數(shù)據(jù)時(shí),會(huì)發(fā)生內(nèi)存截?cái)?,如int型變量賦值給short型變量;同理,把一個(gè)占用內(nèi)存較小的數(shù)據(jù)賦值給一個(gè)占用內(nèi)存較小的數(shù)據(jù)時(shí),會(huì)發(fā)生數(shù)據(jù)擴(kuò)展,如short型變量賦值給int型變量。
(4)有符號(hào)與無符號(hào)轉(zhuǎn)換問題:在數(shù)值比較時(shí),不同的數(shù)據(jù)類型會(huì)轉(zhuǎn)換為相同的數(shù)據(jù)類型,很多程序漏洞就是因?yàn)闆]有考慮這個(gè)轉(zhuǎn)化造成的。
2.4 格式化字符串漏洞
格式化字符串漏洞的成因?yàn)椋簩⒆兞孔址麛?shù)組作為格式化字符串處理函數(shù)的格式參數(shù)傳入。常用的格式化字符串函數(shù)有:fprintf、sprint、snprintf、vprintf、vfprintf等,以sprintf函數(shù)為例,在C99以前的標(biāo)準(zhǔn)中定義為:
int sprintf(char *buffer, const char *format, ... );
第一個(gè)參數(shù)是存儲(chǔ)格式化后的字符串的目的緩沖區(qū);第二個(gè)參數(shù)format就是格式化字符串,根據(jù)格式化字符串參數(shù)的內(nèi)容,可能還會(huì)有一些其它的具體參數(shù)。一旦format參數(shù)被攻擊者控制,通過指定其為%p%p%p%p…的越界,從棧中讀取數(shù)據(jù),指定…%n…可以向任意一個(gè)指定位置寫入可控?cái)?shù)據(jù)。所以,格式化字符串漏洞可以導(dǎo)致任意內(nèi)存數(shù)據(jù)讀寫,是非常嚴(yán)重的漏洞。并且,在POSIX標(biāo)準(zhǔn)下,格式化字符串可以通過n$的形式來指定出第n個(gè)參數(shù)讀寫數(shù)據(jù),大大便利了格式化字符串漏洞的利用。另外,針對(duì)sprintf函數(shù),可能有format參數(shù)沒有檢查最大可能的字符串長度,導(dǎo)致buffer緩沖區(qū)溢出漏洞。值得注意的是,在C99以后的標(biāo)準(zhǔn)中,格式化字符串函數(shù)參數(shù)被添加了關(guān)鍵子restrict,同樣以sprintf為例:
int sprintf(char *restrict buffer,
const char *restrict format, ... );
一個(gè)比較著名的格式化字符串漏洞是CVE-2000-0442,是Qualcomm Qpopper格式化字符串處理的一個(gè)遠(yuǎn)程溢出漏洞。
2.5 釋放后重用漏洞
釋放后重用漏洞(UAF,Use After Free)是目前比較主流的一類漏洞,可以從Apple、Google等公司每月的安全漏洞公告中看出,該類漏洞相對(duì)而言數(shù)量較多。造成UAF漏洞的原因是對(duì)象在內(nèi)存被釋放后,仍然有指向其它的指針或應(yīng)用計(jì)數(shù)器沒有及時(shí)更新,對(duì)象卻被意外地再次引用操作造成漏洞觸發(fā),在對(duì)象釋放和重用過程中,如果能將可控的數(shù)據(jù)在對(duì)象原有的位置上占位,則可通過控制對(duì)象的虛表劫持控制流;不能完全占位則采用一些其它適當(dāng)?shù)穆┒蠢眉夹g(shù),也可能將漏洞轉(zhuǎn)換為可利用的高危漏洞。
2.6 類型混淆漏洞
類型混淆漏洞(TC,Type Confusion)是指程序本來處理的對(duì)象類型和實(shí)際處理對(duì)象類型發(fā)生混淆所導(dǎo)致的漏洞,沒有對(duì)輸入對(duì)應(yīng)的操作對(duì)象適時(shí)地進(jìn)行合法檢查是該類漏洞發(fā)生的根源。該類漏洞在移動(dòng)終端出現(xiàn)也比較多,多發(fā)生在序列、反序列化過程中,比如Android Binder的CVE-2014-7911漏洞。
2.7 競爭條件漏洞
競爭條件漏洞(RC,Race Condition)是指在多個(gè)處理過程(一般多是多線程或多進(jìn)程)的情況下,沒有合理安排共享資源的處理順序所引發(fā)的漏洞,攻擊者可以通過多次競爭來達(dá)到恰當(dāng)?shù)钠谕墓魻顟B(tài)。由于競爭時(shí)機(jī)問題,這類漏洞通過Fuzzing模糊測試和代碼審計(jì)發(fā)現(xiàn)的數(shù)量都比較有限,所以也是近年比較熱門的一類漏洞,2016年,Android及Linux內(nèi)核的兩個(gè)通用權(quán)限提升漏洞CVE-2015-1805和DirtyCow都是競爭條件漏洞。
2.8 邏輯設(shè)計(jì)漏洞
邏輯設(shè)計(jì)類漏洞大多是在軟件在設(shè)計(jì)、實(shí)現(xiàn)過程中沒有考慮安全問題而出現(xiàn)的設(shè)計(jì)、邏輯方面的漏洞。例舉如下兩個(gè)直觀的例子:
如CVE-2014-0773,直接在ActiveX控件中實(shí)現(xiàn)了一個(gè)名為CreateProcess的方法,可以直接調(diào)用這個(gè)方法創(chuàng)建進(jìn)程,構(gòu)造一個(gè)很簡單的攻擊頁面就可以通過這個(gè)漏洞攻破計(jì)算機(jī)。
再如Windows Media Center的CVE-2015-2509漏洞,其POC非常簡單,只有下面一行代碼:
將這行代碼存為.mcl擴(kuò)展的文件類型,即Media Center link文件,然后用Windows Media Center直接打開就彈出一個(gè)計(jì)算器(一種常用于證明漏洞可執(zhí)行任意代碼的方式)。
3 漏洞利用緩解技術(shù)
減少漏洞威脅主要有兩種途徑:一是主動(dòng)挖掘漏洞來減少產(chǎn)品中的漏洞數(shù)量;另外是增加增強(qiáng)漏洞利用緩解機(jī)制,根據(jù)漏洞的特性和漏洞利用的方法,在漏洞利用途徑上進(jìn)行阻斷,多種緩解技術(shù)的組合可以使大量的漏洞無法利用。
3.1 DEP和ASLR機(jī)制
數(shù)據(jù)執(zhí)行保護(hù)(DEP,Data Execution Prevention)在Linux系統(tǒng)上也稱為NX(No-eXecute),在內(nèi)存頁屬性中引入是否可執(zhí)行標(biāo)志來決定該段內(nèi)存是否能夠執(zhí)行代碼,一般將數(shù)據(jù)區(qū)域設(shè)置為不可執(zhí)行,可有效防止攻擊者在可控的數(shù)據(jù)區(qū)域執(zhí)行代碼。然而,單純的DEP防護(hù)可以利用ROP(Return Orient Program)、JOP(Jump Orient Program)等間接執(zhí)行代碼的方式繞過。與DEP相似的一個(gè)技術(shù)是PXN(Privileged Execute Never),即阻止內(nèi)核態(tài)直接執(zhí)行攻擊者在用戶態(tài)構(gòu)造好的代碼,可以有效增加攻擊者編寫利用代碼的難度。
空間地址隨機(jī)化(ASLR,Address Space Layout Randomization)將運(yùn)行的可執(zhí)行文件、加載庫、堆棧等地址隨機(jī)化,PIE(Position Independent Executable)與PIC(Position Independent Code)是該技術(shù)對(duì)可執(zhí)行文件和加載庫的實(shí)現(xiàn)。有了ASLR這種機(jī)制,攻擊者即使劫持程序控制寄存器,也無法知道接下來要執(zhí)行代碼的位置。然而,單純的ASLR防護(hù)還是可以通過沒有實(shí)現(xiàn)隨機(jī)化的段及堆噴射等技術(shù)繞過。ASLR技術(shù)在移動(dòng)智能終端的應(yīng)用比較漫長,蘋果在2011年的iOS 5中引入用戶態(tài)的ASLR,2012年的iOS 6中引入內(nèi)核態(tài)的ASLR;Android在2011年的4.0版本引入用戶態(tài)ASLR,而內(nèi)核態(tài)的ASLR由于不同終端設(shè)備生產(chǎn)廠商采取的策略不同而進(jìn)展緩慢。
同時(shí)采用DEP和ASLR的防御策略可以防御大部分漏洞利用方法,但是攻擊者并非對(duì)此無計(jì)可施,利用一個(gè)內(nèi)存信息泄漏漏洞來繞過ASLR后,再組合其他的漏洞進(jìn)行攻擊就是一種通用的方法。
3.2 校驗(yàn)機(jī)制
早期SOF這類漏洞的防御機(jī)制,如GS cookie是在函數(shù)棧的返回地址之前加入一個(gè)校驗(yàn)位的cookie,用來檢測返回地址是否被緩沖區(qū)溢出覆蓋,這種技術(shù)之后被一些廠商演化為給數(shù)組的長度加cookie檢測數(shù)組長度是否被篡改、給一些安全標(biāo)志位加cookie等。此外,還有如RenewSSP(Prevent SSP Brute Force Attacks)這樣的技術(shù)來防御逐字節(jié)暴力破解Apache等網(wǎng)絡(luò)服務(wù)及Android Zygote這些相同cookie的fork進(jìn)程。
3.3 瀏覽器防護(hù)機(jī)制
作為互聯(lián)網(wǎng)的重要入口,網(wǎng)頁瀏覽器安全一直是關(guān)注的重點(diǎn),各廠商都十分重視。而瀏覽器攻防技術(shù)一直都是研究的前沿領(lǐng)域。
UAF漏洞是瀏覽器中非常普遍的漏洞,一直都是被挖掘的重點(diǎn)對(duì)象,只通過修補(bǔ)有漏洞的代碼來提高瀏覽器的安全性顯然不太可行。所以,相關(guān)廠商往往采用增加漏洞利用緩減機(jī)制的方法來降低漏洞被成功利用的可能性,從而降低其危害。從2013年開始,微軟先后在其Windows瀏覽器中引入延遲釋放、隔離堆、沙箱、EPM、MemGC等漏洞利用緩減機(jī)制和保護(hù)機(jī)制,很大程度地提高了瀏覽器的安全性;Google也早在其瀏覽器中引入了Address Sanitizer等防護(hù)機(jī)制。
此外,sanbox沙箱技術(shù)也被廣泛應(yīng)用到瀏覽器中。沙箱技術(shù)通過限制瀏覽器網(wǎng)頁渲染、腳本執(zhí)行進(jìn)程權(quán)限,來降低漏洞被利用后的攻擊者作惡的能力,可以有效降低用戶終端風(fēng)險(xiǎn),但是仍存在一些缺陷:如被沙箱隔離進(jìn)程的交互過程中的一些漏洞可以繞過沙箱的限制,沙箱內(nèi)進(jìn)程對(duì)一些內(nèi)核、驅(qū)動(dòng)模塊的訪問仍然沒有隔離。除了sandbox,Android系統(tǒng)還定制了一套selinux規(guī)則來對(duì)應(yīng)用的行為行進(jìn)限制??傮w來說,基于隔離思想的防御機(jī)制可以有效增加攻擊成本。
3.4 硬件防護(hù)技術(shù)
安全威脅和安全需求同時(shí)也在驅(qū)動(dòng)著硬件廠商技術(shù)的發(fā)展,ARM TrustZone及SE/inSE等提供的硬件支撐為TEE(Trust Execution Environment)的發(fā)展鋪平了道路,為敏感數(shù)據(jù)安全、可信計(jì)算提供了新的環(huán)境,然而,新功能同時(shí)也引入了新威脅,2016年黑客奧斯卡Pwnie Awards頒發(fā)的最佳提權(quán)漏洞就是由Widevine QSEE TrustZone驅(qū)動(dòng)引入的。
ARMv8-A中新增的Pointer Authentication instructions特性也被高通用來開發(fā)Pointer Authentication技術(shù)保護(hù)內(nèi)存中的指針,很難被黑客篡改。
4 結(jié)束語
各種安全漏洞是由人在編寫代碼等生產(chǎn)過程中的疏忽所造成的,由本文分析可知,新的漏洞利用緩解技術(shù)通過阻擊漏洞利用的途徑來降低漏洞的危害,但仍存在一些問題。隨著攻擊技術(shù)的發(fā)展,會(huì)出現(xiàn)新的攻擊途徑,而且隨著信息系統(tǒng)的日趨復(fù)雜,將來一定會(huì)出現(xiàn)更多的漏洞。同時(shí),隨著攻防雙方技術(shù)的不斷升級(jí),黑客利用漏洞攻擊的難度也越來越大,移動(dòng)智能終端安全保障在不斷提升。
參考文獻(xiàn):
[1] Xu W, Li J, Shu J, et al. From Collision To Exploitation: Unleashing Use-After-Free Vulnerabilities in Linux Kernel[A]. Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security[C]. ACM, 2015: 414-425.
[2] Oehlert P. Violating assumptions with fuzzing[J]. IEEE Security & Privacy, 2005,3(2): 58-62.
[3] Sutton M, Greene A, Amini P. Fuzzing: brute force vulnerability discovery[M]. Pearson Education, 2007.
[4] Corbet J, Rubini A, Kroah-Hartman G. Linux device drivers[M]. O Reilly Media, Inc, 2005.
[5] Jones, Dave. Trinity: A system call fuzzer[A]. Proceedings of the 13th Ottawa Linux Symposium[C]. 2011.
[6] Cadar, Cristian. EXE: automatically generating inputs of death[A]. ACM Transactions on Information and System Security(TISSEC)[C]. 2008: 10.
[7] Vuagnoux, Martin. Autodafe: An act of software torture[A]. 22nd Chaos Communications Congress[C]. 2005.
[8] X Yang, Y Chen, E Eide, et al. Finding and understanding bugs in C compilers[A]. ACM SIGPLAN Notices[C]. 2011: 6.
[9] T Wang, T Wei, Z Lin, et al. IntScope: Automatically Detecting Integer Overflow Vulnerability in X86 Binary Using Symbolic Execution[M]. Network & Distributed System Security Symposium, 2009.
[10] T Wang, T Wei, G Gu, et al. TaintScope: A checksum-aware directed fuzzing tool for automatic software vulnerability detection[J]. Security & Privacy, 2010,41(3): 497-512. ★