CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-107212

CVE-2026-107212: CPU Exhaustion Denial of Service via Look-Ahead Row Parsing in Excelize

Alon Barad
Alon Barad
Software Engineer

Oct 8, 2026·6 min read·5 visits

Executive Summary (TL;DR)

A vulnerability in Excelize allows unauthenticated remote attackers to trigger a sustained Denial of Service (100% CPU exhaustion) by uploading an Excel file containing a row index that exceeds the platform's architectural maximum.

An algorithmic complexity vulnerability (CWE-770) in the Excelize library allows remote attackers to cause resource exhaustion (100% CPU usage) via a crafted Microsoft Excel spreadsheet. This occurs because the look-ahead row index parsing in Rows.Columns() fails to enforce upper boundary limits, enabling an out-of-bounds row index to trigger an infinite seek loop inside the Rows iterator.

Vulnerability Overview

Excelize is an open-source Go language library designed for reading, writing, and processing Microsoft Excel spreadsheets. The library is optimized for handling high-volume data structures and relies heavily on a streaming XML tokenizer to limit memory consumption when parsing large OpenXML workbooks.

Applications that accept user-uploaded files often leverage Excelize to parse spreadsheet data on the backend. This exposes an attack surface where untrusted input files are parsed automatically. If a worksheet contains structural or architectural violations in its XML metadata, the parsing engine must resolve these states cleanly without exhausting host resources.

This vulnerability, tracked as CVE-2026-107212, is an algorithmic complexity flaw within the look-ahead logic of the row processing module. An attacker can supply a crafted Excel document where the row index attribute deviates from sequential ordering and exceeds the architectural row limit. This causes the internal row iterator to enter an unbounded processing loop, resulting in persistent CPU exhaustion.

Root Cause Analysis

Microsoft Excel spreadsheets limit the maximum index of a worksheet row to 1,048,576, which is defined in Excelize as the constant TotalRows. To traverse the underlying XML document sequentially, Excelize couples two main functions: Rows.Next() and Rows.Columns(). While Rows.Next() verifies that the index does not exceed this boundary, the look-ahead logic inside Rows.Columns() contains a distinct code path that reads index values directly.

When Rows.Columns() parses the worksheet XML, it scans ahead to map the columns belonging to the active row. During this look-ahead scan, it reads the row number directly from the raw XML attribute r using the helper attrValToInt(). In affected versions of Excelize, this look-ahead sequence did not validate if the parsed row index value exceeded the TotalRows limit.

When an XML workbook contains a second row with an out-of-bounds index, such as 231999999999940, the look-ahead parser assigns this value directly to the internal state variable rows.curRow. In the subsequent iteration, Rows.Next() attempts to advance to the next index by checking the status of rows.seekRow against rows.curRow to determine if a fast-forward seek is required.

Because rows.curRow contains the oversized, unvalidated value, the conditional check rows.curRow >= rows.seekRow evaluates to true. The iterator continuously increments the internal tracking pointer rows.seekRow in a sequential loop, attempting to reach the massive integer value stored in rows.curRow. This sequence runs indefinitely, consuming 100% of the executing CPU thread.

Code Analysis

The vulnerability resides in rows.go within the Columns() and Next() method implementations. The code below illustrates the look-ahead logic in Rows.Columns() before the fix:

// Vulnerable logic in rows.go
if rowIterator.inElement == "row" {
    rowNum := 0
    if rowNum, rowIterator.err = attrValToInt("r", xmlElement.Attr); rowNum != 0 {
        rows.curRow = rowNum
    } else if rows.token == nil {
        rows.curRow++
    }
}

The code above parses the r attribute and assigns it directly to rows.curRow without checking if the parsed index exceeds TotalRows. Commit 01a9ff32fb3c1f873cf01205e1b8a3285b0e1d23 resolves this by adding an explicit upper bound comparison:

// Patched logic in rows.go
if rowIterator.inElement == "row" {
    rowNum := 0
    if rowNum, rowIterator.err = attrValToInt("r", xmlElement.Attr); rowNum > TotalRows {
        rows.err, rows.token = ErrMaxRows, nil
        return rowIterator.cells, rows.err
    } else if rowNum != 0 {
        rows.curRow = rowNum
    } else if rows.token == nil {
        rows.curRow++
    }
}

