https://cloud.tencent.com/developer/article/1517561
https://mp.weixin.qq.com/s/M1JdPGei-jaIX-LEw5K5NA
1. 使用ALLOW_ALL_HOSTNAME_VERIFIER忽略SSL证书域名验证
检测项概述
App在使用HTTPS相关函数时,如果调用setHostnameVerifier设置了ALLOW_ALL_HOSTNAME_VERIFIER或者AllowAllHostnameVerifier,SSLSocketFactory会忽略证书中的域名和真实域名是否匹配,导致在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。
测试详情
- 反编译apk文件,查看伪源代码,搜索ALLOW_ALL_HOSTNAME_VERIFIER和AllowAllHostnameVerifier关键词,定位到对应的代码段,确认是否存在问题,如下图位不存在问题图片

如下图为存在问题的案例:

tips:有些APP能根据关键词定位到漏洞代码,但是需要关注这代码是不是第三方组件的还是自己实现的,如下代码来自 第三方库 com.loopj.android.http(即著名的 Android Async HTTP 库,也称 LoopJ,这是一个较老的 Android 网络请求库(现已基本被 Retrofit + OkHttp 取代)。


需要自己去验证App 直接或间接调用了 getFixedSocketFactory() 或 getNewHttpClient(null),就会启用这个“信任所有证书 + 忽略主机名”的危险配置;没有直接或间接调用—低风险,直接调用了—高风险
2.自定义HostnameVerfier忽略SSL证书域名验证
检测项概述
App在使用HTTPS相关函数时,在setHostnameVerifier方法中使用自定义的HostnameVerifier,同时没有在该类的实现代码中进行域名校验,导致在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。
测试详情
1.在反编译得到的伪代码中搜索关键词setHostnameVerifier,发现在第三方代码中存在不合理的实现,但是并未被调用:


3. 自定义X509TrustManager未正确校验SSL证书链
检测项概述
App在使用HTTPS相关函数时,没有正确编写X509TrustManager类的相关函数,导致TrustManager无法校验证书的可靠来源。后果是在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。
测试详情
1.对APP进行反编译,搜索checkClientTrusted/checkServerTrusted关键词,分析相关代码,发现在com.zcy.gov.log.network.LogConfigClient类中实现自定义X509TrustManager时未能正确实现checkServerTrusted和checkClientTrusted方法:

不会分析直接让AI帮忙分析


测试结果
中风险。
修复建议
尽量不要使用自定义的X509TrustManager类进行证书校验;严格按照官方文档进行SSL Pinning的编写。
4.使用不安全的HTTP协议进行通信
检测项概述
应用数据交互采用明文传输数据、没有加密、完整校验等机制,在不可信的网络环境下,网络请求依然可以被进行中间人攻击,导致传输过程中的敏感信息能够被第三方程序监听,截获,篡改,重放等。
测试详情
1.使用抓包工具,抓取数据包查看发现使用了安全的HTTPS协议进行通信

测试结果
安全。
5. WebClient忽略SSL证书校验异常
检测项概述
App使用了WebViewClient进行网络数据交互,但没有正确处理onReceivedSslError函数,在该函数中忽略了证书错误。后果是在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。 Android系统内置了一些可信机构办法的证书,可用于作HTTPs证书校验。实际上,使用Webview组件进行HTTPs通信,其证书验证环节也是系统默认会去做的。若发现证书不合法,Webview将显示一个空白页面,其错误在onReceivedSslError()这个方法里进行处理。使用Webview进行HTTPs通信应当遵循安全规范:onReceivedSslError()方法里不能简单地用proceed()方法进行处理,建议给用户一定的提示(如“SSL证书错误,是否继续连接”等)
测试详情
- 查看反编译后的伪源代码,搜索onReceivedSslError 关键词,查看其中是否简单的使用了proceed()方法进行处理,如果是的话即存在问题,如下图:

测试结果
中风险。
修复建议
一般来说,使用Webview连接带有可信机构颁发证书的HTTPs站点,onReceivedSslError()方法里无需作任何处理(系统默认是拒绝连接的)。如果要重写WebViewClient类的onReceivedSslError函数,请不要使用paramSslErrorHandler.proceed();忽略证书校验异常
安全写法
|
|
6. 证书明文存储
检测项概述
应用中的证书文件被用来验证服务器的合法性,以及在与服务器通信的过程中对传输数据进行加密、解密,保证数据传输的保密性、完整性。证书文件明文存储可能导致如下风险:
- 攻击者可以篡改明文存储的公钥证书,进行中间人攻击,解密通过HTTPS协议传输的数据,窃取用户的账号、密码等敏感信息。
2. 攻击者可以利用泄露的明文证书,批量向服务器发送数据请求,进行注册、刷单等操作,导致服务器相应异常或者损害开发者的利益等。
测试详情
|
|

或者使用everything
|
|
不输出文件信息则安全

特殊情况:有些开发会将证书文件命名为png/jpg这种图片文件
1.基于文件内容查找
|
|

|
|

2.frida 动态hook证书文件

7. 敏感数据明文传输
检测项概述
应用数据交互采用明文传输数据、没有加密、完整校验等机制,在不可信的网络环境下,网络请求依然可以被进行中间人攻击,导致传输过程中的敏感信息能够被第三方程序监听,截获,篡改,重放等。
测试详情
1.抓取登录、请求账户信息的数据包,查看数据包,发现进行base64加密传输

测试结果
安全