From db0efc48b53997f03f739a17adb827556ac1c38c Mon Sep 17 00:00:00 2001 From: David Cooper Date: Thu, 21 Dec 2017 16:22:33 -0500 Subject: [PATCH] run_tls_fallback_scsv() improvements This PR is intended to improve the functionality of run_tls_fallback_scsv(). The original goal of this PR was to address servers that support TLSv1.3 when using OpenSSL 1.1.1. That does not seem to be an issue, as using `$OPENSSL s_client` with the `-no_tls1_2` flag results in a TLSv1.1 ClientHello, even if `$OPENSSL` supports TLSv1.3. However, if the server supports TLSv1.3, then a message that says "No fallback possible, TLS 1.2 is the only protocol (OK)" isn't entirely correct. The main issue this PR fixes is some false positives in servers that do not support TLSv1.2. On a few servers that I tested, the current code incorrectly reports "Downgrade attack prevention NOT supported." Some of the servers only support TLSv1, so it should report that fallback is not possible. Another server supports TLSv1.1 and TLSv1, and it supports fallback protection. In both cases, the current code produces a false positive, since it assumes that TLSv1.2 is supported. --- testssl.sh | 161 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 107 insertions(+), 54 deletions(-) diff --git a/testssl.sh b/testssl.sh index c955fe4..b5402db 100755 --- a/testssl.sh +++ b/testssl.sh @@ -12281,6 +12281,7 @@ run_tls_poodle() { run_tls_fallback_scsv() { local -i ret=0 + local p high_proto="" high_proto_str low_proto="" protos_to_try [[ $VULN_COUNT -le $VULN_THRESHLD ]] && outln && pr_headlineln " Testing for TLS_FALLBACK_SCSV Protection " && outln pr_bold " TLS_FALLBACK_SCSV"; out " (RFC 7507) " @@ -12292,66 +12293,118 @@ run_tls_fallback_scsv() { prln_local_problem "$OPENSSL lacks TLS_FALLBACK_SCSV support" return 4 fi - #TODO: this need some tuning: a) if one protocol is supported only it has practcally no value (theoretical it's interesting though) - # b) for IIS6 + openssl 1.0.2 this won't work - # c) best to make sure that we hit a specific protocol, see https://alpacapowered.wordpress.com/2014/10/20/ssl-poodle-attack-what-is-this-scsv-thingy/ - # d) minor: we should do "-state" here - # first: make sure SSLv3 or some TLS protocol is supported + # First determine the highest protocol that the server supports (not including TLSv1.3). if [[ "$OPTIMAL_PROTO" == "-ssl2" ]]; then prln_svrty_critical "No fallback possible, SSLv2 is the only protocol" return 7 fi - # second: make sure we have tls1_2: - $OPENSSL s_client $(s_client_options "$STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI -no_tls1_2") >$TMPFILE 2>$ERRFILE $TMPFILE $TMPFILE 2>$ERRFILE $TMPFILE 2>$ERRFILE $TMPFILE