Re: NegoEx broke GSSAPI in BIND 9

Ondřej Surý <[email protected]>
Newsgroups gmane.comp.encryption.kerberos.devel
Message-ID <[email protected]>
The gssapictx.c is dated 2000 :-), so I am not sure if anybody remembers
what we want :-) apart from implementing RFC 3645 which says:

— cut here —
   The GSS API using SPNEGO [RFC2478] provides maximum flexibility to
   choose the underlying security mechanisms that enables security
   context negotiation.  GSS API using SPNEGO [RFC2478] enables client
   and server to negotiate and choose such underlying security
   mechanisms on the fly.  To support such flexibility, DNS clients and
   servers SHOULD specify SPNEGO mech_type in their GSS API calls.  At
   the same time, in order to guarantee interoperability between DNS
   clients and servers that support GSS-TSIG it is required that

   -  DNS servers specify SPNEGO mech_type
   -  GSS APIs called by DNS client support Kerberos v5
   -  GSS APIs called by DNS server support SPNEGO [RFC2478] and
      Kerberos v5.

   In addition to these, GSS APIs used by DNS client and server MAY also
   support other underlying security mechanisms.
— cut here —

So, what you are saying makes actually vague sense to me.  What I actually
think is that we just want to use SPNEGO and don’t limit the mechanisms.

At the same time, I am still puzzled why it stopped working when NegoEx
was added to krb5.

Thank you very much,
Ondrej
--
Ondřej Surý
[email protected]

> On 20 May 2020, at 16:05, Simo Sorce <[email protected]> wrote:
> 
> 
> The mechanism list you create for gss_acquire_cred looks somewhat wrong
> to me.
> 
> If you want to perform SPNEGO authentication but limit SPNEGO to allow
> only the krb5 mechanism you should acquire creds specifying only the
> SPNEGO oid.
> 
> Then you should use the gss_set_neg_mechs() call on the credentials
> obtained and specify the krb5 mech oid only.
> 
> This means:
> - 1) obtain credentials for any mechanism that SPNEGO can handle.
> - 2) make sure only krb5 is used by SPNEGO
> 
> What you are doing now is to get a set of credentials for raw krb5 as
> well as all other mechanisms under SPNEGO. I am not sure this is what
> you want.
> 
> --
> Simo Sorce
> RHEL Crypto Team
> Red Hat, Inc
> 
> 
> 
> 
> On Wed, 2020-05-20 at 11:34 +0200, Ondřej Surý wrote:
>> Hi,
>> 
>> there’s a regression in krb5 1.18.x that broke SPNEGO usage in BIND 9.
>> 
>> There’s a little bit of history there - historically BIND 9 used internal implementation
>> of SPNEGO and that still works.  But in the development version, I did drop the
>> internal implementation in favor of using KRB5 SPNEGO mechanism implementation.
>> 
>> We don’t do anything fancy, the code is basically:
>> 
>> #ifndef GSS_KRB5_MECHANISM
>> static unsigned char krb5_mech_oid_bytes[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7,
>>                                              0x12, 0x01, 0x02, 0x02 };
>> static gss_OID_desc __gss_krb5_mechanism_oid_desc = {
>>       sizeof(krb5_mech_oid_bytes), krb5_mech_oid_bytes
>> };
>> #define GSS_KRB5_MECHANISM (&__gss_krb5_mechanism_oid_desc)
>> #endif /* ifndef GSS_KRB5_MECHANISM */
>> 
>> #ifndef GSS_SPNEGO_MECHANISM
>> static unsigned char spnego_mech_oid_bytes[] = { 0x2b, 0x06, 0x01,
>>                                                0x05, 0x05, 0x02 };
>> static gss_OID_desc __gss_spnego_mechanism_oid_desc = {
>>       sizeof(spnego_mech_oid_bytes), spnego_mech_oid_bytes
>> };
>> #define GSS_SPNEGO_MECHANISM (&__gss_spnego_mechanism_oid_desc)
>> #endif /* ifndef GSS_SPNEGO_MECHANISM */
>> 
>> […]
>> 
>> static OM_uint32
>> mech_oid_set_create(OM_uint32 *minor, gss_OID_set *mech_oid_set) {
>>       OM_uint32 gret;
>> 
>>       gret = gss_create_empty_oid_set(minor, mech_oid_set);
>>       if (gret != GSS_S_COMPLETE) {
>>               return (gret);
>>       }
>> 
>>       gret = gss_add_oid_set_member(minor, GSS_KRB5_MECHANISM, mech_oid_set);
>>       if (gret != GSS_S_COMPLETE) {
>>               goto release;
>>       }
>> 
>>       gret = gss_add_oid_set_member(minor, GSS_SPNEGO_MECHANISM,
>>                                     mech_oid_set);
>>       if (gret != GSS_S_COMPLETE) {
>>               goto release;
>>       }
>> 
>> release:
>>       REQUIRE(gss_release_oid_set(minor, mech_oid_set) == GSS_S_COMPLETE);
>> 
>>       return (gret);
>> }
>> 
>> static void
>> mech_oid_set_release(gss_OID_set *mech_oid_set) {
>>       OM_uint32 minor;
>> 
>>       REQUIRE(gss_release_oid_set(&minor, mech_oid_set) == GSS_S_COMPLETE);
>> }
>> 
>> and then it’s used like this:
>> 
>>       gss_OID_set mech_oid_set;
>> 
>> […]
>> 
>>       gret = mech_oid_set_create(&minor, &mech_oid_set);
>>       if (gret != GSS_S_COMPLETE) {
>>               gss_log(3, "failed to create OID_set: %s",
>>                       gss_error_tostring(gret, minor, buf, sizeof(buf)));
>>               return (ISC_R_FAILURE);
>>       }
>> 
>>       gret = gss_acquire_cred(&minor, gname, GSS_C_INDEFINITE, mech_oid_set,
>>                               usage, cred, NULL, &lifetime);
>> 
>> 
>> Unfortunately, this stopped working since 1.18.1, but perhaps we were doing something
>> wrong from the beginning. Honestly, looking at the GSSAPI is like reading tea leaves :-),
>> so I would appreciate if I can get some pointers where to start with the debugging.
>> 
>> The code is working in 1.17.1 and it’s neither working in 1.18.1 nor master branch (I saw
>> some fixes in there, so I tried).
>> 
>> Thanks,
>> Ondrej
>> --
>> Ondřej Surý
>> [email protected]
>> 
>> _______________________________________________
>> krbdev mailing list             [email protected]
>> https://mailman.mit.edu/mailman/listinfo/krbdev
>

