Skip to main content

Excelize CVE-2026-107221

| EUVDEUVD-2026-94551 MEDIUM
Out-of-bounds Write (CWE-787)
2026-10-07 GitHub_M GHSA-8mcq-6wmr-jrjv
6.5
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Craft XLSX row with higher-column cell before final lower-column cell
  2. Exploit
    Victim service reads sheet via non-streaming API (GetCellValue)
  3. Execution
    Slice index exceeds length derived from final cell
  4. Impact
    Unrecovered panic terminates process

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Bounds checking, write limits
MITRE ATT&CK

2 techniques across 2 tactics: Execution, Privilege Escalation

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires the application to read an attacker-controlled .xlsx file containing a row whose cells are out of column order - specifically a higher-column cell (e.g. D1) placed before the lower-column final cell (e.g. B1) - and to parse it with a non-streaming worksheet API such as GetCellValue/GetRows that routes through workSheetReader and checkRow. Limiting factors: exploitation needs user/application interaction to load the crafted file (UI:R), impact is limited to a process crash with no data exposure or code execution, applications using the streaming Rows() reader may avoid the vulnerable checkRow path, and only excelize versions 2.0.0 through 2.11.0 are affected.

Impact

This is a medium-severity denial-of-service issue, not a high-priority emergency. The CVSS 6.5 is driven entirely by availability (A:H) with no confidentiality or integrity impact (C:N/I:N) - the worst outcome is an unrecovered panic that crashes the process. The vector is favorable to an attacker in theory (AV:N/AC:L/PR:N) but is tempered by UI:R: the victim application must actually load and read a crafted .xlsx file via a non-streaming API, so this is not wormable or automatable in the SSVC sense (exploitation=none, automatable=no, technical impact=partial/DoS-only). No KEV listing and no EPSS score were provided, and no public exploit exists beyond the reproducing test case in the fix PR - all signals point to low real-world urgency. The one genuinely elevated signal is patch availability: the description states 'No fixed version is available as of this review' even though PR #2376 contains the fix and its reproducing test, so there is a patch-readiness gap worth tracking. Real priority is conditional: elevated only for services that parse untrusted/user-uploaded spreadsheets through excelize's non-streaming worksheet APIs; otherwise low.

Exploit ScenarioDerived

An attacker uploads a malicious .xlsx file to a Go service that uses excelize to read spreadsheet contents. The file contains a row where a higher-column cell (e.g. D1) is placed before the lower-column final cell (e.g. B1); when the service calls a non-streaming API such as GetCellValue, checkRow sizes the target slice from the final cell and the earlier cell's larger column index overruns it, triggering an unrecovered panic that terminates the process. No public exploit exists, but PR #2376 includes a test that reproduces the crash with a descending-column row.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 07, 2026

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-streaming worksheet API, resulting in an unrecovered panic that terminates the process. The bug occurs when a row lists a higher-column cell (e.g. D1) before a lower-column final cell (e.g. B1): checkRow sizes its backing cell slice from the last cell in document order, so the earlier cell's column index falls outside the slice and triggers an out-of-bounds access. Exploitation requires the victim or application to load the malicious workbook (UI:R), impact is limited to availability with no data disclosure or code execution, and no public exploit was identified at time of analysis; an upstream fix is available as a PR/commit but a released patched version is not independently confirmed.

RemediationAI

