[31661] in CVS-changelog-for-Kerberos-V5

home help back first fref pref prev next nref lref last post

krb5 commit [krb5-1.22]: Free call_arg on all AUTH_GSSAPI exit paths

daemon@ATHENA.MIT.EDU (ghudson@mit.edu)
Mon Nov 9 12:01:07 2026

From: ghudson@mit.edu
To: cvs-krb5@mit.edu
Message-Id: <20261109170103.786F0105839@krbdev.mit.edu>
Date: Mon,  9 Nov 2026 12:01:03 -0500 (EST)
MIME-Version: 1.0
Reply-To: krbdev@mit.edu
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: cvs-krb5-bounces@mit.edu

https://github.com/krb5/krb5/commit/93cb29865df33972c54d8b124123973856513f6f
commit 93cb29865df33972c54d8b124123973856513f6f
Author: Julien Rische <jrische@redhat.com>
Date:   Wed Sep 9 15:30:01 2026 +0200

    Free call_arg on all AUTH_GSSAPI exit paths
    
    In gssrpc__svcauth_gssapi(), ensure that call_arg is released along
    all exit paths by freeing it in the error handler.
    
    CVE-2026-112321:
    
    The AUTH_GSSAPI handler in lib/rpc/svc_auth_gssapi.c in MIT Kerberos 5
    (aka krb5) does not free decoded arguments on certain error paths,
    which allows remote attackers to cause a denial of service (memory
    exhaustion in kadmind) via crafted AUTH_GSSAPI_INIT requests that
    trigger authentication failures.
    
    (cherry picked from commit 89ea06778fe893a8fdad483f7716fe8309521603)
    
    ticket: 9246
    version_fixed: 1.22.3

 src/lib/rpc/svc_auth_gssapi.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/lib/rpc/svc_auth_gssapi.c b/src/lib/rpc/svc_auth_gssapi.c
index ac4b7a9ac..244265f01 100644
--- a/src/lib/rpc/svc_auth_gssapi.c
+++ b/src/lib/rpc/svc_auth_gssapi.c
@@ -190,6 +190,7 @@ enum auth_stat gssrpc__svcauth_gssapi(
      /* use AUTH_NONE until there is a client_handle */
      rqst->rq_xprt->xp_auth = &svc_auth_none;
 
+     memset(&call_arg, 0, sizeof(call_arg));
      memset(&call_res, 0, sizeof(call_res));
      creds.client_handle.length = 0;
      creds.client_handle.value = NULL;
@@ -314,7 +315,6 @@ enum auth_stat gssrpc__svcauth_gssapi(
 	  }
 
 	  /* call is for us, deserialize arguments */
-	  memset(&call_arg, 0, sizeof(call_arg));
 	  if (! svc_getargs(rqst->rq_xprt, (xdrproc_t)xdr_authgssapi_init_arg,
 			    &call_arg)) {
 	       PRINTF(("svcauth_gssapi: cannot decode args\n"));
@@ -454,8 +454,9 @@ enum auth_stat gssrpc__svcauth_gssapi(
 	  gssstat = call_res.gss_major;
 	  minor_stat = call_res.gss_minor;
 
-	  /* done with call args */
+	  /* Done with call_arg (it may be reused for AUTH_GSSAPI_MSG). */
 	  xdr_free((xdrproc_t)xdr_authgssapi_init_arg, &call_arg);
+	  memset(&call_arg, 0, sizeof(call_arg));
 
 	  PRINTF(("svcauth_gssapi: accept_sec_context returned %#x %#x\n",
 		  call_res.gss_major, call_res.gss_minor));
@@ -591,14 +592,11 @@ enum auth_stat gssrpc__svcauth_gssapi(
 	       switch (rqst->rq_proc) {
 	       case AUTH_GSSAPI_MSG:
 		    PRINTF(("svcauth_gssapi: GSSAPI_MSG, getting args\n"));
-		    memset(&call_arg, 0, sizeof(call_arg));
 		    if (! svc_getargs(rqst->rq_xprt,
 				      (xdrproc_t)xdr_authgssapi_init_arg,
 				      &call_arg)) {
 			 PRINTF(("svcauth_gssapi: cannot decode args\n"));
 			 LOG_MISCERR("protocol error in call arguments");
-			 xdr_free((xdrproc_t)xdr_authgssapi_init_arg,
-				  &call_arg);
 			 ret = AUTH_BADCRED;
 			 goto error;
 		    }
@@ -659,6 +657,7 @@ enum auth_stat gssrpc__svcauth_gssapi(
      return AUTH_OK;
 
 error:
+     xdr_free((xdrproc_t)xdr_authgssapi_init_arg, &call_arg);
      if (creds.client_handle.length != 0) {
 	  PRINTF(("svcauth_gssapi: freeing client_handle len %d\n",
 		  (int) creds.client_handle.length));
_______________________________________________
cvs-krb5 mailing list
cvs-krb5@mit.edu
https://mailman.mit.edu/mailman/listinfo/cvs-krb5

home help back first fref pref prev next nref lref last post