-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hi,

a few more wrinkles to smooth out.


Sent with ProtonMail Secure Email.

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐

On Wednesday, August 11th, 2021 at 08:29, Antonio Quartulli <a...@unstable.cc> 
wrote:

> Hi,
>
> On 05/08/2021 20:09, Arne Schwabe wrote:
> > TLS 1.0 should not be allowed anymore in a sensible default configuration.
> > Bump the default to TLS 1.2
> > Also modify --cipher not to be automatically appended and default
> > allow-compression to no. This also allows a default configuration to be
> > compatible with DCO.
> >
> > Also introduce --compat-mode version to allow an easy way for UI/users
> > to maximise compatibility to earlier versions at the cost of DCO and
> > security.
> >
> > --compat-mode is only intended as an easier way to set options that
> > are still present. It will not implement options that are removed
> > (e.g. --keysize), so it is meant a best effort option and not as
> > a mean to provide 100% compatibility.


mean -> means


> >
> > Patch v2: rebase
> > Patch v3: Fix version number off by a factor of 10
> >
> > Signed-off-by: Arne Schwabe <a...@rfc2549.org>
> > ---
> >  Changes.rst                          | 23 +++++++
> >  doc/man-sections/generic-options.rst | 21 ++++++
> >  src/openvpn/comp.h                   |  1 +
> >  src/openvpn/options.c                | 97 +++++++++++++++++++++++-----
> >  src/openvpn/options.h                | 17 +++++
> >  src/openvpn/ssl_ncp.c                | 13 ++++
> >  src/openvpn/ssl_ncp.h                |  8 +++
> >  7 files changed, 165 insertions(+), 15 deletions(-)
> >
> > diff --git a/Changes.rst b/Changes.rst
> > index 0323a7f7a..56b4dd39c 100644
> > --- a/Changes.rst
> > +++ b/Changes.rst
> > @@ -45,6 +45,12 @@ Pending auth support for plugins and scripts
> >
> >      See ``sample/sample-scripts/totpauth.py`` for an example.
> >
> > +Compatibility mode (``--compat-mode``)
> > +    The modernisation of defaults can impact the compatibility of OpenVPN 
> > 2.6.0
> > +    with older peers. The options ``--compat-mode`` allows UIs to provide 
> > users
> > +    with an easy way to still connect to older servers.
> > +
> > +
> >  Deprecated features
> >  -------------------
> >  ``inetd`` has been removed
> > @@ -65,6 +71,23 @@ Deprecated features
> >      This option mainly served a role as debug option when NCP was first
> >      introduced. It should now no longer be necessary.
> >
> > +TLS 1.0 and 1.1 are deprecated
> > +    ``tls-version-min`` is set to 1.2 by default.  OpenVPN 2.6.0 defaults
> > +    to a minimum TLS version of 1.2 as TLS 1.0 and 1.1 should be generally
> > +    avoided. Note that OpenVPN versions older than 2.3.7 use TLS 1.0 only.
> > +
> > +``--cipher`` options is no longer included in ``--data-ciphers`` by default
>
> options -> argument ?
>
> > +    Data cipher negotiation has been introduced in 2.4.0 and been 
> > significantly
> > +    improved in 2.5.0. The implicit fallback to the cipher specified in
> > +    ``--cipher`` has been removed.
> > +
> > +Compression no longer enabled by default
> > +    Unless an explicit compression option is specified in the 
> > configuration,
> > +    ``--allow-compression`` defaults to ``no`` in OpeNVPN 2.6.0.
> > +    By default, OpenVPN 2.5 still allowed a server to enable compression by
> > +    pushing compression related options.
> > +
> > +
> >  Overview of changes in 2.5
> >  ==========================
> >
> > diff --git a/doc/man-sections/generic-options.rst 
> > b/doc/man-sections/generic-options.rst
> > index 203e35f57..739e845ac 100644
> > --- a/doc/man-sections/generic-options.rst
> > +++ b/doc/man-sections/generic-options.rst
> > @@ -52,6 +52,27 @@ which mode OpenVPN is configured as.
> >    BSDs implement a getrandom() or getentropy() syscall that removes the
> >    need for /dev/urandom to be available.
> >
> > +--compat-mode version
> > +  This option provides a way to alter the default of OpenVPN to be more
> > +  compatible with the version ``version`` specified. All of the changes
> > +  this option does can also be achieved using invdivdiual configuration
>
> invdivdiual -> individual

