aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2015-11-01 22:46:56 -0500
committerTom Yu <tlyu@mit.edu>2015-12-09 17:34:20 -0500
commit04d0faa8cf9548eddcf9e2d893fc52d57f7b7531 (patch)
treed3b253e350c66d0e4ece0d8323703db342e57d80
parent683f330bd8c3f7159a61a8234b99c4d073de1ae0 (diff)
downloadkrb5-04d0faa8cf9548eddcf9e2d893fc52d57f7b7531.zip
krb5-04d0faa8cf9548eddcf9e2d893fc52d57f7b7531.tar.gz
krb5-04d0faa8cf9548eddcf9e2d893fc52d57f7b7531.tar.bz2
Fix SPNEGO context import
The patches for CVE-2015-2695 did not implement a SPNEGO gss_import_sec_context() function, under the erroneous belief that an exported SPNEGO context would be tagged with the underlying context mechanism. Implement it now to allow SPNEGO contexts to be successfully exported and imported after establishment. (cherry picked from commit 222b09f6e2f536354555f2a0dedfe29fc10c01d6) ticket: 8316 version_fixed: 1.12.5 status: resolved
-rw-r--r--src/lib/gssapi/spnego/spnego_mech.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/lib/gssapi/spnego/spnego_mech.c b/src/lib/gssapi/spnego/spnego_mech.c
index 35c1c25..75ae2d8 100644
--- a/src/lib/gssapi/spnego/spnego_mech.c
+++ b/src/lib/gssapi/spnego/spnego_mech.c
@@ -2218,12 +2218,33 @@ spnego_gss_import_sec_context(
const gss_buffer_t interprocess_token,
gss_ctx_id_t *context_handle)
{
- /*
- * Until we implement partial context exports, there are no SPNEGO
- * exported context tokens, only tokens for underlying mechs. So just
- * return an error for now.
- */
- return GSS_S_UNAVAILABLE;
+ OM_uint32 ret, tmpmin;
+ gss_ctx_id_t mctx;
+ spnego_gss_ctx_id_t sc;
+ int initiate, opened;
+
+ ret = gss_import_sec_context(minor_status, interprocess_token, &mctx);
+ if (ret != GSS_S_COMPLETE)
+ return ret;
+
+ ret = gss_inquire_context(&tmpmin, mctx, NULL, NULL, NULL, NULL, NULL,
+ &initiate, &opened);
+ if (ret != GSS_S_COMPLETE || !opened) {
+ /* We don't currently support importing partially established
+ * contexts. */
+ (void) gss_delete_sec_context(&tmpmin, &mctx, GSS_C_NO_BUFFER);
+ return GSS_S_FAILURE;
+ }
+
+ sc = create_spnego_ctx(initiate);
+ if (sc == NULL) {
+ (void) gss_delete_sec_context(&tmpmin, &mctx, GSS_C_NO_BUFFER);
+ return GSS_S_FAILURE;
+ }
+ sc->ctx_handle = mctx;
+ sc->opened = 1;
+ *context_handle = (gss_ctx_id_t)sc;
+ return GSS_S_COMPLETE;
}
#endif /* LEAN_CLIENT */