CVE-2026-44660
High · 7.5CVSS
7.5
EPSS
0.6%
Published
May 27, 2026
CISA due date
—
Cloudanix analysis
A widely used Python JSON library can slowly run out of memory and crash a service when saving data fails, so teams should update the library to keep services running.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Low
- Patch risk
- None
What it actually does
UltraJSON (ujson) prior to 5.12.1 fails to decrement the reference count of the temporary serialized JSON string when ujson.dump() writes to a file-like object and that write raises. Each failed write therefore leaks memory equal to the full serialized payload. Repeated failures can exhaust process memory and terminate or hang the interpreter, producing a denial-of-service condition. Confidentiality and integrity are not affected.
Why it matters to the business
Python services that encode JSON to files, sockets, or other file-like objects can degrade or crash under repeated write failures, causing outages, lost work, and restart churn. The issue is not in CISA KEV, has no reported ransomware use, and exploit maturity is none; EPSS remains low (~0.006) though it rose about 53% over 30 days. Patching is still warranted wherever ujson is used in long-lived workers, because a single unpatched process can be driven to OOM without stealing data.
How an attack unfolds
An attacker who can reach an application path that calls ujson.dump() on a file-like object they can cause to fail (full disk, broken pipe, permission error, or a write() that raises) triggers the leak. Each exception leaves the entire serialized buffer unreleased. Repeating the request with large payloads grows RSS until the worker is OOM-killed or stops responding. No named threat actors are associated, and there is no public exploit maturity; this is an availability issue, not remote code execution. Unauthenticated reachability depends on whether the dump path is exposed, not on a separate auth bypass in ujson.
How to fix it
Upgrade ultrajson/ujson to 5.12.1 or later, which decrements the serialized string when a write fails. Pin the dependency in lockfiles so it cannot be downgraded. Restart long-running workers after upgrade so previously leaked memory is released. If upgrade is delayed, avoid ujson.dump() to fallible file-like objects: serialize with ujson.dumps() (or the standard library json module) and write with explicit error handling.
How to confirm the fix worked
Confirm the running package is 5.12.1 or newer (pip show ujson; python -c "import ujson; print(ujson.__version__)"). Scan requirements.txt, poetry.lock, Pipfile.lock, and uv.lock for ujson/ultrajson below 5.12.1. In a test process, call dump() against a file-like object whose write() always raises and verify RSS does not grow across many iterations after the patch.
Typical attack path
- Find an application or job that uses UltraJSON dump() to write JSON to a file, socket, or other file-like object
- Cause or wait for write() to raise (disk full, EPIPE, permission error, or a raising file-like object)
- Repeat with large JSON payloads so each failure leaks a full serialized buffer
- Continue until process memory is exhausted and the service crashes or hangs
How to detect it
This leak has no distinctive network payload or named actor TTPs. Hunt Python processes still running ujson before 5.12.1 and correlate unbounded RSS growth with repeated I/O errors during JSON writes (disk full, broken pipe, permission denied) and subsequent OOM kills in kernel, systemd, or container logs. Application logs may show exceptions originating from ujson.dump or the file-like write path immediately before memory pressure. Absence of KEV listing and exploit maturity of none means opportunistic resource exhaustion is more likely than a signature-based campaign.
What your security team should do
- Inventory Python services that depend on ujson/ultrajson, especially internet-facing or high-throughput JSON writers
- Upgrade to 5.12.1 or later, pin lockfiles, and restart workers
- Fail CI/CD when ujson is below 5.12.1
- Add RSS/OOM alerting on processes that serialize JSON to files or sockets
- Until patched, prefer dumps-then-write or the standard json module for fallible destinations
The record
UltraJSON is a fast JSON encoder and decoder written in pure C with bindings for Python 3.7+. Prior to 5.12.1, when ujson.dump() writes to a file-like object and the write operation raises an exception, the serialized JSON string object is not decremented, leaking memory. Each failed write operation leaks the full size of the serialized payload. This vulnerability is fixed in 5.12.1.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-109278 ImageMagick before 6.9.13-57 and 7.x before 7.1.2-32 contains a memory leak in the… CWE-401
- CVE-2026-109270 ImageMagick before 7.1.2-32 contains a memory leak vulnerability in the -process option… CWE-401
- CVE-2026-109262 ImageMagick before 6.9.13-57 and 7.x before 7.1.2-32 contains a memory leak in the SVG… CWE-401
- CVE-2026-109263 ImageMagick before 6.9.13-57 and 7.x before 7.1.2-32 contains a memory leak in the YUV… CWE-401
- CVE-2026-109261 ImageMagick before 6.9.13-57 and 7.x before 7.1.2-32 contains a memory leak in the GIF… CWE-401
- CVE-2026-109260 ImageMagick before 6.9.13-57 and 7.x before 7.1.2-32 contains a memory leak in the PNG… CWE-401
- CVE-2026-104874 Multidict is an implementation of a multidict data structure. CWE-401
- CVE-2026-98162 In the Linux kernel, the following vulnerability has been resolved: smb/server: fix tree… CWE-401