GHSA-42hm-pq2f-3r7m: PHPOffice Math allows XXE when processing an XML file in the MathML format
**Product:** Math
**Version:** 0.2.0
**CWE-ID:** CWE-611: Improper Restriction of XML External Entity Reference
**CVSS vector v.4.0:** 8.7 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N)
**CVSS vector v.3.1:** 7.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
**Description:** An attacker can create a special XML file, during which it processed, external entities are loaded, and it’s possible to read local server files.  
**Impact:** Local server files reading
**Vulnerable component:** The [`loadXML`](https://github.com/PHPOffice/Math/blob/c3ecbf35601e2a322bf2ddba48589d79ac827b92/src/Math/Reader/MathML.php#L38C9-L38C55) function with the unsafe [`LIBXML_DTDLOAD`](https://www.php.net/manual/en/libxml.constants.php#constant.libxml-dtdload) flag, the [`MathML`](https://github.com/PHPOffice/Math/blob/master/src/Math/Reader/MathML.php) class
**Exploitation conditions:** The vulnerability applies only to reading a file in the `MathML` format.
**Mitigation:** If there is no option to refuse using the [`LIBXML_DTDLOAD`](https://www.php.net/manual/en/libxml.constants.php#constant.libxml-dtdload) flag, it’s recommended to filter external entities through the implementation of the [`custom external entity loader function`](https://www.php.net/manual/en/function.libxml-set-external-entity-loader.php).
**Researcher: Aleksandr Zhurnakov (Positive Technologies)**ResearchZero-day vulnerability was discovered in the [Math](https://github.com/PHPOffice/Math) library in the detailed process of the XXE vulnerability research in PHP.
Loading XML data, using the standard [`libxml`](https://www.php.net/manual/en/book.libxml.php) extension and the [`LIBXML_DTDLOAD`](https://www.php.net/manual/en/libxml.constants.php#constant.libxml-dtdload) flag without additional filtration, leads to XXE.Below are steps to reproduce the vulnerability.Preparation:The payload was tested on the PHP versions >= 8.1.The [composer](https://getcomposer.org/) manager is used to install the latest version of the Math library.PHP has to be configurated with [Zlib](https://www.php.net/manual/ru/book.zlib.php) support.The necessary [requirements](https://github.com/PHPOffice/Math?tab=readme-ov-file#requirements) for the Math library must be installed.The `netcat` utility is used for demonstration exfiltration.Make `math` directory and then moving into it.Install the latest actual version of the library (Figure 1)._Figure 1. Installing the library_
<img width="630" alt="fig2" src="https://github.com/user-attachments/assets/bb0c6781-4f5a-411c-970d-9402e652ad87" />Create `poc.xml` file (Listing 1):_Listing 1. Creating `poc.xml`_Create `math.php` file (Listing 2):*Listing 2. Creating `math.php`*The payload (see the step 4) is set to exfiltrate the `/etc/hostname` file through `http://127.0.0.1:9999/`, so the listening socket is launched at the `9999` port (Figure 2)_Figure 2. Launching the listening socket_
<img width="550" alt="fig2" src="https://github.com/user-attachments/assets/6da5b966-70be-4e3e-9bde-c6baf4dfef34" />Execute php-script via console:6 characters from the `/etc/hostname` file will be exfiltrated to the `9999` port in base64 format (Figure 3)._Figure 3. Characters exfiltration_
<img width="520" alt="fig3" src="https://github.com/user-attachments/assets/f0eae873-d156-442f-ab08-12dd94a8dbe9" />Decode the received data from base64 removing the last `M` character (the payload feature) (Figure 4).*Figure 4. Data decoding*
<img width="595" alt="fig4" src="https://github.com/user-attachments/assets/7a091a07-7856-41a0-b1bd-3d8009303ced" />By changing the payload, the remaining file can be received.CreditsAleksandr Zhurnakov (Positive Technologies)
CVSS v4.0: 8.7