does -> makes

>
> > +  option.
> > +
> > +  Note: Using this options sets reverts defaults to no longer recommended
>
> options -> option
>
> sets reverts -> reverts
>
> > +  values and should be avoided if possible.
> > +
> > +  The following table details what defaults are changed depending on the
> > +  version specified.
> > +
> > +  - 2.5.x or lower: ``--allow-compression asym`` is automatically added
> > +    to the configuration if no other compression options are present.
> > +  - 2.4.x or lower: The cipher in ``--cipher`` is appended to
> > +    ``--data-ciphers``
> > +  - 2.3.x or lower: ``--data-cipher-fallback`` is automatically added with
> > +    the same cipher as ``--cipher``
> > +  - 2.3.6 or lower: ``--tls-version-min 1.0`` is added to the configuration
> > +    when ``--tls-version-min`` is not explicitly set.
> > +
> >  --config file
> >    Load additional config options from ``file`` where each line corresponds
> >    to one command line option, but with the leading '--' removed.
> > diff --git a/src/openvpn/comp.h b/src/openvpn/comp.h
> > index cd4f0e1a2..619a574e5 100644
> > --- a/src/openvpn/comp.h
> > +++ b/src/openvpn/comp.h
> > @@ -59,6 +59,7 @@
> >  #define COMP_F_ALLOW_STUB_ONLY      (1<<4) /* Only accept stub 
> > compression, even with COMP_F_ADVERTISE_STUBS_ONLY
> >                                              * we still accept other 
> > compressions to be pushed */
> >  #define COMP_F_MIGRATE              (1<<5) /* push stub-v2 or comp-lzo no 
> > when we see a client with comp-lzo in occ */
> > +#define COMP_F_ALLOW_ASYM           (1<<6) /* Compression was explicitly 
> > set to allow assymetric compression */


assymetric -> asymetric


