Apr 8, 2026·7 min read·81 visits
A 32-bit signed integer overflow in OpenEXR's DWA decoder produces a negative memory offset, resulting in a heap out-of-bounds write during file decompression.
CVE-2026-34589 is a high-severity heap out-of-bounds write vulnerability within the OpenEXR Core library, specifically in the DreamWorks Animation (DWA) lossy decompression logic. By crafting a malicious EXR file with excessively large dimensions, an attacker can trigger a 32-bit signed integer overflow that corrupts subsequent pointer arithmetic. This memory corruption affects multiple version branches of OpenEXR and allows an attacker to cause a denial-of-service condition or potentially execute arbitrary code.
OpenEXR is a high dynamic-range (HDR) image file format developed by the Academy Software Foundation, widely utilized in computer graphics, visual effects, and animation pipelines. The libOpenEXRCore library implements the foundational encoding and decoding routines required to process these files. Among the supported compression schemes is the DreamWorks Animation (DWA) lossy compression format, which optimizes file sizes for high-resolution assets.
The vulnerability, tracked as CVE-2026-34589, is an integer overflow (CWE-190) flaw located within the DWA decompression routines of the libOpenEXRCore library. When processing an exceptionally large or maliciously crafted EXR image, the decoding logic fails to validate the boundaries of a multiplication operation used to determine memory offsets. This failure produces a wrapped or negative integer value that corrupts subsequent memory pointer arithmetic.
Consequently, the integer overflow triggers a heap-based out-of-bounds write (CWE-787). An attacker leverages this memory corruption by convincing a victim to process a malformed EXR file. The vulnerability compromises the integrity and availability of the application, leading to severe denial-of-service conditions or providing a pathway to arbitrary code execution within the context of the calling process.
The root cause of CVE-2026-34589 originates in the internal_dwa_decoder.h file, specifically within the logic responsible for allocating and mapping memory blocks for individual color components. During the decoding of DWA-compressed data, the software calculates an offset array based on the image's block dimensions. The horizontal dimension of the image is divided into 8x8 blocks, yielding a variable referred to as numBlocksX.
To determine the total memory required for a specific row block, the library performs a multiplication operation: int offset = numBlocksX * 64;. This calculation relies on standard 32-bit signed integer arithmetic. The maximum representable value for a signed 32-bit integer (INT_MAX) is 2,147,483,647. If an EXR file specifies a dataWindow large enough to force numBlocksX to exceed 33,554,431, the resulting product surpasses the 32-bit limit.
> [!NOTE] > The integer overflow wraps the calculation into the negative value space or truncates it, producing an entirely incorrect offset value. The software implicitly trusts this resultant calculation without validating it against the allocated buffer limits.
This erroneous offset is directly applied to the base pointer of the rowBlock backing store. The addition of a negative or heavily truncated integer to the heap pointer shifts the destination address outside the bounds of the legitimately allocated buffer. The software proceeds under the assumption that the pointer remains valid, setting the stage for memory corruption in subsequent execution phases.
An examination of the vulnerable implementation reveals a fundamental flaw in variable type selection for memory bound calculations. The original codebase utilizes a standard int data type, which defaults to a signed 32-bit representation on most architectures. This design choice inherently limits the maximum safe bounding calculations for ultra-high-resolution image blocks.
// Vulnerable implementation pattern
int numBlocksX = calculate_blocks(dataWindow.maxX, dataWindow.minX);
// ...
// CWE-190: 32-bit signed integer overflow occurs here
int offset = numBlocksX * 64;
// Corrupted pointer arithmetic
float* componentBlock = rowBlock[comp] + offset;The official patch for CVE-2026-34589 refactors the mathematical operation to utilize a 64-bit unsigned integer type. By casting or defining the variables as uint64_t or size_t, the arithmetic operation safely accommodates the maximum possible values derived from the EXR dataWindow attributes without wrapping.
// Patched implementation pattern
size_t numBlocksX = calculate_blocks_safe(dataWindow.maxX, dataWindow.minX);
// ...
// Safe 64-bit unsigned arithmetic
size_t offset = numBlocksX * 64ULL;
// Bounds checking added prior to pointer assignment
if (offset > MAX_ALLOCATED_SIZE) {
return EXR_ERR_OUT_OF_MEMORY;
}
float* componentBlock = rowBlock[comp] + offset;This remediation prevents the integer overflow entirely. Furthermore, patched versions incorporate explicit validation checks to verify that the derived offset does not exceed the known boundaries of the allocated heap chunk before committing the pointer assignment. This robust boundary validation mitigates variant attacks targeting the same code path.
Exploitation of CVE-2026-34589 requires a local attack vector (AV:L) and user interaction (UI:A). An attacker constructs a malformed EXR file specifically designed to manipulate the dataWindow header fields. By defining extreme width dimensions, the attacker forces the numBlocksX variable into the precise value range required to trigger the 32-bit signed integer overflow during the file initialization phase.
When the victim application opens the malicious file, the OpenEXR Core library instantiates the DWA decoding pipeline. The overflow occurs, generating a corrupted, out-of-bounds pointer within the component mapping phase. The exploitation sequence proceeds to the LossyDctDecoder_execute function, which accepts the corrupted pointer as a legitimate destination for decompressed DCT (Discrete Cosine Transform) data.
The LossyDctDecoder_execute function performs bulk write operations to the out-of-bounds memory address. By structuring the compressed data payload within the EXR file, an attacker controls the specific bytes written to the adjacent heap memory. This capability allows the attacker to overwrite critical heap management structures, neighboring object pointers, or function tables.
Currently, no public proof-of-concept exploits exist for this vulnerability. The theoretical path to code execution requires bypassing modern memory mitigations such as ASLR and DEP, which typically necessitates coupling this out-of-bounds write with a discrete information disclosure vulnerability to map the heap layout.
The primary and most immediate impact of this vulnerability is a Denial of Service (DoS). When the LossyDctDecoder_execute function writes data to an invalid memory address, it causes an immediate segmentation fault or triggers heap-corruption detection mechanisms within the operating system. This renders the application processing the EXR file unavailable, which disrupts automated rendering pipelines and batch processing workflows.
Beyond denial of service, the out-of-bounds write poses a credible risk of arbitrary code execution. If an attacker overwrites critical function pointers or application metadata located on the heap, they can redirect the execution flow of the application. Code execution occurs within the privilege context of the user or service running the vulnerable OpenEXR process.
The vulnerability metrics reflect the severity of this issue. Under the CVSS 4.0 framework, the flaw carries a High severity score of 8.4, acknowledging the substantial impacts on confidentiality, integrity, and availability following user interaction. The CVSS 3.1 score sits at 5.0 (Medium), primarily due to its narrow emphasis on the local attack vector and immediate denial-of-service capability.
Despite the high technical severity, the EPSS (Exploit Prediction Scoring System) score remains extremely low at 0.00028 (7.86th percentile). This indicates a negligible probability of the vulnerability being actively exploited in the wild within the next 30 days. The disparity between technical severity and exploit likelihood highlights the gap between theoretical exploitability and practical, weaponized attacks.
To remediate CVE-2026-34589, organizations must upgrade their OpenEXR deployments to the official patched releases provided by the Academy Software Foundation. The vulnerability is resolved in OpenEXR versions 3.2.7, 3.3.9, and 3.4.9. Administrators must verify the specific branch in use across their rendering nodes and update to the corresponding patched iteration.
For systems where immediate patching is not feasible, organizations can implement preliminary input validation wrappers. Software applications leveraging libOpenEXRCore can pre-flight EXR files by extracting and validating the dataWindow header values before passing the file handle to the DWA decoder. Rejecting files with anomalous or structurally impossible dimensions prevents the vulnerable code path from being reached.
Developers integrating OpenEXR into custom applications should audit their own codebase for similar integer overflow patterns. Transitioning calculations involving memory allocation bounds to robust 64-bit unsigned types, such as size_t, provides inherent protection against this class of vulnerability. Incorporating fuzz testing strategies into the continuous integration pipeline further identifies undiscovered boundary calculation flaws.
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
OpenEXR Academy Software Foundation | >= 3.2.0, <= 3.2.6 | 3.2.7 |
OpenEXR Academy Software Foundation | >= 3.3.0, <= 3.3.8 | 3.3.9 |
OpenEXR Academy Software Foundation | >= 3.4.0, <= 3.4.8 | 3.4.9 |
| Attribute | Detail |
|---|---|
| CWE IDs | CWE-190, CWE-787 |
| Attack Vector | Local (AV:L) |
| CVSS 4.0 | 8.4 |
| EPSS Score | 0.00028 |
| Exploit Status | None |
| Impact | Denial of Service, Potential RCE |
The software performs a calculation that can produce an integer overflow or wraparound, when the logic assumes that the resulting value will always be larger than the original value.
CVE-2026-102275 (GHSA-x33g-cr3x-6449) is a public/private key identity confusion vulnerability in PyJWT versions 2.1.0 through 2.14.0. When importing Octet Key Pair (OKP) JSON Web Keys (JWKs) representing Ed25519 or Ed448 curves, PyJWT fails to verify that the public parameter 'x' matches the private parameter 'd'. An attacker can construct a hybrid JWK combining a victim's public key with the attacker's private key. In protocols like DPoP that bind sessions via public key thumbprints, this allows the attacker to authenticate as the victim while signing proofs with their own private key, fully bypassing sender-constrained security guarantees.
An authentication bypass and privilege escalation vulnerability exists in Filament (filamentphp/filament) due to missing password verification during multi-factor authentication (MFA) setup and management. An attacker with access to an active session can modify or disable MFA, leading to account hijacking.
A critical Denial of Service (DoS) vulnerability exists in @socket.io/cluster-engine before version 0.1.1. Unauthenticated remote attackers can crash the server process by supplying inherited prototype property names as session identifiers.
A vulnerability in the Client-Side Field-Level Encryption (CSFLE) component of the MongoDB Python Driver (PyMongo) allows an attacker with database write access to trigger local Unix domain socket connections. By manipulating the Key Management Service (KMS) endpoint configuration inside the key vault collection to end with a '.sock' extension, an attacker forces the application to perform a Server-Side Request Forgery (SSRF) against internal Unix domain sockets.
A critical double-free vulnerability exists in the Transparent Inter-Process Communication (TIPC) module of the Linux kernel, specifically within the fragment reassembly implementation in `tipc_buf_append()`. This vulnerability can be triggered locally or remotely to cause kernel heap corruption, leading to local privilege escalation or denial of service.
CVE-2026-72137 is a critical double-free vulnerability in the Linux kernel's XFRM (IPsec) subsystem. The vulnerability occurs when the kernel attempts to send NAT keepalive packets over UDP. Under specific transmission failure conditions, both the downstream networking stack and the upstream keepalive dispatcher attempt to free the same socket buffer (sk_buff) structure, leading to kernel memory corruption, denial of service, or potential local privilege escalation.