On Fri, Mar 24, 2023 at 3:01 AM Siddharth <sdo...@mvista.com> wrote:
> From: Siddharth Doshi <sdo...@mvista.com> > > Upstream-Status: Backport from [ > https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=959c59c7a0164117e7f8366466a32bb1f8d77ff1 > ] > Rather than backport, we should instead upgrade to 3.0.9 https://www.cve.org/CVERecord?id=CVE-2023-0464 > Signed-off-by: Siddharth Doshi <sdo...@mvista.com> > --- > .../openssl/openssl/CVE-2023-0464.patch | 226 ++++++++++++++++++ > .../openssl/openssl_3.0.8.bb | 1 + > 2 files changed, 227 insertions(+) > create mode 100644 > meta/recipes-connectivity/openssl/openssl/CVE-2023-0464.patch > > diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2023-0464.patch > b/meta/recipes-connectivity/openssl/openssl/CVE-2023-0464.patch > new file mode 100644 > index 0000000000..69c7e2af67 > --- /dev/null > +++ b/meta/recipes-connectivity/openssl/openssl/CVE-2023-0464.patch > @@ -0,0 +1,226 @@ > +From 959c59c7a0164117e7f8366466a32bb1f8d77ff1 Mon Sep 17 00:00:00 2001 > +From: Pauli <pa...@openssl.org> > +Date: Wed, 8 Mar 2023 15:28:20 +1100 > +Subject: [PATCH] x509: excessive resource use verifying policy constraints > + > +A security vulnerability has been identified in all supported versions > +of OpenSSL related to the verification of X.509 certificate chains > +that include policy constraints. Attackers may be able to exploit this > +vulnerability by creating a malicious certificate chain that triggers > +exponential use of computational resources, leading to a denial-of-service > +(DoS) attack on affected systems. > + > +Fixes CVE-2023-0464 > + > +Reviewed-by: Tomas Mraz <to...@openssl.org> > +Reviewed-by: Shane Lontis <shane.lon...@oracle.com> > +(Merged from https://github.com/openssl/openssl/pull/20568) > + > +Upstream-Status: Backport from > +[ > https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=959c59c7a0164117e7f8366466a32bb1f8d77ff1 > ] > +CVE: CVE-2023-0464 > +Signed-off-by: Siddharth Doshi <sdo...@mvista.com> > +--- > + crypto/x509/pcy_local.h | 8 +++++++- > + crypto/x509/pcy_node.c | 12 +++++++++--- > + crypto/x509/pcy_tree.c | 36 ++++++++++++++++++++++++++---------- > + 3 files changed, 42 insertions(+), 14 deletions(-) > + > +diff --git a/crypto/x509/pcy_local.h b/crypto/x509/pcy_local.h > +index 18b53cc..cba107c 100644 > +--- a/crypto/x509/pcy_local.h > ++++ b/crypto/x509/pcy_local.h > +@@ -111,6 +111,11 @@ struct X509_POLICY_LEVEL_st { > + }; > + > + struct X509_POLICY_TREE_st { > ++ /* The number of nodes in the tree */ > ++ size_t node_count; > ++ /* The maximum number of nodes in the tree */ > ++ size_t node_maximum; > ++ > + /* This is the tree 'level' data */ > + X509_POLICY_LEVEL *levels; > + int nlevel; > +@@ -157,7 +162,8 @@ X509_POLICY_NODE > *ossl_policy_tree_find_sk(STACK_OF(X509_POLICY_NODE) *sk, > + X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, > + X509_POLICY_DATA *data, > + X509_POLICY_NODE *parent, > +- X509_POLICY_TREE *tree); > ++ X509_POLICY_TREE *tree, > ++ int extra_data); > + void ossl_policy_node_free(X509_POLICY_NODE *node); > + int ossl_policy_node_match(const X509_POLICY_LEVEL *lvl, > + const X509_POLICY_NODE *node, const > ASN1_OBJECT *oid); > +diff --git a/crypto/x509/pcy_node.c b/crypto/x509/pcy_node.c > +index 9d9a7ea..450f95a 100644 > +--- a/crypto/x509/pcy_node.c > ++++ b/crypto/x509/pcy_node.c > +@@ -59,10 +59,15 @@ X509_POLICY_NODE *ossl_policy_level_find_node(const > X509_POLICY_LEVEL *level, > + X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, > + X509_POLICY_DATA *data, > + X509_POLICY_NODE *parent, > +- X509_POLICY_TREE *tree) > ++ X509_POLICY_TREE *tree, > ++ int extra_data) > + { > + X509_POLICY_NODE *node; > + > ++ /* Verify that the tree isn't too large. This mitigates > CVE-2023-0464 */ > ++ if (tree->node_maximum > 0 && tree->node_count >= tree->node_maximum) > ++ return NULL; > ++ > + node = OPENSSL_zalloc(sizeof(*node)); > + if (node == NULL) { > + ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE); > +@@ -70,7 +75,7 @@ X509_POLICY_NODE > *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, > + } > + node->data = data; > + node->parent = parent; > +- if (level) { > ++ if (level != NULL) { > + if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) { > + if (level->anyPolicy) > + goto node_error; > +@@ -90,7 +95,7 @@ X509_POLICY_NODE > *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, > + } > + } > + > +- if (tree) { > ++ if (extra_data) { > + if (tree->extra_data == NULL) > + tree->extra_data = sk_X509_POLICY_DATA_new_null(); > + if (tree->extra_data == NULL){ > +@@ -103,6 +108,7 @@ X509_POLICY_NODE > *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, > + } > + } > + > ++ tree->node_count++; > + if (parent) > + parent->nchild++; > + > +diff --git a/crypto/x509/pcy_tree.c b/crypto/x509/pcy_tree.c > +index fa45da5..f953a05 100644 > +--- a/crypto/x509/pcy_tree.c > ++++ b/crypto/x509/pcy_tree.c > +@@ -14,6 +14,17 @@ > + > + #include "pcy_local.h" > + > ++/* > ++ * If the maximum number of nodes in the policy tree isn't defined, set > it to > ++ * a generous default of 1000 nodes. > ++ * > ++ * Defining this to be zero means unlimited policy tree growth which > opens the > ++ * door on CVE-2023-0464. > ++ */ > ++#ifndef OPENSSL_POLICY_TREE_NODES_MAX > ++# define OPENSSL_POLICY_TREE_NODES_MAX 1000 > ++#endif > ++ > + static void expected_print(BIO *channel, > + X509_POLICY_LEVEL *lev, X509_POLICY_NODE > *node, > + int indent) > +@@ -163,6 +174,9 @@ static int tree_init(X509_POLICY_TREE **ptree, > STACK_OF(X509) *certs, > + return X509_PCY_TREE_INTERNAL; > + } > + > ++ /* Limit the growth of the tree to mitigate CVE-2023-0464 */ > ++ tree->node_maximum = OPENSSL_POLICY_TREE_NODES_MAX; > ++ > + /* > + * http://tools.ietf.org/html/rfc5280#section-6.1.2, figure 3. > + * > +@@ -180,7 +194,7 @@ static int tree_init(X509_POLICY_TREE **ptree, > STACK_OF(X509) *certs, > + if ((data = ossl_policy_data_new(NULL, > + OBJ_nid2obj(NID_any_policy), 0)) == > NULL) > + goto bad_tree; > +- if (ossl_policy_level_add_node(level, data, NULL, tree) == NULL) { > ++ if (ossl_policy_level_add_node(level, data, NULL, tree, 1) == NULL) { > + ossl_policy_data_free(data); > + goto bad_tree; > + } > +@@ -239,7 +253,8 @@ static int tree_init(X509_POLICY_TREE **ptree, > STACK_OF(X509) *certs, > + * Return value: 1 on success, 0 otherwise > + */ > + static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr, > +- X509_POLICY_DATA *data) > ++ X509_POLICY_DATA *data, > ++ X509_POLICY_TREE *tree) > + { > + X509_POLICY_LEVEL *last = curr - 1; > + int i, matched = 0; > +@@ -249,13 +264,13 @@ static int > tree_link_matching_nodes(X509_POLICY_LEVEL *curr, > + X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(last->nodes, > i); > + > + if (ossl_policy_node_match(last, node, data->valid_policy)) { > +- if (ossl_policy_level_add_node(curr, data, node, NULL) == > NULL) > ++ if (ossl_policy_level_add_node(curr, data, node, tree, 0) == > NULL) > + return 0; > + matched = 1; > + } > + } > + if (!matched && last->anyPolicy) { > +- if (ossl_policy_level_add_node(curr, data, last->anyPolicy, > NULL) == NULL) > ++ if (ossl_policy_level_add_node(curr, data, last->anyPolicy, > tree, 0) == NULL) > + return 0; > + } > + return 1; > +@@ -268,7 +283,8 @@ static int tree_link_matching_nodes(X509_POLICY_LEVEL > *curr, > + * Return value: 1 on success, 0 otherwise. > + */ > + static int tree_link_nodes(X509_POLICY_LEVEL *curr, > +- const X509_POLICY_CACHE *cache) > ++ const X509_POLICY_CACHE *cache, > ++ X509_POLICY_TREE *tree) > + { > + int i; > + > +@@ -276,7 +292,7 @@ static int tree_link_nodes(X509_POLICY_LEVEL *curr, > + X509_POLICY_DATA *data = sk_X509_POLICY_DATA_value(cache->data, > i); > + > + /* Look for matching nodes in previous level */ > +- if (!tree_link_matching_nodes(curr, data)) > ++ if (!tree_link_matching_nodes(curr, data, tree)) > + return 0; > + } > + return 1; > +@@ -307,7 +323,7 @@ static int tree_add_unmatched(X509_POLICY_LEVEL *curr, > + /* Curr may not have anyPolicy */ > + data->qualifier_set = cache->anyPolicy->qualifier_set; > + data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; > +- if (ossl_policy_level_add_node(curr, data, node, tree) == NULL) { > ++ if (ossl_policy_level_add_node(curr, data, node, tree, 1) == NULL) { > + ossl_policy_data_free(data); > + return 0; > + } > +@@ -370,7 +386,7 @@ static int tree_link_any(X509_POLICY_LEVEL *curr, > + /* Finally add link to anyPolicy */ > + if (last->anyPolicy && > + ossl_policy_level_add_node(curr, cache->anyPolicy, > +- last->anyPolicy, NULL) == NULL) > ++ last->anyPolicy, tree, 0) == NULL) > + return 0; > + return 1; > + } > +@@ -553,7 +569,7 @@ static int tree_calculate_user_set(X509_POLICY_TREE > *tree, > + extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS > + | POLICY_DATA_FLAG_EXTRA_NODE; > + node = ossl_policy_level_add_node(NULL, extra, > anyPolicy->parent, > +- tree); > ++ tree, 1); > + } > + if (!tree->user_policies) { > + tree->user_policies = sk_X509_POLICY_NODE_new_null(); > +@@ -580,7 +596,7 @@ static int tree_evaluate(X509_POLICY_TREE *tree) > + > + for (i = 1; i < tree->nlevel; i++, curr++) { > + cache = ossl_policy_cache_set(curr->cert); > +- if (!tree_link_nodes(curr, cache)) > ++ if (!tree_link_nodes(curr, cache, tree)) > + return X509_PCY_TREE_INTERNAL; > + > + if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY) > +-- > +2.35.7 > + > diff --git a/meta/recipes-connectivity/openssl/openssl_3.0.8.bb > b/meta/recipes-connectivity/openssl/openssl_3.0.8.bb > index 75f9e44748..92e460b1ba 100644 > --- a/meta/recipes-connectivity/openssl/openssl_3.0.8.bb > +++ b/meta/recipes-connectivity/openssl/openssl_3.0.8.bb > @@ -12,6 +12,7 @@ SRC_URI = " > http://www.openssl.org/source/openssl-${PV}.tar.gz \ > > file://0001-buildinfo-strip-sysroot-and-debug-prefix-map-from-co.patch \ > file://afalg.patch \ > file://0001-Configure-do-not-tweak-mips-cflags.patch \ > + file://CVE-2023-0464.patch \ > " > > SRC_URI:append:class-nativesdk = " \ > -- > 2.25.1 > > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#179039): https://lists.openembedded.org/g/openembedded-core/message/179039 Mute This Topic: https://lists.openembedded.org/mt/97820339/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-