[krbdev.mit.edu #8782] gss_accept_sec_context() SPNEGO-wrapped src_name interacts badly with gss_localname()
Greg Hudson via RT
rt-comment at KRBDEV-PROD-APP-1.mit.edu
Fri Feb 8 14:01:23 EST 2019
After successfully establishing a SPNEGO context,
gss_accept_sec_context() returns GSS_S_COMPLETE to the caller with
*mech_type set to the underlying mech OID (not SPNEGO) and *src_name
set to a union name containing a SPNEGO MN. (SPNEGO just stores a
union name as its internal name, so the mech_name field inside the
mechglue's union name is another union name containing an MN for the
underlying mech.)
For the most part this inconsistency is invisible to the caller.
gss_display_name(), gss_inquire_name(), gss_export_name(), and
gss_get_name_attribute() will all be passed through by SPNEGO. Even
the mech_MN reported by gss_inquire_name() will be the underlying
mech.
gss_localname() (based on the Solaris gssd_pname_to_uid()) accepts a
mech parameter--presumably the intent is to allow the caller to ask
for the local name of a non-MN. If the caller provides the mech
returned by gss_accept_sec_context(), the mechglue will notice the
mismatch and will attempt to re-canonicalize the name for the
underlying mech; the conversion process might lose some information
about the name. (As an example, while the mechglue tries to preserve
name attributes across the conversion, the mech may not accept the
gss_set_name_attribute() calls. This was observed with the EAP
mechanism in
https://github.com/modauthgssapi/mod_auth_gssapi/pull/195 .)
Also, SPNEGO doesn't currently implement a passthrough for
gss_localname(), so even if the caller doesn't pass a mech OID,
SPNEGO will force the mechglue to fall back to attributes for getting
the local name.
The mechglue gss_accept_sec_context() has a special case for
*delegated_cred_handle: if the mech returns a different actual_mech
than the mech's own OID, gss_accept_context() will assume that the
delegated cred handle is a union cred and won't wrap it. We could do
the same for *src_name.
Nico suggests adding explicit unwrapping functions to the SPI (here
is a name/context/cred; give me the underlying union
name/context/cred or fail if it's not a simple wrapping). If we did
that then we wouldn't be making as many assumptions about mech
implementations which return actual_mech values different from their
own OIDs, at the expense of more code.
More information about the krb5-bugs
mailing list