Hi Nikolaus 

This sounds exactly like the symptoms we have encountered. Will build from your 
patch & test to see if it works in our situation. 

John. 


> On 7 Dec 2019, at 13:54, Nikolaus <dc.s...@ntcomputer.de> wrote:
> 
>  I was able to solve the issue, fixing both squid-side "error:1425F175:SSL 
> routines:ssl_choose_client_version:inappropriate fallback (1/-1/0)" and 
> client-side certificate verification errors when attempting to contact TLS 
> 1.3 server over a TLS 1.3-enabled squid from a TLS 1.2 client. I will first 
> explain what causes the issue before presenting my solution, which involves 
> changes of the squid code base, for anybody who is affected by the same 
> problem.
> 
> I have inspected the squid source code and noticed that TLS peeking works 
> roughly like this:
> 
> 1. The client sends a client_hello, which is parsed by squid using a custom 
> handshake parser.  <-- Uses TLS 1.2
> 2. Squid creates an OpenSSL TLS session for the peeked connection  <-- Uses 
> TLS 1.3!
> 3. Squid forwards the original client_hello handshake message to the server 
> <-- TLS 1.2
> 4. Squid passes the received server_hello response to the OpenSSL session 
> created previously  <-- Response uses TLS 1.2 - Problem!
> 
> Now, the "problem" is that TLS 1.3 defines a set of new protocol downgrade 
> attack prevention mechanisms (can be found e.g. here: 
> https://blog.gypsyengineer.com/en/security/how-does-tls-1-3-protect-against-downgrade-attacks.html).
>  Both OpenSSL and most likely the server implement these. This includes that 
> the server random in the TLS 1.2 server_hello contains an indicator that the 
> server is TL 1.3-capable. The OpenSSL session created by squid detects this, 
> notices that it is TLS 1.3-capable itself, and closes the connection because 
> it assumes a protocol downgrade attack! Little does it know, that our client 
> actually only supports TLS 1.2, so we *want* the lower protocol version.
> 
> My solution includes setting the maximum TLS version of the OpenSSL session 
> to the version received from the client. This proved a little bit difficult, 
> since the way TLS versions are negotiated has also been changed by the TLS 
> 1.3 specification, and the squid handshake parser was not yet able to detect 
> TLS 1.3 correctly - I have therefore also implemented parsing of the 
> SupportedVersions TLS Extension and a preliminary support for sparse version 
> ranges. You can find all these changes at 
> https://github.com/nthuemmel/squid/tree/tls_downgrade_compatibility , which 
> is a fork of squid 4.9. Feel free to compile & test it if you have a 
> transparent peek-and-splice setup and are affected by the "inappropriate 
> fallback" problem.
> 
> I would of course be glad if the fix could be merged into the main squid 
> repository. If you are a dev, please let me know what you think and if I 
> should open a pull request. There are still some TODOs left, because I wasn't 
> sure what the best way is to integrate some of the changes. Notably, there 
> was also a comment which discourages setting a maximum version for the 
> OpenSSL session to improve peek+bump compatibility - I don't have a setup to 
> which this applies, so I don't know how big of an impact this is or if it is 
> still relevant.
> 
> Best Regards
> Nikolaus
> _______________________________________________
> squid-users mailing list
> squid-users@lists.squid-cache.org
> http://lists.squid-cache.org/listinfo/squid-users
_______________________________________________
squid-users mailing list
squid-users@lists.squid-cache.org
http://lists.squid-cache.org/listinfo/squid-users

Reply via email to