MASTG-TEST-0284: WebView 中 SSL 错误处理不正确
概述¶
此测试评估 Android 应用是否具有通过重写 onReceivedSslError(...)
方法但不进行适当验证来忽略 SSL/TLS 证书错误的 WebView。
当 WebView
在加载页面时遇到 SSL 证书错误时,会触发 onReceivedSslError(...)
方法。默认情况下,WebView
会取消请求,以保护用户免受不安全连接的影响。重写此方法并调用 SslErrorHandler.proceed()
而不进行适当验证将禁用这些保护。
这有效地绕过了 WebView
中的 SSL 证书检查,使应用容易受到使用无效、过期或自签名证书的 MITM 攻击。
步骤¶
- 对应用进行逆向工程( 反编译 Java 代码)。
- 检查源代码并运行静态分析( Android 静态分析)工具,并查找所有
onReceivedSslError(...)
的用法。
观察¶
输出包含 onReceivedSslError(...)
的位置列表,其中包含在没有正确处理 SSL 错误的异常处理的情况下使用 proceed()
的情况。
评估¶
如果 onReceivedSslError(...)
被重写,并且证书错误在没有适当验证或用户参与的情况下被忽略,则测试失败。
这包括以下情况:
- 无条件接受 SSL 错误: 调用
proceed()
而不检查错误的性质。 - 仅依赖于主要错误代码: 使用
getPrimaryError()
进行决策,例如,如果主要错误不是SSL_UNTRUSTED
,则继续,这可能会忽略链中的其他错误。 - 静默抑制异常: 在
onReceivedSslError(...)
中捕获异常而不调用cancel()
,这将允许连接静默继续。
根据 官方 Android 指导,应用永远不应调用 proceed()
来响应 SSL 错误。正确的行为是取消请求,以保护用户免受潜在的不安全连接的侵害。也不鼓励用户提示,因为用户无法可靠地评估 SSL 问题。
当使用自动化工具进行测试时,您需要检查逆向工程代码中所有报告的位置,以确认不正确的实现( 审查反编译的 Java 代码)。