← Back to Feed CACHED · 2026-07-01 01:34:47 · CACHE_KEY CVE-2025-7345
CVE-2025-7345 · CWE-120 · Disclosed 2025-07-08

A flaw exists in gdk‑pixbuf within the gdk_pixbuf__jpeg_image_load_increment function

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A malformed JPEG makes your image viewer choke on its own color profile

The bug lives in gdk_pixbuf__jpeg_image_load_increment() inside io-jpeg.c. When gdk-pixbuf encounters a JPEG carrying multiple embedded ICC color-profile chunks, it hands them off to glib's g_base64_encode_step() for reassembly and mis-sizes the destination buffer — resulting in a heap out-of-bounds write during Base64 encoding of the concatenated ICC blob. Any GTK/GNOME-based consumer of untrusted images (Nautilus thumbnailers, Eye of GNOME, Evolution, Firefox on some builds, tracker-miners, Thunderbird preview) is in the reachable set. Affected: gdk-pixbuf up through 2.42.12 pre-patch; fixed in upstream commit 4af78023 and shipped as Debian 2.42.12+dfsg-4, Ubuntu USN-7662-1, RHEL/SUSE backports, Fedora updates.

The vendor HIGH (7.5, C:N/I:N/A:H) is honest but slightly misleading in framing. It's *availability-only* — the reference scoring treats the OOB access as a reliable crash, not RCE. That maps to real practitioner impact of MEDIUM: this is a thumbnailer-crash / DoS class bug across the Linux desktop, not a wormable RCE. If you're running a headless Linux fleet with no GUI stack, the exposure is closer to LOW; if you're a workstation shop or your MTAs/webmail render inline JPEGs via gdk-pixbuf, it stays MEDIUM.

"Heap overflow in a JPEG parser almost every Linux desktop links against — but CVSS:H (availability) is a crash, not code exec."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Craft the malicious JPEG

Attacker builds a JPEG with multiple APP2 marker segments carrying fragmented ICC profile chunks sized to overflow the Base64 output buffer computed in g_base64_encode_step. Public PoCs derived from the Red Hat Bugzilla reproducer (bug 2377063) and Debian bug 1109262 demonstrate the crash under ASan.
Conditions required:
  • Basic knowledge of JPEG APP2 ICC segmentation
  • libjpeg-turbo or any encoder that permits raw APP2 injection
Where this breaks in practice:
  • None — trivial to build
Detection/coverage: Not detected by typical mail/web AV. YARA rules would need to key on APP2 ICC chunk count anomalies.
STEP 02

Deliver JPEG to a gdk-pixbuf consumer

Attacker gets the JPEG in front of a process that will decode it via gdk-pixbuf — email attachment auto-thumbnailed by Nautilus/tracker-miners, image on a webpage rendered by a GTK browser, chat client preview (Fractal, Polari), or a file dropped in a monitored directory. Zero user interaction is required for background thumbnailers.
Conditions required:
  • Target opens a folder containing the file OR has auto-thumbnailing enabled OR renders inline images
Where this breaks in practice:
  • Server fleets rarely run gdk-pixbuf
  • Wayland session sandboxes for thumbnailers (Flatpak, bwrap) contain the blast radius
Detection/coverage: EDR on Linux workstations (CrowdStrike, SentinelOne) will flag the process crash but usually not the underlying JPEG.
STEP 03

Trigger the heap OOB in g_base64_encode_step

gdk-pixbuf concatenates the fragmented ICC data and calls glib's Base64 encoder with an undersized destination. Write proceeds past the allocation. In the documented reproducers this is an out-of-bounds *write* that reliably crashes the process (SIGSEGV under ASan/glibc hardening).
Conditions required:
  • No compiler/allocator mitigation caught the write first
Where this breaks in practice:
  • glibc MALLOC_CHECK_, _FORTIFY_SOURCE=2/3, Intel CET, and heap tagging on aarch64 all raise the cost of exploitation
  • The overflow content is Base64 alphabet only — no arbitrary bytes, so shaping a useful payload is non-trivial
Detection/coverage: Crash telemetry via systemd-coredump / ABRT / Sentry will show the fault site clearly.
STEP 04

Attempt code execution (theoretical)

To convert the crash into RCE an attacker would need to shape adjacent heap chunks so the Base64-restricted OOB write corrupts a useful pointer or vtable, then chain through libjpeg-turbo's or glib's own control flow. No public exploit achieves this; every advisory treats the impact as availability. Do not assume RCE is impossible — but treat it as expensive, targeted work, not commodity.
Conditions required:
  • Heap grooming primitive in the calling process
  • ASLR leak or offset predictability
  • Ability to run repeatedly without alerting on crashes
Where this breaks in practice:
  • Base64-alphabet-only write
  • ASLR + PIE on all modern distros
  • Full RELRO in gdk-pixbuf/glib builds
  • Nautilus thumbnailer respawns and is often sandboxed
