Android Binder漏洞挖掘技术与案例分享
本文由作者根據其在KCon 2016黑客大會上的演講內容整理而成。演講稿鏈接:Binder fuzzing based on drozer。
文章開始,先來看幾個我在工作生活中發現的Android漏洞。其中包括Android系統鎖屏密碼繞過(影響了所有安全補丁在2016年10月份以前的Android 6.0、6.0.1、7.0系統)、三星手機關機竊聽、三星手機越權修改主題、系統拒絕服務漏洞。然后我們再來解釋相關的技術知識和實踐。
Android系統鎖屏密碼繞過
先來看下漏洞視頻演示:
https://v.qq.com/x/page/u0543o9s9fk.html
這個漏洞當時影響 6.0、6.0.1、7.0的所有最新Android系統。運行exp(exp可以是一個沒有申請任何權限的APK,也可以是一個二進制的bin文件),就可以清除Android系統的鎖屏密碼,這里的密碼包括指紋密碼、手勢密碼、pin碼和password類的所有密碼類型,然后就可以成功重置密碼。
該漏洞前后有兩個CVE(Common Vulnerabilities and Exposures,國際通用的漏洞編號)編號:CVE-2016-3749和CVE-2016-3908。
我在2016年5月份提交給Google,6月1號收到回復:Google內部安全研究員,在4月13號已經發現了該漏洞,漏洞狀態置為duplicate。
繼續深入分析發現:使用另一個Android 6.0.1分支版本進行測試,發現另一個函數也存在安全漏洞,這個漏洞函數對應的數字和之前的漏洞相同,Android系統漏洞眾多的一個很大原因就是碎片化問題。發現這個問題之后,出于一些考慮,并沒有馬上提交給Google,等Google發布漏洞patch。
Google于7月份發布了該漏洞公告,CVE編號CVE-2016-3749,而patch代碼只是修復了我第一次提交的漏洞位置setLockPassword()和setLockPattern()。
于是在漏洞公告發布當天,我又提交了另一份漏洞報告給Google。
Google于2016年7月20號確認該漏洞為高危漏洞,于8月31號分配了CVE-2016-3908,于10月份發布了漏洞公告并致謝。
三星手機關機竊聽
漏洞視頻演示:
https://v.qq.com/x/page/o0543t0uwkw.html
漏洞細節:
CVE-2016-9567
漏洞原理:
通過未授權訪問setmDNIeScreenCurtain()函數,可以控制手機的屏幕,從而造成關機的假象,實現關機竊聽。
三星手機越權修改手機主題
三星居然將其與關機竊聽這個漏洞合并了!
漏洞視頻演示:
https://v.qq.com/x/page/y0543skh3t7.html
系統拒絕服務漏洞
漏洞視頻演示:
https://v.qq.com/x/page/a0543ilaytw.html
這樣的漏洞很多,上面視頻演示中,通過一個NFC tag來實現漏洞利用。
讀者如果想了解具體的實現方式,可以參考作者之前寫的文章《Android漏洞利用方式之NFC淺析》。
上面這些好玩的漏洞都與Android Binder有關,接下來我們就帶你一起來體驗Android Binder相關的漏洞利用技術和工具。
“In the Android platform, the binder is used for nearly everything that happens across processes in the core platform.”
–Dianne Hackborn,Google
https://lkml.org/lkml/2009/6/25/3
Android Binder是知名女程序員Dianne Hackborn基于自己開發的OpenBinder重新實現的Android IPC機制,是Android里最核心的機制。不同于Linux下的管道、共享內存、消息隊列、socket等,它是一套傳輸效率高、可操作性好、安全性高的Client-Server通信機制。Android Binder通過/dev/binder驅動實現底層的進程間通信,通過共享內存實現高性能,它的安全通過Binder Token來保證。
Binder里用到了代理模式(Proxy Pattern)、中介者模式(Mediator Pattern)、橋接模式(Bridge Pattern)。熟悉這些設計模式有助于更好的理解Binder機制。需要了解以下概念:Binder、Binder Object、Binder Protocol、IBinder interface、Binder Token、AIDL(Android interface definition language)、ServiceManager等。下圖大致描述了Binder從kernel層、中間件層到應用層中涉及的重要函數,本文漏洞利用部分會用到。
讀者如果想深入了解Binder,推薦閱讀:Android Binder Android Interprocess Communication。
drozer是MWR實驗室開發的一套針對Android安全審計和攻擊利用的框架,類似于Metasploit。drozer由三部分組成:Console、Agent、Server。下圖左邊的部分為Agent界面,運行在手機端,右邊的部分為Console界面,運行在PC端。
Agent是一個只申請了internet權限的非特權App,它會開啟一個ServerSocket服務,默認監聽31415端口。Console連上Server之后就可以控制Agent與Dalvik虛擬機、第三方App的IPC節點(intent)以及底層操作系統進行交互。為什么一個無特權的Agent應用可以無縫與Dalvik虛擬機進行交互呢?
drozer使用了反射和動態類加載的技術。下圖右邊的部分是官方提供的drozer模塊的demo,可以看到這么一行,直接可以new一個Java類對象實例,這里內部實現就用到了Java反射機制。左邊的部分是drozer源碼的一個目錄,可以看到有許多.java源文件和對應的APK文件,drozer使用了動態類加載機制,在運行相應模塊時,會將這個APK文件上傳到手機上Agent應用的緩存目錄,使用動態類加載機制調用類里的Java函數。這個功能很實用,在本文第三部分還會涉及到這部分知識。
|  |  |
關鍵代碼:
drozer有兩種模式:直連模式和基礎設施模式。Android應用安全審計用到最多的就是直連模式,手機端裝上Agent應用,通過USB連接電腦,Console端通過端口轉發后即可發送命令給Agent端的Embedded Server,來實現對Agent端的控制。
基礎設施模式多用在遠程攻擊利用上:如下圖你可以手動設置Server的host和port,以及是否需要開啟密碼保護和SSL。
也可以通過源碼編譯一個無launcher的惡意Agent,只需要下圖中一條命令。
編譯時可以指定Agent回連的server IP 、port,并且可以通過設置密碼來做身份鑒權,只有通過認證的用戶才可以與該Agent建立session,因此很適合做Android遠控。可以在一臺服務器上開啟drozer Server,如下圖所示命令。
當用戶中招(可以通過社工、釣魚等手段誘導用戶下載安裝),Agent連上來之后,你可在以任意一臺電腦上通過Console連上Server來控制Agent。你可以遠程下載安裝相應的攻擊插件,比如打電話、發短信、讀取聯系人、上傳下載Sdcard文件等。開源的drozer-modules比較好用的有curesec、metall0id。這些功能在Android 4.3以下很好用,在高系統版本由于各種安全機制的限制,導致許多攻擊功能無法完成。
下圖展示了用戶中招后,通過遠程下載安裝drozer利用模塊,實現讀取用戶聯系人、打電話、中止來電的功能:
drozer是模塊化的,可擴展。上文也提到了許多開源的drozer攻擊模塊。那么如何寫一個自己的插件呢?
有兩個要素:
1.圖中顯示的這些元數據是必須的,哪怕是空。
2.execute()函數是核心,在這里執行自己的邏輯。
fuzzing是安全人員用來自動化挖掘漏洞的一種技術,通過編寫fuzzer工具向目標程序提供某種形式的輸入并觀察其響應來發現問題,這種輸入可以是完全隨機的或精心構造的,使用邊界值附近的值對目標進行測試。為什么選擇drozer來做fuzzing框架呢?可擴展、易用是最大的原因。下面簡單介紹我如何使用drozer對Android Binder進行fuzzing測試。
介紹兩種:fuzzing intent、fuzzing系統服務調用。
第一種fuzzing intent。這里我介紹一種通用的方式,不依賴數據類型。這里用到了15年初作者發現的通用型拒絕服務漏洞,可以參考發布在360博客上的技術文章Android通用型拒絕服務漏洞分析報告。簡單介紹下這個漏洞的原理:通過向應用導出組件傳遞一個序列化對象,而這個序列化對象在應用上下文中是不存在的,如果應用沒有做異常處理將會導致應用拒絕服務crash。而對Android系統中的一些高權限組件實施這樣的攻擊,將會導致Android系統拒絕服務重啟。 這個漏洞很暴力,可以讓很多第三方手機廠商的系統拒絕服務,當然也包括Google原生系統。
第二種是fuzzing系統服務調用。我盡量用大家容易理解的方式來簡單介紹這塊。Android中有很多系統服務,可以通過adb shell service list這條shell命令列出來。如下圖,我的Nexus 5X 7.12系統可以列出126個這樣的系統服務。[ ]里是該服務對應的類接口。
這些接口里定義了系統服務用到的函數,下圖列出的是lock_settings服務對應的接口類。接口里的每一個函數對應一個整型int值,我們可以對這些函數進行fuzzing,fuzzing其參數。
如下圖,我們可以基于shell命令進行fuzzing。舉例:adb shell service call lock_settings CODE i32 -1 ,其中CODE部分對應接口類中每一個函數對應的數字,i32是第一個參數的類型,代表32位的整型。
前面提到drozer利用動態加載技術可以加載一個apk文件執行,我們可以利用Java反射機制來確定系統服務中函數的參數個數和類型,然后傳入相應類型的隨機或畸形數據,這些數據可以通過Ramada生成。
上文也講到了如何寫一個drozer模塊,我們只要在execute()函數中執行fuzzing邏輯即可。這里提一下,因為drozer的模塊每次修改都需要重新通過module install MODULE_NAME命令進行安裝,這里可以把核心功能寫在drozer的Python模塊里或者寫在Java文件里,然后通過外部的Python腳本來自動化這個過程,控制fuzzing的邏輯,通過輸出每個fuzzing數據的參數值以及logcat來定位引發漏洞的參數。要注意的是:不是只有Crash才是漏洞,有的漏洞就是正常的調用,并沒有Crash異常。我接下來分享的lock_settings服務漏洞就屬于這種類型。至此,你就可以寫個自己的fuzzer進行自動化漏洞挖掘了。
最后,我們再介紹幾種漏洞利用方法。
結合AIDL利用
在Android開發中,可以使用Android SDK tools基于AIDL文件自動生成Java語言的接口文件。讀者可自行了解更多關于AIDL相關知識。可以參考:對安卓Bound Services的攻擊。
關鍵代碼:
通過Java反射利用
和第一種利用方式類似,只是不需要根據AIDL文件生成Java接口文件,直接通過反射利用。
關鍵代碼:
結合Android源碼利用
需要將利用代碼放在Android系統源碼目錄進行編譯。參考BinderDemo。
關鍵代碼:
通過Java調用shell腳本利用
關鍵代碼:
Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec(command);shell腳本內容舉例:
service call lock_settings 10 i32 02017年加入美團金融服務平臺。從事Android端應用安全和系統漏洞挖掘將近4年,積累了大量真實漏洞案例。后續擬分享Android應用安全系列技術文章,主要從漏洞利用場景、漏洞產生原理、漏洞案例、修復方案來展開,希望能幫助公司開發者提升安全意識,共同構建更加安全,更加健壯的應用軟件。
美團金融服務平臺-安全與合規中心致力于維護美團金融平臺的安全,努力構建行業頂級安全架構,打造行業領先安全產品。歡迎各位行業同仁加入我們。 聯系郵箱:isec#meituan.com
總結
以上是生活随笔為你收集整理的Android Binder漏洞挖掘技术与案例分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美团点评Docker容器管理平台
- 下一篇: android sina oauth2.