File CVE-2025-47151.patch of Package lasso.41555
From 8d12e6263fd6add923469bd5704e05a1ccfa8c69 Mon Sep 17 00:00:00 2001
From: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Thu, 15 May 2025 15:44:58 +0200
Subject: [PATCH] xml: prevent assignment of attribute value inside any
attribute
---
lasso/xml/misc_text_node.c | 2 +-
lasso/xml/saml-2.0/saml2_attribute_value.c | 2 +-
lasso/xml/xml.c | 3 +++
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lasso/xml/misc_text_node.c b/lasso/xml/misc_text_node.c
index 15a0a898..4b127a4d 100644
--- a/lasso/xml/misc_text_node.c
+++ b/lasso/xml/misc_text_node.c
@@ -41,7 +41,7 @@ G_DEFINE_TYPE_WITH_PRIVATE(LassoMiscTextNode, lasso_misc_text_node, LASSO_TYPE_N
static struct XmlSnippet schema_snippets[] = {
{ "content", SNIPPET_TEXT_CHILD,
G_STRUCT_OFFSET(LassoMiscTextNode, content), NULL, NULL, NULL},
- { "any_attributes", SNIPPET_ATTRIBUTE | SNIPPET_ANY | SNIPPET_PRIVATE,
+ { "", SNIPPET_ATTRIBUTE | SNIPPET_ANY | SNIPPET_PRIVATE,
G_STRUCT_OFFSET(LassoMiscTextNodePrivate, any_attributes), NULL, NULL, NULL},
{NULL, 0, 0, NULL, NULL, NULL}
};
diff --git a/lasso/xml/saml-2.0/saml2_attribute_value.c b/lasso/xml/saml-2.0/saml2_attribute_value.c
index c41f0e05..396e0aef 100644
--- a/lasso/xml/saml-2.0/saml2_attribute_value.c
+++ b/lasso/xml/saml-2.0/saml2_attribute_value.c
@@ -55,7 +55,7 @@ G_DEFINE_TYPE_WITH_PRIVATE(LassoSaml2AttributeValue, lasso_saml2_attribute_value
static struct XmlSnippet schema_snippets[] = {
{ "any", SNIPPET_LIST_NODES | SNIPPET_ANY | SNIPPET_ALLOW_TEXT,
G_STRUCT_OFFSET(LassoSaml2AttributeValue, any), NULL, NULL, NULL},
- { "any_attributes", SNIPPET_ATTRIBUTE | SNIPPET_ANY | SNIPPET_PRIVATE,
+ { "", SNIPPET_ATTRIBUTE | SNIPPET_ANY | SNIPPET_PRIVATE,
G_STRUCT_OFFSET(struct _LassoSaml2AttributeValuePrivate, any_attributes), NULL,
NULL, NULL },
{NULL, 0, 0, NULL, NULL, NULL}
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index b713b523..ca8d72fa 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -1576,6 +1576,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode)
type = snippet->type & 0xff;
/* assign attribute content if attribute has the same name as the
* snippet and:
+ * - the snippet is not the any attribute snippet,
* - the snippet and the attribute have no namespace
* - the snippet has no namespace but the attribute has the same
* namespace as the node
@@ -1583,6 +1584,8 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode)
*/
if (type != SNIPPET_ATTRIBUTE)
continue;
+ if (snippet->type & SNIPPET_ANY)
+ continue;
if (! lasso_strisequal((char*)attr->name, (char*)snippet->name))
continue;
if (attr->ns) {
From ebf3dd68910492ab18e9b8b319386f6495c96b01 Mon Sep 17 00:00:00 2001
From: Yann Weber <yweber@entrouvert.com>
Date: Thu, 15 May 2025 17:12:57 +0200
Subject: [PATCH] tests: check assignement of any_attribute is prevented
(#105693)
---
tests/basic_tests.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/tests/basic_tests.c b/tests/basic_tests.c
index 65d60b90..ae8c4128 100644
--- a/tests/basic_tests.c
+++ b/tests/basic_tests.c
@@ -1104,6 +1104,34 @@ START_TEST(test17_test_get_issuer_leading_equal)
}
END_TEST
+START_TEST(test18_test_unexpected_any_attribute_assignement)
+{
+ const char *xml_str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
+<samlp:Response\n\
+ xmlns:xsi=\"XXX\"\n\
+ xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" \n\
+ xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"\n\
+ >\n\
+ <saml:Assertion ID=\"ID_03371036-a6cb-48cd-86eb-6792f33e96cd\" IssueInstant=\"2025-03-06T15:25:53.175Z\" Version=\"2.0\" xmlns=\"urn:oasis:names:tc:SAML:2.0:assertion\">\n\
+ <saml:AttributeStatement>\n\
+ <saml:Attribute Name=\"Magic\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\">\n\
+ <saml:AttributeValue any_attributes=\"CCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB\" xsi:type=\"xs:string\">BBB_CCCC_DDD</saml:AttributeValue>\n\
+ </saml:Attribute>\n\
+ </saml:AttributeStatement>\n\
+ </saml:Assertion>\n\
+</samlp:Response>\n\
+";
+ xmlDoc *xmldoc;
+ LassoNode *node;
+ begin_check_do_log(NULL, G_LOG_LEVEL_WARNING, "Unexpected attribute: {(null)}any_attributes = CCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB", TRUE);
+ xmldoc = xmlParseDoc(xml_str);
+ node = lasso_node_new_from_xmlNode(xmlDocGetRootElement(xmldoc));
+ g_object_unref(node);
+ lasso_release_doc(xmldoc);
+ end_check_do_log(NULL);
+}
+END_TEST
+
Suite*
basic_suite()
{
@@ -1124,6 +1152,7 @@ basic_suite()
TCase *tc_key = tcase_create("Test loading and manipulating LassoKey objects");
TCase *tc_key_info = tcase_create("Test creating and dumping ds:KeyInfo nodes");
TCase *tc_get_issuer = tcase_create("Test get_issuer and get_request_id");
+ TCase *tc_prevent_any_attribute_assignement = tcase_create("Test any_attribute assignement is prevented");
suite_add_tcase(s, tc_server_load_dump_empty_string);
suite_add_tcase(s, tc_server_load_dump_random_string);
@@ -1141,6 +1170,7 @@ basic_suite()
suite_add_tcase(s, tc_key);
suite_add_tcase(s, tc_key_info);
suite_add_tcase(s, tc_get_issuer);
+ suite_add_tcase(s, tc_prevent_any_attribute_assignement);
tcase_add_test(tc_server_load_dump_empty_string, test01_server_load_dump_empty_string);
tcase_add_test(tc_server_load_dump_random_string, test02_server_load_dump_random_string);
@@ -1159,5 +1189,6 @@ basic_suite()
tcase_add_test(tc_key_info, test15_ds_key_info);
tcase_add_test(tc_get_issuer, test16_test_get_issuer);
+ tcase_add_test(tc_prevent_any_attribute_assignement, test18_test_unexpected_any_attribute_assignement);
tcase_set_timeout(tc_load_metadata, 10);
return s;
}