No vendor-released patch was identified at time of analysis: the CVE record states no fixed version is available, so the most specific status is that an upstream fix exists only as a PR/commit (PR #2376, commit 46a5eb289448e40fbc7d3294589b03861fb822f0) and a released tagged version is not independently confirmed - operators should track https://github.com/qax-os/excelize/security/advisories/GHSA-8mcq-6wmr-jrjv and adopt the patched commit or the next tagged release as soon as it is published. Until then, practical compensating controls are: (1) switch untrusted-file parsing to the streaming Rows() reader, which bypasses the workSheetReader/checkRow path at the cost of losing the convenience of random cell access and some worksheet metadata features; (2) wrap all xlsx parsing in a deferred recover() in the same goroutine, or run it in a separate subprocess/worker pool, so a panic is contained and kills only the worker rather than the host process - this contains the crash but does not eliminate it and adds operational overhead; (3) gate ingestion with input validation or a pre-parse reserialization step that rejects or rewrites rows whose cell r references are not in ascending column order, accepting the extra CPU cost and the risk of false positives on legitimate but unusual files; and (4) treat untrusted workbooks as hostile input by imposing file-size/row-count limits and sandboxing the parsing service so a crash cannot cascade into a broader outage.

Affected VersionsENISA

excelize 2.0.0, ≤ 2.11.0

Affected Packages

go github.com/xuri/excelize/v2 fix: 2.11.1-0.20260816084418-46a5eb289448
euvd excelize_2_0_0 no fix

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 pure-Go library for reading and writing Office Open XML spreadsheets. Internally, rows.go's checkRow normalizes each parsed row so that cells are re-scattered into a slice indexed by their explicit column reference (the r attribute, e.g. A1, D1). In vulnerable versions the slice length was derived solely from the column of the last cell appearing in XML document order, and cells were then re-placed using their parsed column index. Because the OOXML schema does not require cells to be listed in ascending column order, a row such as <c r="D1"> followed by <c r="B1"> yields a slice sized for column B (2) while the D cell's index (4) is written/read beyond that length, an out-of-bounds memory access classified as CWE-787 (Out-of-bounds Write). The upstream patch (PR #2376) rewrites checkRow to compute both the cell count and the maximum column encountered while iterating, sizing the slice against the true maximum column rather than the document-order final cell, and adds a regression test that feeds a descending-order row (D1 then B1) through GetCellValue to assert a correctly sized 4-element row. The flaw is reachable through the non-streaming read path (GetCellValue, GetRows, workSheetReader -> checkRow), whereas the streaming Rows() reader may avoid it.

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

Vendor (GitHub_M) PRIMARY 6.5 MEDIUM
AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
vuln.today AI 6.5 MEDIUM

Crafted file is trivial to build (AC:L) and needs no privileges (PR:N), but the app must read it (UI:R); only a process-crashing panic results, so C:N/I:N/A:H.

3.1 AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

DescriptionCVE.org

Excelize is a Go language library for reading and writing Microsoft Excel spreadsheets. From 2.0.0 to 2.11.0, checkRow sizes its target cell slice from the last cell in XML document order and then re-scatters every cell by its explicit column reference. GetCellValue reaches workSheetReader and checkRow, where targetList is too short for an earlier out-of-order cell. When a crafted row places a higher-column cell before a lower-column final cell and a non-streaming worksheet API reads the sheet, the earlier cell's column index exceeds the slice length derived from the final cell, allowing an attacker to cause an unrecovered panic and terminate the process. No fixed version is available as of this review.

Threat Intelligence Overview

EPSS Score
0.3%
Top 79% exploitable
Prevalence
Medium
popular Go Excel library embedded in many backend services, not infrastructure
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC Yes
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

52
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0
CVE-2026-54063 HIGH POC
7.5 Jul 10

Denial of service in the Excelize Go library (github.com/xuri/excelize/v2, a.k.a. qax-os/excelize) before 2.11.0 allows

CVE-2026-107212 HIGH POC
7.5 Oct 07

Denial of service in the Excelize Go library (versions 2.1.0 through 2.11.0) allows an attacker-controlled spreadsheet t

CVE-2026-59161 HIGH POC
8.7 Jul 10

Uncontrolled memory and CPU consumption in Excelize (qax-os/excelize), the widely used Go library for reading and writin

CVE-2026-107213 HIGH
8.7 Oct 07

Denial of service in Excelize 2.9.0 through 2.11.0 allows a crafted spreadsheet to panic and terminate a Go process that

CVE-2026-107211 HIGH
8.7 Oct 07

Go slice-bounds panic in the Excelize spreadsheet library versions 2.8.1 through 2.11.0 lets a crafted .xlsx workbook cr

CVE-2026-107219 HIGH
7.5 Oct 07

Denial of service in the Excelize Go library (versions 2.3.1 through 2.11.0) allows unauthenticated remote attackers to

CVE-2026-107217 HIGH
7.5 Oct 07

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

CVE-2026-107216 HIGH
7.5 Oct 07

Uncontrolled recursion in the Excelize Go library (versions 2.8.1 through 2.11.0) allows a fatal Go stack overflow that

CVE-2026-107214 HIGH
7.5 Oct 07

Denial of service in Excelize versions 2.3.1 through 2.11.0 allows unauthenticated remote attackers to terminate the cal

CVE-2026-107215 HIGH
7.5 Oct 07

Memory exhaustion and runtime panic in the Excelize Go library (versions 2.3.1 through 2.11.0) let unauthenticated remot

CVE-2026-107223 HIGH
7.1 Oct 07

Resource exhaustion in the Excelize Go library (versions 2.1.0 through 2.11.0) lets a crafted .xlsx workbook drive exces

CVE-2026-59162 MEDIUM
6.9 Jul 10

Panic-triggering denial of service in the Excelize Go library (all versions prior to 2.11.0) allows any actor who can su

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy