[TOC]
## 1 SSL連接檢測 # 08001
URL沒有使用SSL安全協議。
風險等級:`提示`
問題示例:
所有不使用https的url字符串常量
建議:
* 如果使用https協議加載url,應用進行證書校驗防止訪問的頁面被篡改掛馬
* 如果使用http協議加載url,應進行白名單過濾、完整性校驗等防止訪問的頁面被篡改
* 如果加載本地html,應將html文件內置在apk中,以及進行對html頁面完整性的校驗
## 2 SSL不安全組件檢測 # 08002
SSLCertificateSocketFactory#getInsecure方法無法執行SSL驗證檢查,使得網絡通信遭受中間人攻擊。
風險等級:`提示`
問題示例:
檢測是否使用了SSLCertificateSocketFactory#getInsecure方法
建議:
移除SSLCertificateSocketFactory#getInsecure方法。
## 3 HttpHost檢測 # 08003
`HttpHost target = new HttpHost(uri.getHost(), uri.getPort(), HttpHost.DEFAULT_SCHEME_NAME);`
HttpHost.DEFAULT_SCHEME_NAME默認是http,不安全。
問題示例:
檢測HttpHost使用的參數是否是`http`
建議:
改成使用`https`
## 4 HttpURLConnection漏洞檢測 # 08004
在`Android 2.2`版本之前,HttpURLConnection一直存在著一些令人厭煩的bug。比如說對一個可讀的InputStream調用close()方法時,就有可能會導致連接池失效了。
風險等級:`低危`
問題示例:
判斷使用HttpURLConnection是否進行了版本判斷
建議:
判斷Android版本,并設置http.keepAlive為false。
```
private void disableConnectionReuseIfNecessary() {
// 解決Android Froyo(Androdi 2.2)版本之前,在HTTP連接重用時會出現的BUG
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}
```
## 5 網絡端口開放威脅檢測 # 08005
Android應用通常使用`PF_UNIX`、`PF_INET`、`PF_NETLINK`等不同domain的socket來進行本地IPC或者遠程網絡通信,這些暴露的socket代表了潛在的本地或遠程攻擊面,歷史上也出現過不少利用socket進行拒絕服務、root提權或者遠程命令執行的案例。特別是`PF_INE`T類型的網絡socket,可以通過網絡與Android應用通信,其原本用于linux環境下開放網絡服務,由于缺乏對網絡調用者身份或者本地調用者id、permission等細粒度的安全檢查機制,在實現不當的情況下,可以突破Android的沙箱限制,以被攻擊應用的權限執行命令,通常出現比較嚴重的漏洞。
風險等級:`低危`
建議:
直接傳遞命令字或者間接處理有敏感信息或操作時,避免使用socket實現,使用身份認證、鑒權、參數校驗等安全要素。