Detection/coverage: Repeated coredumps on the same host from gnome-thumbnail-factory or evince is the signal that matters.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. No KEV listing, no vendor IR reports, no GreyNoise tags as of the current date.
Public PoCReproducer JPEGs attached to Red Hat Bugzilla 2377063 and Debian bug 1109262. No weaponized RCE exploit public.
EPSS0.01051 (~1st percentile) — negligible exploitation probability per FIRST.
KEV statusNot listed by CISA.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H = 7.5 HIGH. Note C:N/I:N — impact is availability-only, hence our MEDIUM reassessment.
Affected versionsgdk-pixbuf ≤ 2.42.12 pre-patch; interaction with glib's g_base64_encode_step.
Fixed versionsUpstream commit 4af78023. Debian 2.42.12+dfsg-4, Ubuntu USN-7662-1, RHEL / SUSE backports available, Fedora updates shipped.
Exposure populationEffectively every desktop Linux install. Headless servers typically ship gdk-pixbuf only if GTK apps or thumbnailers are pulled in — audit with rpm -q gdk-pixbuf2 / dpkg -l libgdk-pixbuf*.
Disclosure2025-07-08, coordinated via GNOME + distro security teams.
CWECWE-120 (Buffer Copy Without Checking Size of Input).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.5/10)

Downgraded to MEDIUM because the single most decisive factor is that the CVSS vector itself is C:N/I:N/A:H — impact is availability (crash), not confidentiality or integrity, and no public work converts the Base64-alphabet-restricted heap write into code execution. Widespread reach across the Linux desktop keeps it out of LOW, but the absence of a code-exec primitive keeps it below HIGH.

HIGH Crash/DoS impact is real and reachable
MEDIUM Whether a determined attacker could pivot to RCE
HIGH Absence of in-the-wild exploitation

Why this verdict

  • Availability-only impact by design of the vector — NVD C:N/I:N/A:H. The observed primitive is an out-of-bounds *write* using Base64-alphabet bytes only, which is a poor foundation for a control-flow hijack without a separate info-leak.
  • Friction: modern Linux hardening blunts exploitation — full RELRO, PIE/ASLR, _FORTIFY_SOURCE, glibc allocator sanity checks, and increasingly sandboxed thumbnailers (Flatpak, bwrap) all sit between the write and any useful outcome.
  • Friction: EPSS 0.01, no KEV, no ITW — attacker interest is essentially zero six-plus months post-disclosure.
  • Role multiplier: workstation desktops — chain succeeds trivially as a crash of gnome-thumbnail-factory / image viewer / mail client preview. Blast radius = one user session, self-heals on respawn. This is the dominant real-world role.
  • Role multiplier: headless servers — chain generally does NOT succeed; gdk-pixbuf is not loaded by any server-critical process. Blast radius = none if the package isn't pulled in transitively.
  • Role multiplier: mail/collab gateways rendering inline images — chain succeeds as DoS of the renderer. Not a high-value-role component under noisgate's catalog (not IdP, hypervisor, PAM, CA, backup, kernel agent, or edge appliance), so no CRITICAL floor is triggered.
  • Widespread install base keeps it MEDIUM, not LOW — practically every GNOME/GTK workstation is affected; nuisance-scale outages are plausible at fleet scale.

Why not higher?

No public path from the Base64-alphabet OOB write to reliable code execution, no in-the-wild exploitation, EPSS floor-level, and the affected component is not a canonical high-value role (identity, hypervisor, PAM, backup, CA, kernel-mode agent, or edge appliance). The vendor HIGH 7.5 is driven by A:H alone, which does not map to an operational HIGH bucket.

Why not lower?

The install base is essentially every Linux desktop and any distro that pulls in GTK/GNOME transitively; the primitive is unauthenticated and requires no user interaction on hosts with thumbnailers or image-rendering mail clients. Dismissing it as LOW would ignore both the reachability and the residual possibility of code execution by a motivated attacker.

05 · Compensating Control