Additionally, the patch implements a critical short-circuit check at the entry point of the Rows.Next() function. This ensures that any error state flagged during look-ahead parsing immediately terminates the iteration:

// Patched logic in Next()
func (rows *Rows) Next() bool {
    if rows.err != nil {
        return false
    }
    rows.seekRow++
    // ...
}

By forcing an immediate exit when rows.err is populated with ErrMaxRows, the parsing engine halts execution immediately. This prevents the execution flow from falling into the sequential lookup loop, entirely neutralizing the CPU exhaustion vector.

Exploitation Methodology

An attacker can exploit this vulnerability by submitting a highly structured XLSX archive that targets the look-ahead mechanism. The exploit does not require authentication and can be completed via standard file-upload vectors.

To construct the payload, an attacker creates an Excel file and unpacks its structures to locate xl/worksheets/sheet1.xml. Inside this document, the attacker inserts a valid first row followed immediately by an out-of-bounds row index:

<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <sheetData>
    <row r="1">
      <c><v>First</v></c>
    </row>
    <row r="5000000000">
      <c><v>Trigger</v></c>
    </row>
  </sheetData>
</worksheet>

Once the archive is re-compressed and uploaded to a target application, the processing service executes the Excelize reading routine. The loop sequentially processes the first row cleanly. During look-ahead processing of the first row, Rows.Columns() reads the next element in the token stream and encounters the row with index 5000000000.

Because the index is not validated, the parser assigns 5000000000 to rows.curRow. When the application calls Rows.Next() to fetch the subsequent row, the validation check enters a loop where rows.seekRow increments from 2 towards 5000000000. This causes the executing Go routine to hang indefinitely, pinning the host CPU core.

Impact Assessment

The impact of CVE-2026-107212 is a sustained Denial of Service on the affected host. Because Excelize is often implemented in synchronous upload handling paths, a single malicious file upload will lock a processing thread and drive host CPU core usage to 100% capacity.

In multi-tenant cloud environments or microservice architectures, multiple automated uploads can quickly exhaust all available CPU resources across instances. This degrades the performance of surrounding services, causes request timeouts, and leads to system-wide instability.

This vulnerability has a CVSS v3.1 base score of 7.5. Since the exploit is contained entirely within the structure of the input file, it requires no privileges, can be executed over the network without user interaction, and has low attack complexity. Although it does not compromise data confidentiality or integrity, its impact on service availability is high.

Remediation and Mitigation

The primary remediation for this vulnerability is updating the Excelize dependency within the application module. Users should target versions containing the official patch merged in PR #2438, or explicitly pin their module configurations to the fixed commit hash:

go get github.com/xuri/excelize/v2@01a9ff32fb3c1f873cf01205e1b8a3285b0e1d23

If updating the library is not immediately possible, applications should implement strict execution timeouts for document parsing tasks. Using Go contexts with strict deadlines guarantees that any parsing operations that exceed reasonable execution boundaries will be terminated forcefully:

ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
defer cancel()
// Implement context check within processing logic

Additional mitigation steps include enforcing payload size limitations at the API gateway layer to prevent extremely large files from reaching backend parsers. Isolating parsing engines in resource-constrained containers (e.g., configuring CPU limits in Kubernetes or Docker) ensures that resource starvation is isolated and does not compromise critical infrastructure.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
EPSS Probability
0.34%
Top 75% most exploited

Affected Systems

github.com/xuri/excelizegithub.com/qax-os/excelize

Affected Versions Detail

Product
Affected Versions
Fixed Version
excelize
qax-os
>= 2.1.0, <= 2.11.0Commit 01a9ff32fb3c1f873cf01205e1b8a3285b0e1d23
AttributeDetail
CWE IDCWE-770
Attack VectorNetwork
CVSS v3.1 Score7.5 (High)
EPSS Score0.00339 (Percentile: 25.26%)
ImpactDenial of Service (CPU Exhaustion)
Exploit StatusPoC / Tested
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-770
Allocation of Resources Without Limits or Throttling

