該部分旨在建立了一個客觀、準確評估應用安全性的模型,主要用于分析Android
APP掃描后的數據,根據風險的數量、分布和威脅程度,計算應用的安全分值。該模型認為,應用風險是造成應用安全問題的最主要的原因,將風險分為高危、中危、低危、警告、提醒和安全六個等級,每個等級賦予一定的分值,計算所有存在風險的分值之和,利用給定的指數函數模型,計算出該應用的安全分值,完成安全性評估。
### 1 風險等級的劃分與數學表達
我們將風險分為六個等級,每個等級對應的分值見下表:
| 風險等級 | 分值 | 符號| 編程所用的代號|
| :----------: | :------: | :------------------:|:------------------:|
|高危|8|` $ R_{3} $ `|3|
|中危|4|` $ R_{2} $ `|2|
| 低危|2|` $ R_{1} $ `|1|
| 提醒|1| ` $ R_{0} $ `|0|
| 安全|0| ` $ R_{-1} $ ` |-1 |
| 展示|0| ` $ R_{-2} $ ` |-2|
:-: 表1.風險等級分值表
**提醒**一般為羅列需要注意的事項,**低危、中危和高危**說明存在由低至高的風險威脅,**安全**說明該風險項的威脅不存在,**展示**僅羅列給用戶看的有意義的信息。
顯然,分值分布符合2的指數冪的關系,即
```[math]
R_{3} = 8 = 2^{3}
```
```[math]
R_{2} = 4 = 2^{2}
```
```[math]
R_{1} = 2 = 2^{1}
```
```[math]
R_{0} = 1 = 2^{0}
```
特別地,令`$ R_{-1} = R_{-2} = 0 $`
在文檔的后面,我會講述為什么要將等級的分值進行這樣的設定,此處暫且不解釋。
該模型將所有的檢測項目分為12類(表2),其中前3類是應用的基本信息共12項,不計入風險的評估環節,從第4類到第12類總共有70項,每項的風險等級在評估前可能有多個取值,但是在評估后都是唯一的,例如第4檢查項,根據應用風險的暴露程度,可能是高危,也可能是提醒,但是在評估后,可以確認為是高危和提醒的其中一個,這是唯一的。
12類風險掃描項涵蓋了大部分安卓應用存在的風險點,更詳細的信息可參見文檔 **《掃描項目詳述》**,里邊有關于每一個檢測項的詳細說明。
* **第1類** 文件信息
* **第2類** 權限信息檢測
* **第3類** 四大組件
* **第4類** Menifest文件檢測
* **第5類** 組件安全檢測
* **第6類** Webview組件安全檢測
* **第7類** Sqlite安全檢測
* **第8類** 網絡通信安全檢測
* **第9類** 弱加密風險檢測
* **第10類** 數據安全檢測
* **第11類** 敏感函數調用檢測
* **第12類** 系統漏洞檢測
定義`$ P_{i} $`為**評估前**第i個檢測項的風險等級的**取值集合**
| 項目序號 | 唯一標識 | 風險描述 | 風險等級 | 檢測方式 | 風險集合Pi |
|----|-------|-----------------------------------------------------------|:------:|:------:|:---------:|
| 1 | 01001 | 文件名 | 無 | `靜態` | ` $ \varnothing $ ` |
| 2 | 01002 | 文件大小 | 無 | `靜態` | ` $ \varnothing $ ` |
| 3 | 01003 | MD5 | 無 | `靜態` | ` $ \varnothing $ ` |
| 4 | 01004 | 包名 | 無 | `靜態` | ` $ \varnothing $ ` |
| 5 | 01005 | Main Activity | 無 | `靜態` | ` $ \varnothing $ ` |
| 6 | 01006 | Min SDK | 無 | `靜態` | ` $ \varnothing $ ` |
| 7 | 01007 | Target SDK | 無 | `靜態` | ` $ \varnothing $ ` |
| 8 | 02001 | 權限信息檢測 | 無 | `靜態` | ` $ \varnothing $ ` |
| 9 | 03001 | Activity組件 | 無 | `靜態` | ` $ \varnothing $ ` |
| 10 | 03002 | Service組件 | 無 | `靜態` | ` $ \varnothing $ ` |
| 11 | 03003 | BroadcastReceiver組件 | 無 | `靜態` | ` $ \varnothing $ ` |
| 12 | 03004 | ContentProvider組件 | 無 | `靜態` | ` $ \varnothing $ ` |
| 13 | 04001 | AndroidManifest文件中PermissionGroup檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 14 | 04002 | AndroidManifest文件中系統權限使用檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 15 | 04003 | AndroidManifest文件中ProtectionLevel權限檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 16 | 04004 | AndroidManifest sharedUserId檢測 | `提醒`,`高危` | `靜態` |` $ \{R_{0},R_3\} $ ` |
| 17 | 04005 | allowBackup標志檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 18 | 04006 | Debuggable配置檢測 | `高危` | `靜態` |` $ \{R_{3}\} $ ` |
| 19 | 04007 | 非必要權限檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 20 | 04008 | app最低版本檢測 | `展示` | `靜態` |` $ \{R_{-2}\} $ ` |
| 21 | 05001 | Activity組件導出檢測 | `中危` | `靜態` |` $ R_{3} $ ` |
| 22 | 05002 | Service組件導出檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 23 | 05003 | Receiver組件導出檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 24 | 05004 | Provider組件導出檢測 | `高危` | `靜態` |` $ \{R_{3}\} $ ` |
| 25 | 05005 | Provider: grant-uri-permission屬性檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 26 | 05006 | Intent-Based攻擊檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 27 | 05007 | Intent Scheme URL漏洞攻擊檢測 | `高危` | `靜態` |` $ \{R_{3}\} $ ` |
| 28 | 05008 | 應用本地拒絕服務器漏洞檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 29 | 05009 | manifest中定義組件未實現檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 30 | 05010 | Debug或Test敏感測試組件泄露檢測 | `中危`,`低危` | `靜態` |` $ \{R_{2},R_1\} $ ` |
| 31 | 05011 | Intent不安全反射風險檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 32 | 06001 | Webview遠程執行漏洞檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 33 | 06002 | WebView潛在XSS攻擊檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 34 | 06003 | WebView本地文件訪問漏洞檢測 | `高危` | `靜態` |` $ \{R_{3}\} $ ` |
| 35 | 06004 | WebView密碼明文存儲漏洞檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 36 | 06005 | 主機名弱校驗檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 37 | 06006 | 證書弱校驗檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ `|
| 38 | 06007 | 中間人攻擊漏洞檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 39 | 06008 | WebView不校驗證書漏洞檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 40 | 06009 | WebView組件系統隱藏接口未移除漏洞 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 41 | 07001 | SQLite數據庫加密(SQLCipher)檢測 | `展示` | `靜態` |` $ \{R_{-2}\} $ ` |
| 42 | 07002 | SQLite數據庫加密拓展(SQLite Encryption Extension,SEE)檢測 | `展示` | `靜態` |` $ \{R_{-2}\} $ ` |
| 43 | 07003 | SQLite數據庫的對稱密鑰檢測 - 未實現 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 44 | 07004 | SQLite Database Transaction Deprecated(SQL注入)檢測 - 未實現 | `所有` | `動態` |` $ \{R_{3},R_{2},R_{1},R_{0}\} $ ` |
| 45 | 07005 | Databases任意讀寫漏洞檢測 - 廢棄 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 46 | 08001 | SSL不安全組件檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 47 | 08002 | SSL連接檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 48 | 08003 | HttpHost檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 49 | 08004 | HttpURLConnection漏洞檢測 - 廢棄 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 50 | 08005 | 網絡端口開放威脅檢測 | `低危` | `混合` |` $ \{R_{1}\} $ ` |
| 51 | 09001 | 弱加密算法風險檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 52 | 09002 | 不安全的密鑰長度風險檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 53 | 09003 | ECB弱加密模式風險檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 54 | 09004 | IVParameterSpec不安全初始化向量風險檢測 | `低危` | `混合` |` $ \{R_{1}\} $ ` |
| 55 | 09005 | RSA中不使用Padding風險檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 56 | 09006 | 檢測keystore是否使用密碼保護 - 未實現 | `高危` | `動態` |` $ \{R_{3}\} $ ` |
| 57 | 10001 | 敏感信息檢測 | `展示` | `靜態` |` $ \{R_{-2}\} $ ` |
| 58 | 10002 | 剪貼板敏感信息泄露風險檢測 | `展示` | `靜態` |` $ \{R_{-2}\} $ ` |
| 59 | 10003 | Intent敏感數據泄露風險檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 60 | 10004 | PendingIntent誤用風險 | `中危` | `靜態` |` $ \{ R_{2} \} $ ` |
| 61 | 10005 | 密鑰硬編碼風險檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 62 | 10006 | 數據或程序加載檢查 - 未實現 | `提醒` | `動態` |` $ \{R_{0}\} $ ` |
| 63 | 10007 | BASE64安全檢測 | `展示` | `靜態` |` $ \{R_{-2}\} $ ` |
| 64 | 10008 | 文件全局讀寫漏洞檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 65 | 10009 | 日志泄露風險檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 66 | 10010 | 外部加載Dex檢測 - 去掉 | `高危` | `靜態` |` $ \{R_{3}\} $ ` |
| 67 | 10011 | 外部存儲路徑檢測 - 未實現 | `提醒` | `動態` |` $ \{R_{0}\} $ ` |
| 68 | 10012 | 明文數字證書風險 - 未實現 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 69 | 11001 | 安全相關的函數檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 70 | 11002 | 安全相關的類檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 71 | 11003 | 運行命令檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 72 | 11004 | Native Library加載檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 73 | 11005 | 外部動態加載DEX檢測 | `高危` | `混合` |` $ \{R_{3}\} $ ` |
| 74 | 11006 | root代碼檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 75 | 11007 | 獲取IMEI和Device ID敏感信息代碼檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 76 | 11008 | 獲取Android ID敏感信息代碼檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 77 | 11009 | 發送SMS敏感代碼檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 78 | 11010 | 文件刪除代碼檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 79 | 11011 | signature代碼檢測 | `提醒` | `靜態` |` $ \{R_{0}\} $ ` |
| 80 | 12001 | fragment注入漏洞檢測 | `中危` | `靜態` |` $ \{R_{2}\} $ ` |
| 81 | 12002 | sqlite數據庫日志泄露漏洞檢測 | `低危` | `靜態` |` $ \{R_{1}\} $ ` |
| 82 | 12003 | 隨機數生成漏洞檢測 | `高危` | `靜態` |` $ \{R_{3}\} $ ` |
:-: 表2.風險評估環節表
現在考慮評估完成后的情況,每個檢測項都會有唯一標定的風險等級,即從每一項的風險等級集合與安全集合的并集` $ P_i\cup\{R_{-1}\} $ `中選取一個合適的值,作為該檢測項的評估結果。
定義` $ r_{i} $`為**評估后**第i個檢測項的風險等級,即
```[math]
r_i \in P_i \cup\{R_{-1}\}
```
特別地, ` $ P_i = \varnothing $ `則令` $ r_i = 0 $ `
所以,所有檢測項的風險等級的分值總和為S,可以表示為
```[math]
S = \sum_{i=1}^{82}{r_i}
```
最后,定義安全系數*K*
```[math]
K(s) = {Floor(0.985}^{S} \times 100)
```
其中Floor是向下取整函數,則*K*就是我們所要的結果
為什么采用K(s)來表示威脅與安全系數的關系是接下來要說明的,我們來考慮函數K(s)的性質:
其原型是一個以0.985為底的指數衰減函數,我們記為取整前的函數為**K(s)\***,即
```[math]
K(s)^* = 0.985^S \times 100
```
**性質一** K(s)是單調遞減函數
**性質二** K(s)\*變化率隨S的增大而減小,表現為曲線由抖變緩
**性質三** K(s)\*的值域為(0,100],當s足夠大時,K(s)\*無限趨近于0,向下取整后為0
**性質四**
令s = 1, 則K(s) = 98
令s = 2, 則K(s) = 97
令s = 4, 則K(s) = 94
令s = 8, 則K(s) = 88
令s = 16, 則K(s) = 78

:-: 圖1 K(s)函數圖像
我們可以觀察到,K(s)符合現實中風險與安全系數的關系:
**性質一**
風險分值S越高,安全指數K越低,應用面臨的風險越大;風險分值S越低,安全指數K越高,應用越安全。
**性質二**
K前期變化率大,后期變化率小,說明在應用出現風險時,應用安全系數會快速下跌,此時往往一兩個高危漏洞就可以讓系統淪陷;可是當風險已經足夠多時,系統已不再安全,應用已經有夠多的漏洞可以利用時,再增加風險的分值,對安全系數的減小的影響會降低
**性質三**
風險評估采用常見的百分制。當風險分值為0,安全系數為100;當風險值不斷增大時,安全系數能夠取到0。安全系數位于閉區間[0,100]。
**性質四**
性質四的現實意義可以用下表來表示:
|安全系數分值|風險分值|風險組合的集合表示|風險組合的文字表述|
|:--------:|:--------:|:--------:|:--------:|
|98|1|` $ \{R_{0}\times2 \} $ ` |1個提醒|
|97|2|` $ \{R_{1}\} $ ` |1個低危|
|94|4|` $ \{R_{2} \} $ ` |1個中危|
|88|8|` $ \{R_{3} \} $ ` |1個高危|
|78|16|` $ \{R_{3} \} $ ` |2個高危|
:-: 表3.風險組合與安全系數的關系
根據性質四,我們可以制定應用安全的等級的標準
| 應用安全等級 | 安全系數分值區間 |編程所用的代碼 |
|:--------------:|:------------------:|:------------------:|
| 安全 | 90~100 |-1|
| 合格 | 70~89 |0|
| 警告 | 50~69 |1|
| 危險 | < 50 |2|
:-: 表4.應用安全的等級標準說明
最后,我需要說明風險等級分值標定的原因,安全和展示等級可以認為對風險的貢獻為0。根據經驗,我們可以直觀地理解,隨著風險等級的提升,其危害程度不應該是線性遞增,而應該是指數遞增,例如高危風險的危害程度應該遠遠大于低危風險。所以在標定風險的分值時,我采用了2的指數冪的方式進行標定分值,能更好地擬合現實中**危害程度**隨**風險等級**的變化。
| 風險等級 | 分值 | 符號| 指數關系|
| :----------: | :------: | :------------------:|:------------------:|
|高危|8|` $ R_{3} $ `|` $ 2^3 $ `|
|中危|4|` $ R_{2} $ `|` $ 2^2 $ `|
| 低危|2|` $ R_{1} $ `|` $ 2^1 $ `|
| 提醒|1| ` $ R_{0} $ `|` $ 2^0 $ `|
| 安全|0| ` $ R_{-1} $ ` | 特殊情況 |
| 展示|0| ` $ R_{-2} $ ` |特殊情況|
:-: 表5.風險等級與指數的關系