What to do — in priority order.

  1. Apply distro package updates for gdk-pixbuf and glib2 fleet-wide — This is the primary fix — pull Ubuntu USN-7662-1, RHEL / SUSE / Debian security-updates, or the Fedora update. Deploy via your standard patch cycle within the noisgate remediation SLA of 365 days for MEDIUM; no mitigation SLA applies.
  2. Confirm thumbnailer sandboxing — Verify gnome-thumbnail-factory and equivalents run under bwrap / Flatpak sandbox on your desktop image. If you deploy vanilla GNOME 44+ this is default; check /usr/share/thumbnailers/*.thumbnailer for X-GNOME-Sandbox=true.
  3. Strip / audit inline image rendering in mail clients — Evolution, Thunderbird, and Geary render inline images via gdk-pixbuf on some builds. Set 'do not load remote images' policies and consider disabling attachment preview until patched.
  4. Enable systemd-coredump alerting for gdk-pixbuf-linked processes — Forward systemd-coredump events to your SIEM and alert on repeated crashes in evince, gnome-thumbnail-factory, nautilus, firefox (Linux). Repeated crashes on one host are the signal that someone is iterating exploitation.
  5. SBOM sweep for embedded gdk-pixbuf/glib in container images — Third-party containers that ship a GUI stack (Selenium Grid nodes, GUI-based CI runners, RDP/VNC servers) often carry old gdk-pixbuf. Trivy / Grype / Syft your registry.
What doesn't work
  • Network-layer WAF / IPS rules — the JPEG can be delivered via email, USB, chat, or HTTPS to any endpoint; perimeter inspection does not cover the reachable code path.
  • Blocking JPEG attachments outright — false-positive rate is unacceptable for enterprise mail and does not stop web-delivered images.
  • Antivirus signatures — no reliable content signature exists for a valid-looking JPEG with abusive ICC chunk counts; commercial AV does not detect the reproducer.
  • SELinux/AppArmor default policies — they may contain post-exploitation lateral movement but do not prevent the initial crash or in-process corruption.
06 · Verification

Crowdsourced verification payload.

Run this on each Linux target host as root or via your config-management push (Ansible, Salt, Puppet). Example: sudo bash check-cve-2025-7345.sh. Detects gdk-pixbuf package version across Debian/Ubuntu, RHEL/Fedora, and SUSE and compares against known fixed thresholds. Exits 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate: CVE-2025-7345 gdk-pixbuf heap OOB via chunked ICC JPEG
set -u

VULN=1
PATCHED=0
UNKNOWN=2

verdict() {
  case "$1" in
    $VULN)    echo "VULNERABLE: $2"; exit $VULN ;;
    $PATCHED) echo "PATCHED: $2";    exit $PATCHED ;;
    *)        echo "UNKNOWN: $2";    exit $UNKNOWN ;;
  esac
}

# Debian/Ubuntu
if command -v dpkg-query >/dev/null 2>&1; then
  V=$(dpkg-query -W -f='${Version}' libgdk-pixbuf-2.0-0 2>/dev/null || \
      dpkg-query -W -f='${Version}' libgdk-pixbuf2.0-0 2>/dev/null || true)
  if [ -n "$V" ]; then
    # Debian fix: 2.42.12+dfsg-4 ; Ubuntu USN-7662-1 backports across releases
    if dpkg --compare-versions "$V" ge "2.42.12+dfsg-4"; then
      verdict $PATCHED "gdk-pixbuf $V (>= 2.42.12+dfsg-4)"
    else
      verdict $VULN "gdk-pixbuf $V (< 2.42.12+dfsg-4)"
    fi
  fi
fi

# RHEL/Fedora
if command -v rpm >/dev/null 2>&1; then
  V=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' gdk-pixbuf2 2>/dev/null | grep -v 'not installed' | head -1)
  if [ -n "$V" ]; then
    # Consult vendor errata; treat any release explicitly noting CVE-2025-7345 as patched
    if rpm -q --changelog gdk-pixbuf2 2>/dev/null | grep -q 'CVE-2025-7345'; then
      verdict $PATCHED "gdk-pixbuf2 $V (changelog cites CVE-2025-7345)"
    else
      verdict $VULN "gdk-pixbuf2 $V (no CVE-2025-7345 fix in changelog)"
    fi
  fi
fi

verdict $UNKNOWN "gdk-pixbuf package not detected on this host"
07 · Bottom Line

If you remember one thing.

TL;DR
Treat this as a routine Linux desktop hygiene item, not a fire drill. Per the noisgate mitigation SLA there is no mitigation deadline for MEDIUM — go straight to the noisgate remediation SLA of ≤ 365 days: schedule the gdk-pixbuf2 / libgdk-pixbuf-2.0-0 / glib2 updates in your next monthly desktop patch wave (aim to close it within 30 days for operational reasons, not compliance). Prioritize workstations, jump boxes, and any server that transitively pulls in GTK (CI runners with headless browsers, Selenium Grid, remote-desktop servers). Confirm thumbnailer sandbox is enabled on your standard desktop image, wire systemd-coredump into your SIEM, and move on. If new evidence of RCE or ITW exploitation emerges, we will re-verdict.

Sources

  1. Red Hat Bugzilla 2377063
  2. GitHub Advisory GHSA-xrq2-m5w8-p5wg
  3. Ubuntu Security CVE-2025-7345
  4. Rapid7 USN-7662-1
  5. Snyk SNYK-DEBIAN12-GDKPIXBUF-10663977
  6. SUSE advisory 2025:03010-1
  7. Debian bug 1109262
  8. Upstream fix commit 4af78023
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.