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.
4 steps from start to impact.
Craft the malicious JPEG
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.- Basic knowledge of JPEG APP2 ICC segmentation
- libjpeg-turbo or any encoder that permits raw APP2 injection
- None — trivial to build
Deliver JPEG to a gdk-pixbuf consumer
- Target opens a folder containing the file OR has auto-thumbnailing enabled OR renders inline images
- Server fleets rarely run gdk-pixbuf
- Wayland session sandboxes for thumbnailers (Flatpak, bwrap) contain the blast radius
Trigger the heap OOB in g_base64_encode_step
- No compiler/allocator mitigation caught the write first
- 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
Attempt code execution (theoretical)
- Heap grooming primitive in the calling process
- ASLR leak or offset predictability
- Ability to run repeatedly without alerting on crashes
- Base64-alphabet-only write
- ASLR + PIE on all modern distros
- Full RELRO in gdk-pixbuf/glib builds
- Nautilus thumbnailer respawns and is often sandboxed
gnome-thumbnail-factory or evince is the signal that matters.The supporting signals.
| In-the-wild exploitation | None observed. No KEV listing, no vendor IR reports, no GreyNoise tags as of the current date. |
|---|---|
| Public PoC | Reproducer JPEGs attached to Red Hat Bugzilla 2377063 and Debian bug 1109262. No weaponized RCE exploit public. |
| EPSS | 0.01051 (~1st percentile) — negligible exploitation probability per FIRST. |
| KEV status | Not listed by CISA. |
| CVSS vector | CVSS: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 versions | gdk-pixbuf ≤ 2.42.12 pre-patch; interaction with glib's g_base64_encode_step. |
| Fixed versions | Upstream commit 4af78023. Debian 2.42.12+dfsg-4, Ubuntu USN-7662-1, RHEL / SUSE backports available, Fedora updates shipped. |
| Exposure population | Effectively 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*. |
| Disclosure | 2025-07-08, coordinated via GNOME + distro security teams. |
| CWE | CWE-120 (Buffer Copy Without Checking Size of Input). |
noisgate verdict.
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.
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.
What to do — in priority order.
- 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.
- Confirm thumbnailer sandboxing — Verify
gnome-thumbnail-factoryand equivalents run under bwrap / Flatpak sandbox on your desktop image. If you deploy vanilla GNOME 44+ this is default; check/usr/share/thumbnailers/*.thumbnailerforX-GNOME-Sandbox=true. - 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.
- Enable systemd-coredump alerting for gdk-pixbuf-linked processes — Forward
systemd-coredumpevents to your SIEM and alert on repeated crashes inevince,gnome-thumbnail-factory,nautilus,firefox(Linux). Repeated crashes on one host are the signal that someone is iterating exploitation. - 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.
- 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.
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.
#!/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"
If you remember one thing.
systemd-coredump into your SIEM, and move on. If new evidence of RCE or ITW exploitation emerges, we will re-verdict.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.