1. 程式人生 > >Android應用安全之外部動態載入DEX檔案風險

Android應用安全之外部動態載入DEX檔案風險

1. 外部動態載入DEX檔案風險描述

Android 系統提供了一種類載入器DexClassLoader,其可以在執行時動態載入並解釋執行包含在JAR或APK檔案內的DEX檔案。外部動態載入DEX檔案的安全風險源於:Anroid4.1之前的系統版本容許Android應用將動態載入的DEX檔案儲存在被其他應用任意讀寫的目錄中(如sdcard),因此不能夠保護應用免遭惡意程式碼的注入;所載入的DEX易被惡意應用所替換或者程式碼注入,如果沒有對外部所載入的DEX檔案做完整性校驗,應用將會被惡意程式碼注入,從而執行的是惡意程式碼;
如果應用沒有正確的動態載入DEX檔案,將會導致攻擊者的任意程式碼被自動執行,進一步實施欺詐、獲取賬號密碼或其他惡意行為等危害,如在烏雲漏洞平臺上的類似漏洞:QQ遊戲Android客戶端漏洞導致任意程式碼執行和密碼洩漏[1]。

2. 外部動態載入DEX檔案影響範圍

Android 系統

3.外部動態載入DEX檔案風險詳情

1) 風險位置: 

public DexClassLoader (String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)[2]

2) 風險觸發前提條件:

  1. 動態載入的DEX檔案儲存在被其他應用讀寫的目錄中,如sdcard;
  2. 沒有對外部所載入的DEX檔案做完整性校驗;

3) 風險原理:

動態載入的DEX檔案儲存在被其他應用任意讀寫的目錄中(如sdcard),如果沒有對外部所載入的DEX檔案做完整性校驗,應用將會被惡意程式碼注入,從而執行的是惡意程式碼;

4. 外部動態載入DEX檔案風險證明

利用DexClassLoader()執行時載入JAR/DEX檔案,該將惡意程式碼替換掉被載入的DEX檔案,或向該被載入的DEX檔案注入惡意程式碼。

被替換的所載入的JAR/DEX class的惡意程式碼如下:

動態載入JAR/DEX的呼叫程式碼:

Android 4.1之前系統版本,結果顯示成功動態載入JAR/DEX如下圖所示:

Android 4.1之後系統版本,結果丟擲異常“Optimized data directory /mnt/sdcard is not owned by the current user. Shared storage cannot protect your application from code injection attacks.”:

由於Android 4.1之後Android版本增加了對JAR/DEX存放目錄檔案的user_id 和動態載入JAR/DEX的程序的user_id是否一致的判斷,如果不一致將丟擲異常導致載入失敗,如下圖所示:

4.1之前版本的Android系統DexFile.java程式碼片段[3]:

4.1及其之後版本的Android系統DexFile.java程式碼片段[4]:

5. 外部動態載入DEX檔案安全建議

1. 將所需要動態載入的DEX/APK檔案放置在APK內部或應用私有目錄中[5]

為了所載入的DEX/APK不被惡意程式碼注入,阿里聚安全建議將要動態載入的DEX/APK放置在APK內部;

2. 使用加密網路協議進行下載載入的DEX/APK檔案並將其放置在應用私有目錄中[5]

阿里聚安全建議使用加密網路協議進行下載並將下載的DEX或APK放置在應用的私有目錄;

3. 對不可信的載入來源進行完整性校驗

如果應用必須將所載入的DEX或APK放置在能被其他應用人意讀寫的目錄中(如sdcard)或使用沒有加密的網路協議進行下載載入源,阿里聚安全建議對這些不可信的載入源進行完整性校驗和白名單處理,以保證不被惡意程式碼注入。

引用
[1] http://www.wooyun.org/bugs/wooyun-2010-09299
[2] http://developer.android.com/reference/dalvik/system/DexClassLoader.html
[3] https://android.googlesource.com/platform/libcore-snapshot/+/ics-mr1/dalvik/src/main/java/dalvik/system/DexFile.java
[4]https://android.googlesource.com/platform/libcore/+/45e02606b35996f61487f512ee91d0df83e75c9e/dalvik/src/main/java/dalvik/system/DexFile.java
[5] http://developer.android.com/training/articles/security-tips.html#DynamicCode

本文轉自:http://www.droidsec.cn/?p=174