Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-59983

CVE-2026-59983: OpenEXR DOS Vulnerability in ILP32 Builds

CVE-2026-59983 is a denial of service vulnerability in OpenEXR affecting ILP32 builds through crafted EXR files. Attackers can trigger out-of-bounds reads causing service disruption. This article covers technical details, affected versions, impact analysis, and mitigation strategies.

Published:

CVE-2026-59983 Overview

CVE-2026-59983 is an out-of-bounds read vulnerability in OpenEXR, the reference implementation for the EXR image format used across the motion picture industry. The flaw affects ILP32 builds where a size calculation in OpenEXRCore/decoding.c wraps around before the sample table is fully iterated. A crafted uncompressed deep-tile EXR file triggers this integer overflow during decoding, leading to denial of service. The issue is classified as [CWE-125] Out-of-Bounds Read and requires user interaction to open a malicious file. Fixed releases are 3.2.11, 3.3.13, and 3.4.14.

Critical Impact

An attacker-supplied deep-tile EXR file processed by a vulnerable ILP32 build of OpenEXR can cause an out-of-bounds read and application crash, resulting in denial of service for image processing pipelines.

Affected Products

  • OpenEXR versions prior to 3.2.11
  • OpenEXR versions 3.3.0 through 3.3.12
  • OpenEXR versions 3.4.0 through 3.4.13 (ILP32 builds)

Discovery Timeline

  • 2026-08-25 - CVE-2026-59983 published to NVD
  • 2026-08-25 - Last updated in NVD database

Technical Details for CVE-2026-59983

Vulnerability Analysis

The vulnerability resides in the deep-tile decoding path of the OpenEXRCore library. When OpenEXR processes a deep-scanline or deep-tiled chunk, decoding.c computes the sample-count table size by multiplying the chunk width and height. On ILP32 platforms, size_t is 32 bits, so this multiplication can wrap for large attacker-controlled tile dimensions.

After the wrapped value passes size validation, unpack_sample_table() iterates over the full uncapped dimensions. The mismatch between the truncated allocation size and the actual iteration count drives reads beyond the allocated buffer, producing a crash and denial of service in host applications that link OpenEXR.

Root Cause

The root cause is a numeric truncation error during size computation. The original code used size_t arithmetic for width * height * sizeof(int32_t), which overflows silently on 32-bit systems. No overflow check gated the value before it was compared to sample_count_table_size and passed to downstream unpack logic.

Attack Vector

Exploitation requires local access and user interaction: a victim must open or process a crafted EXR file with a vulnerable ILP32 build. The confidentiality and integrity impacts are none; only availability is affected. The attack surface is any tool or rendering pipeline that ingests untrusted EXR content on 32-bit builds.

c
     if (stortype == EXR_STORAGE_DEEP_SCANLINE ||
         stortype == EXR_STORAGE_DEEP_TILED)
     {
-        size_t sampsize =
-            (((size_t) decode->chunk.width) * ((size_t) decode->chunk.height));
+        uint64_t sampsize64 =
+            ((uint64_t) decode->chunk.width) * ((uint64_t) decode->chunk.height);
 
         if ((decode->decode_flags & EXR_DECODE_SAMPLE_COUNTS_AS_INDIVIDUAL))
-            sampsize += 1;
-        sampsize *= sizeof (int32_t);
+            sampsize64 += 1;
+        sampsize64 *= sizeof (int32_t);
+        if (sampsize64 != (size_t) sampsize64) return EXR_ERR_OUT_OF_MEMORY;
+        size_t sampsize = (size_t) sampsize64;
 
         if (decode->chunk.sample_count_table_size == sampsize)
         {

Source: OpenEXR patch commit 0efec58. The fix promotes the size calculation to uint64_t, then rejects any value that does not fit into a native size_t with EXR_ERR_OUT_OF_MEMORY.

Detection Methods for CVE-2026-59983

Indicators of Compromise

  • Crashes or abnormal termination in processes that link libOpenEXR or libOpenEXRCore when opening EXR files.
  • Deep-tile or deep-scanline EXR files with unusually large width or height chunk attributes that overflow 32-bit arithmetic.
  • Segmentation faults originating in unpack_sample_table() on 32-bit builds.

Detection Strategies

  • Inventory installed OpenEXR versions across build systems, render farms, and workstations to identify versions below 3.2.11, 3.3.13, or 3.4.14.
  • Enable AddressSanitizer or equivalent memory instrumentation in test pipelines that ingest untrusted EXR content to surface out-of-bounds reads.
  • Monitor endpoint telemetry for repeated crashes of image-processing utilities such as exrheader, exrinfo, or renderer plugins.

Monitoring Recommendations

  • Alert on unexpected termination signals from imaging services processing user-submitted content.
  • Track ingestion of EXR files from external or untrusted sources through content-inspection gateways.
  • Log OpenEXR library version metadata in application startup telemetry to accelerate exposure assessment.

How to Mitigate CVE-2026-59983

Immediate Actions Required

  • Upgrade OpenEXR to 3.2.11, 3.3.13, or 3.4.14, matching the branch currently deployed.
  • Prioritize remediation on ILP32 (32-bit) builds; 64-bit builds are not affected by the specific truncation path.
  • Rebuild and redistribute internal tools and plugins that statically link OpenEXR.

Patch Information

The fix is implemented across three commits in the AcademySoftwareFoundation OpenEXR repository. It rewrites the sample-count size calculation using uint64_t arithmetic and returns EXR_ERR_OUT_OF_MEMORY when the result cannot be represented as size_t. See commit 0efec58, commit 78e9114, commit f0e404f, and the GitHub Security Advisory GHSA-p42q-g5c9-mh9w.

Workarounds

  • Migrate 32-bit hosts processing untrusted EXR content to 64-bit builds where feasible until patches are applied.
  • Restrict deep-tile EXR ingestion to trusted sources and validate width and height chunk attributes before decoding.
  • Sandbox EXR decoding in a separate process so that a crash does not disrupt the host application or pipeline.
bash
# Verify installed OpenEXR version against fixed releases
pkg-config --modversion OpenEXR

# Example: rebuild an ILP32 target against a patched OpenEXR source
git clone https://github.com/AcademySoftwareFoundation/openexr.git
cd openexr
git checkout v3.4.14   # or v3.3.13 / v3.2.11 depending on branch
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.