]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Fix KDC heap corruption vuln [CVE-2012-1015]
authorTom Yu <tlyu@mit.edu>
Wed, 1 Aug 2012 02:45:08 +0000 (22:45 -0400)
committerTom Yu <tlyu@mit.edu>
Wed, 1 Aug 2012 17:42:26 +0000 (13:42 -0400)
Fix KDC heap corruption vulnerability [MITKRB5-SA-2012-001
CVE-2012-1015].  The cleanup code in
kdc_handle_protected_negotiation() in kdc_util.c could free an
uninitialized pointer in some error conditions involving "similar"
enctypes and a failure in krb5_c_make_checksum().

Additionally, adjust the handling of "similar" enctypes to avoid
advertising enctypes that could lead to inadvertent triggering of this
vulnerability (possibly in unpatched KDCs).

Note that CVE-2012-1014 (also described in MITKRB5-SA-2012-001) only
applies to the krb5-1.10 branch and doesn't affect the master branch
or releases prior to krb5-1.10.

ticket: 7225 (new)
target_version: 1.9.5
tags: pullup

src/kdc/kdc_preauth.c
src/kdc/kdc_util.c
src/lib/kdb/kdb_default.c

index 7cc0ccb28a94c9073cf05781c942b9984b6a8213..5ca36769d106eab16d9c2ffd7bdd862c051e8aed 100644 (file)
@@ -1375,7 +1375,8 @@ etype_info_helper(krb5_context context, krb5_kdc_req *request,
                 continue;
 
             }
-            if (request_contains_enctype(context, request, db_etype)) {
+            if (krb5_is_permitted_enctype(context, db_etype) &&
+                request_contains_enctype(context, request, db_etype)) {
                 retval = _make_etype_info_entry(context, client->princ,
                                                 client_key, db_etype,
                                                 &entry[i], etype_info2);
index d3babe7f9f83a518561cbf0b74c1783fe30550d7..a2a9b4b07834daa7f1719162d1df78946d1deb36 100644 (file)
@@ -2490,6 +2490,7 @@ kdc_handle_protected_negotiation(krb5_data *req_pkt, krb5_kdc_req *request,
         return 0;
     pa.magic = KV5M_PA_DATA;
     pa.pa_type = KRB5_ENCPADATA_REQ_ENC_PA_REP;
+    memset(&checksum, 0, sizeof(checksum));
     retval = krb5_c_make_checksum(kdc_context,0, reply_key,
                                   KRB5_KEYUSAGE_AS_REQ, req_pkt, &checksum);
     if (retval != 0)
index cdb9dccb28a60c9621a9a90db05dee336758e1da..ee01d9d21c8dce2edad8a0e5948b0777214455dd 100644 (file)
@@ -61,6 +61,9 @@ krb5_dbe_def_search_enctype(kcontext, dbentp, start, ktype, stype, kvno, kdatap)
     krb5_boolean        saw_non_permitted = FALSE;
 
     ret = 0;
+    if (ktype != -1 && !krb5_is_permitted_enctype(kcontext, ktype))
+        return KRB5_KDB_NO_PERMITTED_KEY;
+
     if (kvno == -1 && stype == -1 && ktype == -1)
         kvno = 0;