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

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

krb5 commit [krb5-1.22]: Fix leaks in lifecycle of RPCSEC_GSS context

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

From: ghudson@mit.edu
To: cvs-krb5@mit.edu
Message-Id: <20261109170139.E8C5E105839@krbdev.mit.edu>
Date: Mon,  9 Nov 2026 12:01:39 -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/31ebc4d7650e77d9b8378f486047507970688674
commit 31ebc4d7650e77d9b8378f486047507970688674
Author: Julien Rische <jrische@redhat.com>
Date:   Fri Sep 4 11:30:45 2026 +0200

    Fix leaks in lifecycle of RPCSEC_GSS context
    
    In svcauth_gss_accept_sec_context(), if gss_accept_sec_context()
    yields a src_name and returns GSS_S_CONTINUE_NEEDED, free the stored
    gd->cname before making the next call.  If gss_accept_sec_context()
    returns an error for an existing context, do not leak gd->ctx.  In the
    unlikely event that gss_accept_sec_context() returns GSS_S_COMPLETE
    multiple times, release gd->cname before calling gss_display_name()
    again.
    
    In gssrpc__svcauth_gss(), reject RPCSEC_GSS_INIT and
    RPCSEC_GSS_CONTINUE_INIT requests if a context is already established.
    
    [ghudson@mit.edu: added gd->established check; removed change to
    delete existing context on error return; rewrote commit message]
    
    (cherry picked from commit 21e981c73df78eaa1df367a97ad31ac848233a89)
    
    ticket: 9267
    version_fixed: 1.22.3

 src/lib/rpc/svc_auth_gss.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/lib/rpc/svc_auth_gss.c b/src/lib/rpc/svc_auth_gss.c
index 8f012c891..aafa54f16 100644
--- a/src/lib/rpc/svc_auth_gss.c
+++ b/src/lib/rpc/svc_auth_gss.c
@@ -197,6 +197,10 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
 			 (caddr_t)&recv_tok))
 		return (FALSE);
 
+	/* Release any prior client name from a previous call. */
+	gss_release_name(&min_stat, &gd->client_name);
+	gd->client_name = GSS_C_NO_NAME;
+
 	gr->gr_major = gss_accept_sec_context(&gr->gr_minor,
 					      &gd->ctx,
 					      gd->cred,
@@ -216,7 +220,6 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
 	if (gr->gr_major != GSS_S_COMPLETE &&
 	    gr->gr_major != GSS_S_CONTINUE_NEEDED) {
 		badauth(gr->gr_major, gr->gr_minor, rqst->rq_xprt);
-		gd->ctx = GSS_C_NO_CONTEXT;
 		goto errout;
 	}
 	gr->gr_ctx.value = "xxxx";
@@ -237,6 +240,8 @@ svcauth_gss_accept_sec_context(struct svc_req *rqst,
 		/* spkm3: no src_name (anonymous) */
 		if(!g_OID_equal(gss_mech_spkm3, mech)) {
 #endif
+		    /* Release any prior name in case we get here twice. */
+		    gss_release_buffer(&min_stat, &gd->cname);
 		    maj_stat = gss_display_name(&min_stat, gd->client_name,
 					    &gd->cname, &gd->sec.mech);
 #ifdef SPKM
@@ -490,6 +495,9 @@ gssrpc__svcauth_gss(struct svc_req *rqst, struct rpc_msg *msg,
 		if (!svcauth_gss_acquire_cred(gd))
 			ret_freegc (AUTH_FAILED);
 
+		if (gd->established)
+			ret_freegc (AUTH_FAILED);
+
 		if (!svcauth_gss_accept_sec_context(rqst, &gr))
 			ret_freegc (AUTH_REJECTEDCRED);
 
_______________________________________________
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