這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進(jìn)行Janus安卓簽名漏洞預(yù)警分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、桂陽ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的桂陽網(wǎng)站制作公司
0x00背景介紹
2017年7月31日 GuardSquare向Google報告了一個簽名漏洞并于當(dāng)天收到確認(rèn)。Google本月修復(fù)了該漏洞,編號CVE-2017-13156。
經(jīng)過360CERT分析確認(rèn),該問題確實存在,影響較為嚴(yán)重。攻擊者可以繞過簽名驗證機(jī)制構(gòu)造惡意程序更新原有的程序。
0x01 事件概述
該漏洞產(chǎn)生的根源在于將DEX文件和APK文件拼接之后校驗簽名時只校驗了文件的APK部分,而虛擬機(jī)執(zhí)行時卻執(zhí)行了文件的DEX部分,導(dǎo)致了漏洞的發(fā)生。由于這種同時為APK文件和DEX文件的二元性,聯(lián)想到羅馬的二元之神Janus,將該漏洞命名為Janus漏洞。
0x02 事件影響
影響Android5.0-8.0的各個版本和使用安卓V1簽名的APK文件。
0x03 事件詳情
1. 技術(shù)細(xì)節(jié)
Android支持兩種應(yīng)用簽名方案,一種是基于JAR簽名的方案(v1方案),另一種是Android Nougat(7.0)中引入的APK簽名方案v2(v2方案)。
v1簽名不保護(hù)APK的某些部分,例如ZIP元數(shù)據(jù)。APK驗證程序需要處理大量不可信(尚未經(jīng)過驗證)的數(shù)據(jù)結(jié)構(gòu),然后會舍棄不受簽名保護(hù)的數(shù)據(jù)。這會導(dǎo)致相當(dāng)大的受攻擊面。此外,APK 驗證程序必須解壓所有已壓縮的條目,而這需要花費(fèi)更多時間和內(nèi)存。為了解決這些問題,Android7.0中引入了APK簽名方案v2。在驗證期間,v2方案會將APK文件視為 Blob,并對整個文件進(jìn)行簽名檢查。對APK進(jìn)行的任何修改(包括對ZIP元數(shù)據(jù)進(jìn)行的修改)都會使 APK 簽名作廢。這種形式的APK驗證不僅速度要快得多,而且能夠發(fā)現(xiàn)更多種未經(jīng)授權(quán)的修改。
如果開發(fā)者只勾選V1簽名不會有什么影響,但是在7.0上不會使用更安全的V2簽名驗證方式;只勾選V2簽名7.0以下無法正常安裝,7.0以上則使用了V2的方式驗證;同時勾選V1和V2則所有機(jī)型都沒問題。此次出現(xiàn)問題的是V1簽名方案。簡單地說,把修改過的dex文件附加到V1簽名的apk文件之前構(gòu)造一個新的文件,V1方案只校驗了新文件的apk部分,而執(zhí)行時虛擬機(jī)根據(jù)magic header只執(zhí)行了新文件的dex部分。
我們來看一下已經(jīng)公布的POC (https://github.com/V-E-O/PoC/tree/master/CVE-2017-13156)的原理。janus.py接受dex文件和apk文件作為輸入,組合起來輸出。
讀取dex文件:
讀取apk文件:
Apk其實就是一個zip。簡單地說zip文件格式由文件數(shù)據(jù)區(qū)、中央目錄結(jié)構(gòu)和中央目錄結(jié)束節(jié)組成。
其中中央目錄結(jié)束節(jié)有一個字段保存了中央目錄結(jié)構(gòu)的偏移。代碼中搜索中央目錄結(jié)束節(jié)的固定結(jié)束標(biāo)記x06054b50定位到中央目錄結(jié)構(gòu)的偏移,將其加上dex文件的大小,因為我們要把dex文件插到apk前面。
接下來依次更新中央目錄結(jié)構(gòu)數(shù)組中的deHeaderOffset字段也就是本地文件頭的相對位移字段。通過deHeaderOffset字段可以直接獲取到對應(yīng)文件的文件數(shù)據(jù)區(qū)結(jié)構(gòu)的文件偏移,就可以直接獲取到對應(yīng)文件的壓縮數(shù)據(jù)了。同樣也是因為dex文件插在前面了所以直接加上dex文件的大小。
最后更新dex部分的file_size字段為整個dex+apk的大小,使用alder32算法和SHA1算法更新checksum和signature字段。
下面做一個非常簡單的測試。
在APK文件中寫一個彈出Hello的toast,同時采用V1簽名方案簽名:
安裝到手機(jī)上:
將編譯好的apk解壓得到dex文件,baksmali.jar反編譯dex文件得到smali代碼,將hello隨便改成另外一個字符串:
用smali.jar回編譯成dex文件,使用提供的腳本把dex文件和原來的apk打包生成out.apk:
安裝到手機(jī)上成功通過了簽名校驗并且執(zhí)行了修改的dex中的代碼:
在我android8.0沒有打補(bǔ)丁的手機(jī)上如果采用了V2簽名方案不受該漏洞影響,更新不了原來正常的程序:
補(bǔ)丁非常簡單,強(qiáng)制校驗了zip的frSignature:
0x04 修復(fù)建議
1、開發(fā)者在開發(fā)應(yīng)用程序時勾選V2簽名方案
2、各廠商應(yīng)及時發(fā)布補(bǔ)丁,確保用戶盡快更新系統(tǒng)
3、用戶應(yīng)在正規(guī)的應(yīng)用市場下載程序
上述就是小編為大家分享的如何進(jìn)行Janus安卓簽名漏洞預(yù)警分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。