Android安全检测 - Janus签名漏洞
前言
這一章來說說Janus簽名漏洞,網上關于這個漏洞的介紹很詳細,其中的原理均為其它地方進行摘錄,那么我主要做的就是POC測試,在文章末尾也會給出相應的樣本,當然樣本就是自己做的,用真實的上線項目來做這個也不合適,想找真實的項目來練練手的話推薦找2017年12月之前的項目(學習可以,但不要在網上發布不當的東西)
一、漏洞原理
基本概述
Google在2017年12月份披露了一個名為“Janus”的安全漏洞(漏洞編號:CVE-2017-13156),該漏洞可以讓攻擊者繞過安卓的簽名校驗機制(signature scheme V1簽名機制),進而可以對應用進行篡改(apk代碼篡改)。安卓的部分安全機制是建立在簽名和校驗的基礎上的,故這個漏洞會給搭載安卓系統的設備造成很大的危害
這個漏洞可以在篡改apk內容的情況下,保持apk的簽名不發生變化,那么這就會使得用戶在下載到安裝這個過程中,設備中的安全軟件發現不了它是一個被篡改的惡意盜版應用。
影響范圍
安卓5.0到8.0系統以及基于V1簽名機制的app均Janus漏洞影響;基于V2簽名的App則不受影響。從安卓7.0開始系統就已經支持了V2簽名,那么7.0的安卓系統安裝了含有V2簽名的app不會受到此漏洞的影響
原理
文章來源:https://zhuanlan.zhihu.com/p/31972541
攻擊原理解讀:
安卓應用程序代碼邏輯主要是以DEX文件格式存放。DEX格式標準文檔鏈接:鏈接
此DEX格式文件以文件名classes.dex,classes2.dex等與其他應用程序所需文件一起壓縮存放于APK格式的文件里。APK格式文檔鏈接:鏈接
APK格式文件就是大眾熟知的安卓應用程序安裝包,有它就可以安裝一款應用軟件到手機。問題也就出在安卓操作系統安裝應用程序的流程上。
螞蟻金服安全部門的巴斯光年實驗室成員吳濰浠(@wish_wu)表示,Android操作系統在安裝一個應用軟件時,會將DEX文件轉化成OAT文件,負責轉化任務的程序叫dex2oat 。安卓操作系統會將APK文件直接給dex2oat程序。
而dex2oat有這樣一套邏輯:
如果給它的是APK文件,它會把classes.dex文件從APK文件里取出再轉化成OAT文件。如果給它的是DEX文件,它直接把DEX文件轉化成OAT文件。
如果一個既是APK格式文件又是DEX格式文件的文件,給dex2oat程序會怎樣呢?
以下是程序判斷邏輯:
dex2oat通過IsZipMagic函數和IsDexMagic函數來決定這是什么格式的文件。
再來看看IsZipMagic函數和IsDexMagic函數的實現:
所以dex2oat程序是依據前文件的前4個字節決定這是什么格式文件。然而根據APK格式,前兩個字節可以不是‘P’和‘K’,也就是說這里對APK格式的判斷并不嚴謹。事實上一個既滿足APK格式要求又滿足DEX格式要求的文件是可以構造出來的。
借用漏洞個發現者發布的圖片所示:
這里我們暫且把這個DEX格式文件與APK格式文件合體之后產生的文件叫做DEXAPK文件。
當DEXAPK文件在被安卓操作系統安裝時,包管理器的代碼會把它當作APK格式文件,而dex2oat會把它當作DEX格式文件。安卓應用程序的簽名驗證是包管理器做的,程序運行加載的OAT文件是由dex2oat根據輸入的DEX格式文件生成的。
攻擊者可以利用Janus漏洞,將一個惡意DEX與源APK進行拼接,構造一個DEXAPK文件,從而既可以通過安裝程序時系統對APK文件的簽名認證,又包含攻擊者想要運行的程序邏輯。Android系統運行時會將當前的APK文件看作是之前應用的合法升級版并允許安裝,最終通過
“升級”植入用戶設備執行惡意DEX代碼。
二、POC
這里主要做"Janus"漏洞的POC測試,在實際的操作過程種遇到的一些問題
測試環境\工具
(1)AndroidStudio自帶模擬器Android 6.0
(2)dex和apk合并工具
兩種情況的不同處理
(1)在原dex的基礎之上進行修改
(2)生成一個新dex替換原dex
具體測試
1. 在原dex的基礎之上進行修改
1.1. 使用Android Studio生成含有單dex文件的apk(只使用V1簽名機制進行簽名),并查看apk的簽名信息
1.2. 模擬真實環境(不知道apk源碼的情況下),使用AndroidKiller對apk文件代碼(dex)進行修改,將文本修改成"盜版軟件",并且進行重打包
1.3. 將重打包生成的apk文件提取出classes.dex文件,將提取出的dex文件和原apk文件(樣本)進行合并(使用工具進行合并)
1.4. 將合并完成的apk文件安裝至模擬器,可以發現apk的內容已經修改,成功復現在原dex的基礎之上進行修改情況下的Janus漏洞
2、生成一個新dex替換原dex
2.1. 使用Android Studio生成一個含有Application、Activity、ContentProvider的apk文件
2.2. 模擬真實環境(不知道apk源碼的情況下),將apk進行反編譯查看清單文件中的所有組件
2.3.創建一個新的Android項目,根據清單文件創建出所有已存在的組件(主Activity、ContentProvider),若是有Application也要進行創建
2.4. 把新Android項目生成的apk文件提取出classes.dex文件,將提取出的dex文件和原apk文件(樣本)進行合并(使用工具進行合并)
2.5.將合并完成的apk文件安裝至模擬器,可以發現apk的內容已經修改,成功復現Janus漏洞
遇到的問題
1、在第二種情況(生成一個新dex替換原dex)中,若未實現Application,則會發生崩潰情況
2、在第二種情況(生成一個新dex替換原dex)中,若未實現ContentProvider,則會發生崩潰情況
3、合并apk之后無法進行安裝的問題。出現這種問題可能是當前手機系統已經修復了此漏洞,換模擬器或者其它手機即可(系統版本在5.0-8.0)
4、單dex和多dex的情況不同,單dex的情況下可以在原apk的基礎上直接進行修改,而不對功能的使用造成影響,而多dex的情況下處理比較麻煩,分dex表示dex的方法數超過了65535,若想保留原軟件的功能,而使用一個dex來替換多dex文件,這是不太現實的,那么對于多dex并想保留原功能可以考慮使用動態加載和Classloader替換的方式來實現
三、修復建議
(1)建議開發者使用V2簽名機制對應用進行簽名
四、樣本
點擊下載(0積分)
asjhan for Android reverse
總結
以上是生活随笔為你收集整理的Android安全检测 - Janus签名漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教室计算机文件共享方法,教程方法;34、
- 下一篇: android 精品软件,《分享精彩应用