Skip to content

Commit f0521f9

Browse files
committed
Multiple security vulnerabilities have been discovered in the Heimdal
implementation of the Kerberos 5 network authentication protocols and KDC. - - CVE-2022-42898 PAC parse integer overflows - - CVE-2022-3437 Overflows and non-constant time leaks in DES{,3} and arcfour - - CVE-2021-44758 NULL dereference DoS in SPNEGO acceptors - - CVE-2022-44640 Heimdal KDC: invalid free in ASN.1 codec - - CVE-2019-14870 Validate client attributes in protocol-transition - - CVE-2019-14870 Apply forwardable policy in protocol-transition - - CVE-2019-14870 Always lookup impersonate client in DB Obtained from: FreeBSD
1 parent b80554f commit f0521f9

53 files changed

Lines changed: 394 additions & 158 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crypto/heimdal/admin/change.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ kt_change (struct change_options *opt, int argc, char **argv)
217217
krb5_kt_end_seq_get(context, keytab, &cursor);
218218

219219
if (ret == KRB5_KT_END) {
220-
ret = 0;
221220
for (i = 0; i < j; i++) {
222221
if (verbose_flag) {
223222
char *client_name;

crypto/heimdal/appl/gssmask/gssmask.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,9 @@ HandleOP(WrapExt)
949949
memcpy(p, iov[4].buffer.value, iov[4].buffer.length);
950950
p += iov[4].buffer.length;
951951
memcpy(p, iov[5].buffer.value, iov[5].buffer.length);
952+
#ifndef __clang_analyzer__
952953
p += iov[5].buffer.length;
954+
#endif
953955

954956
gss_release_iov_buffer(NULL, iov, iov_len);
955957

crypto/heimdal/kadmin/kadmind.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,11 @@ main(int argc, char **argv)
116116
}
117117

118118
argc -= optidx;
119+
#ifndef __clang_analyzer__
119120
argv += optidx;
121+
#endif
122+
if (argc != 0)
123+
usage(1);
120124

121125
if (config_file == NULL) {
122126
asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context));

crypto/heimdal/kadmin/mod.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ static void
106106
add_aliases(krb5_context contextp, kadm5_principal_ent_rec *princ,
107107
struct getarg_strings *strings)
108108
{
109-
krb5_error_code ret;
109+
krb5_error_code ret = 0;
110110
HDB_extension ext;
111111
krb5_data buf;
112112
krb5_principal p;
@@ -127,9 +127,16 @@ add_aliases(krb5_context contextp, kadm5_principal_ent_rec *princ,
127127
sizeof(ext.data.u.aliases.aliases.val[0]));
128128
ext.data.u.aliases.aliases.len = strings->num_strings;
129129

130-
for (i = 0; i < strings->num_strings; i++) {
130+
for (i = 0; ret == 0 && i < strings->num_strings; i++) {
131131
ret = krb5_parse_name(contextp, strings->strings[i], &p);
132-
ret = copy_Principal(p, &ext.data.u.aliases.aliases.val[i]);
132+
if (ret)
133+
krb5_err(contextp, 1, ret, "Could not parse alias %s",
134+
strings->strings[i]);
135+
if (ret == 0)
136+
ret = copy_Principal(p, &ext.data.u.aliases.aliases.val[i]);
137+
if (ret)
138+
krb5_err(contextp, 1, ret, "Could not copy parsed alias %s",
139+
strings->strings[i]);
133140
krb5_free_principal(contextp, p);
134141
}
135142
}

crypto/heimdal/kadmin/stash.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ stash(struct stash_options *opt, int argc, char **argv)
103103
}
104104
}
105105
ret = krb5_string_to_key_salt(context, enctype, buf, salt, &key);
106-
ret = hdb_add_master_key(context, &key, &mkey);
106+
if (ret == 0)
107+
ret = hdb_add_master_key(context, &key, &mkey);
108+
if (ret)
109+
krb5_warn(context, errno, "setting master key");
107110
krb5_free_keyblock_contents(context, &key);
108111
}
109112

crypto/heimdal/kcm/protocol.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ kcm_op_get_principal(krb5_context context,
423423
free(name);
424424
kcm_release_ccache(context, ccache);
425425

426-
return 0;
426+
return ret;
427427
}
428428

