Blame SOURCES/Prevent-KDC-unset-status-assertion-failures.patch

963210
From 3b2376b47a9f1fc7dfd138d4ecc70e5d8897dc2b Mon Sep 17 00:00:00 2001
963210
From: Greg Hudson <ghudson@mit.edu>
963210
Date: Thu, 13 Jul 2017 12:14:20 -0400
963210
Subject: [PATCH] Prevent KDC unset status assertion failures
963210
963210
Assign status values if S4U2Self padata fails to decode, if an
963210
S4U2Proxy request uses invalid KDC options, or if an S4U2Proxy request
963210
uses an evidence ticket which does not match the canonicalized request
963210
server principal name.  Reported by Samuel Cabrero.
963210
963210
If a status value is not assigned during KDC processing, default to
963210
"UNKNOWN_REASON" rather than failing an assertion.  This change will
963210
prevent future denial of service bugs due to similar mistakes, and
963210
will allow us to omit assigning status values for unlikely errors such
963210
as small memory allocation failures.
963210
963210
CVE-2017-11368:
963210
963210
In MIT krb5 1.7 and later, an authenticated attacker can cause an
963210
assertion failure in krb5kdc by sending an invalid S4U2Self or
963210
S4U2Proxy request.
963210
963210
  CVSSv3 Vector: AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H/E:H/RL:O/RC:C
963210
963210
ticket: 8599 (new)
963210
target_version: 1.15-next
963210
target_version: 1.14-next
963210
tags: pullup
963210
963210
(cherry picked from commit ffb35baac6981f9e8914f8f3bffd37f284b85970)
963210
---
963210
 src/kdc/do_as_req.c  |  4 ++--
963210
 src/kdc/do_tgs_req.c |  3 ++-
963210
 src/kdc/kdc_util.c   | 10 ++++++++--
963210
 3 files changed, 12 insertions(+), 5 deletions(-)
963210
963210
diff --git a/src/kdc/do_as_req.c b/src/kdc/do_as_req.c
963210
index 241b05b40..f5cf8ad89 100644
963210
--- a/src/kdc/do_as_req.c
963210
+++ b/src/kdc/do_as_req.c
963210
@@ -372,8 +372,8 @@ finish_process_as_req(struct as_req_state *state, krb5_error_code errcode)
963210
     did_log = 1;
963210
 
963210
 egress:
963210
-    if (errcode != 0)
963210
-        assert (state->status != 0);
963210
+    if (errcode != 0 && state->status == NULL)
963210
+        state->status = "UNKNOWN_REASON";
963210
 
963210
     au_state->status = state->status;
963210
     au_state->reply = &state->reply;
963210
diff --git a/src/kdc/do_tgs_req.c b/src/kdc/do_tgs_req.c
963210
index 4c722a4a3..0009a9319 100644
963210
--- a/src/kdc/do_tgs_req.c
963210
+++ b/src/kdc/do_tgs_req.c
963210
@@ -829,7 +829,8 @@ process_tgs_req(struct server_handle *handle, krb5_data *pkt,
963210
     free(reply.enc_part.ciphertext.data);
963210
 
963210
 cleanup:
963210
-    assert(status != NULL);
963210
+    if (status == NULL)
963210
+        status = "UNKNOWN_REASON";
963210
     if (reply_key)
963210
         krb5_free_keyblock(kdc_context, reply_key);
963210
     if (errcode)
963210
diff --git a/src/kdc/kdc_util.c b/src/kdc/kdc_util.c
963210
index 8cbdf2c5b..5455e2a67 100644
963210
--- a/src/kdc/kdc_util.c
963210
+++ b/src/kdc/kdc_util.c
963210
@@ -1213,8 +1213,10 @@ kdc_process_for_user(kdc_realm_t *kdc_active_realm,
963210
     req_data.data = (char *)pa_data->contents;
963210
 
963210
     code = decode_krb5_pa_for_user(&req_data, &for_user);
963210
-    if (code)
963210
+    if (code) {
963210
+        *status = "DECODE_PA_FOR_USER";
963210
         return code;
963210
+    }
963210
 
963210
     code = verify_for_user_checksum(kdc_context, tgs_session, for_user);
963210
     if (code) {
963210
@@ -1313,8 +1315,10 @@ kdc_process_s4u_x509_user(krb5_context context,
963210
     req_data.data = (char *)pa_data->contents;
963210
 
963210
     code = decode_krb5_pa_s4u_x509_user(&req_data, s4u_x509_user);
963210
-    if (code)
963210
+    if (code) {
963210
+        *status = "DECODE_PA_S4U_X509_USER";
963210
         return code;
963210
+    }
963210
 
963210
     code = verify_s4u_x509_user_checksum(context,
963210
                                          tgs_subkey ? tgs_subkey :
963210
@@ -1617,6 +1621,7 @@ kdc_process_s4u2proxy_req(kdc_realm_t *kdc_active_realm,
963210
      * that is validated previously in validate_tgs_request().
963210
      */
963210
     if (request->kdc_options & (NON_TGT_OPTION | KDC_OPT_ENC_TKT_IN_SKEY)) {
963210
+        *status = "INVALID_S4U2PROXY_OPTIONS";
963210
         return KRB5KDC_ERR_BADOPTION;
963210
     }
963210
 
963210
@@ -1624,6 +1629,7 @@ kdc_process_s4u2proxy_req(kdc_realm_t *kdc_active_realm,
963210
     if (!krb5_principal_compare(kdc_context,
963210
                                 server->princ, /* after canon */
963210
                                 server_princ)) {
963210
+        *status = "EVIDENCE_TICKET_MISMATCH";
963210
         return KRB5KDC_ERR_SERVER_NOMATCH;
963210
     }
963210