CVE-2026-32875
High · 7.5CVSS
7.5
EPSS
0.8%
Published
Mar 20, 2026
CISA due date
—
Cloudanix analysis
A fast Python JSON library can crash or freeze an application if someone is allowed to choose a huge or negative indentation when data is written out, which can take the service offline until it is restarted or updated.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Memory Corruption
- Remediation
- Upgrade
- Effort
- Low
- Patch risk
- Low
What it actually does
UltraJSON (ujson) versions 5.10 through 5.11.0 contain an integer overflow and underflow in the C encoder when computing how much memory to reserve for indentation. If the product of the indent argument and the nesting depth of the input exceeds INT32_MAX, a buffer overflow occurs and the Python interpreter aborts with a segmentation fault. A large negative indent underflows the same calculation and can stall the encoder in an infinite loop. Both outcomes are process-level denial of service only: confidentiality and integrity are not affected, and there is no indicated path to remote code execution. A service is exposed only if it calls ujson.dump(), ujson.dumps(), or ujson.encode() with an untrusted or unbounded indent, or if it uses a fixed negative indent on nested input.
Why it matters to the business
Python APIs and workers that pretty-print JSON with UltraJSON can be taken offline by a single crafted request, causing worker crashes, restart storms, request timeouts, and loss of availability. Impact is highest where indent is taken from query parameters, request bodies, or debug flags and where UltraJSON is a direct or transitive dependency of many services. The issue is not in CISA KEV, is not associated with ransomware, and has no public exploit maturity, so urgency is driven by availability rather than known mass exploitation. EPSS is still low at 0.0077 but rose about 64% over 30 days, and the CVE has been public for roughly 200 days—long enough that remaining 5.10–5.11.0 deployments are an avoidable reliability risk.
How an attack unfolds
An unauthenticated client finds an HTTP or RPC endpoint that serializes responses with UltraJSON and either forwards a client-supplied indent/pretty-print option into dump, dumps, or encode, or uses a fixed negative indent. The client sends nested JSON together with an extremely large positive indent so that indent multiplied by depth overflows a 32-bit integer, or with a large negative indent that underflows the reservation math. The native encoder then either overflows the indentation buffer and kills the interpreter, or never returns. Repeating the request against load-balanced workers exhausts capacity. No credentials or user interaction are required when indent is exposed on the network. No named threat actors or campaigns are associated with this CVE, and exploitation yields denial of service rather than access to data or code execution.
How to fix it
Upgrade the ultrajson package to 5.12.0 or later everywhere it is declared or pulled in transitively, and refresh lockfiles (pip, poetry, pipenv, uv, conda) so 5.10–5.11.0 cannot be reintroduced. Until the upgrade is complete, stop passing any client-controlled value into the indent parameter of ujson.dump(), ujson.dumps(), or ujson.encode(); clamp indent to a small non-negative range or omit it; and remove any fixed negative indent. Treat remaining 5.10–5.11.0 pins as a production availability defect.
How to confirm the fix worked
Inventory Python environments and container images for ultrajson 5.10 through 5.11.0 and confirm the resolved version is 5.12.0 or newer. Grep application code and wrappers for dump, dumps, and encode call sites that take indent from request input, configuration, or a negative constant. After upgrading, regression-test legitimate pretty-print paths with small non-negative indents and nested documents, and verify workers no longer crash or hang on encode. Do not use unbounded or negative indent values as a production test.
Typical attack path
- Locate a service that encodes JSON with UltraJSON and accepts an indent or pretty-print option from the client, or that hard-codes a negative indent.
- Send nested JSON while supplying an unbounded positive indent or a large negative indent to dump, dumps, or encode.
- Trigger a native crash (segmentation fault) or an encoder hang in the Python worker.
- Repeat against multiple workers or instances so process managers restart into the same failing path and legitimate traffic is denied.
How to detect it
Hunt for historical denial of service rather than post-exploitation malware. Review application, reverse-proxy, and access logs around JSON encode or pretty-print endpoints for requests that set an indent (or equivalent pretty-print) parameter to a negative number or to a value far above normal pretty-print ranges, clustered with 5xx responses, worker timeouts, or sudden process exits. On hosts, look at systemd/journald, container runtime, and orchestrator events for Python workers exiting with SIGSEGV or remaining unresponsive on CPU while encoding JSON. Core dumps, fatal interpreter logs, and native stack frames in the ujson extension around dumps/encode are the primary artifacts; there is no known persistence, implant, or named actor TTPs for this CVE. Correlate spikes in restart counts for services that still resolve ultrajson 5.10–5.11.0.
- ujson.dumps
- ujson.dump
- ujson.encode
- Fatal Python error
- Segmentation fault
- SIGSEGV
- indent=-
- "indent":-
- indent=2147483647
- indent=2147483646
- libujson
- _ujson*.so
What your security team should do
- Patch ultrajson to 5.12.0 or later in all direct and transitive dependencies and block 5.10–5.11.0 in package policy.
- Find and change every dump/dumps/encode call so indent cannot come from untrusted input and is never negative.
- Prioritize internet-facing Python APIs and high-churn worker pools; remaining unpatched hosts after ~200 days of public disclosure are an availability incident waiting to happen.
- Watch EPSS and crash telemetry; the 30-day rise is a signal to finish rollout even though KEV and ransomware flags are false.
- Add dependency scanning and SBOM checks so future UltraJSON releases are absorbed before similar encoder bugs recur.
The record
UltraJSON is a fast JSON encoder and decoder written in pure C with bindings for Python 3.7+. Versions 5.10 through 5.11.0 are vulnerable to buffer overflow or infinite loop through large indent handling. ujson.dumps() crashes the Python interpreter (segmentation fault) when the product of the indent parameter and the nested depth of the input exceeds INT32_MAX. It can also get stuck in an infinite loop if the indent is a large negative number. Both are caused by an integer overflow/underflow whilst calculating how much memory to reserve for indentation. And both can be used to achieve denial of service. To be vulnerable, a service must call ujson.dump()/ujson.dumps()/ujson.encode() whilst giving untrusted users control over the indent parameter and not restrict that indentation to reasonably small non-negative values. A service may also be vulnerable to the infinite loop if it uses a fixed negative indent. An underflow always occurs for any negative indent when the input data is at least one level nested but, for small negative indents, the underflow is usually accidentally rectified by another overflow. This issue has been fixed in version 5.12.0.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-110264 An issue has been discovered in GitLab CE/EE affecting all versions from 7.0 before… CWE-190
- CVE-2026-53615 util-linux is a random collection of Linux utilities. CWE-190
- CVE-2026-106574 ImageMagick is free and open-source software used for editing and manipulating digital… CWE-190
- CVE-2026-106571 ImageMagick is free and open-source software used for editing and manipulating digital… CWE-190
- CVE-2026-75820 GNU Aspell contains an integer truncation vulnerability in the WritableDict::add()… CWE-190
- CVE-2026-102621 A vulnerability was identified in Freedesktop Poppler up to 26.08.0. CWE-190
- CVE-2026-102620 A vulnerability was determined in Freedesktop Poppler 26.06.0/26.07.0/26.08.0. CWE-190
- CVE-2026-102633 libexpat versions 2.7.2 through 2.8.5 contain an integer overflow vulnerability in… CWE-190