From 6e989230a10a36934c56718f1ec866c2683fe815 Mon Sep 17 00:00:00 2001
From: Benjamin Franzke <ben@bnf.dev>
Date: Tue, 14 Nov 2023 09:58:11 +0100
Subject: [PATCH] [SECURITY] Upgrade to typo3/html-sanitizer v2.1.4

See https://github.com/TYPO3/html-sanitizer/releases/tag/v2.1.4

composer req typo3/html-sanitizer:^2.1.4
composer req typo3/html-sanitizer:^2.1.4 \
   -d typo3/sysext/core --no-update

Resolves: #102169
Releases: main, 12.4, 11.5
Change-Id: I76edb7ff0dc66d3308d5c0875c2db56ca02addd7
Security-Bulletin: TYPO3-CORE-SA-2023-007
Security-References: CVE-2023-47125
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/81737
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
---
 composer.json                                      |  2 +-
 composer.lock                                      | 14 +++++++-------
 .../DataHandling/DataHandler/SecurityTest.php      |  7 +++++++
 .../Html/DefaultSanitizerBuilderTest.php           | 13 +++++++++++++
 typo3/sysext/core/composer.json                    |  2 +-
 .../ViewHelpers/Sanitize/HtmlViewHelperTest.php    |  1 +
 .../Rendering/SecureHtmlRenderingTest.php          |  8 ++++++++
 7 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/composer.json b/composer.json
index c1ed28c71992..6ccc1266025b 100644
--- a/composer.json
+++ b/composer.json
@@ -96,7 +96,7 @@
 		"typo3/class-alias-loader": "^1.1.4",
 		"typo3/cms-cli": "^3.1",
 		"typo3/cms-composer-installers": "^5.0",
-		"typo3/html-sanitizer": "^2.1.3",
+		"typo3/html-sanitizer": "^2.1.4",
 		"typo3fluid/fluid": "^2.9.2"
 	},
 	"require-dev": {
diff --git a/composer.lock b/composer.lock
index 24cda42fb014..33cb943bc946 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "3804c033560c628a027dfc79915afdb4",
+    "content-hash": "2220edce56b7861d31cf5b5c4b223a7f",
     "packages": [
         {
             "name": "bacon/bacon-qr-code",
@@ -4773,16 +4773,16 @@
         },
         {
             "name": "typo3/html-sanitizer",
-            "version": "v2.1.3",
+            "version": "v2.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/TYPO3/html-sanitizer.git",
-                "reference": "a35f220b2336e3f040f91d3de23d19964833643f"
+                "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/a35f220b2336e3f040f91d3de23d19964833643f",
-                "reference": "a35f220b2336e3f040f91d3de23d19964833643f",
+                "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/b8f90717251d968c49dc77f8c1e5912e2fbe0dff",
+                "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff",
                 "shasum": ""
             },
             "require": {
@@ -4818,9 +4818,9 @@
             "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.",
             "support": {
                 "issues": "https://github.com/TYPO3/html-sanitizer/issues",
-                "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.3"
+                "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.4"
             },
-            "time": "2023-07-25T08:47:32+00:00"
+            "time": "2023-11-14T07:41:08+00:00"
         },
         {
             "name": "typo3fluid/fluid",
diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SecurityTest.php b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SecurityTest.php
index 39965bdc7938..b4f5c8c3cbf9 100644
--- a/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SecurityTest.php
+++ b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SecurityTest.php
@@ -227,6 +227,13 @@ final class SecurityTest extends FunctionalTestCase
                     '<p><a href="t3://page?uid=1" target="_blank" rel="noreferrer" role="button" onmouseover="alert(1)">text</a></p>',
                 ],
             ],
+            [
+                '<?xml >s<img src=x onerror=alert(1)> ?>',
+                [
+                    '&lt;?xml &gt;s&lt;img src=x onerror=alert(1)&gt; ?&gt;',
+                    '<?xml >s<img src=x onerror=alert(1)> ?>',
+                ],
+            ],
         ];
     }
 
