A math mistake in libsoup's quoted-string helper that crashes the parser but doesn't hand attackers the keys
libsoup is the HTTP client/server library GNOME ships with — used by Evolution, gnome-online-accounts, geary, GStreamer's souphttpsrc, and various embedded HTTP consumers on Linux. In the append_param_quoted() helper (which formats key="value" parameters for headers like Content-Disposition), an integer overflow in length arithmetic produces a buffer under-read. The immediate consequence is a crash or a small out-of-bounds memory read — availability impact, no code execution, no controllable memory disclosure per the CVSS vector. Affected versions span libsoup 2.x and 3.x prior to the April 2025 backport wave; RHEL fixes shipped in RHSA-2025:4560 / RHSA-2025:4568 / RHSA-2025:8292 and equivalent Debian/Ubuntu/SUSE updates.
Red Hat's MEDIUM (5.9) is if anything *generous* for this bug. The CVSS vector is AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H — network reachable but high attack complexity, and the sole impact is availability. There is no path to RCE, no confirmed info-leak primitive shown in the advisory, and the affected function is only reached when the application feeds attacker-controlled strings into libsoup's parameter serializer. In practical enterprise fleets — where libsoup is *consuming* HTTP responses from services the user chose to visit — the reachable path is client-side and self-inflicted.
4 steps from start to impact.
Attacker stands up a hostile HTTP endpoint
Content-Disposition or another header libsoup parses with quoted parameters) containing pathological length values designed to trip the integer overflow in append_param_quoted(). Tooling: any HTTP fuzzer — boofuzz, radamsa, or a hand-rolled Python http.server. No public weaponized PoC repo is currently indexed for this specific CVE.- Attacker controls a network-reachable HTTP endpoint the victim will contact
- Victim application uses libsoup to parse the response
- Requires the victim client to actively fetch attacker content — no unsolicited server-side reachability
- Header parsing in libsoup on the client side is the typical trigger surface, not a listener
Victim GNOME/Linux client fetches the malicious response
souphttpsrc pulls a media manifest from the attacker. libsoup ingests the response headers.- User interaction OR scheduled polling of attacker-influenced URL
- Vulnerable libsoup version linked into the consuming binary
- Most enterprise Linux fleets do not run GNOME on servers; libsoup exposure is largely on developer workstations and thin clients
- Corporate proxies + TLS inspection frequently normalize or strip malformed headers
Integer overflow triggers buffer under-read
append_param_quoted() miscalculates a size and reads before the intended buffer origin. The process either segfaults immediately or accesses uninitialized adjacent memory — the CVSS C:N says no confirmed confidentiality leak surfaces to the attacker.- Crafted header reaches the vulnerable function without upstream sanitization
- glibc heap hardening / MALLOC_CHECK_ / GLIBC_TUNABLES can trap the under-read
- ASan builds catch it in dev; production builds simply crash
libsoup.so in the crash frameImpact: application crash (denial of service)
- No supervisor throttling on restart loops
- Blast radius is one process on one endpoint; no fleet-wide amplifier
- Users notice and close the offending tab / disconnect the account
SIGSEGV for the same binary in journald is trivially alertableThe supporting signals.
| In-the-wild exploitation | None observed. Not in CISA KEV. No campaign attribution. |
|---|---|
| Public PoC | No weaponized public PoC. Bug reproducers exist in the GNOME libsoup bug tracker and Red Hat Bugzilla 2357067. |
| EPSS | 0.665% — low exploitation likelihood, consistent with an availability-only client-side bug |
| KEV status | Not listed |
| CVSS vector | AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H — network vector but high complexity, impact strictly availability |
| Affected versions | libsoup 2.x and 3.x prior to the April 2025 fix wave (exact upstream commit range not enumerated in GHSA-99xf-gcww-2c64) |
| Fixed versions / backports | RHSA-2025:4560, RHSA-2025:4568, RHSA-2025:8292; Debian/Ubuntu/SUSE equivalents; IBM Power HMC bulletin covers appliance path |
| Internet exposure | Not a listener — no Shodan/Censys signal is meaningful. libsoup is a client-side library in the vast majority of deployments. |
| Disclosure date | 2025-04-03 |
| Reporter | GNOME libsoup maintainers / Red Hat Product Security triage |
noisgate verdict.
Downgraded to LOW because the single decisive factor is impact ceiling: availability-only with C:N/I:N — no RCE, no confirmed info leak, and no confirmed high-value role where a libsoup crash produces fleet-scale consequences. High attack complexity and client-side-only reachability compound the case.
Why this verdict
- Impact ceiling is availability.
C:N/I:N/A:H— no code execution, no data disclosure documented. The worst realistic outcome is a crashed Evolution or GStreamer process. - High attack complexity + user-initiated fetch. libsoup is a client library; the victim has to reach out to attacker-controlled content. This isn't a listener you scan for on the edge.
- Friction audit: (a) attacker needs a hostile endpoint the victim contacts — post-phish or watering-hole positioning; (b) proxies/TLSI often normalize headers; (c) heap hardening frequently traps the under-read into a clean crash.
- Role multiplier — workstation: crash of one GNOME app. Local nuisance. No lateral value.
- Role multiplier — server/appliance (e.g., IBM Power HMC): libsoup is present but the exposed surface is management UI, not an unauthenticated public fetch loop. Chain still ends in DoS of the mgmt component, not fleet compromise.
- Role multiplier — high-value roles (DC, hypervisor, PAM, CI/CD): libsoup is not the canonical HTTP stack for any of these. No plausible high-value-role floor triggers.
- EPSS 0.665% + no KEV + no public weaponized PoC — telemetry confirms the friction audit.
Why not higher?
MEDIUM would require a plausible integrity or confidentiality primitive — neither exists in the advisory. The buffer under-read has not been shown to leak controllable memory back to a remote attacker, and there is no RCE path. A DoS of a desktop-side HTTP consumer does not meet the MEDIUM bar for a fleet of 10,000 hosts.
Why not lower?
Not IGNORE because the fix is trivially available via distro package updates, real Linux workstations do run vulnerable libsoup, and a scriptable client-side crash is still a nuisance surface worth cleaning up during normal patch hygiene. It earns backlog attention, not deprioritization to zero.
What to do — in priority order.
- Ride the normal distro patch cadence — Ensure
dnf update libsoup libsoup3/apt upgrade libsoup2.4-1 libsoup-3.0-0lands in your monthly Linux workstation baseline. No mitigation SLA applies — remediation target is the standard 365-day window per the noisgate SLA, but there is no reason to defer past the next monthly cycle. - Restart long-lived libsoup consumers after update — Evolution, gnome-online-accounts, and any daemon linking libsoup keep the old
.somapped until restart. Aneedrestartsweep or a scheduled reboot closes the window on the same day as the package install. - Egress-filter developer/user workstations through inspecting proxy — A TLS-terminating proxy that normalizes response headers strips most malformed
Content-Dispositionpayloads before they reach the client. This is generic hygiene that already covers many similar client-side parser bugs. - Alert on repeated libsoup segfaults in journald — A simple detection:
journalctl | grep 'libsoup.*SIGSEGV'piped to your SIEM. Cheap early warning if someone ever weaponizes this into a targeted DoS loop.
- Public-facing WAF rules — libsoup is a client library on most fleets; your WAF doesn't sit between it and the attacker's server.
- Perimeter IDS signatures — the payload is inside TLS to an attacker-controlled endpoint; no inline visibility without full MITM.
- Disabling libsoup — you can't; too much of the GNOME/Linux desktop stack links it. Patch, don't remove.
Crowdsourced verification payload.
Run this on each Linux host (workstation or appliance) as a normal user; root only needed if you also want the needrestart check. Example invocation: ./check_libsoup.sh — no arguments. Exits 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN.
#!/usr/bin/env bash
# check_libsoup.sh — CVE-2025-32050 detector
# Compares installed libsoup version(s) against distro fixed versions.
set -u
VULN=0
FOUND=0
check_rpm() {
command -v rpm >/dev/null || return
for pkg in libsoup libsoup3; do
ver=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' "$pkg" 2>/dev/null | grep -v 'not installed' || true)
[ -z "$ver" ] && continue
FOUND=1
echo "[rpm] $pkg = $ver"
# RHEL 9 fixed: libsoup-2.72.0-8.el9_5.1 / libsoup3-3.0.7-3.el9_5.1 (approx from RHSA-2025:4560/4568)
case "$pkg" in
libsoup) min='2.72.0-8.el9_5.1' ;;
libsoup3) min='3.0.7-3.el9_5.1' ;;
esac
if ! rpm --quiet -q "$pkg" || [ "$(printf '%s\n%s\n' "$min" "$ver" | sort -V | head -1)" != "$min" ]; then
# installed < min
if [ "$(printf '%s\n%s\n' "$ver" "$min" | sort -V | head -1)" = "$ver" ] && [ "$ver" != "$min" ]; then
echo " -> VULNERABLE (need >= $min)"
VULN=1
else
echo " -> patched"
fi
fi
done
}
check_dpkg() {
command -v dpkg-query >/dev/null || return
for pkg in libsoup2.4-1 libsoup-3.0-0; do
ver=$(dpkg-query -W -f='${Version}\n' "$pkg" 2>/dev/null || true)
[ -z "$ver" ] && continue
FOUND=1
echo "[dpkg] $pkg = $ver"
# Consult your distro's security tracker for the exact fixed epoch; flag if pre-2025-04.
# Heuristic: any libsoup built before 2025-04-03 upstream commit is suspect.
echo " -> cross-check against https://security-tracker.debian.org / USN for CVE-2025-32050"
done
}
check_rpm
check_dpkg
if [ "$FOUND" -eq 0 ]; then
echo "UNKNOWN — no libsoup package found via rpm/dpkg"
exit 2
fi
if [ "$VULN" -eq 1 ]; then
echo "RESULT: VULNERABLE"
exit 1
fi
echo "RESULT: PATCHED"
exit 0
If you remember one thing.
libsoup / libsoup3 ride your next monthly Linux patch cycle on workstations and appliances. Monday morning: confirm RHSA-2025:4560/4568/8292 (or Debian/Ubuntu/SUSE equivalents) are queued in your standard update channel, ensure long-lived libsoup-linked processes (Evolution, gnome-online-accounts, souphttpsrc consumers) restart after the update via needrestart or a reboot, and stop there — do not preempt higher-severity work to chase this.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.