TLS 1.3会话恢复在没有主密钥的情况下工作,允许MITM

2020-06-08 03:26:56

GNUTLS服务器无需访问由GNUTLS_SESSION_TICKET_KEY_GENERATE()生成的密钥,即可使用彼此签发的票证。这允许没有有效凭据的MITM服务器恢复与客户端的会话,该客户端首先与具有有效凭据的服务器建立初始连接。此问题适用于TLS 1.3,当使用TLS 1.2恢复如预期失败时。

因为票证可以在不知道主密钥的情况下用于恢复,所以我假设(但还没有经过测试)它也可以用于早期数据的被动解密。

我首先在Ubuntu版本3.6.13-2ubuntu1中注意到了这个问题,并使用52e78f1e的master版本重现了这个问题。

连接到服务器并存储恢复数据:openssl s_client-connect localhost:5556-Cafile AUTHORITY/x509.pem-VERIFY_RETURN_ERROR-SESS_OUT session.cache

在同一地址端口使用伪造凭据启动服务器(假设真正的攻击者仅在客户端要求恢复时才重定向连接):GNUTLS-SERV--x509keyfile=rogueca/mitm/Secret.key--x509certfile=rogueca/mitm/x509.pem。

使用存储的恢复数据重新连接:openssl s_client-connect localhost:5556-Cafile AUTHORITY/x509.pem-Verify_Return_Error-Sess_in session.cache。

我使用OpenSSL s_client重现了这个问题,因为GNUTLS-CLI缺乏跨调用存储恢复数据的方法,但是使用GNUTLS的应用程序也可以重现这种效果,因为GNUTLS缓存会话数据的时间足够长,可以更改服务器。在mod_GNUTLS中为代理连接实现会话恢复时,我注意到了这个问题。

这些证书只是我的测试PKI中的证书,如果有帮助,我可以邮寄它们。重要的是,步骤1中的服务器具有客户端信任的CA颁发的证书,而步骤4中的服务器具有客户端未知的CA颁发的证书。

伪造的服务器能够恢复会话,客户端不会检测到攻击。

会话恢复应该失败,从而导致完全握手,除非第二台服务器具有有效的凭据,否则必须失败。如果使用相同的证书而不是伪造的证书重新启动服务器,则完全握手成功将是预期的结果。

GNUTLS服务器无需访问`gnutls_SESSION_TICKET_KEY_GENERATE()`生成的密钥,即可使用彼此签发的票证。这允许没有有效凭据的MITM服务器恢复与客户端的会话,该客户端首先与具有有效凭据的服务器建立初始连接。此问题适用于TLS 1.3,当使用TLS 1.2恢复失败时,正如预期的那样。因为票证可以在不知道主密钥的情况下用于恢复,所以我假设(但尚未测试)票证也可以用于被动解密早期数据。我首先注意到Ubuntu版本3.6.13-2ubuntu1存在这个问题,并使用52e78f1e3a95a6d9e4f1f9a72f的`master‘版本复制了它。使用有效凭据启动服务器:`gnutls-serv--x509keyfile=Authority/server/Secret.key--x509certfile=Authority/server/x509.pem`2.连接到服务器并存储恢复数据:`openssl s_client-connect localhost:5556-CAFILE AUTHORITY/x509.pem-Verify_Return_Error-Sess_out session.cache`3.停止在步骤1.4中启动的服务器。在同一地址端口使用伪造凭据启动服务器(假设真正的攻击者仅在客户端请求恢复时才重定向连接):`gnutls-serv--x509keyfile=rogueca/mitm/Secret.key--x509certfile=rogueca/mitm/x509.pem`5.使用存储的恢复数据重新连接:`openssl s_client-connect localhost:5556-Cafile Authority/x505.pem`5.使用存储的恢复数据重新连接:`openssl s_client-connect localhost:5556-Cafile Authority/x50。我使用`openssl s_client`来重现该问题,因为`gnutls-cli`缺乏跨调用存储恢复数据的方式,但是使用GNUTLS的应用程序也可以重现该效果,因为GNUTLS缓存会话数据的时间足够长,可以更改服务器。在mod_gnutls中为代理连接实现会话恢复时,我注意到了这个问题。证书只是我测试的PKI中的证书,如果有帮助,我可以发布它们。重要的是,步骤1中的服务器具有客户端信任的CA颁发的证书,而步骤4中的服务器具有客户端未知的CA颁发的证书。##实际结果伪造的服务器能够恢复会话,客户端检测不到攻击。##预期的结果会话恢复应该失败,从而导致完全握手,除非第二台服务器具有有效的凭据,否则握手必须失败。如果使用相同的证书而不是伪造的证书重新启动服务器,则完全握手成功将是预期的结果。