Hi,

On 28-03-17 22:53, David Sommerseth wrote:
> If tls_deauthenticate() was called, it could in some scenarios leave the
> authentication token for a session in memory.  This change just ensures
> auth-tokens are always wiped as soon as a TLS session is considered
> broken.
> 
> Signed-off-by: David Sommerseth <dav...@openvpn.net>
> 
> ---
> 
> The wipe_auth_token() function is otherwise moved to be declared before
> tls_deauthenticate() and the latter function is also slightly modified to
> make use of the C99 feature of inline declaration - mostly to have a more
> reasonable coding style when adding the wipe_auth_token() call.
> 
> v2 - Fixed coding style issues after changes in wipe_auth_token()
>    - Added wipe_auth_token() call when --ccd-exclusive auth fails
> ---
>  src/openvpn/ssl_verify.c | 47 +++++++++++++++++++++++++++--------------------
>  1 file changed, 27 insertions(+), 20 deletions(-)
> 
> diff --git a/src/openvpn/ssl_verify.c b/src/openvpn/ssl_verify.c
> index a6e9be3..bc578fa 100644
> --- a/src/openvpn/ssl_verify.c
> +++ b/src/openvpn/ssl_verify.c
> @@ -80,6 +80,28 @@ setenv_untrusted(struct tls_session *session)
>      setenv_link_socket_actual(session->opt->es, "untrusted", 
> &session->untrusted_addr, SA_IP_PORT);
>  }
>  
> +
> +/**
> + *  Wipes the authentication token out of the memory, frees and cleans up 
> related buffers and flags
> + *
> + *  @param multi  Pointer to a multi object holding the auth_token variables
> + */
> +static void
> +wipe_auth_token(struct tls_multi *multi)
> +{
> +    if( multi )
> +    {
> +        if (multi->auth_token )
> +        {

This still has weird spaces: "if( multi )" should be "if (multi)", and
"if (multi->auth_token )" should be "if (multi->auth_token)".

> +            secure_memzero(multi->auth_token, AUTH_TOKEN_SIZE);
> +            free(multi->auth_token);
> +        }
> +        multi->auth_token = NULL;
> +        multi->auth_token_sent = false;
> +    }
> +}
> +
> +
>  /*
>   * Remove authenticated state from all sessions in the given tunnel
>   */
> @@ -88,10 +110,10 @@ tls_deauthenticate(struct tls_multi *multi)
>  {
>      if (multi)
>      {
> -        int i, j;
> -        for (i = 0; i < TM_SIZE; ++i)
> +        wipe_auth_token(multi);
> +        for (int i = 0; i < TM_SIZE; ++i)
>          {
> -            for (j = 0; j < KS_SIZE; ++j)
> +            for (int j = 0; j < KS_SIZE; ++j)
>              {
>                  multi->session[i].key[j].authenticated = false;
>              }
> @@ -1219,21 +1241,6 @@ verify_user_pass_management(struct tls_session 
> *session, const struct user_pass
>  }
>  #endif /* ifdef MANAGEMENT_DEF_AUTH */
>  
> -/**
> - *  Wipes the authentication token out of the memory, frees and cleans up 
> related buffers and flags
> - *
> - *  @param multi  Pointer to a multi object holding the auth_token variables
> - */
> -static void
> -wipe_auth_token(struct tls_multi *multi)
> -{
> -    secure_memzero(multi->auth_token, AUTH_TOKEN_SIZE);
> -    free(multi->auth_token);
> -    multi->auth_token = NULL;
> -    multi->auth_token_sent = false;
> -}
> -
> -
>  /*
>   * Main username/password verification entry point
>   */
> @@ -1285,7 +1292,7 @@ verify_user_pass(struct user_pass *up, struct tls_multi 
> *multi,
>          /* Ensure that the username has not changed */
>          if (!tls_lock_username(multi, up->username))
>          {
> -            wipe_auth_token(multi);
> +            /* auth-token cleared in tls_lock_username() on failure */
>              ks->authenticated = false;
>              goto done;
>          }
> @@ -1306,7 +1313,6 @@ verify_user_pass(struct user_pass *up, struct tls_multi 
> *multi,
>          if (memcmp_constant_time(multi->auth_token, up->password,
>                                   strlen(multi->auth_token)) != 0)
>          {
> -            wipe_auth_token(multi);
>              ks->authenticated = false;
>              tls_deauthenticate(multi);
>  
> @@ -1478,6 +1484,7 @@ verify_final_auth_checks(struct tls_multi *multi, 
> struct tls_session *session)
>          if (!cn || !strcmp(cn, CCD_DEFAULT) || !test_file(path))
>          {
>              ks->authenticated = false;
> +            wipe_auth_tokens(multi);

This should be wipe_auth_token(), not wipe_auth_tokens().

>              msg(D_TLS_ERRORS, "TLS Auth Error: --client-config-dir 
> authentication failed for common name '%s' file='%s'",
>                  session->common_name,
>                  path ? path : "UNDEF");
> 

Otherwise this looks good.  So if the above two comments are processed,
ACK.  I'm fine with you doing that on-the-fly.

-Steffan

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to