pull up r23724 from trunk
authorTom Yu <tlyu@mit.edu>
Wed, 17 Feb 2010 05:11:45 +0000 (05:11 +0000)
committerTom Yu <tlyu@mit.edu>
Wed, 17 Feb 2010 05:11:45 +0000 (05:11 +0000)
 ------------------------------------------------------------------------
 r23724 | tlyu | 2010-02-16 17:10:17 -0500 (Tue, 16 Feb 2010) | 10 lines

 ticket: 6662
 subject: MITKRB5-SA-2010-001 CVE-2010-0283 KDC denial of service
 tags: pullup
 target_version: 1.8

 Code introduced in krb5-1.7 can cause an assertion failure if a
 KDC-REQ is internally inconsistent, specifically if the ASN.1 tag
 doesn't match the msg_type field.  Thanks to Emmanuel Bouillon (NATO
 C3 Agency) for discovering and reporting this vulnerability.

ticket: 6664
version_fixed: 1.7.2
status: resolved

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-7@23731 dc483132-0cff-0310-8789-dd5450dbe970

src/kdc/do_as_req.c
src/kdc/do_tgs_req.c
src/kdc/fast_util.c

index 52fbda5d606798ebb0c0e0b9f3ade88b7dbd1008..680e6a192700ed7ad218ae7e0932488347b7245e 100644 (file)
@@ -137,6 +137,11 @@ process_as_req(krb5_kdc_req *request, krb5_data *req_pkt,
     session_key.contents = 0;
     enc_tkt_reply.authorization_data = NULL;
 
+    if (request->msg_type != KRB5_AS_REQ) {
+        status = "msg_type mismatch";
+        errcode = KRB5_BADMSGTYPE;
+        goto errout;
+    }
     errcode = kdc_make_rstate(&state);
     if (errcode != 0) {
        status = "constructing state";
index 12180ff93afbb5ba84bc3f5877c9142d61be4adf..c8cf69286fa3bca1c2c3d170de7baead3a1b1000 100644 (file)
@@ -135,6 +135,8 @@ process_tgs_req(krb5_data *pkt, const krb5_fulladdr *from,
     retval = decode_krb5_tgs_req(pkt, &request);
     if (retval)
         return retval;
+    if (request->msg_type != KRB5_TGS_REQ)
+        return KRB5_BADMSGTYPE;
 
     /*
      * setup_server_realm() sets up the global realm-specific data pointer.
index d88e0cb217bdb910cc4c71bf23ab641a36aef1e6..2639047df7d371d666a544cabb89b9ac4e0c5a26 100644 (file)
@@ -384,7 +384,7 @@ krb5_error_code kdc_fast_handle_error
     krb5_data *encoded_e_data = NULL;
 
     memset(outer_pa, 0, sizeof(outer_pa));
-    if (!state->armor_key)
+    if (!state || !state->armor_key)
        return 0;
     fx_error = *err;
     fx_error.e_data.data = NULL;