******** VU中的SSL漏洞#582497

时间:2014-11-21 11:52:33

标签: android ssl https

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

  ---------- 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=203使用SSL 通过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;
        }
    }

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

1 个答案:

答案 0 :(得分:3)

  

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

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

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

详细说明:

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

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

        HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());

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

  • 您要访问的网站是super-secure.example并且您为其购买了证书
  • 攻击者拥有网站attacker.example并为其购买了证书

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

你的主要错误可能是你刚从某个地方复制了一些代码而没有理解它的作用。在任何情况下都是坏主意,尤其是与安全相关的任何事情。