Android Binder漏洞挖掘技術與案例分享(下)

美團雲發表於2017-09-25

Android Binder簡介

"In the Android platform, the binder is used for nearly everything that happens across processes in the core platform."

–Dianne Hackborn,Google

lkml.org/lkml/2009/6…

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層、中介軟體層到應用層中涉及的重要函式,本文漏洞利用部分會用到。

Android Binder漏洞挖掘技術與案例分享(下)

讀者如果想深入瞭解Binder,推薦閱讀:Android Binder Android Interprocess Communication

drozer的架構和高階用法

drozer是MWR實驗室開發的一套針對Android安全審計和攻擊利用的框架,類似於Metasploit。drozer由三部分組成:Console、Agent、Server。下圖左邊的部分為Agent介面,執行在手機端,右邊的部分為Console介面,執行在PC端。

Android Binder漏洞挖掘技術與案例分享(下)Android Binder漏洞挖掘技術與案例分享(下)

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函式。這個功能很實用,在本文第三部分還會涉及到這部分知識。

Android Binder漏洞挖掘技術與案例分享(下)Android Binder漏洞挖掘技術與案例分享(下)

關鍵程式碼:

Android Binder漏洞挖掘技術與案例分享(下)

drozer有兩種模式:直連模式和基礎設施模式。Android應用安全審計用到最多的就是直連模式,手機端裝上Agent應用,通過USB連線電腦,Console端通過埠轉發後即可傳送命令給Agent端的Embedded Server,來實現對Agent端的控制。

Android Binder漏洞挖掘技術與案例分享(下)

基礎設施模式多用在遠端攻擊利用上:如下圖你可以手動設定Server的host和port,以及是否需要開啟密碼保護和SSL。

Android Binder漏洞挖掘技術與案例分享(下)

也可以通過原始碼編譯一個無launcher的惡意Agent,只需要下圖中一條命令。

Android Binder漏洞挖掘技術與案例分享(下)

編譯時可以指定Agent回連的server IP 、port,並且可以通過設定密碼來做身份鑑權,只有通過認證的使用者才可以與該Agent建立session,因此很適合做Android遠控。可以在一臺伺服器上開啟drozer Server,如下圖所示命令。

Android Binder漏洞挖掘技術與案例分享(下)

當使用者中招(可以通過社工、釣魚等手段誘導使用者下載安裝),Agent連上來之後,你可在以任意一臺電腦上通過Console連上Server來控制Agent。你可以遠端下載安裝相應的攻擊外掛,比如打電話、發簡訊、讀取聯絡人、上傳下載Sdcard檔案等。開源的drozer-modules比較好用的有curesec、metall0id。這些功能在Android 4.3以下很好用,在高系統版本由於各種安全機制的限制,導致許多攻擊功能無法完成。

下圖展示了使用者中招後,通過遠端下載安裝drozer利用模組,實現讀取使用者聯絡人、打電話、中止來電的功能:

Android Binder漏洞挖掘技術與案例分享(下)

drozer是模組化的,可擴充套件。上文也提到了許多開源的drozer攻擊模組。那麼如何寫一個自己的外掛呢?

有兩個要素:

1.圖中顯示的這些後設資料是必須的,哪怕是空。
2.execute()函式是核心,在這裡執行自己的邏輯。

Android Binder漏洞挖掘技術與案例分享(下)

基於drozer的自動化漏洞挖掘技術

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個這樣的系統服務。[ ]裡是該服務對應的類介面。

Android Binder漏洞挖掘技術與案例分享(下)

這些介面裡定義了系統服務用到的函式,下圖列出的是lock_settings服務對應的介面類。介面裡的每一個函式對應一個整型int值,我們可以對這些函式進行fuzzing,fuzzing其引數。

Android Binder漏洞挖掘技術與案例分享(下)

如下圖,我們可以基於shell命令進行fuzzing。舉例:adb shell service call lock_settings CODE i32 -1 ,其中CODE部分對應介面類中每一個函式對應的數字,i32是第一個引數的型別,代表32位的整型。

Android Binder漏洞挖掘技術與案例分享(下)

前面提到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的攻擊

關鍵程式碼:

Android Binder漏洞挖掘技術與案例分享(下)

通過Java反射利用

和第一種利用方式類似,只是不需要根據AIDL檔案生成Java介面檔案,直接通過反射利用。

關鍵程式碼:

Android Binder漏洞挖掘技術與案例分享(下)

結合Android原始碼利用

需要將利用程式碼放在Android系統原始碼目錄進行編譯。參考BinderDemo

關鍵程式碼:

Android Binder漏洞挖掘技術與案例分享(下)

通過Java呼叫shell指令碼利用

關鍵程式碼:

Runtime runtime = Runtime.getRuntime();    
Process proc = runtime.exec(command);
複製程式碼

shell指令碼內容舉例:

service call lock_settings 10 i32 0
複製程式碼

作者簡介

2017年加入美團點評金融服務平臺。從事Android端應用安全和系統漏洞挖掘將近4年,積累了大量真實漏洞案例。後續擬分享Android應用安全系列技術文章,主要從漏洞利用場景、漏洞產生原理、漏洞案例、修復方案來展開,希望能幫助公司開發者提升安全意識,共同構建更加安全,更加健壯的應用軟體。


  • 本文轉自美團點評技術學院,未經作者許可,不允許私自轉載!
  • 加入美團雲技術交流群(QQ群:469243579),每日分享更多精彩技術文章。


相關文章