CVE-2023-24813 (published 2023-02-07T19:15Z)

Dompdf is an HTML to PDF converter written in php. Due to the difference in the attribute parser of Dompdf and php-svg-lib, an attacker can still call arbitrary URLs with arbitrary protocols. Dompdf parses the href attribute of `image` tags and respects `xlink:href` even if `href` is specified. However, php-svg-lib, which is later used to parse the svg file, parses the href attribute. Since `href` is respected if both `xlink:href` and `href` is specified, it's possible to bypass the protection on the Dompdf side by providing an empty `xlink:href` attribute. An attacker can exploit the vulnerability to call arbitrary URLs with arbitrary protocols if they provide an SVG file to the Dompdf. In PHP versions before 8.0.0, it leads to arbitrary unserialize, which will lead, at the very least, to arbitrary file deletion and might lead to remote code execution, depending on available classes. This vulnerability has been addressed in commit `95009ea98` which has been included in release version 2.0.3. Users are advised to upgrade. There are no known workarounds for this vulnerability.

CVSS v3 base score: 9.8, CRITICAL (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

Weakness information:
cwe_id: CWE-436
cwe_name: Interpretation Conflict
description: Product A handles inputs or steps differently than Product B, which causes A to perform incorrect actions based on its perception of B's state.
extended_description: This is generally found in proxies, firewalls, anti-virus software, and other intermediary devices that monitor, allow, deny, or modify traffic based on how the client or server is expected to behave.
         

Fix information:
repo_url: https://github.com/dompdf/dompdf
commit_details: repo_url: https://github.com/dompdf/dompdf
author: Brian Sweeney
author_date: 2023-02-04 16:16:42-05:00
msg: Validate both bare and namespaced SVG image HREF attributes
repository: repo_url: https://github.com/dompdf/dompdf
repo_name: dompdf/dompdf
description: HTML to PDF converter for PHP
repo_language: PHP
owner: dompdf
file_changes: filename: Cache.php
change_type: ModificationType.MODIFY
diff: @@ -135,15 +135,19 @@ class Cache
                     function ($parser, $name, $attributes) use ($options, $parsed_url, $full_url) {
                         if (strtolower($name) === "image") {
                             $attributes = array_change_key_case($attributes, CASE_LOWER);
-                            $url = $attributes["xlink:href"] ?? $attributes["href"];
-                            if (!empty($url)) {
-                                $inner_full_url = Helpers::build_url($parsed_url["protocol"], $parsed_url["host"], $parsed_url["path"], $url);
-                                if ($inner_full_url === $full_url) {
-                                    throw new ImageException("SVG self-reference is not allowed", E_WARNING);
-                                }
-                                [$resolved_url, $type, $message] = self::resolve_url($url, $parsed_url["protocol"], $parsed_url["host"], $parsed_url["path"], $options);
-                                if (!empty($message)) {
-                                    throw new ImageException("This SVG document references a restricted resource. $message", E_WARNING);
+                            $urls = [];
+                            $urls[] = $attributes["xlink:href"] ?? "";
+                            $urls[] = $attributes["href"] ?? "";
+                            foreach ($urls as $url) {
+                                if (!empty($url)) {
+                                    $inner_full_url = Helpers::build_url($parsed_url["protocol"], $parsed_url["host"], $parsed_url["path"], $url);
+                                    if ($inner_full_url === $full_url) {
+                                        throw new ImageException("SVG self-reference is not allowed", E_WARNING);
+                                    }
+                                    [$resolved_url, $type, $message] = self::resolve_url($url, $parsed_url["protocol"], $parsed_url["host"], $parsed_url["path"], $options);
+                                    if (!empty($message)) {
+                                        throw new ImageException("This SVG document references a restricted resource. $message", E_WARNING);
+                                    }
                                 }
                             }
                         }
@@ -156,6 +160,7 @@ class Cache
                         xml_parse($parser, $line, false);
                     }
                     fclose($fp);
+                    xml_parse($parser, "", true);
                 }
                 xml_parser_free($parser);
             }

programming_language: PHP