svn rev #24560: branches/krb5-1-8/src/ lib/crypto/krb/ lib/crypto/krb/dk/ lib/gssapi/krb5/ ...
tlyu@MIT.EDU
tlyu at MIT.EDU
Sat Dec 4 00:11:04 EST 2010
http://src.mit.edu/fisheye/changelog/krb5/?cs=24560
Commit By: tlyu
Log Message:
ticket: 6833
subject: SA-2010-007 Checksum vulnerabilities (CVE-2010-1324 and others)
target_version: 1.8.4
version_fixed: 1.8.4
status: resolved
Apply patch for MITKRB5-SA-2010-007.
Fix multiple checksum handling bugs, as described in:
CVE-2010-1324
CVE-2010-1323
CVE-2010-4020
CVE-2010-4021
* Return the correct (keyed) checksums as the mandatory checksum type
for DES enctypes.
* Restrict simplified-profile checksums to their corresponding etypes.
* Add internal checks to reduce the risk of stream ciphers being used
with simplified-profile key derivation or other algorithms relying
on the block encryption primitive.
* Use the mandatory checksum type for the PKINIT KDC signature,
instead of the first-listed keyed checksum.
* Use the mandatory checksum type when sending KRB-SAFE messages by
default, instead of the first-listed keyed checksum.
* Use the mandatory checksum type for the t_kperf test program.
* Use the mandatory checksum type (without additional logic) for the
FAST request checksum.
* Preserve the existing checksum choices (unkeyed checksums for DES
enctypes) for the authenticator checksum, using explicit logic.
* Ensure that SAM checksums received from the KDC are keyed.
* Ensure that PAC checksums are keyed.
Changed Files:
U branches/krb5-1-8/src/lib/crypto/krb/cksumtypes.c
U branches/krb5-1-8/src/lib/crypto/krb/dk/derive.c
U branches/krb5-1-8/src/lib/crypto/krb/keyed_checksum_types.c
U branches/krb5-1-8/src/lib/gssapi/krb5/util_crypt.c
U branches/krb5-1-8/src/lib/krb5/krb/mk_safe.c
U branches/krb5-1-8/src/lib/krb5/krb/pac.c
U branches/krb5-1-8/src/lib/krb5/krb/preauth2.c
U branches/krb5-1-8/src/plugins/preauth/pkinit/pkinit_srv.c
Modified: branches/krb5-1-8/src/lib/crypto/krb/cksumtypes.c
===================================================================
--- branches/krb5-1-8/src/lib/crypto/krb/cksumtypes.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/crypto/krb/cksumtypes.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -101,7 +101,7 @@
{ CKSUMTYPE_MD5_HMAC_ARCFOUR,
"md5-hmac-rc4", { 0 }, "Microsoft MD5 HMAC",
- NULL, &krb5int_hash_md5,
+ &krb5int_enc_arcfour, &krb5int_hash_md5,
krb5int_hmacmd5_checksum, NULL,
16, 16, 0 },
};
Modified: branches/krb5-1-8/src/lib/crypto/krb/dk/derive.c
===================================================================
--- branches/krb5-1-8/src/lib/crypto/krb/dk/derive.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/crypto/krb/dk/derive.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -91,6 +91,8 @@
blocksize = enc->block_size;
keybytes = enc->keybytes;
+ if (blocksize == 1)
+ return KRB5_BAD_ENCTYPE;
if (inkey->keyblock.length != enc->keylength || outrnd->length != keybytes)
return KRB5_CRYPTO_INTERNAL;
Modified: branches/krb5-1-8/src/lib/crypto/krb/keyed_checksum_types.c
===================================================================
--- branches/krb5-1-8/src/lib/crypto/krb/keyed_checksum_types.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/crypto/krb/keyed_checksum_types.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -35,6 +35,13 @@
{
if (ctp->flags & CKSUM_UNKEYED)
return FALSE;
+ /* Stream ciphers do not play well with RFC 3961 key derivation, so be
+ * conservative with RC4. */
+ if ((ktp->etype == ENCTYPE_ARCFOUR_HMAC ||
+ ktp->etype == ENCTYPE_ARCFOUR_HMAC_EXP) &&
+ ctp->ctype != CKSUMTYPE_HMAC_MD5_ARCFOUR &&
+ ctp->ctype != CKSUMTYPE_MD5_HMAC_ARCFOUR)
+ return FALSE;
return (!ctp->enc || ktp->enc == ctp->enc);
}
Modified: branches/krb5-1-8/src/lib/gssapi/krb5/util_crypt.c
===================================================================
--- branches/krb5-1-8/src/lib/gssapi/krb5/util_crypt.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/gssapi/krb5/util_crypt.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -119,10 +119,22 @@
if (code != 0)
return code;
- code = (*kaccess.mandatory_cksumtype)(context, subkey->keyblock.enctype,
- cksumtype);
- if (code != 0)
- return code;
+ switch (subkey->keyblock.enctype) {
+ case ENCTYPE_DES_CBC_MD4:
+ *cksumtype = CKSUMTYPE_RSA_MD4_DES;
+ break;
+ case ENCTYPE_DES_CBC_MD5:
+ case ENCTYPE_DES_CBC_CRC:
+ *cksumtype = CKSUMTYPE_RSA_MD5_DES;
+ break;
+ default:
+ code = (*kaccess.mandatory_cksumtype)(context,
+ subkey->keyblock.enctype,
+ cksumtype);
+ if (code != 0)
+ return code;
+ break;
+ }
switch (subkey->keyblock.enctype) {
case ENCTYPE_DES_CBC_MD5:
Modified: branches/krb5-1-8/src/lib/krb5/krb/mk_safe.c
===================================================================
--- branches/krb5-1-8/src/lib/krb5/krb/mk_safe.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/krb5/krb/mk_safe.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -215,10 +215,28 @@
for (i = 0; i < nsumtypes; i++)
if (auth_context->safe_cksumtype == sumtypes[i])
break;
- if (i == nsumtypes)
- i = 0;
- sumtype = sumtypes[i];
krb5_free_cksumtypes (context, sumtypes);
+ if (i < nsumtypes)
+ sumtype = auth_context->safe_cksumtype;
+ else {
+ switch (enctype) {
+ case ENCTYPE_DES_CBC_MD4:
+ sumtype = CKSUMTYPE_RSA_MD4_DES;
+ break;
+ case ENCTYPE_DES_CBC_MD5:
+ case ENCTYPE_DES_CBC_CRC:
+ sumtype = CKSUMTYPE_RSA_MD5_DES;
+ break;
+ default:
+ retval = krb5int_c_mandatory_cksumtype(context, enctype,
+ &sumtype);
+ if (retval) {
+ CLEANUP_DONE();
+ goto error;
+ }
+ break;
+ }
+ }
}
if ((retval = krb5_mk_safe_basic(context, userdata, key, &replaydata,
plocal_fulladdr, premote_fulladdr,
Modified: branches/krb5-1-8/src/lib/krb5/krb/pac.c
===================================================================
--- branches/krb5-1-8/src/lib/krb5/krb/pac.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/krb5/krb/pac.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -582,6 +582,8 @@
checksum.checksum_type = load_32_le(p);
checksum.length = checksum_data.length - PAC_SIGNATURE_DATA_LENGTH;
checksum.contents = p + PAC_SIGNATURE_DATA_LENGTH;
+ if (!krb5_c_is_keyed_cksum(checksum.checksum_type))
+ return KRB5KRB_AP_ERR_INAPP_CKSUM;
pac_data.length = pac->data.length;
pac_data.data = malloc(pac->data.length);
Modified: branches/krb5-1-8/src/lib/krb5/krb/preauth2.c
===================================================================
--- branches/krb5-1-8/src/lib/krb5/krb/preauth2.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/lib/krb5/krb/preauth2.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -1578,7 +1578,9 @@
cksum = sc2->sam_cksum;
- while (*cksum) {
+ for (; *cksum; cksum++) {
+ if (!krb5_c_is_keyed_cksum((*cksum)->checksum_type))
+ continue;
/* Check this cksum */
retval = krb5_c_verify_checksum(context, as_key,
KRB5_KEYUSAGE_PA_SAM_CHALLENGE_CKSUM,
@@ -1592,7 +1594,6 @@
}
if (valid_cksum)
break;
- cksum++;
}
if (!valid_cksum) {
Modified: branches/krb5-1-8/src/plugins/preauth/pkinit/pkinit_srv.c
===================================================================
--- branches/krb5-1-8/src/plugins/preauth/pkinit/pkinit_srv.c 2010-12-03 20:38:02 UTC (rev 24559)
+++ branches/krb5-1-8/src/plugins/preauth/pkinit/pkinit_srv.c 2010-12-04 05:11:04 UTC (rev 24560)
@@ -691,8 +691,7 @@
krb5_reply_key_pack *key_pack = NULL;
krb5_reply_key_pack_draft9 *key_pack9 = NULL;
krb5_data *encoded_key_pack = NULL;
- unsigned int num_types;
- krb5_cksumtype *cksum_types = NULL;
+ krb5_cksumtype cksum_type;
pkinit_kdc_context plgctx;
pkinit_kdc_req_context reqctx;
@@ -882,14 +881,25 @@
retval = ENOMEM;
goto cleanup;
}
- /* retrieve checksums for a given enctype of the reply key */
- retval = krb5_c_keyed_checksum_types(context,
- encrypting_key->enctype, &num_types, &cksum_types);
- if (retval)
- goto cleanup;
- /* pick the first of acceptable enctypes for the checksum */
- retval = krb5_c_make_checksum(context, cksum_types[0],
+ switch (encrypting_key->enctype) {
+ case ENCTYPE_DES_CBC_MD4:
+ cksum_type = CKSUMTYPE_RSA_MD4_DES;
+ break;
+ case ENCTYPE_DES_CBC_MD5:
+ case ENCTYPE_DES_CBC_CRC:
+ cksum_type = CKSUMTYPE_RSA_MD5_DES;
+ break;
+ default:
+ retval = krb5int_c_mandatory_cksumtype(context,
+ encrypting_key->enctype,
+ &cksum_type);
+ if (retval)
+ goto cleanup;
+ break;
+ }
+
+ retval = krb5_c_make_checksum(context, cksum_type,
encrypting_key, KRB5_KEYUSAGE_TGS_REQ_AUTH_CKSUM,
req_pkt, &key_pack->asChecksum);
if (retval) {
@@ -1033,7 +1043,6 @@
krb5_free_data(context, encoded_key_pack);
free(dh_pubkey);
free(server_key);
- free(cksum_types);
switch ((int)padata->pa_type) {
case KRB5_PADATA_PK_AS_REQ:
More information about the cvs-krb5
mailing list