_______________________________________________
krbdev mailing list             [email protected]
https://mailman.mit.edu/mailman/listinfo/krbdev
signature.asc (application/pgp-signature, 963 B)
-----BEGIN PGP SIGNATURE-----

iQKTBAEBCgB9FiEEw2Gx4wKVQ+vGJel9g3Kkd++uWcIFAl7FPrVfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEMz
NjFCMUUzMDI5NTQzRUJDNjI1RTk3RDgzNzJBNDc3RUZBRTU5QzIACgkQg3Kkd++u
WcIXzw//XMLeqYCd5IgoLgEQGn2QGJtnubl9cyb6aufIIqTiNNumETtUpwb4gn5f
gmje9ej3RDssTBk2YdZ93ZQVHkuWcVUMHBnxfBcfY3IbyhpgaDm1d/l2pqgudKfX
YFB9k8WllR5+QSLL1RBsX3OU3dTjbC3m4wsbkTtRyVYwyCVvseB8+a0/ztUAXL6c
iC6l5H3tNheybQBRrMsJQwwjUdRIfE6+LGsS2V9gPMXxCNkA0h7I2r67ANr62Wes
9X97970zt1q15EupjGAAbLotVaucwgfzDgMXo7l70mNmuI69KcwtyFIdnHQpB/y9
UC0qwxj0l18nWyGjRrV5lwSB2kYa6d1Z457X7A2qd5tcGYFeEbf1jl+dhdb2NRUL
BoDP9s9tYbCdEhuvRlK9T9r0B/pyf+W+2+hfqLcSvklb5Lfum7mHHLwmaxkEgymr
DkBZUI4xbQjNcPvfCpXEMP2BDH9nYjXS0tQWtAizkaJlHQ9z85WeZRFlzVa97pEJ
axiMri50898wXkbsiIhVPxnjwlFFhElNuGqdniSa8EL+JBGSGXEa775wixJNPPr3
f9vagNqutrpSYRSDE34hk3KW4WwbMkzan2GdS5fKv8P/L9NINEasFvBM9vxku7kC
BNefhbHT9hoyTVyHLLAjAZzFPXG0bqszAWt6zFWu0+Pa+huXiHo=
=WQT1
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.