|
|
d283c7 |
From 7aea9fc73fb508e3168581990eb2e2ff7a1aea31 Mon Sep 17 00:00:00 2001
|
|
|
d283c7 |
From: Isaac Boukris <iboukris@gmail.com>
|
|
|
d283c7 |
Date: Mon, 9 Mar 2020 16:04:21 +0100
|
|
|
d283c7 |
Subject: [PATCH] Implement KERB_AP_OPTIONS_CBT (server side)
|
|
|
d283c7 |
|
|
|
d283c7 |
Add server support for Microsoft's KERB_AP_OPTIONS_CBT as described in
|
|
|
d283c7 |
MS-KILE. If the client includes the AP option in the authenticator
|
|
|
d283c7 |
authdata and the server passed channel bindings, require the bindings
|
|
|
d283c7 |
to match.
|
|
|
d283c7 |
|
|
|
d283c7 |
[ghudson@mit.edu: refactored to put more logic in the helper function;
|
|
|
d283c7 |
added a comment; clarified commit message]
|
|
|
d283c7 |
|
|
|
d283c7 |
ticket: 8900 (new)
|
|
|
d283c7 |
(cherry picked from commit 4f7c77b64a048ca5e3199b26b31493698c777a9c)
|
|
|
d283c7 |
(cherry picked from commit 6407bf087fe53088d91efd09df736e979cd4e8db)
|
|
|
d283c7 |
---
|
|
|
d283c7 |
src/include/krb5/krb5.hin | 1 +
|
|
|
d283c7 |
src/lib/gssapi/krb5/accept_sec_context.c | 45 +++++++++++++++++++++++-
|
|
|
d283c7 |
2 files changed, 45 insertions(+), 1 deletion(-)
|
|
|
d283c7 |
|
|
|
d283c7 |
diff --git a/src/include/krb5/krb5.hin b/src/include/krb5/krb5.hin
|
|
|
d283c7 |
index f8269fb17..9264bede1 100644
|
|
|
d283c7 |
--- a/src/include/krb5/krb5.hin
|
|
|
d283c7 |
+++ b/src/include/krb5/krb5.hin
|
|
|
d283c7 |
@@ -1915,6 +1915,7 @@ krb5_verify_checksum(krb5_context context, krb5_cksumtype ctype,
|
|
|
d283c7 |
#define KRB5_AUTHDATA_SIGNTICKET 512 /**< formerly 142 in krb5 1.8 */
|
|
|
d283c7 |
#define KRB5_AUTHDATA_FX_ARMOR 71
|
|
|
d283c7 |
#define KRB5_AUTHDATA_AUTH_INDICATOR 97
|
|
|
d283c7 |
+#define KRB5_AUTHDATA_AP_OPTIONS 143
|
|
|
d283c7 |
/** @} */ /* end of KRB5_AUTHDATA group */
|
|
|
d283c7 |
|
|
|
d283c7 |
/* password change constants */
|
|
|
d283c7 |
diff --git a/src/lib/gssapi/krb5/accept_sec_context.c b/src/lib/gssapi/krb5/accept_sec_context.c
|
|
|
d283c7 |
index 9d3e2f4fe..175a24c4e 100644
|
|
|
d283c7 |
--- a/src/lib/gssapi/krb5/accept_sec_context.c
|
|
|
d283c7 |
+++ b/src/lib/gssapi/krb5/accept_sec_context.c
|
|
|
d283c7 |
@@ -430,6 +430,32 @@ kg_process_extension(krb5_context context,
|
|
|
d283c7 |
/* A zero-value channel binding, for comparison */
|
|
|
d283c7 |
static const uint8_t null_cb[CB_MD5_LEN];
|
|
|
d283c7 |
|
|
|
d283c7 |
+/* Look for AP_OPTIONS in authdata. If present and the options include
|
|
|
d283c7 |
+ * KERB_AP_OPTIONS_CBT, set *cbt_out to true. */
|
|
|
d283c7 |
+static krb5_error_code
|
|
|
d283c7 |
+check_cbt(krb5_context context, krb5_authdata **authdata,
|
|
|
d283c7 |
+ krb5_boolean *cbt_out)
|
|
|
d283c7 |
+{
|
|
|
d283c7 |
+ krb5_error_code code;
|
|
|
d283c7 |
+ uint32_t ad_ap_options;
|
|
|
d283c7 |
+ const uint32_t KERB_AP_OPTIONS_CBT = 0x4000;
|
|
|
d283c7 |
+
|
|
|
d283c7 |
+ *cbt_out = FALSE;
|
|
|
d283c7 |
+
|
|
|
d283c7 |
+ code = krb5_find_authdata(context, NULL, authdata,
|
|
|
d283c7 |
+ KRB5_AUTHDATA_AP_OPTIONS, &authdata);
|
|
|
d283c7 |
+ if (code || authdata == NULL)
|
|
|
d283c7 |
+ return code;
|
|
|
d283c7 |
+ if (authdata[1] != NULL || authdata[0]->length != 4)
|
|
|
d283c7 |
+ return KRB5KRB_AP_ERR_MSG_TYPE;
|
|
|
d283c7 |
+
|
|
|
d283c7 |
+ ad_ap_options = load_32_le(authdata[0]->contents);
|
|
|
d283c7 |
+ if (ad_ap_options & KERB_AP_OPTIONS_CBT)
|
|
|
d283c7 |
+ *cbt_out = TRUE;
|
|
|
d283c7 |
+
|
|
|
d283c7 |
+ return 0;
|
|
|
d283c7 |
+}
|
|
|
d283c7 |
+
|
|
|
d283c7 |
/*
|
|
|
d283c7 |
* The krb5 GSS mech appropriates the authenticator checksum field from RFC
|
|
|
d283c7 |
* 4120 to store structured data instead of a checksum, indicated with checksum
|
|
|
d283c7 |
@@ -454,7 +480,7 @@ process_checksum(OM_uint32 *minor_status, krb5_context context,
|
|
|
d283c7 |
krb5_error_code code = 0;
|
|
|
d283c7 |
OM_uint32 status, option_id, token_flags;
|
|
|
d283c7 |
size_t cb_len, option_len;
|
|
|
d283c7 |
- krb5_boolean valid, token_cb_present = FALSE, cb_match = FALSE;
|
|
|
d283c7 |
+ krb5_boolean valid, client_cbt, token_cb_present = FALSE, cb_match = FALSE;
|
|
|
d283c7 |
krb5_key subkey;
|
|
|
d283c7 |
krb5_data option, empty = empty_data();
|
|
|
d283c7 |
krb5_checksum cb_cksum;
|
|
|
d283c7 |
@@ -582,6 +608,23 @@ process_checksum(OM_uint32 *minor_status, krb5_context context,
|
|
|
d283c7 |
}
|
|
|
d283c7 |
}
|
|
|
d283c7 |
|
|
|
d283c7 |
+ /*
|
|
|
d283c7 |
+ * If the client asserts the KERB_AP_OPTIONS_CBT flag (from MS-KILE) in the
|
|
|
d283c7 |
+ * authenticator authdata, and the acceptor passed channel bindings,
|
|
|
d283c7 |
+ * require matching channel bindings from the client. The intent is to
|
|
|
d283c7 |
+ * prevent an authenticator generated for use outside of a TLS channel from
|
|
|
d283c7 |
+ * being used inside of one.
|
|
|
d283c7 |
+ */
|
|
|
d283c7 |
+ code = check_cbt(context, authenticator->authorization_data, &client_cbt);
|
|
|
d283c7 |
+ if (code) {
|
|
|
d283c7 |
+ status = GSS_S_FAILURE;
|
|
|
d283c7 |
+ goto fail;
|
|
|
d283c7 |
+ }
|
|
|
d283c7 |
+ if (client_cbt && acceptor_cb != GSS_C_NO_CHANNEL_BINDINGS && !cb_match) {
|
|
|
d283c7 |
+ status = GSS_S_BAD_BINDINGS;
|
|
|
d283c7 |
+ goto fail;
|
|
|
d283c7 |
+ }
|
|
|
d283c7 |
+
|
|
|
d283c7 |
status = GSS_S_COMPLETE;
|
|
|
d283c7 |
|
|
|
d283c7 |
fail:
|