{"schema":"threatline.record/2","record":{"id":"CVE-2026-107215","aliases":["GHSA-x2q3-8cjh-766f","GO-2026-6689"],"summary":"Excelize: extractPart allocates attacker-controlled, unbounded and negative-sized buffers from CFB directory entries: remote panic / OOM DoS","details":"### Summary\n\n`extractPart` allocates directly from the mscfb directory-entry size with no clamping (`crypt.go:198`, same missing bound at `crypt.go:204`):\n\n```go\nbuf := make([]byte, entry.Size)\n```\n\n`entry.Size` is the raw `streamSize` field from the attacker-controlled CFB directory entry (mscfb v1.0.8 `fixFile`, `file.go:109-120`: full uint64 → int64 for major version 4, low uint32 for v3). mscfb only detects short sector chains later, inside `File.Read` (`file.go:485-489` \"emergency brake\") — i.e. **after** the allocation. The zip path already enforces `UnzipSizeLimit`, and the KDF path bounds work with `maxSpinCount`; this path consults no limit at all.\n\n### Details\n\nTwo consequences, both execution-confirmed against pristine master (`ecd99d761fe0`, 2026-09-08):\n\n1. **Hard crash**: a version-4 CFB declaring `streamSize = 0xFFFFFFFFFFFFFFFF` yields `entry.Size == -1` → `panic: runtime error: makeslice: len out of range`, which escapes `Decrypt` (`openReaderAt` converts errors, not panics, `excelize.go:210-214`) and kills the process.\n2. **Memory exhaustion**: any CFB (v3 suffices) declaring `streamSize` up to `0xFFFFFFFF` forces up to 4 GiB of zeroed allocation from a ~12 KB file — an amplification factor of ~350,000×, trivially repeated per request in memory-limited deployments.\n\nCall path: `OpenFile`/`OpenReader`/`OpenBytes` → `openReaderAt` (`excelize.go:208-215`, OLE magic sniff) → `Decrypt` (`crypt.go:145-150`) → `extractPart` (`crypt.go:198`).\n\n### PoC\n\nA standalone program (public API only) was provided to the maintainer by email (`2-extractpart-oom`): it builds a valid-enough v4 (4096-byte sector) CFB — header (signature, sector shift `0x0C`, `DIFAT[0]=1`), one directory sector with Root Entry (typeID 5, child=1) and a stream entry `EncryptionInfo` (objectType=2, startingSector=endOfChain, `streamSize=0xFFFFFFFFFFFFFFFF`). `mscfb.New` succeeds, `doc.Next()` returns the entry, and `extractPart` calls `make([]byte, -1)` before any chain validation. On master `ecd99d761fe0` the program prints `panic: runtime error: makeslice: len out of range`; with the proposed patch it prints BLOCKED. An `-oom` flag demonstrates the 4 GiB allocation variant with `streamSize = 0xFFFFFFFF`.\n\n### Impact\n\nAn attacker uploads any file starting with the OLE signature `D0 CF 11 E0 A1 B1 1A E1` (~12 KB is enough) to a service that calls `excelize.OpenFile`/`OpenReader`/`OpenBytes` on it (or calls `Decrypt` directly): remote, unauthenticated process crash (hard panic) or forced 4 GiB allocation per request (OOM) with a ~350,000× amplification factor.\n\n### Proposed fix\n\nBound the declared stream size before allocating in `extractPart`: reject negative sizes and sizes above a sane policy cap (1 GiB is far above any real encrypted-workbook part) with `ErrWorkbookFileFormat`, so malformed CFBs are rejected as errors instead of panicking or OOMing. A complete patch has been provided to the maintainer; verified that the patch blocks the PoC while legitimate `Encrypt()` output still opens.","categories":["Libraries & packages"],"product":"github.com/xuri/excelize/v2","vendor":"qax-os","ecosystem":"go","affected_ranges":[{"source":"GitHub Advisory Database","source_url":"https://github.com/advisories/GHSA-x2q3-8cjh-766f","source_modified_at":"2026-10-08T16:31:27Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"go","name":"github.com/xuri/excelize/v2"},"range":">= 2.3.1, < 2.11.1-0.20260912113515-5f636f9dcde5"},{"source":"CVE List","source_url":"https://www.cve.org/CVERecord?id=CVE-2026-107215","source_modified_at":"2026-10-10T02:38:31.276Z","fetched_at":"2026-10-23T18:45:31.882637Z","product":"excelize","vendor":"qax-os","versions":[{"version":">= 2.3.1, <= 2.11.0","status":"affected"}],"defaultStatus":null},{"source":"OSV","source_url":"https://osv.dev/vulnerability/GHSA-x2q3-8cjh-766f","source_modified_at":"2026-10-19T21:41:17.838565606Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"Go","name":"github.com/xuri/excelize/v2","purl":"pkg:golang/github.com/xuri/excelize/v2"},"ranges":[{"events":[{"introduced":"2.3.1"},{"fixed":"2.11.1-0.20260912113515-5f636f9dcde5"}],"type":"SEMVER"}],"versions":[]}],"fixed_versions":[{"source":"GitHub Advisory Database","source_url":"https://github.com/advisories/GHSA-x2q3-8cjh-766f","source_modified_at":"2026-10-08T16:31:27Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"go","name":"github.com/xuri/excelize/v2"},"version":"2.11.1-0.20260912113515-5f636f9dcde5"},{"source":"OSV","source_url":"https://osv.dev/vulnerability/GHSA-x2q3-8cjh-766f","source_modified_at":"2026-10-19T21:41:17.838565606Z","fetched_at":"2026-10-23T18:42:43.628194Z","package":{"ecosystem":"Go","name":"github.com/xuri/excelize/v2","purl":"pkg:golang/github.com/xuri/excelize/v2"},"version":"2.11.1-0.20260912113515-5f636f9dcde5"}],"cvss":7.5,"severity":"High","kev":{"listed":false},"epss":{"probability":0.00228,"percentile":0.12787,"score_date":"2026-10-23"},"published_at":"2026-10-07T17:48:03.233Z","modified_at":"2026-10-19T21:41:17.838565606Z","provenance":[{"source":"GitHub Advisory Database","url":"https://github.com/advisories/GHSA-x2q3-8cjh-766f","fetched_at":"2026-10-23T18:42:43.628194Z","source_modified_at":"2026-10-08T16:31:27Z"},{"source":"CVE List","url":"https://www.cve.org/CVERecord?id=CVE-2026-107215","fetched_at":"2026-10-23T18:45:31.882637Z","source_modified_at":"2026-10-10T02:38:31.276Z"},{"source":"OSV","url":"https://osv.dev/vulnerability/GHSA-x2q3-8cjh-766f","fetched_at":"2026-10-23T18:42:43.628194Z","source_modified_at":"2026-10-19T21:41:17.838565606Z"},{"source":"EPSS","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-107215","fetched_at":"2026-10-23T18:42:43.628194Z","source_modified_at":"2026-10-23"}],"sources":["GitHub Advisory Database","CVE List","OSV","EPSS"],"references":[{"source":"CVE List","url":"https://github.com/qax-os/excelize/security/advisories/GHSA-x2q3-8cjh-766f","tags":["exploit"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-107215","source":"GitHub Advisory Database"},{"source":"CVE List","url":"https://github.com/qax-os/excelize/pull/2396","tags":["x_refsource_MISC"]},{"source":"CVE List","url":"https://github.com/qax-os/excelize/commit/5f636f9dcde55911f14290060b017f0cc88cd694","tags":["x_refsource_MISC"]},{"url":"https://github.com/advisories/GHSA-x2q3-8cjh-766f","source":"GitHub Advisory Database"}],"locations":[],"motoko_assessment":{"status":"requires_architecture_review","automatic_remediation":false},"cve_state":"PUBLISHED","ssvc":{"exploitation":"poc","automatable":"yes","technical_impact":"partial","assessed_at":"2026-10-10T02:38:08.709822Z"},"classification":{"method":"product-first software-layer rules","rules_version":"2.1","matched_on":"ecosystem","confidence":"heuristic","reviewed":false},"change_timestamp":"2026-10-19T21:41:17.838565606Z","content_hash":"69d9ae437b8e573dc4b3553c20f9de4a3d32cbf092275cf3d45b2c18fe62f289"}}
