天天看點

超級安卓漏洞 “寄生獸”影響數千萬手機應用

本文講的是 超級安卓漏洞 “寄生獸”影響數千萬手機應用,一個被研究人員命名為“寄生獸”的安全漏洞影響市面上數以千萬的APP,包括網際網路巨頭BAT等廠商的衆多流行移動産品。利用該漏洞,攻擊者可以直接在使用者手機中植入木馬,盜取使用者的短信照片等個人隐私,盜取銀行、支付寶等賬号密碼等。

發現該漏洞的360手機安全研究團隊VulpeckerTeam向安全牛表示,寄生獸屬于APK緩存代碼劫持漏洞,他們已經向補天漏洞響應平台送出了這個漏洞。目前補天已經将相關詳情通知給各大廠商的安全響應中心(src),請各廠商及時自查和修複。

漏洞原理

由于安卓應用的更新都需要重新安裝程式,為了避免頻繁更新給使用者體驗和開發都帶來了不便,是以現在市面上的app大都使用插件機制來做到無縫更新和擴充功能,APP隻需要引入相應的插件檔案即可完成更新。但這種做法卻隐藏了不為人知的安全隐患。

VulpeckerTeam的安全專家黎博解釋,APP插件機制的實作方式是把相關功能編寫成單獨apk或jar檔案,然後在程式運作時用DexClassLoader函數動态加載,進行反射調用。由于安卓應用的代碼緩存機制會優先加載運作APK的緩存代碼odex,是以如果針對插件的odex檔案進行攻擊,開發者對于插件檔案所做的各種保護都将失效。

安全人員檢測了市面上一些用到插件機制的主流app,發現部分app對DexClassLoader的第一個參數的插件檔案做了校驗,在加載前對要加載的apk或jar做了簽名或者MD5等校驗。這在一定程度上保護了插件的完整性,防止了代碼注入攻擊。但是,幾乎沒有廠商對第二個參數的緩存檔案進行保護,這就導緻了新的攻擊點的出現。

經過在安卓源碼中的驗證,攻擊者需要修改odex檔案中的兩個參數crc及modWhen以實作惡意代碼的注入。

超級安卓漏洞 “寄生獸”影響數千萬手機應用

上圖dex_old是修改前的odex檔案,dex_new是修改後的dex檔案。兩個檔案的md5不一樣,但是crc及modWhen卻是一樣的,這樣就可以繞過DexClassLoader的校驗。

APK緩存代碼感染雖然危害很大,但是一般情況下,開發者都會将odex的緩存目錄選在App的私有目錄下,google官方文檔也提示開發者,不要将odex的緩存路徑選擇在外部存儲器(SD卡)上。是以,攻擊者如果沒有足夠的權限是無法替換app私有目錄下的檔案的。

在之前安全牛報道過的三星輸入法漏洞利 用中,攻擊者用到了安卓zip解壓縮的一個漏洞。可以周遊目,并在解壓zip檔案時以原app的權限覆寫任意檔案。如果該app用到了插件機制,則對應的插件的odex檔案也會被備份。攻擊者可以先用adb backup備份使用者資料,對備份下來的odex檔案進行修改,然後用adb restore恢複回去,就可以替換掉正常的odex檔案,造成代碼劫持。

漏洞危害

安全人員測試了市面上幾款主流的app,凡是用到了這種插件機制的app,都沒有對DexClassLoader的第二個參數做校驗,一旦攻擊者将惡意代碼注入APK的緩存代碼(odex)中,開發者對apk/jar做的各種保護都将失效。而且這種攻擊,APK自身很難發現,即使重新開機或關機,隻要app一運作,惡意代碼就會随之運作。

為了證明漏洞危害的嚴重性,安全人員選擇了三類代表性的APP驗證漏洞:

輸入法類APP:搜狗輸入法,百度輸入法等

可感染代碼輸出logcat

浏覽器類APP:UC浏覽器等

替換支付寶SDK,盜取密碼

通用類SDK:高德地圖SDK,微信SDK等

感染代碼輸出logcat

高德地圖漏洞利用視訊

由于驗證漏洞需要花大量精力,是以還需要各大廠商自查并修複。

解決方案

APK緩存劫持漏洞的核心有兩點,一個是軟體開發者沒有考慮odex的安全問題,另一個是沒有對zip解壓縮時的惡意檔案名做檢測,是以防護上也應該從這方面做考慮。

•odex完整性校驗

由于對odex一般是由系統(DexClassLoader)自動生成的,且odex與apk/jar是相對獨立的,開發者事先無法知道odex檔案的MD5等資訊,是以很難通過MD5校驗等手段保護odex的完整性;同時,系統的DexClassLoader函數隻是校驗了odex中的crc、modWhen字段,可以很輕易的被繞過。是以,目前對odex的防護隻能由app自身來做,可以在每次運作DexClassLoader之前,清楚已經 存在的odex;另外,在odex第一次生成之後,存儲odex檔案的MD5值,以後每次調用DexClassLoader的時候都對odex檔案進行 MD5校驗。

•對劫持odex的攻擊入口的修複

對zip解壓縮的漏洞,隻需要在調用 zipEntry.getName()的時候,過濾傳回值中的”../”跳轉符。對于引用的第三方的zip庫也需要注意,可以用上面的測試用例測試一下第 三方庫是否有zip解壓縮的漏洞;調用DexClassLoader動态加載dex的時候,第二個參數不要指定在sdcard上;在manifest裡指 定allowBackup=”false”。

原文釋出時間為:七月 1, 2015

本文作者:Recco

本文來自雲栖社群合作夥伴安全牛,了解相關資訊可以關注安全牛。

繼續閱讀