跳过内容

MASTG-TEST-0284: WebView 中 SSL 错误处理不正确

概述

此测试评估 Android 应用是否具有通过重写 onReceivedSslError(...) 方法但不进行适当验证来忽略 SSL/TLS 证书错误的 WebView。

WebView 在加载页面时遇到 SSL 证书错误时,会触发 onReceivedSslError(...) 方法。默认情况下,WebView 会取消请求,以保护用户免受不安全连接的影响。重写此方法并调用 SslErrorHandler.proceed() 而不进行适当验证将禁用这些保护。

这有效地绕过了 WebView 中的 SSL 证书检查,使应用容易受到使用无效、过期或自签名证书的 MITM 攻击

步骤

  1. 对应用进行逆向工程( 反编译 Java 代码)。
  2. 检查源代码并运行静态分析( Android 静态分析)工具,并查找所有 onReceivedSslError(...) 的用法。

观察

输出包含 onReceivedSslError(...) 的位置列表,其中包含在没有正确处理 SSL 错误的异常处理的情况下使用 proceed() 的情况。

评估

如果 onReceivedSslError(...) 被重写,并且证书错误在没有适当验证或用户参与的情况下被忽略,则测试失败。

这包括以下情况:

  • 无条件接受 SSL 错误: 调用 proceed() 而不检查错误的性质。
  • 仅依赖于主要错误代码: 使用 getPrimaryError() 进行决策,例如,如果主要错误不是 SSL_UNTRUSTED,则继续,这可能会忽略链中的其他错误。
  • 静默抑制异常:onReceivedSslError(...) 中捕获异常而不调用 cancel(),这将允许连接静默继续。

根据 官方 Android 指导,应用永远不应调用 proceed() 来响应 SSL 错误。正确的行为是取消请求,以保护用户免受潜在的不安全连接的侵害。也不鼓励用户提示,因为用户无法可靠地评估 SSL 问题。

当使用自动化工具进行测试时,您需要检查逆向工程代码中所有报告的位置,以确认不正确的实现( 审查反编译的 Java 代码)。