倪昀澤

【摘 要】為了研究移動智能終端安全漏洞攻防技術,通過對近年披露的移動智能終端的安全漏洞及利用方法進行分析,將安全漏洞按照觸發原理進行了分類總結,同時,闡述了最新的漏洞利用緩解機制并指出其不足,通過分析得知,安全漏洞的攻防技術相互促進發展,使攻擊的難度不斷提升。
【關鍵詞】信息安全 移動智能終端 安全漏洞
1 引言
隨著移動互聯網技術及業務的發展,在終端業務用戶需求的驅動下,移動終端的功能日漸豐富,從傳統的語音電話、短信,到拍照、電子郵件、定位服務、網頁瀏覽,再到能夠安裝第三方應用的智能終端及移動支付,功能的增多、應用的豐富增加了用戶多維度的個人信息在終端的錄入和存儲,個人的信息安全也更加依賴于終端的安全。同時,伴隨著終端系統和應用代碼量的增加,引入的攻擊面和漏洞數量也隨之增加。Pegasus、Vault 7等間諜工具和文件的曝光,使無論iOS還是Android平臺的智能終端信息安全形勢更加嚴峻。另一方面,終端廠商等防御方也在不斷努力減少漏洞,同時增強漏洞利用緩解機制。本文將就移動智能終端的安全漏洞進行分類研究,并闡述相應的漏洞利用緩解機制。
2 常見漏洞類型
從漏洞的觸發原理分類,常見的軟件漏洞類型有:棧溢出漏洞、堆溢出漏洞、格式化字符串漏洞、整數溢出漏洞、釋放后重用漏洞、雙重釋放漏洞、邏輯設計類漏洞、類型混淆漏洞等。
2.1 棧緩沖區溢出漏洞
棧緩沖區溢出漏洞(SOF,Stack Buffer Overflow)是一類歷史悠久的內存類破壞漏洞。SOF的原理比較簡單,即棧上的緩沖區在拷貝數據時沒有合理檢查目的緩沖區的長度和源數據的長度,導致數據拷貝過程中,目的緩沖區之外的其它數據被覆蓋,比較經典的利用方式是覆蓋函數的返回地址、指針變量、SEH異常處理函數指針。早些年的時候,軟件針對棧上的內存保護機制較少,且操作系統中的保護機制還不是很完善,棧緩沖區漏洞能夠比較穩定地利用,當時,很多網絡服務程序中存在的漏洞導致了蠕蟲大量傳播。表1展示了2002年至2008年間利用棧緩沖區漏洞攻擊的重大安全事件。
目前,對棧返回地址攻擊的棧溢出漏洞幾乎已經消亡了,但是,利用棧上的其他結構溢出覆蓋的攻擊仍然存在。
2.2 堆緩沖區溢出漏洞
堆緩沖區溢出漏洞(HOF,Heap Buffer Overflow)與SOF原理類似,都是因為數據復制拷貝時沒有對其長度及范圍進行充分檢查造成的。但是因為堆上的數據結構相對靈活,且堆上的內存分配、釋放、回收等問題相對棧上要更復雜,很多程序都對堆進行了單獨優化,因此堆溢出與棧溢出相比利用技術更多、更復雜。因此,堆上的內存攻防仍是目前研究的熱點。
2.3 整數溢出漏洞
整數是在包括C\C++\JAVA等語言中最常見的數據類型,常見的變量類型,如short、unsigned short、int、unsigned int等都可能發生整數溢出。因為一個整數變量在內存中是以固定的長度存儲的,所以它能存儲的數據范圍也是有限的。如x86_32架構Windows操作系統中的int所占內存大小為4子節,數據范圍是區間[-2147483648, 2147483647]內的所有整數。當對整數進行一次或多次加減乘除等操作而沒有考慮數據范圍,將可能會導致整數溢出。因為在目前主流編譯器遵循的ISOC99標準中規定,整數溢出將會產生“不能確定的行為”,所以,整數溢出是會被編譯器忽略的,并且在運行時也不會拋出異常,而且由于整數溢出不符合人類的自然認知,所以這類漏洞較為隱蔽并時常發生。之前,Android曝出很多stagefright的漏洞大多是整數溢出漏洞。
本文總結了四類可能導致整數溢出漏洞的整數操作:
(1)無符號的整數溢出:在操作無符號整數時沒有充分考慮其數據范圍。
(2)有符號數的整數溢出:操作有符號數時沒有考慮他的最大值,導致變量溢出為負數,如果該變量被用于數組索引,肯定會造成一個非常嚴重的漏洞。
(3)數據截斷與擴展:把一個占用內存較大的數據賦值給一個占用內存較小的數據時,會發生內存截斷,如int型變量賦值給short型變量;同理,把一個占用內存較小的數據賦值給一個占用內存較小的數據時,會發生數據擴展,如short型變量賦值給int型變量。
(4)有符號與無符號轉換問題:在數值比較時,不同的數據類型會轉換為相同的數據類型,很多程序漏洞就是因為沒有考慮這個轉化造成的。
2.4 格式化字符串漏洞
格式化字符串漏洞的成因為:將變量字符數組作為格式化字符串處理函數的格式參數傳入。常用的格式化字符串函數有:fprintf、sprint、snprintf、vprintf、vfprintf等,以sprintf函數為例,在C99以前的標準中定義為:
int sprintf(char *buffer, const char *format, ... );
第一個參數是存儲格式化后的字符串的目的緩沖區;第二個參數format就是格式化字符串,根據格式化字符串參數的內容,可能還會有一些其它的具體參數。一旦format參數被攻擊者控制,通過指定其為%p%p%p%p…的越界,從棧中讀取數據,指定…%n…可以向任意一個指定位置寫入可控數據。所以,格式化字符串漏洞可以導致任意內存數據讀寫,是非常嚴重的漏洞。并且,在POSIX標準下,格式化字符串可以通過n$的形式來指定出第n個參數讀寫數據,大大便利了格式化字符串漏洞的利用。另外,針對sprintf函數,可能有format參數沒有檢查最大可能的字符串長度,導致buffer緩沖區溢出漏洞。值得注意的是,在C99以后的標準中,格式化字符串函數參數被添加了關鍵子restrict,同樣以sprintf為例:
int sprintf(char *restrict buffer,
const char *restrict format, ... );
一個比較著名的格式化字符串漏洞是CVE-2000-0442,是Qualcomm Qpopper格式化字符串處理的一個遠程溢出漏洞。
2.5 釋放后重用漏洞
釋放后重用漏洞(UAF,Use After Free)是目前比較主流的一類漏洞,可以從Apple、Google等公司每月的安全漏洞公告中看出,該類漏洞相對而言數量較多。造成UAF漏洞的原因是對象在內存被釋放后,仍然有指向其它的指針或應用計數器沒有及時更新,對象卻被意外地再次引用操作造成漏洞觸發,在對象釋放和重用過程中,如果能將可控的數據在對象原有的位置上占位,則可通過控制對象的虛表劫持控制流;不能完全占位則采用一些其它適當的漏洞利用技術,也可能將漏洞轉換為可利用的高危漏洞。
2.6 類型混淆漏洞
類型混淆漏洞(TC,Type Confusion)是指程序本來處理的對象類型和實際處理對象類型發生混淆所導致的漏洞,沒有對輸入對應的操作對象適時地進行合法檢查是該類漏洞發生的根源。該類漏洞在移動終端出現也比較多,多發生在序列、反序列化過程中,比如Android Binder的CVE-2014-7911漏洞。
2.7 競爭條件漏洞
競爭條件漏洞(RC,Race Condition)是指在多個處理過程(一般多是多線程或多進程)的情況下,沒有合理安排共享資源的處理順序所引發的漏洞,攻擊者可以通過多次競爭來達到恰當的期望的攻擊狀態。由于競爭時機問題,這類漏洞通過Fuzzing模糊測試和代碼審計發現的數量都比較有限,所以也是近年比較熱門的一類漏洞,2016年,Android及Linux內核的兩個通用權限提升漏洞CVE-2015-1805和DirtyCow都是競爭條件漏洞。
2.8 邏輯設計漏洞
邏輯設計類漏洞大多是在軟件在設計、實現過程中沒有考慮安全問題而出現的設計、邏輯方面的漏洞。例舉如下兩個直觀的例子:
如CVE-2014-0773,直接在ActiveX控件中實現了一個名為CreateProcess的方法,可以直接調用這個方法創建進程,構造一個很簡單的攻擊頁面就可以通過這個漏洞攻破計算機。
再如Windows Media Center的CVE-2015-2509漏洞,其POC非常簡單,只有下面一行代碼:
將這行代碼存為.mcl擴展的文件類型,即Media Center link文件,然后用Windows Media Center直接打開就彈出一個計算器(一種常用于證明漏洞可執行任意代碼的方式)。
3 漏洞利用緩解技術
減少漏洞威脅主要有兩種途徑:一是主動挖掘漏洞來減少產品中的漏洞數量;另外是增加增強漏洞利用緩解機制,根據漏洞的特性和漏洞利用的方法,在漏洞利用途徑上進行阻斷,多種緩解技術的組合可以使大量的漏洞無法利用。
3.1 DEP和ASLR機制
數據執行保護(DEP,Data Execution Prevention)在Linux系統上也稱為NX(No-eXecute),在內存頁屬性中引入是否可執行標志來決定該段內存是否能夠執行代碼,一般將數據區域設置為不可執行,可有效防止攻擊者在可控的數據區域執行代碼。然而,單純的DEP防護可以利用ROP(Return Orient Program)、JOP(Jump Orient Program)等間接執行代碼的方式繞過。與DEP相似的一個技術是PXN(Privileged Execute Never),即阻止內核態直接執行攻擊者在用戶態構造好的代碼,可以有效增加攻擊者編寫利用代碼的難度。
空間地址隨機化(ASLR,Address Space Layout Randomization)將運行的可執行文件、加載庫、堆棧等地址隨機化,PIE(Position Independent Executable)與PIC(Position Independent Code)是該技術對可執行文件和加載庫的實現。有了ASLR這種機制,攻擊者即使劫持程序控制寄存器,也無法知道接下來要執行代碼的位置。然而,單純的ASLR防護還是可以通過沒有實現隨機化的段及堆噴射等技術繞過。ASLR技術在移動智能終端的應用比較漫長,蘋果在2011年的iOS 5中引入用戶態的ASLR,2012年的iOS 6中引入內核態的ASLR;Android在2011年的4.0版本引入用戶態ASLR,而內核態的ASLR由于不同終端設備生產廠商采取的策略不同而進展緩慢。
同時采用DEP和ASLR的防御策略可以防御大部分漏洞利用方法,但是攻擊者并非對此無計可施,利用一個內存信息泄漏漏洞來繞過ASLR后,再組合其他的漏洞進行攻擊就是一種通用的方法。
3.2 校驗機制
早期SOF這類漏洞的防御機制,如GS cookie是在函數棧的返回地址之前加入一個校驗位的cookie,用來檢測返回地址是否被緩沖區溢出覆蓋,這種技術之后被一些廠商演化為給數組的長度加cookie檢測數組長度是否被篡改、給一些安全標志位加cookie等。此外,還有如RenewSSP(Prevent SSP Brute Force Attacks)這樣的技術來防御逐字節暴力破解Apache等網絡服務及Android Zygote這些相同cookie的fork進程。
3.3 瀏覽器防護機制
作為互聯網的重要入口,網頁瀏覽器安全一直是關注的重點,各廠商都十分重視。而瀏覽器攻防技術一直都是研究的前沿領域。
UAF漏洞是瀏覽器中非常普遍的漏洞,一直都是被挖掘的重點對象,只通過修補有漏洞的代碼來提高瀏覽器的安全性顯然不太可行。所以,相關廠商往往采用增加漏洞利用緩減機制的方法來降低漏洞被成功利用的可能性,從而降低其危害。從2013年開始,微軟先后在其Windows瀏覽器中引入延遲釋放、隔離堆、沙箱、EPM、MemGC等漏洞利用緩減機制和保護機制,很大程度地提高了瀏覽器的安全性;Google也早在其瀏覽器中引入了Address Sanitizer等防護機制。
此外,sanbox沙箱技術也被廣泛應用到瀏覽器中。沙箱技術通過限制瀏覽器網頁渲染、腳本執行進程權限,來降低漏洞被利用后的攻擊者作惡的能力,可以有效降低用戶終端風險,但是仍存在一些缺陷:如被沙箱隔離進程的交互過程中的一些漏洞可以繞過沙箱的限制,沙箱內進程對一些內核、驅動模塊的訪問仍然沒有隔離。除了sandbox,Android系統還定制了一套selinux規則來對應用的行為行進限制。總體來說,基于隔離思想的防御機制可以有效增加攻擊成本。
3.4 硬件防護技術
安全威脅和安全需求同時也在驅動著硬件廠商技術的發展,ARM TrustZone及SE/inSE等提供的硬件支撐為TEE(Trust Execution Environment)的發展鋪平了道路,為敏感數據安全、可信計算提供了新的環境,然而,新功能同時也引入了新威脅,2016年黑客奧斯卡Pwnie Awards頒發的最佳提權漏洞就是由Widevine QSEE TrustZone驅動引入的。
ARMv8-A中新增的Pointer Authentication instructions特性也被高通用來開發Pointer Authentication技術保護內存中的指針,很難被黑客篡改。
4 結束語
各種安全漏洞是由人在編寫代碼等生產過程中的疏忽所造成的,由本文分析可知,新的漏洞利用緩解技術通過阻擊漏洞利用的途徑來降低漏洞的危害,但仍存在一些問題。隨著攻擊技術的發展,會出現新的攻擊途徑,而且隨著信息系統的日趨復雜,將來一定會出現更多的漏洞。同時,隨著攻防雙方技術的不斷升級,黑客利用漏洞攻擊的難度也越來越大,移動智能終端安全保障在不斷提升。
參考文獻:
[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. ★