NegoEx broke GSSAPI in BIND 9
Ondřej Surý
ondrej at isc.org
Wed May 20 10:29:09 EDT 2020
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ý
ondrej at isc.org
> On 20 May 2020, at 16:05, Simo Sorce <simo at redhat.com> 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ý
>> ondrej at isc.org
>>
>> _______________________________________________
>> krbdev mailing list krbdev at mit.edu
>> https://mailman.mit.edu/mailman/listinfo/krbdev
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 963 bytes
Desc: Message signed with OpenPGP
Url : http://mailman.mit.edu/pipermail/krbdev/attachments/20200520/e38f97d0/attachment.bin
More information about the krbdev
mailing list