CVE-2026-63420 Overview
CVE-2026-63420 is a heap out-of-bounds read [CWE-125] in OpenImageIO, an open-source toolset for reading and manipulating image files used across visual effects and animation pipelines. The flaw resides in the Photoshop Document (PSD) input plugin. When an indexed PSD file carries transparency metadata, the plugin allocates fewer channel_buffers than the channel count advertised by spec.nchannels. If oiio:rawcolor or psd:rawdata is enabled, PSDInput::read_native_scanline() passes the inflated channel count to PSDInput::interleave_row(), which then indexes past the allocated buffers. The result is a process crash triggered by a crafted image file.
Critical Impact
A malicious PSD file can crash any OpenImageIO-consuming application when raw color mode is active, disrupting rendering, batch conversion, and asset ingestion workflows.
Affected Products
- OpenImageIO versions prior to 3.0.21.0
- OpenImageIO 3.1.x versions prior to 3.1.16.0
- OpenImageIO 3.2.0 pre-release versions prior to 3.2.0.3-beta1
Discovery Timeline
- 2026-09-18 - CVE-2026-63420 published to NVD
- 2026-09-23 - Last updated in NVD database
Technical Details for CVE-2026-63420
Vulnerability Analysis
The vulnerability lives in src/psd.imageio/psdinput.cpp. OpenImageIO parses PSD headers and populates an ImageSpec whose nchannels field reflects the logical channel count, including the alpha channel implied by transparency metadata on indexed images. However, the internal allocation of per-channel row storage in channel_buffers follows the actual number of stored channels in the file, which is smaller for indexed PSDs with separate transparency metadata.
When callers request unprocessed data via the oiio:rawcolor or psd:rawdata options, PSDInput::read_native_scanline() bypasses the color conversion path and forwards spec.nchannels directly into PSDInput::interleave_row(). The interleave loop indexes channel_buffers[0..nchans-1] and reads past the last valid vector, producing a heap out-of-bounds read that terminates the process.
Root Cause
The root cause is a mismatch between the advertised channel count and the number of stored channel buffers on the raw-data code path. The channel-count invariant assumed by interleave_row() does not hold for indexed PSDs with transparency metadata, and no bounds validation was performed before dereferencing entries in channel_buffers.
Attack Vector
Exploitation requires an operator to open or process a crafted PSD file with an OpenImageIO tool or an application that links against the library. User interaction is required, and the impact is limited to availability. Rendering farms, batch converters, and asset pipelines that auto-ingest untrusted PSDs from artists or external vendors are the most exposed environments.
// Patch from src/psd.imageio/psdinput.cpp (#5307)
// Interleave channels (RRRGGGBBB -> RGBRGBRGB) while copying from
// channel_buffers[0..nchans-1] to dst.
template<typename T>
- static void
+ static bool
interleave_row(T* dst, cspan<std::vector<unsigned char>> channel_buffers,
int width, int nchans);
Source: GitHub commit 4995b25b. The fix changes interleave_row() from void to bool, enabling callers to detect the bounds mismatch and abort the read instead of dereferencing past channel_buffers.
Detection Methods for CVE-2026-63420
Indicators of Compromise
- Unexpected termination of OpenImageIO-based tools such as oiiotool, iconvert, or maketx while processing PSD files.
- Renderer or asset-pipeline worker crashes with SIGSEGV signatures immediately after loading a PSD input.
- Presence of untrusted or externally-sourced indexed-mode PSD files with embedded transparency in ingestion directories.
Detection Strategies
- Inventory installed OpenImageIO builds and libraries and compare versions against 3.0.21.0, 3.1.16.0, and 3.2.0.3-beta1.
- Scan build manifests, container images, and Python OpenImageIO bindings used by DCC applications and render nodes.
- Enable AddressSanitizer in test pipelines to surface the out-of-bounds read against fuzzed PSD corpora.
Monitoring Recommendations
- Alert on repeated crashes of image-processing services on the same input path, which may indicate crafted PSD delivery.
- Log invocations of tools that set oiio:rawcolor or psd:rawdata, since these options activate the vulnerable code path.
- Monitor render farm job failures correlated with newly uploaded artist assets to identify targeted denial-of-service attempts.
How to Mitigate CVE-2026-63420
Immediate Actions Required
- Upgrade OpenImageIO to 3.0.21.0, 3.1.16.0, or 3.2.0.3-beta1 or later on every host that processes PSD files.
- Rebuild and redeploy downstream applications and container images that statically link or bundle OpenImageIO.
- Quarantine PSD assets received from untrusted sources until affected systems are patched.
Patch Information
The Academy Software Foundation released fixes in OpenImageIO v3.0.21.0 and OpenImageIO v3.1.16.0, with additional context in GHSA-x877-h4xx-5m5j and Pull Request #5307. The patch converts interleave_row() to return a boolean and validates channel_buffers.size() against nchans before indexing.
Workarounds
- Disable the oiio:rawcolor and psd:rawdata options in tooling configurations until the upgrade is complete.
- Pre-validate incoming PSD files by converting them to a normalized intermediate format such as EXR with a hardened toolchain.
- Sandbox image-processing workers with resource limits and automatic restarts to contain crash-based disruption.
# Verify the installed OpenImageIO version and confirm remediation
oiiotool --version
# Expected output: OpenImageIO 3.0.21.0 (or 3.1.16.0 / 3.2.0.3-beta1) or later
# Reject the vulnerable raw-data path in wrapper scripts
unset OPENIMAGEIO_OPTIONS
oiiotool --no-autopremult input.psd -o output.exr
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