> >
> >
> >  /*
> > diff --git a/src/openvpn/options.c b/src/openvpn/options.c
> > index 63cda1e86..20c273063 100644
> > --- a/src/openvpn/options.c
> > +++ b/src/openvpn/options.c
> > @@ -854,6 +854,7 @@ init_options(struct options *o, const bool init_gc)
> >      o->use_prediction_resistance = false;
> >  #endif
> >      o->tls_timeout = 2;
> > +    o->ssl_flags = (TLS_VER_1_2 << SSLF_TLS_VERSION_MIN_SHIFT);
> >      o->renegotiate_bytes = -1;
> >      o->renegotiate_seconds = 3600;
> >      o->renegotiate_seconds_min = -1;
> > @@ -3079,8 +3080,12 @@ options_postprocess_verify(const struct options *o)
> >  static void
> >  options_postprocess_cipher(struct options *o)
> >  {
> > -    if (!o->pull && !(o->mode == MODE_SERVER))
> > +    if (!o->tls_server && !o->tls_client)
> >      {
> > +        /* we are in the classic P2P mode */
> > +        msg( M_WARN, "Cipher negotiation is disabled since TLS "
>
> no space after '('
>
> > +             "mode is not enabled");
> > +
> >          /* If the cipher is not set, use the old default of BF-CBC. We will
> >           * warn that this is deprecated on cipher initialisation, no need
> >           * to warn here as well */
> > @@ -3101,26 +3106,68 @@ options_postprocess_cipher(struct options *o)
> >          /* We still need to set the ciphername to BF-CBC since various 
> > other
> >           * parts of OpenVPN assert that the ciphername is set */
> >          o->ciphername = "BF-CBC";
> > +
> > +        msg(M_WARN, "Note: --cipher is not set. Previous OpenVPN versions "
> > +                    "defaulted to BF-CBC as fallback when cipher 
> > negotiation "
> > +                    "failed in this case. If you need this fallback please 
> > add "
> > +                    "'--data-ciphers-fallback 'BF-CBC' to your 
> > configuration "
> > +                    "and/or add BF-CBC to --data-ciphers.");
>
> I wonder if we really need this message. Am I wrong or this message will
> simply appear by default once people understand that --cipher is not
> useful anymore?
>
> If you think it is important for people that may get fooled by the new
> behaviour, then I'd suggest to use M_INFO.
>
> >      }
> >      else if (!o->enable_ncp_fallback
> >               && !tls_item_in_cipher_list(o->ciphername, o->ncp_ciphers))
> >      {
> > -        msg(M_WARN, "DEPRECATED OPTION: --cipher set to '%s' but missing 
> > in"
> > -            " --data-ciphers (%s). Future OpenVPN version will "
> > -            "ignore --cipher for cipher negotiations. "
> > -            "Add '%s' to --data-ciphers or change --cipher '%s' to "
> > -            "--data-ciphers-fallback '%s' to silence this warning.",
> > -            o->ciphername, o->ncp_ciphers, o->ciphername,
> > -            o->ciphername, o->ciphername);
> > -        o->enable_ncp_fallback = true;
> > +        msg(M_WARN, "DEPRECATED OPTION: --cipher set to '%s' but missing 
> > in "
> > +            "--data-ciphers (%s). OpenVPN ignores --cipher for cipher "
> > +            "negotiations. ",
> > +            o->ciphername, o->ncp_ciphers);
> > +    }
> > +}
> > +
> > +static void
> > +options_set_backwards_compatible_options(struct options *o)
> > +{
> > +    /* TLS min version is not set */
> > +    if ((o->ssl_flags & SSLF_TLS_VERSION_MIN_MASK) == 0)
> > +    {
> > +        if (!need_compatibility(o, 20307))
> > +        {
> > +            /* 2.3.6 and earlier have TLS 1.0 only, set minimum to TLS 1.0 
> > */
> > +            o->ssl_flags = (TLS_VER_1_0 << SSLF_TLS_VERSION_MIN_SHIFT);
> > +        }
> > +        else
> > +        {
> > +            /* Use TLS 1.2 as proper default */
> > +            o->ssl_flags = (TLS_VER_1_2 << SSLF_TLS_VERSION_MIN_SHIFT);
> > +        }
> > +    }
> >
> > -        /* Append the --cipher to ncp_ciphers to allow it in NCP */
> > -        size_t newlen = strlen(o->ncp_ciphers) + 1 + strlen(o->ciphername) 
> > + 1;
> > -        char *ncp_ciphers = gc_malloc(newlen, false, &o->gc);
> > +    /* Versions < 2.5.0 do need --cipher in the list of accepted ciphers.
> > +     * Version 2.4 might probably does not need it but NCP was not so


might is not required here


> > +     * good with 2.4 and ncp-disable might be more common on 2.4 peers.
> > +     * Only do this iif --cipher is not explicitly (BF-CBC). This is not

iif -> if

> > +     * 100% correct backwards compatible behaviour but 2.5 already behaved 
> > like
> > +     * this */
> > +    if (o->ciphername && need_compatibility(o, 20500)
> > +        && !tls_item_in_cipher_list(o->ciphername, o->ncp_ciphers))
> > +    {
> > +        append_cipher_to_ncp_list(o, o->ciphername);
> > +    }
> > +
> > +    /* Versions <= 2.3.0 additionally might be compiled with 
> > --enable-small and
> > +     * not have OCC strings required for "poor man's NCP" */
> > +    if (o->ciphername &&  need_compatibility(o, 20400))
> > +    {
> > +        o->enable_ncp_fallback = true;
> > +    }
> >
> > -        ASSERT(openvpn_snprintf(ncp_ciphers, newlen, "%s:%s", 
> > o->ncp_ciphers,
> > -                                o->ciphername));
> > -        o->ncp_ciphers = ncp_ciphers;
> > +    /* Compression is deprecated and we do not want to announce support 
> > for it
> > +     * by default anymore, additionally DCO breaks with with compression.
> > +     * Disable compression by default starting with 2.6.0 if no other
> > +     * compression related options have been explicitly set */
> > +    if (!comp_non_stub_enabled(&o->comp) && !need_compatibility(o, 20600)
> > +        && (o->comp.flags == 0))
> > +    {
> > +        o->comp.flags = COMP_F_ALLOW_STUB_ONLY|COMP_F_ADVERTISE_STUBS_ONLY;
> >      }
> >  }
> >
> > @@ -3136,6 +3183,8 @@ options_postprocess_mutate(struct options *o)
> >      helper_keepalive(o);
> >      helper_tcp_nodelay(o);
> >
> > +    options_set_backwards_compatible_options(o);
> > +
> >      options_postprocess_cipher(o);
> >      options_postprocess_mutate_invariant(o);
> >
> > @@ -3213,6 +3262,12 @@ options_postprocess_mutate(struct options *o)
> >       * when using --pull
> >       */
> >      pre_connect_save(o);
> > +
> > +    /* Give a general warning at the end of initialisation that defaults
> > +     * have changed */
> > +    msg(M_WARN, "Note that modernistation of defaults in OpenVPN 2.6 
> > limits "
>
> modernistation -> modernisation
>
> > +                "compatibility with old versions. See Changes.rst and "
> > +                "--compat-mode in the manual for details.");
> >  }
> >
> >  /*
> > @@ -6704,6 +6759,17 @@ add_option(struct options *options,
> >              setenv_str(es, p[1], p[2] ? p[2] : "");
> >          }
> >      }
> > +    else if (streq(p[0], "compat-mode") && p[1] && !p[3])
> > +    {
> > +        unsigned int major, minor, patch;
> > +        if (!(sscanf(p[1], "%u.%u.%u", &major, &minor, &patch) == 3))
> > +        {
> > +            msg(msglevel, "cannot parse version number for -compat-mode: 
> > %s", p[1]);
> > +            goto err;
> > +        }
> > +
> > +        options->backwards_compatible = major * 10000 + minor * 100 + 
> > patch;
> > +    }
> >      else if (streq(p[0], "setenv-safe") && p[1] && !p[3])
> >      {
> >          VERIFY_PERMISSION(OPT_P_SETENV);
> > @@ -7701,6 +7767,7 @@ add_option(struct options *options,
> >          else if (streq(p[1], "asym"))
> >          {
> >              options->comp.flags &= ~COMP_F_ALLOW_COMPRESS;
> > +            options->comp.flags |= COMP_F_ALLOW_ASYM;
> >          }
> >          else if (streq(p[1], "yes"))
> >          {
> > diff --git a/src/openvpn/options.h b/src/openvpn/options.h
> > index b0e40cb7f..eb4e39f11 100644
> > --- a/src/openvpn/options.h
> > +++ b/src/openvpn/options.h
> > @@ -225,6 +225,10 @@ struct options
> >
> >      /* enable forward compatibility for post-2.1 features */
> >      bool forward_compatible;
> > +    /** What version we should try to be compatible with as major * 10000 +
> > +      * minor * 100 + patch, e.g. 2.4.7 => 20407 */
> > +    unsigned int backwards_compatible;
> > +
> >      /* list of options that should be ignored even if unknown */
> >      const char **ignore_unknown_option;
> >
> > @@ -660,6 +664,19 @@ struct options
> >      unsigned int data_channel_crypto_flags;
> >  };
> >
> > +/**
> > + * Returns if we want 'backwards-compatible' to a certain version
>
> Maybe better rephrased:
>
> Returns if
>
> > + * @param version   the first version does that *NOT* need the 
> > compatibility
> > + *                  e.g. 204000 for all versions <= 2.4.0


does that *NOT* need ???

that does not need ??? guessing ..


>
> is there a 0 too many in the example (should be 20400?)? How about
> making the format more explicit?
> At the moment the example is the only thing trying to document the
> version format.
>
>
> On top of that, isn't the example wrong? The definition says "first
> version that *NOT* need.." but the example says <= 2.4.0 ?
> It probably should say "<2.4.0"
>
> This said I think this is a bit confusing. See below:
>
> > + * @return          compatibility should be enabled.
> > + */
> > +static inline bool
> > +need_compatibility(const struct options *o, int version)
> > +{
> > +    return o->backwards_compatible != 0 && o->backwards_compatible < 
> > version;
>
> How about changing this check to "backwards_compatible <= version" ?
>
> This way the function meaning becomes "do we want to be compatible with
> the version specified and older?"
>
>
> > +}
> > +
> > +
> >  #define streq(x, y) (!strcmp((x), (y)))
> >
> >  /*
> > diff --git a/src/openvpn/ssl_ncp.c b/src/openvpn/ssl_ncp.c
> > index 6967e2bba..022a9dc3b 100644
> > --- a/src/openvpn/ssl_ncp.c
> > +++ b/src/openvpn/ssl_ncp.c
> > @@ -172,6 +172,19 @@ mutate_ncp_cipher_list(const char *list, struct 
> > gc_arena *gc)
> >      return ret;
> >  }
> >
> > +
> > +void
> > +append_cipher_to_ncp_list(struct options *o, const char *ciphername)
> > +{
> > +    /* Append the --cipher to ncp_ciphers to allow it in NCP */
> > +    size_t newlen = strlen(o->ncp_ciphers) + 1 + strlen(ciphername) + 1;
> > +    char *ncp_ciphers = gc_malloc(newlen, false, &o->gc);
> > +
> > +    ASSERT(openvpn_snprintf(ncp_ciphers, newlen, "%s:%s", o->ncp_ciphers,
> > +                            ciphername));
> > +    o->ncp_ciphers = ncp_ciphers;
> > +}
> > +
> >  bool
> >  tls_item_in_cipher_list(const char *item, const char *list)
> >  {
> > diff --git a/src/openvpn/ssl_ncp.h b/src/openvpn/ssl_ncp.h
> > index 4a2601a2e..09ddeb28e 100644
> > --- a/src/openvpn/ssl_ncp.h
> > +++ b/src/openvpn/ssl_ncp.h
> > @@ -102,6 +102,14 @@ tls_peer_ncp_list(const char *peer_info, struct 
> > gc_arena *gc);
> >  char *
> >  mutate_ncp_cipher_list(const char *list, struct gc_arena *gc);
> >
> > +/**
> > + * Appends the cipher specified by the ciphernamer parameter to to


ciphernamer -> ciphername


> > + * the o->ncp_ciphers list.
> > + * @param o             options struct to modify. Its gc is also used
> > + * @param ciphername    the ciphername to add
> > + */
> > +void append_cipher_to_ncp_list(struct options *o, const char *ciphername);
> > +
> >  /**
> >   * Return true iff item is present in the colon-separated zero-terminated
> >   * cipher list.
> >
>
> I think this patch, although not too big, may be better if split in pieces.
>
> IMHO the change to the default should be atomic and clearly motivated.
> In a few months from now we will see this patch changing defaults and we
> will have to remember why we wanted to do that.
>
> The commit message explains what is happening, but not why.
>
> Wouldn't it be better to have one patch of reach default behaviour being
> charged with a concise but focused explanation as to why that default is
> being changed?
>
> After those patches, then another patch could come in implementing
> compat-mode.
>
> IMHO this would give the change history a very good cut. Anybody willing
> to understand what happened can go back and check.
>
> Thoughts?
>
>
> Regards,
>
> p.s. the code per se looks good at first glance.
>
> --
> Antonio Quartulli
>
>
>
>
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel

-----BEGIN PGP SIGNATURE-----
Version: ProtonMail

wsBzBAEBCAAGBQJhE8qOACEJEE+XnPZrkLidFiEECbw9RGejjXJ5xVVVT5ec
9muQuJ2veAgAtOlgEGJ5zKH0YPIwck4s36FcJ1a68VlJQZGpBNGw/gdsm23w
YtiLckbzCQ/d4EuIFx1CX5DOW1oSY+PUYVLVehYkDtHKfCqrBDjbr7r5Rap9
B64mrZgTctr/Vfd9INDPR86Wn90/cDBfMsXNiHMAN25ZvHTlPSZEszmhBnkR
eMDDF6OeWpVhLDIr940FDO2XllJMFZaHjguT+PGLMnImEkXBWkrxCi9Ob5Wk
r5IVS6dPEV5i32g/Msh2O1+TEvuTmReNB7G0IGuuZiN4w795aEi+kTRW3j/g
Ie3niYsZo/dMfavCSLexZ/cQ2FEUfUVdDWXNmR+fu7kfDGEJv49V2Q==
=djIW
-----END PGP SIGNATURE-----

Attachment: publickey - tincantech@protonmail.com - 0x09BC3D44.asc
Description: application/pgp-keys

Attachment: publickey - tincantech@protonmail.com - 0x09BC3D44.asc.sig
Description: PGP signature

_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to