CVE-2026-88052
High · 7.8CVSS
7.8
EPSS
0.2%
Published
Sep 10, 2026
CISA due date
—
Cloudanix analysis
A common text-reading tool can crash or be abused if it is given a tampered language file, and there is still no official update to install.
- Exploitation
- Requires User Interaction
- Attacker needs
- User Interaction
- Complexity
- Moderate
- Impact
- Full Compromise
- Component
- Application
- Class
- Memory Corruption
- Remediation
- No Fix Yet
- Effort
- Other
- Patch risk
- Low
What it actually does
Tesseract 5.5.3 and earlier contain an unchecked-index heap write in UNICHARSET loading. load_via_fgets trusts a declared unichar count as a loop bound while unichar_insert_backwards_compatible may not grow the unichars vector for empty, duplicate, or already-encodable entries. The resulting out-of-bounds writes to UNICHAR_PROPERTIES during LSTM and legacy engine initialization can crash the process or corrupt adjacent heap state in the OCR worker.
Why it matters to the business
Any product that runs Tesseract on files, language packs, or traineddata from users, vendors, or the public internet can suffer OCR outages or, in worse cases, compromise of the process that performs recognition. Impact is local and needs the victim to process a crafted file, but public exploit code is already available and no official patched release exists more than three weeks after disclosure, so exposure remains open-ended for document pipelines, scanners, and RPA/OCR services.
How an attack unfolds
An attacker supplies a malicious unicharset or traineddata artifact rather than attacking Tesseract over the network. When the victim (or an automated pipeline) loads that data, initialization walks past the end of the unichars vector and corrupts the heap. The realistic outcomes are a reliable crash of the OCR process or, with a carefully shaped file, further memory corruption in the same process. Named ransomware or APT use is not reported; abuse is most likely via poisoned language data, a malicious document workflow, or a local file the user is induced to recognize.
How to fix it
No fixed Tesseract release is published. Stop loading unicharset and traineddata files from untrusted sources; pin known-good language data; run OCR in a tightly sandboxed, least-privilege process (container, seccomp, no extra mounts or credentials); and track upstream tesseract-ocr for a patch to UNICHARSET::load_via_fgets / unichar_insert_backwards_compatible. Do not treat rebuilding 5.5.3 as a fix. If you vendor Tesseract, add bounds checks so id is never used beyond unichars.size() and reject declared counts that do not match inserted entries.
How to confirm the fix worked
Inventory every binary, container, and language-pack path that ships tesseract or libtesseract and confirm whether the engine is 5.5.3 or earlier. Verify OCR workers only load signed or internally curated traineddata, and that untrusted uploads never reach unicharset load. After sandbox or input-policy changes, process a known-good language pack and confirm recognition still works; do not validate by running public crash files against production. Re-check when an official release that bounds the unichar index ships.
Typical attack path
- Obtain or generate a unicharset/traineddata file that desynchronizes the declared character count from the actual vector length.
- Deliver the file through a channel the victim already trusts for OCR input (shared language packs, document ingest, plugin, or local open).
- Wait for Tesseract 5.5.3 or earlier to load the file during LSTM or legacy engine setup.
- Trigger heap corruption that aborts recognition or undermines the OCR process.
- If the process runs with broader rights than needed, use that foothold only to affect the host or adjacent documents—not as a remote wormable step.
How to detect it
This is a local initialization bug, not a network service flaw, so look for crashes and unexpected language data rather than C2. Review host and container logs for tesseract/libtesseract aborts, segfaults, or fatal heap errors around OCR jobs; inspect core dumps or crashpad reports whose stacks mention unicharset load or engine init. Compare traineddata and unicharset files on disk against known-good hashes and alert on new language packs appearing outside your curated directory. There are no named threat actors or KEV ransomware campaigns to key on; a crash while loading newly introduced language data is the primary retrospective signal.
What your security team should do
- Treat this as unpatched High (CVSS 7.8) with public exploit code: isolate Tesseract immediately rather than waiting for a vendor tag.
- Block or quarantine untrusted .traineddata, unicharset, and third-party language packs at ingest.
- Sandbox OCR (separate user, no secrets, no writable app volumes) so a crash or heap smash cannot reach the rest of the host.
- Find all downstream uses of tesseract-ocr and freeze language-data updates until a patched engine is available.
- Watch upstream for a release that rejects oversize declared unichar counts; upgrade as soon as one exists.
- Hunt for recent tesseract crashes and unexpected language-data drops; public KEV/ransomware use is not indicated, but exploit maturity is not theoretical.
The record
Tesseract is an open source OCR engine. In version 5.5.3 and earlier, UNICHARSET::load_via_fgets in src/ccutil/unicharset.cpp trusts the declared unichar count as a loop bound and uses id as an unchecked index into the unichars vector. unichar_insert_backwards_compatible can leave the vector unchanged for an empty, duplicate, or already-encodable representation, causing id to become larger than unichars.size(). Subsequent set_* calls and the write to unichars[id].properties.enabled then write UNICHAR_PROPERTIES beyond the vector during initialization in both the default LSTM and legacy engines, causing heap corruption, a crash, or potentially controlled corruption. No fixed release is available as of this review.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-96675 alsa-lib through 1.2.16.1 contains a denial of service vulnerability in the multi PCM… CWE-129
- CVE-2026-84445 gRPC-Go is the Go language implementation of gRPC. CWE-129
- CVE-2026-87500 Improper validation of array index in ANGLE in Google Chrome prior to 153.0.8010.36… CWE-129
- CVE-2026-0799 In BPF instructions that load/store a value from/to a scratch memory register the… CWE-129
- CVE-2026-57159 PJSIP is a free and open source multimedia communication library written in C. CWE-129
- CVE-2026-85084 Out-of-bounds Write and Improper Validation of Array Index vulnerability in Samsung Open… CWE-129
- CVE-2023-31308 A malicious virtual function can invoke the certain command handlers in the SMU, causing… CWE-129
- CVE-2026-82327 A flaw was found in libsolv, a dependency-resolution library used by RPM-based package… CWE-129