From c04a9389d3e1d905a32c25eee4cbf0a008cca799 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Sun, 10 Nov 2024 01:07:59 -0800 Subject: [PATCH] Merge commit from fork * Security Patch * Throw Exception for EBCDIC Encoding * Mixed UTF-8 and UTF-16 Further mischief. I don't know if the examples truly are valid Xml, but PhpSpreadsheet is letting them sneak through. --- .../Reader/Security/XmlScanner.php | 53 ++++++++++++------ src/PhpSpreadsheet/Reader/Xml.php | 12 +--- .../Reader/Security/XmlScannerTest.php | 48 +++++++++++++--- tests/data/Reader/XLSX/ebcdic.dontuse | Bin 0 -> 5576 bytes tests/data/Reader/XLSX/utf16be.bom.xlsx | Bin 0 -> 8125 bytes tests/data/Reader/XLSX/utf16be.xlsx | Bin 0 -> 8121 bytes tests/data/Reader/XLSX/utf16entity.dontuse | Bin 0 -> 5716 bytes tests/data/Reader/XLSX/utf7quoteorder.dontuse | Bin 0 -> 5490 bytes tests/data/Reader/XLSX/utf8and16.dontuse | Bin 0 -> 5620 bytes .../data/Reader/XLSX/utf8and16.entity.dontuse | Bin 0 -> 5711 bytes 10 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 tests/data/Reader/XLSX/ebcdic.dontuse create mode 100644 tests/data/Reader/XLSX/utf16be.bom.xlsx create mode 100644 tests/data/Reader/XLSX/utf16be.xlsx create mode 100644 tests/data/Reader/XLSX/utf16entity.dontuse create mode 100644 tests/data/Reader/XLSX/utf7quoteorder.dontuse create mode 100644 tests/data/Reader/XLSX/utf8and16.dontuse create mode 100644 tests/data/Reader/XLSX/utf8and16.entity.dontuse diff --git a/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/src/PhpSpreadsheet/Reader/Security/XmlScanner.php index 362a70c127..be64981920 100644 --- a/src/PhpSpreadsheet/Reader/Security/XmlScanner.php +++ b/src/PhpSpreadsheet/Reader/Security/XmlScanner.php @@ -6,6 +6,9 @@ class XmlScanner { + private const ENCODING_PATTERN = '/encoding\\s*=\\s*(["\'])(.+?)\\1/s'; + private const ENCODING_UTF7 = '/encoding\\s*=\\s*(["\'])UTF-7\\1/si'; + private string $pattern; /** @var ?callable */ @@ -36,13 +39,24 @@ private static function forceString(mixed $arg): string private function toUtf8(string $xml): string { $charset = $this->findCharSet($xml); + $foundUtf7 = $charset === 'UTF-7'; if ($charset !== 'UTF-8') { + $testStart = '/^.{0,4}\\s*findCharSet($xml); - if ($charset !== 'UTF-8') { - throw new Reader\Exception('Suspicious Double-encoded XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); + if ($startWithXml1 === 1 && preg_match($testStart, $xml) !== 1) { + throw new Reader\Exception('Double encoding not permitted'); } + $foundUtf7 = $foundUtf7 || (preg_match(self::ENCODING_UTF7, $xml) === 1); + $xml = preg_replace(self::ENCODING_PATTERN, '', $xml) ?? $xml; + } else { + $foundUtf7 = $foundUtf7 || (preg_match(self::ENCODING_UTF7, $xml) === 1); + } + if ($foundUtf7) { + throw new Reader\Exception('UTF-7 encoding not permitted'); + } + if (substr($xml, 0, Reader\Csv::UTF8_BOM_LEN) === Reader\Csv::UTF8_BOM) { + $xml = substr($xml, Reader\Csv::UTF8_BOM_LEN); } return $xml; @@ -50,15 +64,16 @@ private function toUtf8(string $xml): string private function findCharSet(string $xml): string { - $patterns = [ - '/encoding\\s*=\\s*"([^"]*]?)"/', - "/encoding\\s*=\\s*'([^']*?)'/", - ]; - - foreach ($patterns as $pattern) { - if (preg_match($pattern, $xml, $matches)) { - return strtoupper($matches[1]); - } + if (substr($xml, 0, 4) === "\x4c\x6f\xa7\x94") { + throw new Reader\Exception('EBCDIC encoding not permitted'); + } + $encoding = Reader\Csv::guessEncodingBom('', $xml); + if ($encoding !== '') { + return $encoding; + } + $xml = str_replace("\0", '', $xml); + if (preg_match(self::ENCODING_PATTERN, $xml, $matches)) { + return strtoupper($matches[2]); } return 'UTF-8'; @@ -71,13 +86,15 @@ private function findCharSet(string $xml): string */ public function scan($xml): string { + // Don't rely purely on libxml_disable_entity_loader() + $pattern = '/\\0*' . implode('\\0*', str_split($this->pattern)) . '\\0*/'; + $xml = "$xml"; + if (preg_match($pattern, $xml)) { + throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); + } $xml = $this->toUtf8($xml); - - // Don't rely purely on libxml_disable_entity_loader() - $pattern = '/\\0?' . implode('\\0?', str_split($this->pattern)) . '\\0?/'; - if (preg_match($pattern, $xml)) { throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); } @@ -90,7 +107,7 @@ public function scan($xml): string } /** - * Scan theXML for use of getSecurityScannerOrThrow()->scan($data); // Why? //$data = str_replace("'", '"', $data); // fix headers with single quote @@ -106,14 +106,6 @@ public function canRead(string $filename): bool } } - // Retrieve charset encoding - if (preg_match('//m', $data, $matches)) { - $charSet = strtoupper($matches[1]); - if (preg_match('/^ISO-8859-\d[\dL]?$/i', $charSet) === 1) { - $data = StringHelper::convertEncoding($data, 'UTF-8', $charSet); - $data = (string) preg_replace('/()/um', '$1' . 'UTF-8' . '$2', $data, 1); - } - } $this->fileContents = $data; return $valid; diff --git a/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php b/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php index aa214b4a06..9299161f0e 100644 --- a/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php @@ -30,7 +30,11 @@ public static function providerValidXML(): array self::assertNotFalse($glob); foreach ($glob as $file) { $filename = realpath($file); - $expectedResult = file_get_contents($file); + $expectedResult = (string) file_get_contents($file); + if (preg_match('/UTF-16(LE|BE)?/', $file, $matches) == 1) { + $expectedResult = (string) mb_convert_encoding($expectedResult, 'UTF-8', $matches[0]); + $expectedResult = preg_replace('/encoding\\s*=\\s*[\'"]UTF-\\d+(LE|BE)?[\'"]/', '', $expectedResult) ?? $expectedResult; + } $tests[basename($file)] = [$filename, $expectedResult]; } @@ -132,19 +136,47 @@ public function testEncodingAllowsMixedCase(): void self::assertSame($input, $output); } - public function testUtf7Whitespace(): void + /** + * @dataProvider providerInvalidXlsx + */ + public function testInvalidXlsx(string $filename, string $message): void { $this->expectException(ReaderException::class); - $this->expectExceptionMessage('Double-encoded'); + $this->expectExceptionMessage($message); $reader = new Xlsx(); - $reader->load('tests/data/Reader/XLSX/utf7white.dontuse'); + $reader->load("tests/data/Reader/XLSX/$filename"); } - public function testUtf8Entity(): void + public static function providerInvalidXlsx(): array + { + return [ + ['utf7white.dontuse', 'UTF-7 encoding not permitted'], + ['utf7quoteorder.dontuse', 'UTF-7 encoding not permitted'], + ['utf8and16.dontuse', 'Double encoding not permitted'], + ['utf8and16.entity.dontuse', 'Detected use of ENTITY'], + ['utf8entity.dontuse', 'Detected use of ENTITY'], + ['utf16entity.dontuse', 'Detected use of ENTITY'], + ['ebcdic.dontuse', 'EBCDIC encoding not permitted'], + ]; + } + + /** + * @dataProvider providerValidUtf16 + */ + public function testValidUtf16(string $filename): void { - $this->expectException(ReaderException::class); - $this->expectExceptionMessage('Detected use of ENTITY'); $reader = new Xlsx(); - $reader->load('tests/data/Reader/XLSX/utf8entity.dontuse'); + $spreadsheet = $reader->load("tests/data/Reader/XLSX/$filename"); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame(1, $sheet->getCell('A1')->getValue()); + $spreadsheet->disconnectWorksheets(); + } + + public static function providerValidUtf16(): array + { + return [ + ['utf16be.xlsx'], + ['utf16be.bom.xlsx'], + ]; } } diff --git a/tests/data/Reader/XLSX/ebcdic.dontuse b/tests/data/Reader/XLSX/ebcdic.dontuse new file mode 100644 index 0000000000000000000000000000000000000000..9d366bd1279b19103a1198b43f37b39ea43b8041 GIT binary patch literal 5576 zcmb7|2RzjO|GIp}SIyOhon`8hyf+ZjT@a?9HL(t(KA_mx~gH5|M?8sMe-+b`^0P3R% z8#r9>rW^Ddi74=dO>>)E>kdC- #V_Uv; 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 literal 0 HcmV?d00001 diff --git a/tests/data/Reader/XLSX/utf16be.bom.xlsx b/tests/data/Reader/XLSX/utf16be.bom.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d18c3600e6e5a66825000bfccd89b39702bb6685 GIT binary patch literal 8125 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 literal 0 HcmV?d00001 diff --git a/tests/data/Reader/XLSX/utf16be.xlsx b/tests/data/Reader/XLSX/utf16be.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6bcaf0767dfea7f2f07b19b62554b5484dd91480 GIT binary patch literal 8121 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 literal 0 HcmV?d00001 diff --git a/tests/data/Reader/XLSX/utf16entity.dontuse b/tests/data/Reader/XLSX/utf16entity.dontuse new file mode 100644 index 0000000000000000000000000000000000000000..2462cb870ab6baa7a39d2a7d8f0a7abc271c7203 GIT binary patch literal 5716 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 literal 0 HcmV?d00001