summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-02-07 15:46:58 +0000
committertb <>2023-02-07 15:46:58 +0000
commit17612bc3d782a97e95d66d08696fd71d0758c93e (patch)
tree6eafe46afe2ef726e93b43aba98eacb31cef2e55 /src
parent5701ad0e385dd88700fb100c0ea01cabe49716bb (diff)
downloadopenbsd-17612bc3d782a97e95d66d08696fd71d0758c93e.tar.gz
openbsd-17612bc3d782a97e95d66d08696fd71d0758c93e.tar.bz2
openbsd-17612bc3d782a97e95d66d08696fd71d0758c93e.zip
Fix arbitrary memory read in GENERAL_NAME_cmp()
The ASN.1 template for GENERAL_NAME and its corresponding C structure disagree on the type of the x400Address member. This results in an ASN.1 string to be considered as an ASN.1 type, which allows an attacker to read (essentially) arbitrary memory. Fix this by forcing comparison as strings. While the underlying type confusion has been present since time immemorial, this particular bug came with the EdiPartyName fix (6.8/008_asn1.patch.sig). Reported by David Benjamin, fix suggested by jsing. Release date for this was set to be January 31. Unilaterally pushed back to February 7 by OpenSSL by way of announcement of many completely unrelated embargoed issues, some of which they had been sitting on since July 2020. ok beck jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/x509/x509_genn.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/lib/libcrypto/x509/x509_genn.c b/src/lib/libcrypto/x509/x509_genn.c
index ce1fb6cc02..395d487f8f 100644
--- a/src/lib/libcrypto/x509/x509_genn.c
+++ b/src/lib/libcrypto/x509/x509_genn.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_genn.c,v 1.3 2022/11/14 17:48:50 beck Exp $ */ 1/* $OpenBSD: x509_genn.c,v 1.4 2023/02/07 15:46:58 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 */
@@ -383,7 +383,8 @@ GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b)
383 return -1; 383 return -1;
384 switch (a->type) { 384 switch (a->type) {
385 case GEN_X400: 385 case GEN_X400:
386 result = ASN1_TYPE_cmp(a->d.x400Address, b->d.x400Address); 386 result = ASN1_STRING_cmp((ASN1_STRING *)a->d.x400Address,
387 (ASN1_STRING *)b->d.x400Address);
387 break; 388 break;
388 389
389 case GEN_EDIPARTY: 390 case GEN_EDIPARTY: