[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实现,使用身份认证、鉴权、参数校验等安全要素。