From: Tom Yu Date: Wed, 17 Feb 2010 05:11:45 +0000 (+0000) Subject: pull up r23724 from trunk X-Git-Tag: krb5-1.7.2-final~14 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=59a78125dddb9ae721502a08890ba621466d6865;p=krb5.git pull up r23724 from trunk ------------------------------------------------------------------------ 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 --- diff --git a/src/kdc/do_as_req.c b/src/kdc/do_as_req.c index 52fbda5d6..680e6a192 100644 --- a/src/kdc/do_as_req.c +++ b/src/kdc/do_as_req.c @@ -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"; diff --git a/src/kdc/do_tgs_req.c b/src/kdc/do_tgs_req.c index 12180ff93..c8cf69286 100644 --- a/src/kdc/do_tgs_req.c +++ b/src/kdc/do_tgs_req.c @@ -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. diff --git a/src/kdc/fast_util.c b/src/kdc/fast_util.c index d88e0cb21..2639047df 100644 --- a/src/kdc/fast_util.c +++ b/src/kdc/fast_util.c @@ -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;