Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft XLSX with empty mergeCell ref
-
DeliveryDeliver file to target application
-
ExploitGetCellValue invokes mergeCellsParser
-
ExecutioncellInRange indexes empty slice
-
ImpactApplication panics (denial of service)
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Bounds checking, read limits
MITRE ATT&CK
1 technique across 1 tactic: Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires an application built with Excelize 2.7.1 through 2.11.0 to parse an attacker-controlled worksheet whose XML contains a mergeCell element with an empty 'ref' attribute, AND to then invoke a non-streaming cell-reading API (such as GetCellValue) that reaches mergeCellsParser. Limiting factors: the workbook must be processed by the victim application (UI:R - no fully autonomous remote trigger), and streaming cell APIs that do not route through mergeCellsParser/cellInRange are not affected. There is no authentication requirement in the library itself (PR:N), but real-world exposure depends on whether the embedding application accepts untrusted spreadsheet input. |
| Impact | This is a moderate-severity denial-of-service issue, not a high-priority emergency. The provided CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H, score 6.5) correctly reflects an availability-only impact (a Go panic / crash) with no confidentiality or integrity loss, gated by required user interaction (UI:R) - a victim application must read an attacker-supplied worksheet. Despite AV:N, exploitation is not purely remote-automatic: the attacker must get a crafted .xlsx file processed by an application that embeds the vulnerable Excelize versions (2.7.1-2.11.0) and calls a non-streaming cell API. No EPSS score, SSVC decision, or CISA KEV status was provided in the input, and there is no public exploit identified at time of analysis - only a vendor fix (PR #2379 / commit 99903a3) and a regression test, which is a patch artifact rather than weaponized exploit code. Note a conflict to verify: the 'Information Disclosure' tag contradicts the CVSS vector (C:N), and the 'Buffer Overflow' tag is imprecise - CWE-125 out-of-bounds read here produces a crash, not memory disclosure or code execution. Overall this warrants routine patching prioritization for teams whose Go services parse untrusted spreadsheets, not crisis response. |
| Exploit ScenarioDerived | An attacker crafts a malicious Excel workbook containing a mergeCell element with an empty 'ref' attribute and gets it uploaded to or opened by a backend service that uses Excelize to read cell values (e.g., an invoice/report ingestion pipeline). When the service calls a non-streaming API such as GetCellValue, mergeCellsParser hands an empty rectangle slice to cellInRange, which indexes four out-of-bounds positions and panics, crashing the processing routine. No public exploit code is identified at time of analysis, though the trigger is trivial to construct from the public patch and test case. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 07, 2026
An out-of-bounds slice access in the Excelize Go library (versions 2.7.1 through 2.11.0) lets a crafted .xlsx workbook crash the host application, causing denial of service. When mergeCellsParser encounters a mergeCell element with an empty 'ref' attribute it returns an empty rectangle and passes it to cellInRange, which indexes four positions without a length check; any non-streaming cell API such as GetCellValue then panics on the first affected cell operation. The bug is remotely triggerable but requires the victim application to process an attacker-supplied spreadsheet and invoke an affected cell-reading API (CVSS 3.1: AV:N/AC:L/PR:N/UI:R, A:H only), and no public exploit or confirmed active exploitation is known at time of analysis.
RemediationAI
No vendor-released patch version is available at time of analysis; upstream fix code exists in PR #2379 / commit 99903a3240e58a47ff28fb8e05a03bd9d496ec24, so consumers should either upgrade as soon as a tagged release incorporating that commit is published (tracking the advisory at https://github.com/qax-os/excelize/security/advisories/GHSA-g27h-8qhm-6pff) or temporarily vendor the commit/build a fork with the added zero-length rectangle check. Compensating controls if patching is not yet possible: pre-validate and sanitize uploaded workbooks, specifically rejecting or stripping mergeCell elements with empty or malformed 'ref' attributes before parsing; switch affected workloads to Excelize's streaming row reader, which does not route through mergeCellsParser/cellInRange, at the cost of a reduced feature set (no random-access cell queries or full worksheet mutation); and wrap parsing in a recover() boundary plus worker isolation with strict upload size and rate limits so a panic degrades a single request rather than the whole process. Note that panic recovery masks other latent parsing defects and is a stopgap, not a fix.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Excelize is a widely embedded pure-Go library for reading and writing Office Open XML (xlsx) spreadsheets, identified by CPE cpe:2.3:a:qax-os:excelize:*:*:*:*:*:*:*:*. The defect is classified as CWE-125 (Out-of-bounds Read) and arises in the worksheet merge-range parser: mergeCellsParser builds a rectangle from the 'ref' attribute of a mergeCell element, and when that attribute is empty the cached rectangle stays an empty slice. The code then forwards the empty slice to cellInRange, which indexes positions [0] through [3] of the rectangle without verifying its length. In Go, indexing past the bounds of an empty slice raises a runtime panic rather than returning memory, so the practical effect is a hard crash (availability loss) of the process handling the workbook. The affected path is reached only by non-streaming cell APIs that call mergeCellsParser/cellInRange; streaming readers bypass this code path. The referenced upstream patch (PR #2379, commit 99903a3240e58a47ff28fb8e05a03bd9d496ec24) adds a guard that skips merge cells whose rectangle length is zero, with a regression test covering an empty mergeCell Ref.
Know when Excelize gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
A crafted file can be delivered remotely (AV:N) and trivially triggers a panic (AC:L), but a victim application must read the file (UI:R); impact is crash-only, so C:N/I:N/A:H.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
DescriptionCVE.org
Excelize is a Go language library for reading and writing Microsoft Excel spreadsheets. From 2.7.1 to 2.11.0, mergeCellsParser leaves the cached rectangle empty for an empty mergeCell ref and then passes that empty slice to cellInRange without a length check. GetCellValue reaches mergeCellsParser, which passes an empty rectangle derived from the mergeCell ref attribute into cellInRange. When a crafted worksheet contains an empty mergeCell ref and a non-streaming cell API reads the worksheet, cellInRange indexes four positions in an empty slice, allowing an attacker to panic on the first affected cell operation. No fixed version is available as of this review.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
A buffer overflow occurs when a program writes more data to a memory buffer than it was allocated to hold, causing the excess data to spill into adjacent memory regions.
Denial of service in the Excelize Go library (github.com/xuri/excelize/v2, a.k.a. qax-os/excelize) before 2.11.0 allows
Denial of service in the Excelize Go library (versions 2.1.0 through 2.11.0) allows an attacker-controlled spreadsheet t
A crafted Excel (.xlsx) file can crash any Go application that parses it with Excelize 2.0.0 through 2.11.0 using a non-
Uncontrolled memory and CPU consumption in Excelize (qax-os/excelize), the widely used Go library for reading and writin
Denial of service in Excelize 2.9.0 through 2.11.0 allows a crafted spreadsheet to panic and terminate a Go process that
Go slice-bounds panic in the Excelize spreadsheet library versions 2.8.1 through 2.11.0 lets a crafted .xlsx workbook cr
Denial of service in the Excelize Go library (versions 2.3.1 through 2.11.0) allows unauthenticated remote attackers to
Denial of service in the Excelize Go spreadsheet library (github.com/xuri/excelize/v2 2.0.0-2.11.0 and github.com/xuri/e
Uncontrolled recursion in the Excelize Go library (versions 2.8.1 through 2.11.0) allows a fatal Go stack overflow that
Denial of service in Excelize versions 2.3.1 through 2.11.0 allows unauthenticated remote attackers to terminate the cal
Memory exhaustion and runtime panic in the Excelize Go library (versions 2.3.1 through 2.11.0) let unauthenticated remot
Resource exhaustion in the Excelize Go library (versions 2.1.0 through 2.11.0) lets a crafted .xlsx workbook drive exces
EUVD-2026-94550
GHSA-g27h-8qhm-6pff
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB