3.8网络通信安全

文章目录
  1. 1. 1 SSL连接检测 # 08001
  2. 2. 2 SSL不安全组件检测 # 08002
  3. 3. 3 HttpHost检测 # 08003
  4. 4. 4 HttpURLConnection漏洞检测 # 08004
  5. 5. 5 网络端口开放威胁检测 # 08005

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。

1
2
3
4
5
6
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_UNIXPF_INETPF_NETLINK等不同domain的socket来进行本地IPC或者远程网络通信,这些暴露的socket代表了潜在的本地或远程攻击面,历史上也出现过不少利用socket进行拒绝服务、root提权或者远程命令执行的案例。特别是PF_INET类型的网络socket,可以通过网络与Android应用通信,其原本用于linux环境下开放网络服务,由于缺乏对网络调用者身份或者本地调用者id、permission等细粒度的安全检查机制,在实现不当的情况下,可以突破Android的沙箱限制,以被攻击应用的权限执行命令,通常出现比较严重的漏洞。

风险等级:低危

建议:

直接传递命令字或者间接处理有敏感信息或操作时,避免使用socket实现,使用身份认证、鉴权、参数校验等安全要素。