GITHUB.COM/XURI/EXCELIZE/V2 · CVE-2026-107218 · Package
FIX → 2.11.1-0.20260908032718-ecd99d761fe0
The Go spreadsheet library Excelize panics when its RIGHT() formula function handles text containing supplementary-plane characters with a negative index. The sources do not say that an attacker can run code or read data; the impact described is a crash.
first public Sep 8, 2026 · 3 sources
Check it with your coding agent
It checks your repository and tells you if you’re affected, with the fix.
Applications that import Excelize 2.10.1 up to but not including the fixed pseudo-version and evaluate RIGHT() formulas on text that may contain supplementary-plane characters. A negative index argument is also needed to trigger the panic. Programs that only write fixed cell values or never calculate formulas from untrusted input can skip it.
Not affected if fixed-version, no-formula-evaluation
Who cares cwe-129, excelize, go, spreadsheets
github.com/xuri/excelize/v2 in go.mod or with go list -m github.com/xuri/excelize/v2govulncheck ./... to see whether the vulnerable function is reachableleftRight (calc.go:14236) tests the length with countUTF16String, which counts a rune above U+FFFF as 2. The RIGHT branch on 14241 then slices []rune(text) at utf8.RuneCountInString(text)-numChars, which counts it as 1. For text with N such runes the two measures are 2N and N, so any numChars between them passes the guard and gives a negative index. The numChars < 0 check at 14216 does not help, since the value that gets through is positive.
What makes it worth reporting is AutoFitColWidth, which evaluates formulas without looking like it does, so normalising an uploaded sheet is enough to reach it. One scoping correction to my own wording there: AutoFitColWidth was added in v2.11.0 and does not exist at v2.10.1, so on v2.10.1 the only reachable path is an explicit CalcCellValue.
A 6,077-byte file containing two U+1D7D9 characters in A1 and RIGHT(A1,3) in B1 was created and then opened in a separate program without recovery enabled:
v2 ok
v2 ok
v2 : slice bounds out of [:]
v2 : slice bounds out of [:]
Are you affected?
Tell InfraStack what you run. It checks this one, and every next one, against your stack.
Ask from here. InfraStack checks the affected versions against your stack and answers in your inbox.
InfraStack checks the affected versions against your stack and answers in Slack, with the evidence and the fix.
Upgrade to 2.11.1-0.20260908032718-ecd99d761fe0
github.com/xuri/excelize/v2 to 2.11.1-0.20260908032718-ecd99d761fe0 or laterSo it is a regression, not an old defect. Commit a880146 (2026-01-16) moved the guard to countUTF16String and left the slice on the rune index, and git tag --contains gives v2.10.1 and v2.11.0 only.
RIGHT only. RIGHTB reaches the same function but takes the byte branch at 14225, which is internally consistent, and I probed MID and MIDB from 1 to 5 with no panic. It is the same negative-index family as GHSA-fx5j-qcqg-grpf and GHSA-48hm-4h8j-58fg, though those are shared-string lookups in the reader rather than a unit mismatch in the formula library.
This page as .md · .json · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Go Vulnerability Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain · GitHub Advisory Database, CC-BY 4.0. Posts quoted belong to their authors.