今天是Black Hat 2015第二天,第一天的大會總結請參考:
看黑客如何遠程黑掉一輛汽車 - BlackHat 2015 黑帽大會總結 day 1
本來打算去聽shendi的TrustZone crack的talk,但是因為shendi的visa沒有辦下來,最后就給cancel了。于是去聽了這個iOS injection的talk。
Talk首先介紹說在iOS 8之前是不允許動態加載library的,只允許靜態編譯。但在iOS 8之后加入了新的特性叫”Embedded Frameworks”。允許應用和它的extension進行通訊,但實際上無論有沒有extension都可以用這個新特性。
然后作者嘗試用substrate的方法來hook SSL方法在非越獄機器上,但是失敗了,原因是substrate在hook函數的時候需要patch函數的prologue,因此需要RWX權限,但這在非越獄機器上是不可能的。最終作者采用的方法是facebook開發的fishhook框架用來進行HOOK。https://github.com/facebook/fishhook
最后作者利用上面講到的方法開發了trustkit。利用trustkit,可以在不修改源代碼的情況下用來hook SSL函數并加入pinning的功能。并且作者在今天發布了源碼。
PPT下載:
https://www.blackhat.com/docs/us-15/materials/us-15-Diquet-TrustKit-Code-Injection-On-iOS-8-For-The-Greater-Good.pdf
trustkit源碼:
https://github.com/datatheorem/TrustKit
speaker是 Xu Wen,來自上海交通大學并且在keen實習。首先speaker提到想要實現萬能root必須要基于linux kernel的漏洞而不是靠驅動的漏洞。隨后speaker講述了怎么樣發現漏洞的過程。
speaker首先采用https://github.com/kernelslacker/trinity
這個system call fuzzer獲取到很多的log信息。然后在分析fuzzer的log的過程中,發現kernel crash在一個很奇怪的地址0x200200。繼續分析發現問題是由ping_unash()這個函數引起的。但開始只能造成拒絕服務攻擊,這對于root來說是遠遠不夠的。隨后繼續分析發現sock_put(sk)被調用了2遍,會產生非常普遍的UAF(use-after-free)漏洞。既然有了UAF漏洞,下一步就是用UAF來控制內核。PingPong Root采用的方式是Ret2dir (Ret2dir: rethinking kernel isolate)。控制內核以后就是執行提權的shellcode了。PingPong root借鑒了towelroot中使用的通用提權shellcode,讓進程獲取root權限。
speaker最后提到了如何root 64位的設備。在64位上,UAF漏洞依然存在,但有一個問題是無法將shellcode return到user space。所以需要做kernel層的ROP。最后采用了類似rop的JOP(jump to program)的方法,并在某些ROMs中發現了一個GOD gadgets可以做到泄露內存信息以及覆蓋數據的功能。最終做到了root提權。
PPT:
https://www.blackhat.com/docs/us-15/materials/us-15-Xu-Ah-Universal-Android-Rooting-Is-Back.pdf
speaker是來自FireEye的Wei Tao和Zhang Yulong。Talk首先介紹了指紋系統的原理以及實現,比如如何進行特征采集,如何對比特征等。
隨后講了2種架構,一種是Fingerprint without TrustZone和Fingerprint with TrustZone。在root情況下without TrustZone是非常危險的,所有的數據都可以輕松獲取到。但是在有了TrustZone的情況下,hacker在獲取了root以后依然無法讀取TrustZone中的指紋信息。如果想要獲取指紋信息,理論上還需要破解TrustZone才行。
接著speaker介紹了四種攻擊手段:第一個攻擊是confused attack(迷惑性攻擊)。speaker提到fingerprint有兩種用處,一種是authentication另一種authorization。就像是passport和visa。一個用來做身份驗證,一個用來行使權力。Hacker可以采取一種迷惑性的攻擊,讓用戶僅僅是覺得做身份驗證,但實際上卻行使了權利,比如說在demo中用戶以為他在解鎖手機屏幕,而實際上卻使用指紋轉了錢給黑客。
第二個攻擊是不安全的數據存儲。最經典的例子就是HTC one的指紋保存文件。對所有人都是可讀可寫的。毫無安全性可言。
第三個攻擊是finger spy。雖然TrustZone非常安全,但是android系統是通過應用層的service和TrustZone進行通訊的。因此hacker可以偽造一個finger print app,并且和finger print sensor進行通訊,從而竊取到用戶的指紋。三星針對這個問題的解決方式是TrustZone UI。也就是當使用指紋進行授權的時候必須通過TrustZone UI來進行,因為TrustZone UI也是TrustZone的一部分,所以黑客必須要破解掉TrustZone才能獲取到指紋。
第四個攻擊是fingerprint backdoor。用戶在系統的設置中可以查看當前記錄的指紋數量,但是這個數量信息并沒有保存在TrustZone當中。因此hacker可以留下自己的指紋作為后門,并且將增加的指紋的數量減掉。比如說在demo中fingerprint service顯示僅保存了一個指紋,但是demo中卻成功的用三個指紋解鎖了手機屏幕,因為其中兩個指紋其實是黑客留下的,為了防止用戶發現,黑客將保存的指紋數修改成了1。
PPT:
https://www.blackhat.com/docs/us-15/materials/us-15-Zhang-Fingerprints-On-Mobile-Devices-Abusing-And-Leaking.pdf
這個talk來自盤古。speaker首先介紹了iOS的幾個攻擊點:本地攻擊,遠程攻擊,內核攻擊等,并舉了很多例子(比如之前jailbroken使用的漏洞)。
接著speaker介紹了在kernel層進行fuzzing的tips。speaker首先提到IOKit是最好的fuzz目標,因此對fuzzy IOkit的第一個建議是盡量fuzz更底層的函數。比如說IOConnectCallMethod里有對參數大小的限制,但是如果調用io_connect_method就沒有參數大小的限制。第二個建議就是使用information leak的漏洞來獲取fuzzy過程中產生的信息。
隨后speaker提到了Shared Memory。因為IOKit會share一些data到用戶層并且用戶層可以對這些數據進行修改。因此在fuzz io_connect_method的過程中可以對這些用戶層數據也進行fuzz。隨后IOKit在讀取了用戶層修改的數據之后就有可能產生漏洞。接著speaker又介紹了iokit_user_client_trap()這個用戶層函數的fuzzy,并demo了一個0day。
接下來speaker介紹了如何在用戶層挖XPC的洞。首先在應用上分別建立server端和client端,然后使用client端對server端進行通訊。
在進行通訊過程的中,有很多函數可以進行fuzz,如果函數對傳輸的數據處理有誤,有可能會產生空指針異常,內存越界以及遠程代碼執行等漏洞。最后演講者分別展示這幾種漏洞的POC代碼并簡單介紹了如何利用這些fuzz出來的漏洞。
PPT:
https://www.blackhat.com/docs/us-15/materials/us-15-Wang-Review-And-Exploit-Neglected-Attack-Surface-In-iOS-8.pdf
最后一個talk本來想去聽360講的Android Fuzzing,結果又是因為簽證問題給cancel了。于是本屆BlackHat的會議部分就算結束了。明天開始將在隔壁酒店舉行DEFCON的會議以及CTF比賽。歡迎大家繼續關注。