CVE-2026-65970 Overview
CVE-2026-65970 affects OpenImageIO, a toolset for reading, writing, and manipulating image files used across visual effects (VFX) and animation pipelines. The vulnerability exists in the multithreaded TIFF scanline reader prior to version 3.1.16.0. A crafted ZIP-compressed TIFF processed with TIFF multithreading enabled triggers a use-after-scope condition in TIFFInput::read_native_scanlines(). Worker tasks continue accessing stale stack and heap storage after their owning objects are destroyed, causing a crash and denial of service. The issue is tracked under [CWE-825] (Expired Pointer Dereference).
Critical Impact
A single malformed TIFF file can crash any application or pipeline stage that uses OpenImageIO with TIFF multithreading enabled, disrupting rendering, asset processing, and image ingestion workflows.
Affected Products
- OpenImageIO versions prior to 3.1.16.0
- VFX and animation pipelines relying on OpenImageIO for TIFF ingestion
- Applications embedding OpenImageIO with TIFF multithreading enabled
Discovery Timeline
- 2026-09-18 - CVE-2026-65970 published to the National Vulnerability Database (NVD)
- 2026-09-24 - Last updated in NVD database
Technical Details for CVE-2026-65970
Vulnerability Analysis
The defect lives in src/tiff.imageio/tiffinput.cpp inside TIFFInput::read_native_scanlines(). The function dispatches strip decompression work through a task_set that captures references to local objects. When decoding fails, the function returns through an error path while decompression tasks are still queued. Because task_set is declared before ok and compressed_scratch, C++ destroys those captured objects first. The task_set destructor then waits for worker tasks that dereference already-destroyed storage. The result is a use-after-scope condition triggered by a crafted ZIP-compressed TIFF.
Root Cause
The root cause is variable declaration ordering. In C++, local objects are destroyed in reverse declaration order. Because task_set tasks(pool) was declared before ok and compressed_scratch, its destructor executed last. Worker threads inside that destructor then referenced ok and compressed_scratch after their lifetime had already ended. The lifetime mismatch produced expired pointer dereferences during error unwinding.
Attack Vector
Exploitation requires an attacker-supplied TIFF file to reach an OpenImageIO consumer that has TIFF multithreading enabled. User interaction is required to open or process the file. Successful triggering causes a process crash and denial of service. The vulnerability does not expose confidentiality or integrity impact according to the published CVSS vector.
// Patch excerpt from src/tiff.imageio/tiffinput.cpp
// The task_set declaration was moved to ensure its destructor
// runs while ok and compressed_scratch are still alive.
// Make room for, and read the raw (still compressed) strips. As each
// one is read, kick off the decompress and any other extras, to execute
// in parallel.
- task_set tasks(pool);
bool ok = true; // failed compression will stash a false here
int y = ybegin;
size_t ystride = m_spec.scanline_bytes(true);
Source: GitHub Commit 31201c2
Detection Methods for CVE-2026-65970
Indicators of Compromise
- Unexpected crashes in processes linking OpenImageIO when handling TIFF assets, particularly ZIP-compressed variants.
- Core dumps or stack traces referencing TIFFInput::read_native_scanlines(), uncompress_one_strip(), or task_set destruction.
- Repeated ingestion failures on the same TIFF asset across render nodes or automated pipelines.
Detection Strategies
- Inventory build systems and DCC (Digital Content Creation) tools for OpenImageIO versions below 3.1.16.0 using software bill of materials (SBOM) data.
- Add crash-signal telemetry for processes that load liboiio and correlate crashes with recently ingested TIFF files.
- Scan incoming asset shares for ZIP-compressed TIFFs and route unknown-origin files through sandboxed validation.
Monitoring Recommendations
- Monitor render farms, asset ingest gateways, and thumbnail services for abnormal exit codes on image processing workers.
- Enable OpenImageIO logging where available to capture the file path that preceded each crash.
- Track TIFF submissions from external vendors and freelancers as higher-risk inputs.
How to Mitigate CVE-2026-65970
Immediate Actions Required
- Upgrade OpenImageIO to version 3.1.16.0 or later across build environments, render nodes, and packaged applications.
- Rebuild and redistribute any internal tools that statically link OpenImageIO after applying the fix.
- Quarantine untrusted TIFF submissions until downstream consumers are patched.
Patch Information
The fix reorders local variable declarations in TIFFInput::read_native_scanlines() so that task_set is destroyed before the objects its worker tasks capture. This ensures pending decompression work completes while ok and compressed_scratch remain valid. Details are available in the GitHub Security Advisory GHSA-v278-gpwr-r836, the GitHub Pull Request #5294, and the GitHub Release v3.1.16.0.
Workarounds
- Disable TIFF multithreading in OpenImageIO configuration where patching is not immediately possible.
- Restrict TIFF processing to isolated sandbox workers so crashes do not disrupt shared pipeline services.
- Validate TIFF compression types at ingest and reject or transcode ZIP-compressed TIFFs from untrusted sources.
# Configuration example: force single-threaded TIFF decoding
# by disabling OpenImageIO's global multithreading for TIFF I/O.
export OPENIMAGEIO_OPTIONS="threads=1,tiff:multithread=0"
# Verify installed OpenImageIO version
oiiotool --version
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

