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

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

krb5 commit [krb5-1.22]: Prevent null dereference in PKINIT CMS

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

From: ghudson@mit.edu
To: cvs-krb5@mit.edu
Message-Id: <20261109170036.05E9F102E40@krbdev.mit.edu>
Date: Mon,  9 Nov 2026 12:00:36 -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/1b3a8db6567ff840b3cda173c9f0a9802b5fef8e
commit 1b3a8db6567ff840b3cda173c9f0a9802b5fef8e
Author: Greg Hudson <ghudson@mit.edu>
Date:   Sun Aug 2 21:44:11 2026 -0400

    Prevent null dereference in PKINIT CMS processing
    
    In cms_signeddata_verify(), where we use CMS_get0_content(), check
    that the dereferenced result is non-null as well as the result itself.
    (The result itself is a pointer to the eContent slot, whether or not
    the decoded ASN.1 value contained an eContent field, and will only be
    null if the CMS_ContentInfo object has an unexpected type.)
    
    CVE-2026-71200:
    
    If a KDC is configured to allow PKINIT authentication, an
    unauthenticated attacker can trigger a null pointer dereference,
    causing the process to terminate.  Discovered by Claude and Ada
    Logics, and independently by Erin Liman using DeepSeek.
    
    (cherry picked from commit 6a5d772002c1764bd14934ccb6684f0cce15d617)
    
    ticket: 9227
    version_fixed: 1.22.3

 src/plugins/preauth/pkinit/pkinit_crypto_openssl.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
index 7d0545419..2fbda32de 100644
--- a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
+++ b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
@@ -2030,7 +2030,8 @@ cms_signeddata_verify(krb5_context context,
         unsigned char *d;
         *is_signed = 0;
         octets = CMS_get0_content(cms);
-        if (!octets || (ASN1_STRING_type(*octets) != V_ASN1_OCTET_STRING)) {
+        if (octets == NULL || *octets == NULL ||
+            (ASN1_STRING_type(*octets) != V_ASN1_OCTET_STRING)) {
             retval = KRB5KDC_ERR_PREAUTH_FAILED;
             krb5_set_error_message(context, retval,
                                    _("Invalid pkinit packet: octet string "
@@ -2085,9 +2086,10 @@ cms_signeddata_verify(krb5_context context,
         *is_signed = 0;
         /* We cannot use CMS_dataInit because there may be no digest */
         octets = CMS_get0_content(cms);
-        if (octets)
+        if (octets != NULL && *octets != NULL) {
             out = BIO_new_mem_buf(ASN1_STRING_get0_data(*octets),
                                   ASN1_STRING_length(*octets));
+        }
         if (out == NULL)
             goto cleanup;
     } else {
_______________________________________________
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