diff options
author | tb <> | 2024-01-25 13:44:08 +0000 |
---|---|---|
committer | tb <> | 2024-01-25 13:44:08 +0000 |
commit | 0c15b6210877e84c0a155c41b8c76f1a978d3378 (patch) | |
tree | 9d0ddeedac76c50676cebd46c11f193ae4afaa82 | |
parent | 054892485301bc4fb700ac9a0ce8338b47f40acf (diff) | |
download | openbsd-0c15b6210877e84c0a155c41b8c76f1a978d3378.tar.gz openbsd-0c15b6210877e84c0a155c41b8c76f1a978d3378.tar.bz2 openbsd-0c15b6210877e84c0a155c41b8c76f1a978d3378.zip |
Fix various NULL dereferences in PKCS #12
The PKCS #7 ContentInfo has a mandatory contentType, but the content itself
is OPTIONAL. Various unpacking API assumed presence of the content type is
enough to access members of the content, resulting in crashes.
Reported by Bahaa Naamneh on libressl-security, many thanks
ok jsing
-rw-r--r-- | src/lib/libcrypto/pkcs12/p12_add.c | 26 | ||||
-rw-r--r-- | src/lib/libcrypto/pkcs12/p12_mutl.c | 10 | ||||
-rw-r--r-- | src/lib/libcrypto/pkcs12/pkcs12_local.h | 5 | ||||
-rw-r--r-- | src/lib/libcrypto/pkcs7/pk7_doit.c | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/pkcs7/pk7_mime.c | 7 |
5 files changed, 37 insertions, 15 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_add.c b/src/lib/libcrypto/pkcs12/p12_add.c index 93c7c7221e..8ce1fede74 100644 --- a/src/lib/libcrypto/pkcs12/p12_add.c +++ b/src/lib/libcrypto/pkcs12/p12_add.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: p12_add.c,v 1.22 2023/02/16 08:38:17 tb Exp $ */ | 1 | /* $OpenBSD: p12_add.c,v 1.23 2024/01/25 13:44:08 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 1999. | 3 | * project 1999. |
4 | */ | 4 | */ |
@@ -124,11 +124,15 @@ LCRYPTO_ALIAS(PKCS12_pack_p7data); | |||
124 | STACK_OF(PKCS12_SAFEBAG) * | 124 | STACK_OF(PKCS12_SAFEBAG) * |
125 | PKCS12_unpack_p7data(PKCS7 *p7) | 125 | PKCS12_unpack_p7data(PKCS7 *p7) |
126 | { | 126 | { |
127 | ASN1_OCTET_STRING *aos; | ||
128 | |||
127 | if (!PKCS7_type_is_data(p7)) { | 129 | if (!PKCS7_type_is_data(p7)) { |
128 | PKCS12error(PKCS12_R_CONTENT_TYPE_NOT_DATA); | 130 | PKCS12error(PKCS12_R_CONTENT_TYPE_NOT_DATA); |
129 | return NULL; | 131 | return NULL; |
130 | } | 132 | } |
131 | return ASN1_item_unpack(p7->d.data, &PKCS12_SAFEBAGS_it); | 133 | if ((aos = PKCS7_get_octet_string(p7)) == NULL) |
134 | return NULL; | ||
135 | return ASN1_item_unpack(aos, &PKCS12_SAFEBAGS_it); | ||
132 | } | 136 | } |
133 | LCRYPTO_ALIAS(PKCS12_unpack_p7data); | 137 | LCRYPTO_ALIAS(PKCS12_unpack_p7data); |
134 | 138 | ||
@@ -182,11 +186,16 @@ LCRYPTO_ALIAS(PKCS12_pack_p7encdata); | |||
182 | STACK_OF(PKCS12_SAFEBAG) * | 186 | STACK_OF(PKCS12_SAFEBAG) * |
183 | PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, int passlen) | 187 | PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, int passlen) |
184 | { | 188 | { |
189 | PKCS7_ENC_CONTENT *content; | ||
190 | |||
185 | if (!PKCS7_type_is_encrypted(p7)) | 191 | if (!PKCS7_type_is_encrypted(p7)) |
186 | return NULL; | 192 | return NULL; |
187 | return PKCS12_item_decrypt_d2i(p7->d.encrypted->enc_data->algorithm, | 193 | if (p7->d.encrypted == NULL) |
188 | &PKCS12_SAFEBAGS_it, pass, passlen, | 194 | return NULL; |
189 | p7->d.encrypted->enc_data->enc_data, 1); | 195 | if ((content = p7->d.encrypted->enc_data) == NULL) |
196 | return NULL; | ||
197 | return PKCS12_item_decrypt_d2i(content->algorithm, &PKCS12_SAFEBAGS_it, | ||
198 | pass, passlen, content->enc_data, 1); | ||
190 | } | 199 | } |
191 | LCRYPTO_ALIAS(PKCS12_unpack_p7encdata); | 200 | LCRYPTO_ALIAS(PKCS12_unpack_p7encdata); |
192 | 201 | ||
@@ -210,11 +219,14 @@ LCRYPTO_ALIAS(PKCS12_pack_authsafes); | |||
210 | STACK_OF(PKCS7) * | 219 | STACK_OF(PKCS7) * |
211 | PKCS12_unpack_authsafes(const PKCS12 *p12) | 220 | PKCS12_unpack_authsafes(const PKCS12 *p12) |
212 | { | 221 | { |
222 | ASN1_OCTET_STRING *aos; | ||
223 | |||
213 | if (!PKCS7_type_is_data(p12->authsafes)) { | 224 | if (!PKCS7_type_is_data(p12->authsafes)) { |
214 | PKCS12error(PKCS12_R_CONTENT_TYPE_NOT_DATA); | 225 | PKCS12error(PKCS12_R_CONTENT_TYPE_NOT_DATA); |
215 | return NULL; | 226 | return NULL; |
216 | } | 227 | } |
217 | return ASN1_item_unpack(p12->authsafes->d.data, | 228 | if ((aos = PKCS7_get_octet_string(p12->authsafes)) == NULL) |
218 | &PKCS12_AUTHSAFES_it); | 229 | return NULL; |
230 | return ASN1_item_unpack(aos, &PKCS12_AUTHSAFES_it); | ||
219 | } | 231 | } |
220 | LCRYPTO_ALIAS(PKCS12_unpack_authsafes); | 232 | LCRYPTO_ALIAS(PKCS12_unpack_authsafes); |
diff --git a/src/lib/libcrypto/pkcs12/p12_mutl.c b/src/lib/libcrypto/pkcs12/p12_mutl.c index f0e6df9eb6..c71ed735ea 100644 --- a/src/lib/libcrypto/pkcs12/p12_mutl.c +++ b/src/lib/libcrypto/pkcs12/p12_mutl.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: p12_mutl.c,v 1.35 2023/02/16 08:38:17 tb Exp $ */ | 1 | /* $OpenBSD: p12_mutl.c,v 1.36 2024/01/25 13:44:08 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 1999. | 3 | * project 1999. |
4 | */ | 4 | */ |
@@ -115,6 +115,7 @@ PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, | |||
115 | { | 115 | { |
116 | const EVP_MD *md_type; | 116 | const EVP_MD *md_type; |
117 | HMAC_CTX *hmac = NULL; | 117 | HMAC_CTX *hmac = NULL; |
118 | ASN1_OCTET_STRING *aos; | ||
118 | unsigned char key[EVP_MAX_MD_SIZE], *salt; | 119 | unsigned char key[EVP_MAX_MD_SIZE], *salt; |
119 | int saltlen, iter; | 120 | int saltlen, iter; |
120 | int md_size; | 121 | int md_size; |
@@ -124,6 +125,10 @@ PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, | |||
124 | PKCS12error(PKCS12_R_CONTENT_TYPE_NOT_DATA); | 125 | PKCS12error(PKCS12_R_CONTENT_TYPE_NOT_DATA); |
125 | goto err; | 126 | goto err; |
126 | } | 127 | } |
128 | if ((aos = PKCS7_get_octet_string(p12->authsafes)) == NULL) { | ||
129 | PKCS12error(PKCS12_R_DECODE_ERROR); | ||
130 | goto err; | ||
131 | } | ||
127 | 132 | ||
128 | salt = p12->mac->salt->data; | 133 | salt = p12->mac->salt->data; |
129 | saltlen = p12->mac->salt->length; | 134 | saltlen = p12->mac->salt->length; |
@@ -155,8 +160,7 @@ PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, | |||
155 | goto err; | 160 | goto err; |
156 | if (!HMAC_Init_ex(hmac, key, md_size, md_type, NULL)) | 161 | if (!HMAC_Init_ex(hmac, key, md_size, md_type, NULL)) |
157 | goto err; | 162 | goto err; |
158 | if (!HMAC_Update(hmac, p12->authsafes->d.data->data, | 163 | if (!HMAC_Update(hmac, aos->data, aos->length)) |
159 | p12->authsafes->d.data->length)) | ||
160 | goto err; | 164 | goto err; |
161 | if (!HMAC_Final(hmac, mac, maclen)) | 165 | if (!HMAC_Final(hmac, mac, maclen)) |
162 | goto err; | 166 | goto err; |
diff --git a/src/lib/libcrypto/pkcs12/pkcs12_local.h b/src/lib/libcrypto/pkcs12/pkcs12_local.h index 1d6f0558ed..8d82d2f462 100644 --- a/src/lib/libcrypto/pkcs12/pkcs12_local.h +++ b/src/lib/libcrypto/pkcs12/pkcs12_local.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: pkcs12_local.h,v 1.3 2022/11/26 17:23:18 tb Exp $ */ | 1 | /* $OpenBSD: pkcs12_local.h,v 1.4 2024/01/25 13:44:08 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 1999. | 3 | * project 1999. |
4 | */ | 4 | */ |
@@ -96,6 +96,9 @@ struct pkcs12_bag_st { | |||
96 | } value; | 96 | } value; |
97 | }; | 97 | }; |
98 | 98 | ||
99 | /* XXX - should go into pkcs7_local.h. */ | ||
100 | ASN1_OCTET_STRING *PKCS7_get_octet_string(PKCS7 *p7); | ||
101 | |||
99 | __END_HIDDEN_DECLS | 102 | __END_HIDDEN_DECLS |
100 | 103 | ||
101 | #endif /* !HEADER_PKCS12_LOCAL_H */ | 104 | #endif /* !HEADER_PKCS12_LOCAL_H */ |
diff --git a/src/lib/libcrypto/pkcs7/pk7_doit.c b/src/lib/libcrypto/pkcs7/pk7_doit.c index 759d9dd5a5..ce0e99eec1 100644 --- a/src/lib/libcrypto/pkcs7/pk7_doit.c +++ b/src/lib/libcrypto/pkcs7/pk7_doit.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: pk7_doit.c,v 1.54 2023/11/15 00:55:43 tb Exp $ */ | 1 | /* $OpenBSD: pk7_doit.c,v 1.55 2024/01/25 13:44:08 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -92,7 +92,7 @@ PKCS7_type_is_other(PKCS7* p7) | |||
92 | 92 | ||
93 | } | 93 | } |
94 | 94 | ||
95 | static ASN1_OCTET_STRING * | 95 | ASN1_OCTET_STRING * |
96 | PKCS7_get_octet_string(PKCS7 *p7) | 96 | PKCS7_get_octet_string(PKCS7 *p7) |
97 | { | 97 | { |
98 | if (PKCS7_type_is_data(p7)) | 98 | if (PKCS7_type_is_data(p7)) |
diff --git a/src/lib/libcrypto/pkcs7/pk7_mime.c b/src/lib/libcrypto/pkcs7/pk7_mime.c index f00e18c7ef..381335589f 100644 --- a/src/lib/libcrypto/pkcs7/pk7_mime.c +++ b/src/lib/libcrypto/pkcs7/pk7_mime.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: pk7_mime.c,v 1.19 2023/05/02 09:56:12 tb Exp $ */ | 1 | /* $OpenBSD: pk7_mime.c,v 1.20 2024/01/25 13:44:08 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project. | 3 | * project. |
4 | */ | 4 | */ |
@@ -89,8 +89,11 @@ SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags) | |||
89 | STACK_OF(X509_ALGOR) *mdalgs = NULL; | 89 | STACK_OF(X509_ALGOR) *mdalgs = NULL; |
90 | int ctype_nid; | 90 | int ctype_nid; |
91 | 91 | ||
92 | if ((ctype_nid = OBJ_obj2nid(p7->type)) == NID_pkcs7_signed) | 92 | if ((ctype_nid = OBJ_obj2nid(p7->type)) == NID_pkcs7_signed) { |
93 | if (p7->d.sign == NULL) | ||
94 | return 0; | ||
93 | mdalgs = p7->d.sign->md_algs; | 95 | mdalgs = p7->d.sign->md_algs; |
96 | } | ||
94 | 97 | ||
95 | flags ^= SMIME_OLDMIME; | 98 | flags ^= SMIME_OLDMIME; |
96 | 99 | ||