krb5 commit: Prevent null dereferences in kadmind server stubs

ghudson at mit.edu ghudson at mit.edu
Mon Nov 9 11:58:41 EST 2026


https://github.com/krb5/krb5/commit/407e75e927c1870161305d3288cc0205e9ff067b
commit 407e75e927c1870161305d3288cc0205e9ff067b
Author: Greg Hudson <ghudson at mit.edu>
Date:   Tue Oct 20 12:00:23 2026 -0400

    Prevent null dereferences in kadmind server stubs
    
    In server_stubs.c, when a stub function uses a policy name as
    prime_arg, check for a null value and return an error.
    
    CVE-2026-112318:
    
    The policy RPC stubs in kadmin/server/server_stubs.c in MIT Kerberos 5
    (aka krb5) 1.5.3 and later do not reject a NULL policy name decoded by
    xdr_nullstring(), which allows remote authenticated users to cause a
    denial of service (kadmind crash via NULL pointer dereference) by
    sending a policy request with an empty policy name that reaches
    authorization checks or logging code.
    
    ticket: 9265 (new)
    tags: pullup
    target_version: 1.22-next

 src/kadmin/server/server_stubs.c | 30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/src/kadmin/server/server_stubs.c b/src/kadmin/server/server_stubs.c
index 7fd980794..e36c91322 100644
--- a/src/kadmin/server/server_stubs.c
+++ b/src/kadmin/server/server_stubs.c
@@ -1261,6 +1261,10 @@ create_policy_2_svc(cpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
         goto exit_func;
 
     prime_arg = arg->rec.policy;
+    if (prime_arg == NULL) {
+        ret->code = EINVAL;
+        goto exit_func;
+    }
 
     if (CHANGEPW_SERVICE(rqstp) ||
         !stub_auth_pol(handle, OP_ADDPOL, arg->rec.policy,
@@ -1274,8 +1278,7 @@ create_policy_2_svc(cpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
         if (ret->code != 0)
             errmsg = krb5_get_error_message(handle->context, ret->code);
 
-        log_done("kadm5_create_policy",
-                 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
+        log_done("kadm5_create_policy", prime_arg, errmsg,
                  &client_name, &service_name, rqstp);
 
         if (errmsg != NULL)
@@ -1303,6 +1306,10 @@ delete_policy_2_svc(dpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
         goto exit_func;
 
     prime_arg = arg->name;
+    if (prime_arg == NULL) {
+        ret->code = EINVAL;
+        goto exit_func;
+    }
 
     if (CHANGEPW_SERVICE(rqstp) ||
         !stub_auth(handle, OP_DELPOL, NULL, NULL, arg->name, NULL)) {
@@ -1314,8 +1321,7 @@ delete_policy_2_svc(dpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
         if (ret->code != 0)
             errmsg = krb5_get_error_message(handle->context, ret->code);
 
-        log_done("kadm5_delete_policy",
-                 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
+        log_done("kadm5_delete_policy", prime_arg, errmsg,
                  &client_name, &service_name, rqstp);
 
         if (errmsg != NULL)
@@ -1343,6 +1349,10 @@ modify_policy_2_svc(mpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
         goto exit_func;
 
     prime_arg = arg->rec.policy;
+    if (prime_arg == NULL) {
+        ret->code = EINVAL;
+        goto exit_func;
+    }
 
     if (CHANGEPW_SERVICE(rqstp) ||
         !stub_auth_pol(handle, OP_MODPOL, arg->rec.policy,
@@ -1355,8 +1365,7 @@ modify_policy_2_svc(mpol_arg *arg, generic_ret *ret, struct svc_req *rqstp)
         if (ret->code != 0)
             errmsg = krb5_get_error_message(handle->context, ret->code);
 
-        log_done("kadm5_modify_policy",
-                 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
+        log_done("kadm5_modify_policy", prime_arg, errmsg,
                  &client_name, &service_name, rqstp);
 
         if (errmsg != NULL)
@@ -1390,6 +1399,10 @@ get_policy_2_svc(gpol_arg *arg, gpol_ret *ret, struct svc_req *rqstp)
     funcname = "kadm5_get_policy";
 
     prime_arg = arg->name;
+    if (prime_arg == NULL) {
+        ret->code = EINVAL;
+        goto exit_func;
+    }
 
     /* Look up the client principal's policy value. */
     ret2 = kadm5_get_principal(handle->lhandle, handle->current_caller,
@@ -1408,9 +1421,8 @@ get_policy_2_svc(gpol_arg *arg, gpol_ret *ret, struct svc_req *rqstp)
         if (ret->code != 0)
             errmsg = krb5_get_error_message(handle->context, ret->code);
 
-        log_done(funcname,
-                 ((prime_arg == NULL) ? "(null)" : prime_arg), errmsg,
-                 &client_name, &service_name, rqstp);
+        log_done(funcname, prime_arg, errmsg, &client_name, &service_name,
+                 rqstp);
         if (errmsg != NULL)
             krb5_free_error_message(handle->context, errmsg);
     }


More information about the cvs-krb5 mailing list