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