Skip to main content
← All vulnerabilities
CVE-2026-40902GHSA-7C6M-4442-2X6M

PhpSpreadsheet: CPU Denial of Service via Unbounded Row Number in XLSX Row Dimensions

Published
Last modified
published
Not listed in CISA KEV
Fix
Fixed in 1.30.4, 2.1.16, 2.4.5, 3.10.5, 5.7.0
None on Exploit-DB, Metasploit or GitHub
  • Exploitation: poc
  • Automatable: yes
  • Technical impact: partial

Summary

PhpSpreadsheet is a pure PHP library for reading and writing spreadsheet files. Prior to 1.30.4, 2.1.16, 2.4.5, 3.10.5, and 5.7.0, the XLSX reader's ColumnAndRowAttributes::readRowAttributes() method reads row numbers from XML attributes without validating them against the spreadsheet maximum row limit (AddressRange::MAX_ROW = 1,048,576). An attacker can craft a minimal XLSX file (~1.6KB) containing a <row r="999999999"/> element that inflates cachedHighestRow to 999,999,999, causing any subsequent row iteration to attempt ~1 billion loop cycles and exhaust CPU resources. This vulnerability is fixed in 1.30.4, 2.1.16, 2.4.5, 3.10.5, and 5.7.0.

Timeline

  1. CVE published
  2. CISA SSVC assessment

    Exploitation: poc · Automatable: yes · Technical impact: partial

  3. Record last updated

Affected versions

  • PHPOffice PhpSpreadsheet

    fixed in 1.30.4; From 2.0.0 · fixed in 2.1.16; From 2.2.0 · fixed in 2.4.5; From 3.3.0 · fixed in 3.10.5; From 4.0.0 · fixed in 5.7.0

  • phpoffice/phpspreadsheetPackagist

    From 4.0.0 · fixed in 5.7.0

  • phpoffice/phpspreadsheetPackagist

    From 3.3.0 · fixed in 3.10.5

  • phpoffice/phpspreadsheetPackagist

    From 2.2.0 · fixed in 2.4.5

  • phpoffice/phpspreadsheetPackagist

    From 2.0.0 · fixed in 2.1.16

  • phpoffice/phpspreadsheetPackagist

    fixed in 1.30.4

References 1

GitHub · PHPOffice/PhpSpreadsheet