CVE-2026-33023
NixOS vulnerability analysis and mitigation

Overview

CVE-2026-33023 is a use-after-free (UAF) vulnerability in libsixel, a SIXEL encoder/decoder library, affecting versions 1.8.7 and prior when built with the --with-gdk-pixbuf2 option. The flaw exists in the load_with_gdkpixbuf() function in loader.c, where a sixel_frame_t object is manually freed without consulting its reference count, leaving callbacks that retained a reference holding a dangling pointer. It was disclosed on April 14, 2026, by researcher nicoppida via a GitHub Security Advisory, and a fix was released the same day in version 1.8.7-r1. The vulnerability carries a CVSS v3.1 base score of 7.8 (High) (GitHub Advisory, Red Hat Bugzilla).

Technical details

The root cause is a consistency failure between two cleanup strategies in the same codebase (CWE-416: Use After Free; CWE-825: Expired Pointer Dereference). In load_with_builtin(), the correct sixel_frame_unref() is used to decrement the reference count before freeing, but load_with_gdkpixbuf() instead calls raw free() on the sixel_frame_t object and its internal buffers (frame->pixels, frame->palette, frame) without ever reading frame->ref. Because the object is created via the refcounted constructor sixel_frame_new() (which sets ref = 1) and exposed to a public callback, any callback that calls sixel_frame_ref(frame) to retain the object will hold a dangling pointer after sixel_helper_load_image_file() returns. Subsequent access to the frame or its fields (e.g., sixel_frame_get_pixels()) triggers a heap-use-after-free, confirmed by AddressSanitizer. Exploitation requires user interaction — specifically, an application processing a crafted image file (PNG, JPEG, or any format accepted by gdk-pixbuf2) (GitHub Advisory).

Impact

Successful exploitation can lead to information disclosure (reading reallocated heap content), memory corruption, or arbitrary code execution if the freed memory region is reused to hold a function pointer or vtable-like structure. The attack vector is local and requires user interaction (e.g., opening a crafted image), but no privileges are required. Any application linked against libsixel with gdk-pixbuf2 support is affected, potentially exposing sensitive in-process data or allowing an attacker to gain code execution in the context of the vulnerable application (GitHub Advisory, Red Hat Bugzilla).

Exploitability

A proof-of-concept (PoC) exploit in the form of a standalone C harness (harness.c) is publicly available in the GitHub Security Advisory. The PoC calls sixel_helper_load_image_file() with a callback that retains a frame reference via sixel_frame_ref(), then accesses the freed memory to trigger the UAF. The EPSS score is approximately 0.015% (very low), and there is no evidence of in-the-wild exploitation or CISA KEV catalog listing as of the time of disclosure. No threat actor attribution has been reported (GitHub Advisory, Feedly).

Exploitation steps

  1. Identify target applications: Locate applications that use libsixel version ≤ 1.8.7 compiled with --with-gdk-pixbuf2 support (e.g., terminal emulators, image viewers, or tools that render SIXEL graphics).
  2. Prepare a crafted image: Create or obtain any valid image file accepted by gdk-pixbuf2 (PNG, JPEG, etc.) to serve as the trigger file.
  3. Deliver the image: Supply the crafted image to the target application, either directly (e.g., via a file open dialog, drag-and-drop, or command-line argument) or indirectly (e.g., embedded in a document or served over a network).
  4. Trigger the UAF: When the application processes the image, sixel_helper_load_image_file() calls load_with_gdkpixbuf(), which frees the sixel_frame_t object via raw free() after the callback has retained a reference via sixel_frame_ref(frame). The saved pointer is now dangling.
  5. Exploit heap reuse: Depending on heap layout, arrange for the freed memory region to be reallocated with attacker-controlled data (e.g., a fake function pointer or vtable entry). Subsequent access to the dangling frame pointer by the application triggers the UAF, potentially redirecting execution flow.
  6. Achieve objective: Depending on heap state, read reallocated memory for information disclosure, corrupt heap metadata, or achieve code execution in the context of the vulnerable process (GitHub Advisory).

Indicators of compromise

  • Process: Unexpected crashes or segmentation faults in applications using libsixel when processing image files; AddressSanitizer output referencing sixel_frame_get_pixels, load_with_gdkpixbuf, or sixel_helper_load_image_file in stack traces.
  • Logs: Application crash logs or core dumps referencing loader.c line 1184 (load_with_gdkpixbuf) or frame.c line 205 (sixel_frame_get_pixels); ASAN error messages indicating heap-use-after-free at addresses within libsixel's allocator.
  • File System: Presence of crafted image files (PNG, JPEG, or other gdk-pixbuf2-supported formats) in directories processed by libsixel-linked applications, particularly if delivered from untrusted sources.
  • Network: Unexpected inbound delivery of image files to services that process images using libsixel with gdk-pixbuf2 support, especially from unknown or suspicious sources (GitHub Advisory).

Mitigation and workarounds

Upgrade libsixel to version 1.8.7-r1 or later, which replaces the raw free() calls in load_with_gdkpixbuf() with the correct sixel_frame_unref() to properly respect the reference count. As a workaround, rebuild libsixel without the --with-gdk-pixbuf2 configure option to avoid the vulnerable code path entirely. Additionally, restrict image processing to trusted sources and avoid exposing libsixel-linked applications to untrusted image input until patched (GitHub Release, GitHub Advisory).

Community reactions

The vulnerability was reported by researcher nicoppida and acknowledged by the libsixel maintainer (saitoha), who released the fix in v1.8.7-r1 on the same day as disclosure (April 14, 2026). The release notes note that development is focused on the develop branch with AI-assisted test generation and fuzzing to improve security. Red Hat tracked the issue via Bugzilla with a high severity rating. Social media activity was limited to automated CVE notification accounts on Bluesky and Mastodon (GitHub Advisory, GitHub Release, Red Hat Bugzilla).

Additional resources


SourceThis report was generated using AI

Related NixOS vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-84121CRITICAL9.6
  • NixOS logoNixOS
  • firefox-esr
NoYesSep 01, 2026
CVE-2026-84123HIGH8.8
  • NixOS logoNixOS
  • thunderbird
NoYesSep 01, 2026
CVE-2026-84125MEDIUM5.4
  • NixOS logoNixOS
  • firefox
NoYesSep 01, 2026
CVE-2026-84124MEDIUM5.4
  • NixOS logoNixOS
  • cpe:2.3:a:mozilla:firefox
NoYesSep 01, 2026
CVE-2026-84122MEDIUM5.4
  • NixOS logoNixOS
  • firefox-esr
NoYesSep 01, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management