The software allocates memory, CPU, or other resources without checking or restricting the quantity, allowing a remote attacker to exhaust host resources and trigger a Denial of Service.

Vulnerability Timeline

Official patch authored and pull request #2438 submitted
2026-09-30
CVE-2026-107212 published and GHSA-jw42-f3rr-4cc3 advisory released
2026-10-07

References & Sources

  • [1]GitHub Security Advisory GHSA-jw42-f3rr-4cc3
  • [2]Official Fix Pull Request #2438
  • [3]Official Fix Commit
  • [4]National Vulnerability Database (NVD) Entry
  • [5]CVE Org Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•CVE-2026-105647
4.0

CVE-2026-105647: Server-Side Request Forgery via Favicon Probing in Ghost CMS

An unauthenticated Server-Side Request Forgery (SSRF) vulnerability exists in Ghost CMS from version 6.54.1 to 6.65.0. The vulnerability stems from a validation bypass in the favicon resolution logic within the bookmark-fetching subsystem, which allows remote, unauthenticated attackers to trigger arbitrary HTTP requests to the local host and internal networks. This bypass circumvents the custom DNS-level IP blocklist controls configured globally in the application.

Alon Barad
Alon Barad
3 views•8 min read
•about 3 hours ago•CVE-2026-106450
5.3

CVE-2026-106450: Denial of Service via Eager Resource Allocation in lz4-java LZ4FrameInputStream

A resource allocation vulnerability (CWE-770) in lz4-java before version 1.11.4 allows an unauthenticated remote attacker to trigger CPU exhaustion and high garbage collection overhead by streaming empty concatenated LZ4 frames.

Alon Barad
Alon Barad
6 views•8 min read
•about 4 hours ago•CVE-2026-106449
3.7

CVE-2026-106449: Stack Overflow via Uncontrolled Recursion in yawkat lz4-java

A Denial of Service (DoS) vulnerability exists in the yawkat fork of lz4-java prior to version 1.11.4. Under specific non-default configurations (stopOnEmptyBlock = false), parsing crafted streams with a large sequence of contiguous empty LZ4 blocks triggers uncontrolled recursion inside the LZ4BlockInputStream.refill() method, causing stack exhaustion and thread termination.

Alon Barad
Alon Barad
4 views•6 min read
•about 4 hours ago•CVE-2026-76485
9.8

CVE-2026-76485: Remote Code Execution in Cisco NX-OS VXLAN OAM (NGOAM)

CVE-2026-76485 is a critical stack-based buffer overflow vulnerability in the VXLAN OAM (NGOAM) parsing component of Cisco NX-OS Software. The flaw enables an unauthenticated, remote attacker to execute arbitrary code with root privileges or trigger a denial of service on affected Nexus switches. This vulnerability is triggered through crafted packets sent to an IP interface. No workarounds are currently available to mitigate the vulnerability while preserving the NGOAM functionality. Cisco has published software patches to address this flaw.

Alon Barad
Alon Barad
7 views•6 min read
•about 5 hours ago•CVE-2026-106451
7.3

CVE-2026-106451: Local Privilege Escalation via JNI Extraction TOCTOU in lz4-java

A local privilege escalation and code execution vulnerability exists in the yawkat fork of lz4-java when extracting its bundled JNI shared library into the system temporary directory. Predictable path derivation and lack of exclusive file creation flags allow a local attacker to hijack library loading via a race condition.

Alon Barad
Alon Barad
6 views•6 min read
•about 6 hours ago•CVE-2026-105698
5.4

CVE-2026-105698: Missing Authorization in Deprecated Chat Vertices Endpoints in Langflow

A missing authorization vulnerability in Langflow versions 1.0.0 through 1.10.0 allows authenticated users (and unauthenticated users in versions prior to 1.7.2) to access private workflow structures and execute graph components by targeting deprecated API endpoints.

Amit Schendel
Amit Schendel
5 views•8 min read