Kerberos 1.7 and later does not interoperate with AD Read-only DCs
Adam Bernstein
abernstein at beyondtrust.com
Tue Feb 21 13:41:41 EST 2012
On 02/21/2012 10:10 AM, Greg Hudson wrote:
> On 02/20/2012 09:54 PM, Adam Bernstein wrote:
>> Interestingly, this problem does not reproduce using Kerberos 1.6.
> In krb5 1.6 we encode by casting the kvno value (an unsigned int) to
> int, then encode it as a signed value. There is a comment saying
> "krb5_kvno should be int". We decode this field as a signed long and
> then cast the result to an unsigned int. (That means we reject
> RFC4120-conformant kvno values>= 0x80000000 on platforms where long is
> 32-bit.)
>
> In krb5 1.7-1.10, as you noted, the encoder treats the field as an
> unsigned 32-bit integer, which conforms better to RFC 4120 but generates
> TGS requests which don't interoperate with RODCs using RodcIDs>=
> 0x8000. The decoder behavior hasn't changed.
>
> In the trunk, we encode and decode the kvno value as unsigned 32-bit
> numbers, which means we would probably reject the AS reply from an RODC
> with RodcID>= 0x8000.
>
> I think the most practical solution is to restore the 1.6 behavior,
> treating kvno as a signed 32-bit value when encoding and decoding.
> Although this conflicts with RFC 4120, I think RODCs are the only case
> where kvno values that large are likely to appear in the wild. If
> you're in a position to test patches, I will run them by you.
Yes, we have a Read-write/read-only DC configuration we can use for
testing. I've pulled Kerberos 1.10 and built that to verify the behavior
is the same in this case as 1.7. I can easily apply a patch to Kerberos
and verify the patch works with the RODC.
Our short-term solution to this issue was to make the following change
to asn1_k_encode.c:
Index: src/lib/krb5/asn.1/asn1_k_encode.c
===================================================================
--- src/lib/krb5/asn.1/asn1_k_encode.c (revision 63560)
+++ src/lib/krb5/asn.1/asn1_k_encode.c (revision 63561)
@@ -146,7 +146,7 @@ optional_encrypted_data (const void *vptr)
static const struct field_info encrypted_data_fields[] = {
FIELDOF_NORM(krb5_enc_data, int32, enctype, 0),
- FIELDOF_OPT(krb5_enc_data, uint, kvno, 1, 1),
+ FIELDOF_OPT(krb5_enc_data, int32, kvno, 1, 1),
FIELDOF_NORM(krb5_enc_data, ostring_data, ciphertext, 2),
};
Adam
>
> (As an aside, Heimdal appears to treat the EncryptedData kvno field as
> unsigned 32-bit, conformant to RFC 4120. It probably also doesn't
> interoperate with RODCs with RodcID>= 0x8000.)
More information about the krbdev
mailing list