歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

開發一個基于Dalvik字節碼的相似性檢測引擎,比較同一款Android應用程序的不同版本之間的代碼差異(二)

來源:本站整理 作者:佚名 時間:2019-06-19 TAG: 我要投稿

上文我們說過,《針對Dalvik字節碼的相似性檢測引擎,比較同一款Android應用程序的不同版本之間的代碼差異》這篇文章計劃分兩個部分來講解,上文只介紹了如何利用Quarkslab公司開發的diff引擎。本文我們將介紹一個用例:URl欺騙漏洞(CVE-2019-10875) ,另外還會介紹如何將Redex與diff工具相結合,檢測被混淆處理的應用程序中到底發生了哪些修改?
CVE-2019-10875漏洞及緩解措施的分析
CVE-2019-10875漏洞介紹
mint browser(薄荷瀏覽器)是小米專門為安卓手機用戶設計的一款輕量級瀏覽器應用,這款軟件內存很小,設計的十分簡潔,但是該有的功能一應俱全,支持語音搜索,能夠帶給用戶更好的瀏覽體驗。不過就在2019年4月,研究人員曝出小米薄荷瀏覽器存在URL欺騙漏洞,攻擊者可把惡意鏈接偽裝成權威網站的URL,對受害者進行釣魚攻擊。之后雖然小米公司迅速發布了安全補丁,但有人發現安全補丁存在嚴重的問題,只需要簡單添加幾個字母,就可繞過。該漏洞是CVE-2019-10875。粗略地說,小米薄荷瀏覽器為了提升用戶體驗,在當你打開某個網絡鏈接時,若鏈接類似于https://www.google.com/?q=www.domain.com時,則網址欄就只會顯示www.domain.com,也就是只顯示?q=后面的字段。因此,一旦攻擊者構造https://www.evil.com/?q=www.google.com這類的鏈接進行釣魚攻擊,受害者則只會在網址欄看到www.google.com,相信任何人都不會懷疑谷歌是釣魚網站。當攻擊者輸入https://www.andmp.com/?q=www.google.com時,跳轉成功后,可看到地址欄顯示www.google.com,但頁面其實是www.andmp.com的內容,這種URl欺騙漏洞攻擊者利用起來毫無難度,僅僅只需要編造一個簡單的惡意鏈接。
這就會造成,攻擊者可以利用此安全漏洞作為網絡釣魚活動的一部分。該漏洞會影響1.6.1或更低版本,所以為了安全,請盡快升級到1.6.3版。
現在,讓我們假設有人想快速理解這個漏洞是如何工作的。要做到這一點,最快的方法是在發現到這個漏洞之后查看開發人員應用的安全補丁。它應該會引導我們訪問易受攻擊的代碼并阻止我們檢查整個應用程序代碼。
在本文中,我們會介紹如何使用diff分析來找出代碼的哪些實際部分被修改,以保護用戶免受漏洞影響。請注意,由于JNI特性,根據不同的情況,還可以在嵌入式本機庫中進行一些修改。如果是這樣,則必須在本機代碼級別執行互補的diff進程。
選擇要比較的類
首先,我們必須減少要進行比較的類的集合,以便只保留由小米開發團隊實際開發的類。這一步非常重要,因為它使得比較過程更快,結果更準確。位于APK根目錄的AndroidManifest.xml可以為我們提供有關其開發包的一些有用信息,這些開發包通常包含它們的大部分活動、服務、廣播接收器等。
這樣,我們很快就會發現manifest文件中介紹的一個名為com.miui.org.chromium.chrome.browser的資源包,該包含有root權限,被大量類共享。因此,我們會首先比較其中包含的類。以下Python代碼展示了具體工作過程:
lhs_app = load("com.mi.globalbrowser.mini-1.6.1.apk.apk") # Loading left handside application
rhs_app = load("com.mi.globalbrowser.mini-1.6.3.apk.apk") # Loading right handside application
condition = {"package_filtering": "com.miui.org.chromium.chrome.browser"}
lhs_classes = filter(lhs_app.classes, condition)
rhs_classes = filter(rhs_app.classes, condition)
查找修改過的類
一旦得到類,我們就需要知道哪些類已經被修改。為此,我們必須事先優化選項。
optimizations = {
  "inner_skipping": False,
  "external_skipping": False,
  "synthetic_skipping": True,
  "find_obfuscated_packages": False,
  "min_inst_size_threshold": 5,
  "top_match_threshold": 3
}
diff_results = diff(lhs_classes, rhs_classes, 0.8, optimizations)
這些優化選項分別配置了diff引擎:
1.不要跳過內部和外部類:內部類和外部類很可能包含修改過的代碼。
2.跳過合成類:合成類是由編譯器自動生成的,因此不太可能嵌入修改過的代碼。
3.不要試圖找到已經被混淆的包名:如前所述,包名稱似乎沒有混淆。設置此選項后,diff引擎將不會考慮由混淆引起的潛在問題。
4.不要考慮嵌入少于5條命令的類:應用程序通常包含所有看起來相似的小類(例如,一些只返回屬性值的方法)。然而,在大多數情況下,它們在比較版本的diff方面毫無價值。大多數情況下,他們只會進行一些誤報,不過,這些結果可以通過設置合適的值來消除。
5.在三個高級類中進行徹底的比較:如果我們處理的類在結構級別上大致相同,則必須增加此選項。不過這超出了本文所講的范圍。
此外,我們將匹配閾值設置為0.8,因為在尋找修復的漏洞時,我們只期望尋找那些進行較小修改的漏洞。這意味著,匹配距離低于此值的類,將在結果中直接被刪除。
此時,我們得到了diff()函數的結果,可以用下面的Python代碼對它們進行迭代:
for match in diff_results:
  if match.distance  {match.distance:1.4f}")
執行完整個腳本后,會輸出大量結果。
[+] com/miui/org/chromium/chrome/browser/widget/progress: ToolbarProgressBar - ToolbarProgressBar.java | com/miui/org/chromium/chrome/browser/widget/progress: ToolbarProgressBar - ToolbarProgressBar.java -> 0.9994
[+] com/miui/org/chromium/chrome/browser/update: HomePageDataUpdator - HomePageDataUpdator.java | com/miui/org/chromium/chrome/browser/update: HomePageDataUpdator - HomePageDataUpdator.java -> 0.9794
[+] com/miui/org/chromium/chrome/browser/init: ChromeBrowserInitializer$2 - ChromeBrowserInitializer.java | com/miui/org/chromium/chrome/browser/init: ChromeBrowserInitializer$2 - ChromeBrowserInitializer.java -> 0.9771

[1] [2] [3] [4] [5]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