你可能還不知道的apk簽名繞過方法

這篇文章上次修改於 564 天前,可能其部分內容已經發生變化,如有疑問可詢問作者。

近期更新Android應用可要注意了,不要隨意點個鏈接就升級,你的正宗應用可能升級成山寨應用哦。 Google在12月發布的安全公告中提到的「Janus」漏洞,可使攻擊者在不改變原應用簽名的情況上,注入惡意程式碼。

Android應用的包名和簽名是唯一確定一個應用的基礎。 偽造包名可以說沒有任何成本,但是簽名確是唯一的;正版應用如果被修改,其簽名也隨之被破壞,需要重新簽名,因此山寨應用不能再安裝在有正版應用的Android手機上;各種應用商店和管家類應用,往往通過包名和簽名來判斷一個應用是否山寨。

此次Google公布的「Janus」漏洞,可使攻擊者將Dex附加到原有的apk之上,繞過簽名認證;在執行時優先執行附加的dex文件。

該漏洞直接影響Android 5.0–8.0上所有基於 signature scheme V1簽名的apk。

先通過一個簡單的Demo來驗證下如何利用該漏洞 1.準備 (1)Android5.0到8.0系統版本的手機 最好是android 7.0以下,這樣就不用考慮當前的apk簽名方案是v1,還是v2混合的。 (2)apk文件 最好是自己的應用,這樣測試避免通過反編譯重打包的方式來修改。下面也將以自己應用方式演示 2.具體使用過程 (1)生成apk文件並安裝 自己的應用,在Android7.0以下手機測試時,直接生成apk即可,不需額外操作。7.0以上手機時,通過Android studio生成,關閉v2簽名。我的是升級到了3.0.1後可選的,如下圖所示:

(注意,當gradle plugin在2.2及以上時,自動採用了v1+v2的混合方式。可以通過配置v2SigningEnabled關閉

 signingConfigs      {      debug      {      v2SigningEnabled false      }      }

或者升級到新版本,支援在Build->Generate Signed APK中選擇配置。 在apk文件的META-INF文件夾.sf文件中開頭有X-Android-APK-Signed: 2,表明是使用了v1+v2簽名,沒有則是v1簽名。連.sf文件都沒有那是僅採用了v2簽名)

將生成的apk文件安裝到手機上。

(2)修改apk文件 自己的應用,直接修改程式碼,從新生成的apk中解壓得到dex文件 通過參考4的鏈接下載Python腳本,將dex文件附加到apk文件之上得到新apk文件out.apk文件

janus.py class.dex demo.apk out.apk

將out.apk文件直接安裝到手機上即可,不需要重新簽名,發現可以升級覆蓋安裝。 解壓此apk,可以看到解壓出的文件中沒有剛才添加的dex文件(部分壓縮軟體可能提示無法解壓)

原理簡單分析: Android 7.0之前的apk簽名為v1方案(Jar Signature),apk也是一個zip文件,其中包含的目錄、文件及應用開發者的簽名資訊都存儲在META-INF文件夾中。 (1)manifest.mf清單文件,列出對jar中除meta-inf文件夾外所有文件的sha1後進行base64編碼 例如 Name: res/layout/xxx.xml SHA1-Digest: NCdFnJxgi644KYg8m8OvtnEdHWw=

cat -e 顯示文件的回車換行符(linxu n,windows rn , mac r),查看.mf文件中的內容 可以看到每行的後面是(rn),最後相當於有兩個(rn)

openssl dgst -sha1 -binary res/layout/xxx.xml | openssl base64可以計算一個文件的hash值,寫入.mf文件中 (2).sf 開頭的摘要值是對.mf文件的摘要,後續每行是對.mf文件對一個文件的描述的三行做一個摘要產生,方法同上

(3).rsa 包含應用開發者的證書資訊,以及對.sf文件摘要的簽名。具體可以看看參考文章

apk的驗證過程是依賴於zip文件格式,同時需要解壓文件後依次校驗,從.rsa的證書,到.sf文件的驗證,再依次校驗各個文件。

從上面幾個文件間接可以理解apk的簽名驗證機制,它是如何保護文件不被篡改的。meta-inf中的文件添加是不會破壞簽名資訊。

該漏洞可以繞過簽名校驗的兩個條件: (1)應用apk(v1簽名)安裝時的簽名校驗,是解壓apk,執行文件和目錄的校驗;未在zip目錄中的數據不做處理 (2)應用執行時,虛擬機可直接執行Dex文件和apk文件

看Python腳本,非常簡單,就是將dex文件添加到apk文件的頭部,然後依次修改zip目錄中各個資訊塊的偏移地址,加上了dex文件的大小。再修改dex文件的大小和校驗值。

修復建議: 注意使用v1和v2混合簽名。單純的v2的簽名在Android7.0以下是不支援的。 (如果android7.0以下的系統沒有升級安全修補程式,那麼即使採用v1+v2的混合簽名也是沒有意義的。)

apk簽名v2方案是Android 7.0時推出的,和v1方案的區別主要是不再需要解壓apk,而是直接校驗apk文件,除了簽名資訊塊外,所有對apk文件的修改都會被檢測出來,此時該漏洞添加dex文件的方式不再有效。

詳細的v2簽名方案可以查看參考鏈接3

轉載請註明出處:http://blog.csdn.net/w7849516230,歡迎關注微信公眾號「編程陽光」