429429
/*

crypto/heimdal/kdc/digest.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,10 @@ _kdc_do_digest(krb5_context context,
14611461
ret = krb5_encrypt_EncryptedData(context, crypto, KRB5_KU_DIGEST_ENCRYPT,
14621462
buf.data, buf.length, 0,
14631463
&rep.innerRep);
1464+
if (ret) {
1465+
krb5_prepend_error_message(context, ret, "Failed to encrypt digest: ");
1466+
goto out;
1467+
}
14641468

14651469
ASN1_MALLOC_ENCODE(DigestREP, reply->data, reply->length, &rep, &size, ret);
14661470
if (ret) {

crypto/heimdal/kdc/hpropd.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ main(int argc, char **argv)
107107
}
108108

109109
argc -= optidx;
110+
#ifndef __clang_analyzer__
110111
argv += optidx;
112+
#endif
111113

112114
if (argc != 0)
113115
usage(1);
@@ -125,6 +127,7 @@ main(int argc, char **argv)
125127
krb5_ticket *ticket;
126128
char *server;
127129

130+
memset(&ss, 0, sizeof(ss));
128131
sock = STDIN_FILENO;
129132
#ifdef SUPPORT_INETD
130133
if (inetd_flag == -1) {

crypto/heimdal/kdc/kdc-replay.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ main(int argc, char **argv)
184184
unsigned int tag2;
185185
ret = der_get_tag (r.data, r.length,
186186
&cl, &ty, &tag2, NULL);
187+
if (ret)
188+
krb5_err(context, 1, ret, "Could not decode replay data");
187189
if (MAKE_TAG(cl, ty, 0) != clty)
188190
krb5_errx(context, 1, "class|type mismatch: %d != %d",
189191
(int)MAKE_TAG(cl, ty, 0), (int)clty);

crypto/heimdal/kdc/krb5tgs.c

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,30 +1928,40 @@ tgs_build_reply(krb5_context context,
19281928
if (ret)
19291929
goto out;
19301930

1931+
ret = _kdc_db_fetch(context, config, tp, HDB_F_GET_CLIENT | flags,
1932+
NULL, &s4u2self_impersonated_clientdb,
1933+
&s4u2self_impersonated_client);
1934+
if (ret) {
1935+
const char *msg;
1936+
1937+
/*
1938+
* If the client belongs to the same realm as our krbtgt, it
1939+
* should exist in the local database.
1940+
*
1941+
*/
1942+
1943+
if (ret == HDB_ERR_NOENTRY)
1944+
ret = KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN;
1945+
msg = krb5_get_error_message(context, ret);
1946+
kdc_log(context, config, 2,
1947+
"S4U2Self principal to impersonate %s not found in database: %s",
1948+
tpn, msg);
1949+
krb5_free_error_message(context, msg);
1950+
goto out;
1951+
}
1952+
1953+
free(s4u2self_impersonated_client->entry.pw_end);
1954+
s4u2self_impersonated_client->entry.pw_end = NULL;
1955+
1956+
ret = kdc_check_flags(context, config, s4u2self_impersonated_client, tpn,
1957+
NULL, NULL, FALSE);
1958+
if (ret)
1959+
goto out;
1960+
19311961
/* If we were about to put a PAC into the ticket, we better fix it to be the right PAC */
19321962
if(rspac.data) {
19331963
krb5_pac p = NULL;
19341964
krb5_data_free(&rspac);
1935-
ret = _kdc_db_fetch(context, config, tp, HDB_F_GET_CLIENT | flags,
1936-
NULL, &s4u2self_impersonated_clientdb, &s4u2self_impersonated_client);
1937-
if (ret) {
1938-
const char *msg;
1939-
1940-
/*
1941-
* If the client belongs to the same realm as our krbtgt, it
1942-
* should exist in the local database.
1943-
*
1944-
*/
1945-
1946-
if (ret == HDB_ERR_NOENTRY)
1947-
ret = KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN;
1948-
msg = krb5_get_error_message(context, ret);
1949-
kdc_log(context, config, 1,
1950-
"S2U4Self principal to impersonate %s not found in database: %s",
1951-
tpn, msg);
1952-
krb5_free_error_message(context, msg);
1953-
goto out;
1954-
}
19551965
ret = _kdc_pac_generate(context, s4u2self_impersonated_client, &p);
19561966
if (ret) {
19571967
kdc_log(context, config, 0, "PAC generation failed for -- %s",
@@ -1987,10 +1997,12 @@ tgs_build_reply(krb5_context context,
19871997

19881998
/*
19891999
* If the service isn't trusted for authentication to
1990-
* delegation, remove the forward flag.
2000+
* delegation or if the impersonate client is disallowed
2001+
* forwardable, remove the forwardable flag.
19912002
*/
19922003

1993-
if (client->entry.flags.trusted_for_delegation) {
2004+
if (client->entry.flags.trusted_for_delegation &&
2005+
s4u2self_impersonated_client->entry.flags.forwardable) {
19942006
str = "[forwardable]";
19952007
} else {
19962008
b->kdc_options.forwardable = 0;

0 commit comments

Comments
 (0)