【问题标题】:SSL Vulnerability in ******** VU#582497******** VU#582497 中的 SSL 漏洞
【发布时间】:2014-11-21 11:52:33
【问题描述】:

最近收到一封警告信,说我的应用程序安全受到威胁。

  ---------- Forwarded message ----------
    From: CERT Coordination Center <cert@cert.org>
    Subject: SSL Vulnerability in ********* VU#582497
    Cc: cert@cert.org

这封信包含以下信息: 我们最近一直在使用 CERT Tapioca 进行评估 http://www.cert.org/blogs/certcc/post.cfm?EntryID=203SSL的使用 通过 Android 应用程序。通过自动化测试,我们正在记录应用程序 导致通过 HTTPS 连接发送或接收流量 无效的 SSL 证书链。以下应用程序已经证明了这种不正确的行为。

可能会影响测试结果的一些注意事项:

1) 我们尚未调查通过 HTTPS 发送的内容 使用无效的 SSL 证书链。如果信息不 敏感,有人可能会争辩说该漏洞并不真正 有影响。然而,另一个论点是使用 未经验证的 SSL 是一个需要纠正的漏洞, 无论发送或接收的内容如何。

2) 可能是您的应用程序本身正确使用了 SSL,但它 包含一个第三方库,该库本身执行不正确的 SSL 验证。在这种情况下,这个第三方库需要 被更新。或者如果修复不可用,图书馆的作者 应该通知他们,让他们知道他们需要修复 图书馆。

3) 由于我们在动态测试中使用的 UI 自动化 执行时,应用程序或 应用程序使用的浏览器组件确实正确警告 用户在继续之前。如果 UI 自动化确实发生了点击 尽管证书无效,仍需要继续的按钮,然后 这可以被认为是误报。如果你相信这 如果是这种情况,请回复并让我们知道。

根据要求,我使用 robospice-spring-android。 ssl 用法:

 static {
        try {
            SSLContext sslc = SSLContext.getInstance("TLS");
            TrustManager[] trustManagerArray = {new NullX509TrustManager()};
            sslc.init(null, trustManagerArray, null);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
        } catch (Exception e) {
        }
    }

private static class NullX509TrustManager implements X509TrustManager {
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

    private static class NullHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }

任何人都可以就这个问题提出建议。我的错是什么?

【问题讨论】:

    标签: android ssl https


    【解决方案1】:

    任何人都可以就这个问题提出建议。我的错是什么?

    您有效地禁用了 TLS 中内置的任何类型的身份验证。因此,攻击者可以轻松发起中间人攻击或网络钓鱼攻击,即侦听和操纵加密流量或声称自己是真实服务器。

    这通常可以通过本地 LAN 或公共 WLAN 内的 ARP 或 DHCP 欺骗轻松完成,因此所描述的问题不是理论上的问题,而是实际问题。

    详细说明:

            TrustManager[] trustManagerArray = {new NullX509TrustManager()};
            sslc.init(null, trustManagerArray, null);
    

    您可以在此处禁用检查证书是否由受信任的 CA 签名。攻击者现在可以使用任何自签名证书或由不受信任的 CA 签名的证书而不是真实证书。

            HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
    

    您可以在此处禁用检查以根据您要访问的主机验证证书中的主机名。示例:

    • 您要访问的网站是超级安全的。示例并且您为其购买了证书
    • 攻击者拥有站点attacker.example 并为其购买了证书

    通常客户端会验证证书中的名称是否与客户端连接的名称匹配。但是您使用上面的代码明确禁用了此检查,因此攻击者证书被接受。

    您的主要错误可能是您只是从某个地方复制了一些代码而不了解它的作用。无论如何都是个坏主意,尤其是与安全相关的任何事情。

    【讨论】:

    • 您能帮我在代码级别解决这个问题吗?我自己试过了,研究了developer.android.com/training/articles/security-ssl.html,但是一直到梗还没弄明白。
    • 只需删除任何自定义信任管理器和主机名验证器并使用默认值。如果因为您只是使用了一些自行创建的证书而失败,那么请购买真正的证书或了解公钥固定。
    • 您能提供任何示例的链接吗?
    • 另外很抱歉,我忘了提到代码的部分,但已经编辑过了。你谈过了吗?
    • 同样,您需要做的就是删除任何类型的自定义信任管理器和主机名验证器,并使用普通的而非自定义的 HttpsURLConnection。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多