diff --git a/typo3/sysext/core/Tests/Functional/Html/DefaultSanitizerBuilderTest.php b/typo3/sysext/core/Tests/Functional/Html/DefaultSanitizerBuilderTest.php
index 612c25f18aad..9800249a85ee 100644
--- a/typo3/sysext/core/Tests/Functional/Html/DefaultSanitizerBuilderTest.php
+++ b/typo3/sysext/core/Tests/Functional/Html/DefaultSanitizerBuilderTest.php
@@ -145,6 +145,18 @@ final class DefaultSanitizerBuilderTest extends FunctionalTestCase
                 '<span style="color: orange">value</span>',
                 '<span style="color: orange">value</span>',
             ],
+            '#912' => [
+                '<!---><p>',
+                '<!---&gt;&lt;p&gt;-->',
+            ],
+            '#913' => [
+                '<!---!><p>',
+                '<!---!&gt;&lt;p&gt;-->',
+            ],
+            '#941' => [
+                '<?xml >s<img src=x onerror=alert(1)> ?>',
+                '&lt;?xml &gt;s&lt;img src=x onerror=alert(1)&gt; ?&gt;',
+            ],
         ];
     }
 
@@ -202,6 +214,7 @@ final class DefaultSanitizerBuilderTest extends FunctionalTestCase
         $sanitizer->sanitize('<script>alert(1)</script>', new SanitizerInitiator($trace));
         $logItemDataExpectation = [
             'behavior' => 'default',
+            'nodeType' => 1,
             'nodeName' => 'script',
             'initiator' => $trace,
         ];
diff --git a/typo3/sysext/core/composer.json b/typo3/sysext/core/composer.json
index 6833553b070d..adbf204e5efc 100644
--- a/typo3/sysext/core/composer.json
+++ b/typo3/sysext/core/composer.json
@@ -72,7 +72,7 @@
 		"typo3/class-alias-loader": "^1.1.4",
 		"typo3/cms-cli": "^3.1",
 		"typo3/cms-composer-installers": "^5.0",
-		"typo3/html-sanitizer": "^2.1.3",
+		"typo3/html-sanitizer": "^2.1.4",
 		"typo3fluid/fluid": "^2.9.2"
 	},
 	"suggest": {
diff --git a/typo3/sysext/fluid/Tests/Functional/ViewHelpers/Sanitize/HtmlViewHelperTest.php b/typo3/sysext/fluid/Tests/Functional/ViewHelpers/Sanitize/HtmlViewHelperTest.php
index 7b7c4ecb63a6..d30a4597c104 100644
--- a/typo3/sysext/fluid/Tests/Functional/ViewHelpers/Sanitize/HtmlViewHelperTest.php
+++ b/typo3/sysext/fluid/Tests/Functional/ViewHelpers/Sanitize/HtmlViewHelperTest.php
@@ -94,6 +94,7 @@ final class HtmlViewHelperTest extends FunctionalTestCase
 
         $logItemDataExpectation = [
             'behavior' => 'default',
+            'nodeType' => 1,
             'nodeName' => 'script',
             'initiator' => HtmlViewHelper::class,
         ];
diff --git a/typo3/sysext/fluid_styled_content/Tests/Functional/Rendering/SecureHtmlRenderingTest.php b/typo3/sysext/fluid_styled_content/Tests/Functional/Rendering/SecureHtmlRenderingTest.php
index 1d0444ec2b48..46b24afb2d26 100644
--- a/typo3/sysext/fluid_styled_content/Tests/Functional/Rendering/SecureHtmlRenderingTest.php
+++ b/typo3/sysext/fluid_styled_content/Tests/Functional/Rendering/SecureHtmlRenderingTest.php
@@ -109,6 +109,14 @@ final class SecureHtmlRenderingTest extends FunctionalTestCase
                 '07: <a href="t3://page?uid=1000" target="_blank" rel="noreferrer" class="button" role="button" onmouseover="alert(1)">TYPO3</a>',
                 '<p>07: <a href="/" target="_blank" rel="noreferrer" class="button" role="button">TYPO3</a></p>',
             ],
+            '#08' => [
+                '08: <?xml >s<img src=x onerror=alert(1)> ?>',
+                // Note: The TYPO3 HTML Parser encodes processing instructions, it's therefore
+                // expected and "OK" that the img tag is not encoded but sanitized.
+                // If the HTML Parser would not run, the expected result would be:
+                // '<p>08: &lt;?xml &gt;s&lt;img src=x onerror=alert(1)&gt; ?&gt;</p>',
+                '<p>08: &lt;?xml &gt;s<img src="x"> ?&gt;</p>',
+            ],
         ];
     }
 
-- 
GitLab