Following the earlier warning about small block ciphers, now limit the
--reneg-bytes value when using a cipher that susceptible to SWEET32-like
attacks.  The 64 MB value has been selected with the researchers who
published the SWEET32 paper.

Note that this will not change a user-set --reneg-bytes value, to allow a
user to align a gun with his feet^w^w^w^w^w^w override this behaviour if
really needed.

v2: obey user-set --reneg-bytes 0 to revert to old behaviour, use more firm
    language in warning message, and add URL to man page.

Signed-off-by: Steffan Karger <steffan.kar...@fox-it.com>
---
 doc/openvpn.8         |  1 +
 src/openvpn/crypto.c  |  5 +++--
 src/openvpn/options.c |  1 +
 src/openvpn/ssl.c     | 29 ++++++++++++++++++++++++++++-
 4 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/doc/openvpn.8 b/doc/openvpn.8
index 2e58f33..0ac8184 100644
--- a/doc/openvpn.8
+++ b/doc/openvpn.8
@@ -4101,6 +4101,7 @@ an abbreviation for Blowfish in Cipher Block Chaining 
mode.
 
 Using BF-CBC is no longer recommended, because of it's 64-bit block size.  This
 small block size allows attacks based on collisions, as demonstrated by 
SWEET32.
+See https://community.openvpn.net/openvpn/wiki/SWEET32 for details.
 
 To see other ciphers that are available with OpenVPN, use the
 .B \-\-show\-ciphers
diff --git a/src/openvpn/crypto.c b/src/openvpn/crypto.c
index 45689f2..f600070 100644
--- a/src/openvpn/crypto.c
+++ b/src/openvpn/crypto.c
@@ -836,8 +836,9 @@ init_key_ctx (struct key_ctx *ctx, struct key *key,
          cipher_kt_iv_size(kt->cipher));
       if (cipher_kt_block_size(kt->cipher) < 128/8)
        {
-         msg (M_WARN, "WARNING: this cipher's block size is less than 128 bit "
-             "(%d bit).  Consider using a --cipher with a larger block size.",
+         msg (M_WARN, "WARNING: INSECURE cipher with block size less than 128"
+             " bit (%d bit).  This allows attacks like SWEET32.  Mitigate by "
+             "using a --cipher with a larger block size (e.g. AES-256-CBC).",
              cipher_kt_block_size(kt->cipher)*8);
        }
     }
diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index 281ef0b..996c26e 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -852,6 +852,7 @@ init_options (struct options *o, const bool init_gc)
 #endif
   o->key_method = 2;
   o->tls_timeout = 2;
+  o->renegotiate_bytes = -1;
   o->renegotiate_seconds = 3600;
   o->handshake_window = 60;
   o->transition_window = 3600;
diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
index dfdc200..33122a3 100644
--- a/src/openvpn/ssl.c
+++ b/src/openvpn/ssl.c
@@ -283,6 +283,27 @@ tls_get_cipher_name_pair (const char * cipher_name, size_t 
len) {
   return NULL;
 }
 
+/**
+ * Limit the reneg_bytes value when using a small-block (<128 bytes) cipher.
+ *
+ * @param cipher       The current cipher (may be NULL).
+ * @param reneg_bytes  Pointer to the current reneg_bytes, updated if needed.
+ *                     May *not* be NULL.
+ */
+static void
+tls_limit_reneg_bytes (const cipher_kt_t *cipher, int *reneg_bytes)
+{
+  if (cipher && (cipher_kt_block_size(cipher) < 128/8))
+    {
+      if (*reneg_bytes == -1) /* Not user-specified */
+       {
+         msg (M_WARN, "WARNING: cipher with small block size in use, "
+              "reducing reneg-bytes to 64MB to mitigate SWEET32 attacks.");
+         *reneg_bytes = 64 * 1024 * 1024;
+       }
+    }
+}
+
 /*
  * Max number of bytes we will add
  * for data structures common to both
@@ -1742,6 +1763,8 @@ tls_session_update_crypto_params(struct tls_session 
*session,
       msg (D_TLS_ERRORS, "TLS Error: server generate_key_expansion failed");
       goto cleanup;
     }
+  tls_limit_reneg_bytes (session->opt->key_type.cipher,
+                        &session->opt->renegotiate_bytes);
   ret = true;
 cleanup:
   CLEAR (*ks->key_src);
@@ -2126,6 +2149,8 @@ key_method_2_write (struct buffer *buf, struct 
tls_session *session)
        }
                      
       CLEAR (*ks->key_src);
+      tls_limit_reneg_bytes (session->opt->key_type.cipher,
+                            &session->opt->renegotiate_bytes);
     }
 
   return true;
@@ -2354,6 +2379,8 @@ key_method_2_read (struct buffer *buf, struct tls_multi 
*multi, struct tls_sessi
        }
 
       CLEAR (*ks->key_src);
+      tls_limit_reneg_bytes (session->opt->key_type.cipher,
+                            &session->opt->renegotiate_bytes);
     }
 
   gc_free (&gc);
@@ -2410,7 +2437,7 @@ tls_process (struct tls_multi *multi,
   if (ks->state >= S_ACTIVE &&
       ((session->opt->renegotiate_seconds
        && now >= ks->established + session->opt->renegotiate_seconds)
-       || (session->opt->renegotiate_bytes
+       || (session->opt->renegotiate_bytes > 0
           && ks->n_bytes >= session->opt->renegotiate_bytes)
        || (session->opt->renegotiate_packets
           && ks->n_packets >= session->opt->renegotiate_packets)
-- 
2.7.4


------------------------------------------------------------------------------
The Command Line: Reinvented for Modern Developers
Did the resurgence of CLI tooling catch you by surprise?
Reconnect with the command line and become more productive. 
Learn the new .NET and ASP.NET CLI. Get your free copy!
http://sdm.link/telerik
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to