A GNOME-stack HTTP client that faints when a malicious server forgets to send a Digest nonce
libsoup is the HTTP client library that ships with GNOME and is linked by gnome-online-accounts, evolution, geary, gvfs, tracker-miners, gnome-software, flatpak, and dozens of GTK apps. When the client authenticates with HTTP Digest and the server returns a 401 Unauthorized *without* the mandatory nonce parameter in the WWW-Authenticate header, SoupAuthDigest dereferences a NULL pointer and the calling process aborts. Affected: all libsoup 2.x and 3.x builds prior to 3.6.5 (fix landed upstream April 2025; distro backports followed within days for RHEL 8/9/10, Ubuntu 22.04/24.04, Debian 12, SUSE 15).
Red Hat's 6.5 MEDIUM rating is *defensible only on paper*. AV:N/AC:L/PR:N is technically correct — the trigger is a single malformed HTTP response — but UI:R (the user must initiate the request) plus C:N/I:N (no confidentiality or integrity impact, availability-only) puts the real-world impact at *the affected app crashes once*. The library auto-restarts under most GNOME service supervisors, there is no privilege boundary crossed, and there is no path to RCE. Vendor severity should be LOW; treating this as MEDIUM in your queue wastes cycles that belong on KEV bugs.
3 steps from start to impact.
Attacker stands up a malicious HTTP endpoint
python3 -m http.server with a 30-line wrapper, or a mitmproxy script that intercepts an outbound request and rewrites the WWW-Authenticate: Digest header to omit nonce="...". Public PoC patterns exist in the Red Hat Bugzilla reproducer attached to BZ#2359356.- Attacker controls a URL the victim libsoup client will contact
- Server replies with
401+Digestrealm but nononce
- Most enterprise HTTP traffic from GNOME apps goes to known SaaS endpoints, not attacker-controlled hosts
- Corporate proxies typically rewrite or strip malformed
WWW-Authenticateheaders
Victim app issues a libsoup HTTP request to the endpoint
gnome-online-accounts, browses a tracker-indexed share, or flatpak installs from a malicious remote. Headless / server roles (RHEL minimal, Ubuntu Server with no GUI) almost never load libsoup at all.- A libsoup-linked process is running on the host
- That process can be coerced into contacting the attacker URL
- Server-class Linux installs typically have libsoup present but no consumer of it
- Egress firewall / proxy filtering blocks arbitrary outbound HTTP from servers
ProcessTerminated with SIGSEGV, Elastic process.exit_code ≠ 0) flags the abort but not the cause.NULL deref → SIGSEGV in the libsoup-linked process
soup_auth_digest_update() dereferences the unset nonce field on the auth struct. Process aborts. That's the end of the chain — no memory disclosure, no control-flow hijack, no privilege escalation. systemd / GNOME session bus respawns the dead service in seconds.- libsoup < 3.6.5 (or unpatched 2.x) in the address space
- Crash is *the impact*; there is no follow-on stage to add friction to
systemd-coredump, abrt) captures the signature; ASAN/UBSAN builds in distro CI caught this pre-disclosure.The supporting signals.
| In-the-wild exploitation | None observed. No campaigns, no IR reports, no Mandiant/Unit42/Talos write-ups. |
|---|---|
| Public PoC | Reproducer in Red Hat BZ#2359356; no weaponized exploit on GitHub or ExploitDB. |
| EPSS | 0.00372 (~0.4%) — bottom percentile. FIRST.org has zero exploitation forecast. |
| KEV status | Not listed. CISA has not added and is unlikely to — availability-only client crash. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H — network, low complexity, user interaction required, availability-only. |
| Affected versions | libsoup < 3.6.5; both libsoup-2.4 and libsoup-3.0 source trees affected. |
| Fixed versions | Upstream 3.6.5; RHEL 9 libsoup-2.72.0-8.el9_4.2, Ubuntu 24.04 libsoup-3.0 3.4.4-5ubuntu0.1, Debian 12 libsoup3 3.2.2-2+deb12u1, SUSE SLE15-SP6 libsoup-2_4-1-2.74.3-150600.x. |
| Exposure | GreyNoise/Shodan irrelevant — this is *client-side*. Server fingerprinting won't tell you anything. |
| Disclosure | 2025-04-14 via Red Hat Product Security; coordinated with GNOME maintainers. |
| Reporter | Red Hat Product Security (no individual researcher credited in the GHSA). |
noisgate verdict.
The single decisive factor is impact ceiling: the chain terminates at a SIGSEGV in a client process with no confidentiality or integrity loss, and the affected component runs as the calling user with no privilege boundary to cross. Availability-only client-side DoS on auto-respawning desktop libraries does not warrant MEDIUM queue placement.
Why this verdict
- Availability-only, client-side: C:N/I:N/A:H plus UI:R means the worst case is the user's mail/calendar/file-manager app dies once and respawns. No data exfil, no code execution, no lateral pivot.
- Attacker position requirement: the victim must initiate an HTTP request to a server the attacker controls — implies prior phishing, DNS hijack, or MITM position. Each of those is a separate, higher-bar incident your EDR/proxy/email gateway is already paid to stop.
- Role multiplier: workstation role → single-app crash, user reopens it; headless server role → libsoup is usually present but *unused* (no GUI consumer), so unreachable; CI/build hosts — same. No high-value role (DC, hypervisor, IdP, PAM, backup, kernel-mode agent) links libsoup in its hot path. Floor is LOW.
- No active exploitation, no KEV, EPSS 0.4% — the threat landscape signal is empty across every datasource that matters.
Why not higher?
MEDIUM would require either a credible RCE path (there isn't one — NULL deref on a read field, no controlled write) or a high-value-role consumer (libsoup is not linked by domain controllers, hypervisors, or kernel-mode agents). Without those, A:H on a respawning desktop process does not clear the MEDIUM bar.
Why not lower?
IGNORE is wrong because patches exist, are free, are already in your distro's normal update channel, and the bug is real (not theoretical). You should fix it during the next scheduled patch cycle — just not ahead of anything that's actually being exploited.
What to do — in priority order.
- Route libsoup-linked apps through an authenticating egress proxy — A forward proxy that rewrites or rejects malformed
WWW-Authenticateheaders neutralizes the trigger. No mitigation SLA applies (LOW verdict) — implement during the normal proxy policy review cycle. - Enable
systemd-coredumpretention on desktop fleet — If exploited at scale, you want forensic evidence. SetStorage=externalin/etc/systemd/coredump.confand ship to your SIEM. Do this opportunistically; no deadline. - Track libsoup in your SBOM / package inventory — Many shops underestimate desktop-library exposure. Inventory which hosts have libsoup linked into long-running processes; informs prioritization of *future* libsoup CVEs too.
- WAFs / IDS rules — the malicious response comes from an attacker-controlled server *to your client*; your inbound WAF never sees it.
- Disabling HTTP Digest auth in apps — most GNOME apps don't expose that setting, and the parsing happens before any policy check.
- Network segmentation alone — doesn't help; the affected library is reaching *out*, not being reached *in*.
Crowdsourced verification payload.
Run on each Linux host as root (or via your config-management tool — Ansible, Salt, Puppet). Invoke as sudo ./check_cve_2025_32912.sh. No arguments. Exits 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN.
#!/usr/bin/env bash
# check_cve_2025_32912.sh — libsoup SoupAuthDigest NULL deref
# Usage: sudo ./check_cve_2025_32912.sh
set -u
FIXED_UPSTREAM="3.6.5"
status="UNKNOWN"
vercmp() {
# returns 0 if $1 >= $2
[ "$(printf '%s\n%s\n' "$2" "$1" | sort -V | head -n1)" = "$2" ]
}
check_pkg() {
local pkg="$1" ver=""
if command -v rpm >/dev/null 2>&1; then
ver=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' "$pkg" 2>/dev/null | head -n1)
elif command -v dpkg-query >/dev/null 2>&1; then
ver=$(dpkg-query -W -f='${Version}\n' "$pkg" 2>/dev/null | head -n1)
fi
echo "$ver"
}
found=0
for pkg in libsoup-3.0-0 libsoup2.4-1 libsoup libsoup-2_4-1 libsoup-3_0-0; do
v=$(check_pkg "$pkg")
[ -z "$v" ] && continue
found=1
echo "Found $pkg version $v"
base=$(echo "$v" | sed -E 's/[-+~].*//')
if vercmp "$base" "$FIXED_UPSTREAM"; then
status="PATCHED"
else
# distro backport check: presence of patched release tag
if echo "$v" | grep -Eq 'el9_4|el8_10|ubuntu0\.1|deb12u1|150600'; then
status="PATCHED"
else
status="VULNERABLE"
break
fi
fi
done
if [ "$found" -eq 0 ]; then
echo "libsoup not installed — not vulnerable (no attack surface)."
echo "PATCHED"
exit 0
fi
echo "$status"
case "$status" in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esac
If you remember one thing.
apt upgrade / dnf update window). Monday morning, do *nothing CVE-specific*: confirm your patch pipeline is healthy, and move on to KEV-listed items. Verify with the script above after your next normal update cycle.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.