summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2025-07-31 02:02:35 +0000
committertb <>2025-07-31 02:02:35 +0000
commit46d63bc2ba510e4fc96e384acec4676227bf7f50 (patch)
treefebd0c4807ef70a818cceffdfb2a38fcacce470d /src
parentaa7438bc918c1337f5cb9e3bbcb6c61710c672f9 (diff)
downloadopenbsd-46d63bc2ba510e4fc96e384acec4676227bf7f50.tar.gz
openbsd-46d63bc2ba510e4fc96e384acec4676227bf7f50.tar.bz2
openbsd-46d63bc2ba510e4fc96e384acec4676227bf7f50.zip
Plug leaks due to misuse of PKCS7_add_signed_attribute()
set0/add0 functions that can fail are the worst. Without fail this trips up both users and authors (by and large these are two identical groups consisting of a single person), resulting in leaks and double frees. In today's episode of spelunking in the gruesome gore provided by the PKCS#7 and Time-Stamp protocol "implementations", we fix a couple of leaks in PKCS7_add_attrib_smimecap() and ESS_add_signing_cert(). We do so by recalling that there is i2d_X509_ALGORS(), so we might as well put it to use instead of inlining it poorly (aka, without error checking). Normalize said error checking and ensure ownership is handled correctly in the usual single-exit idiom. ESS_add_signing_cert() can also make use of proper i2d handling, so it's simpler and correct and in the end looks pretty much the same as PKCS7_add_attrib_smimecap(). ok kenjiro
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/pkcs7/pk7_attr.c38
-rw-r--r--src/lib/libcrypto/ts/ts_rsp_sign.c40
2 files changed, 52 insertions, 26 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_attr.c b/src/lib/libcrypto/pkcs7/pk7_attr.c
index bf775735d9..9a822eaecd 100644
--- a/src/lib/libcrypto/pkcs7/pk7_attr.c
+++ b/src/lib/libcrypto/pkcs7/pk7_attr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pk7_attr.c,v 1.18 2025/07/28 04:29:00 tb Exp $ */ 1/* $OpenBSD: pk7_attr.c,v 1.19 2025/07/31 02:02:35 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 2001. 3 * project 2001.
4 */ 4 */
@@ -69,15 +69,37 @@
69int 69int
70PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, STACK_OF(X509_ALGOR) *cap) 70PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, STACK_OF(X509_ALGOR) *cap)
71{ 71{
72 ASN1_STRING *seq; 72 ASN1_STRING *seq = NULL;
73 if (!(seq = ASN1_STRING_new())) { 73 unsigned char *data = NULL;
74 int len = 0;
75 int ret = 0;
76
77 if ((len = i2d_X509_ALGORS(cap, &data)) <= 0) {
78 len = 0;
79 goto err;
80 }
81
82 if ((seq = ASN1_STRING_new()) == NULL) {
74 PKCS7error(ERR_R_MALLOC_FAILURE); 83 PKCS7error(ERR_R_MALLOC_FAILURE);
75 return 0; 84 goto err;
76 } 85 }
77 seq->length = ASN1_item_i2d((ASN1_VALUE *)cap, &seq->data, 86
78 &X509_ALGORS_it); 87 ASN1_STRING_set0(seq, data, len);
79 return PKCS7_add_signed_attribute(si, NID_SMIMECapabilities, 88 data = NULL;
80 V_ASN1_SEQUENCE, seq); 89 len = 0;
90
91 if (!PKCS7_add_signed_attribute(si, NID_SMIMECapabilities,
92 V_ASN1_SEQUENCE, seq))
93 goto err;
94 seq = NULL;
95
96 ret = 1;
97
98 err:
99 ASN1_STRING_free(seq);
100 freezero(data, len);
101
102 return ret;
81} 103}
82LCRYPTO_ALIAS(PKCS7_add_attrib_smimecap); 104LCRYPTO_ALIAS(PKCS7_add_attrib_smimecap);
83 105
diff --git a/src/lib/libcrypto/ts/ts_rsp_sign.c b/src/lib/libcrypto/ts/ts_rsp_sign.c
index d35f6a7c94..b8cc7e2baf 100644
--- a/src/lib/libcrypto/ts/ts_rsp_sign.c
+++ b/src/lib/libcrypto/ts/ts_rsp_sign.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ts_rsp_sign.c,v 1.36 2025/05/10 05:54:39 tb Exp $ */ 1/* $OpenBSD: ts_rsp_sign.c,v 1.37 2025/07/31 02:02:35 tb Exp $ */
2/* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL 2/* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL
3 * project 2002. 3 * project 2002.
4 */ 4 */
@@ -955,28 +955,32 @@ static int
955ESS_add_signing_cert(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc) 955ESS_add_signing_cert(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc)
956{ 956{
957 ASN1_STRING *seq = NULL; 957 ASN1_STRING *seq = NULL;
958 unsigned char *p, *pp = NULL; 958 unsigned char *data = NULL;
959 int len; 959 int len = 0;
960 int ret = 0;
960 961
961 len = i2d_ESS_SIGNING_CERT(sc, NULL); 962 if ((len = i2d_ESS_SIGNING_CERT(sc, &data)) <= 0) {
962 if (!(pp = malloc(len))) { 963 len = 0;
963 TSerror(ERR_R_MALLOC_FAILURE);
964 goto err; 964 goto err;
965 } 965 }
966 p = pp; 966
967 i2d_ESS_SIGNING_CERT(sc, &p); 967 if ((seq = ASN1_STRING_new()) == NULL)
968 if (!(seq = ASN1_STRING_new()) || !ASN1_STRING_set(seq, pp, len)) {
969 TSerror(ERR_R_MALLOC_FAILURE);
970 goto err; 968 goto err;
971 }
972 free(pp);
973 pp = NULL;
974 return PKCS7_add_signed_attribute(si,
975 NID_id_smime_aa_signingCertificate, V_ASN1_SEQUENCE, seq);
976 969
977err: 970 ASN1_STRING_set0(seq, data, len);
971 data = NULL;
972 len = 0;
973
974 if (!PKCS7_add_signed_attribute(si, NID_id_smime_aa_signingCertificate,
975 V_ASN1_SEQUENCE, seq))
976 goto err;
977 seq = NULL;
978
979 ret = 1;
980
981 err:
978 ASN1_STRING_free(seq); 982 ASN1_STRING_free(seq);
979 free(pp); 983 freezero(data, len);
980 984
981 return 0; 985 return ret;
982} 986}