← Back to Feed CACHED · 2026-06-30 15:08:10 · CACHE_KEY CVE-2025-32049
CVE-2025-32049 · CWE-770 · Disclosed 2025-04-03

A flaw was found in libsoup

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

An attacker mails you an oversized envelope until the mailroom collapses

CVE-2025-32049 is a CWE-770 (Allocation of Resources Without Limits) flaw in SoupWebsocketConnection. When a libsoup-backed WebSocket server (or client) processes a large or heavily fragmented WebSocket message, the library happily allocates memory to buffer it before applying any size cap. A remote, unauthenticated peer can stream multi-gigabyte frames until the process is OOM-killed. Affects libsoup 2.4 and libsoup 3.x across all major distros until patched: Ubuntu fixes land in 2.74.3-6ubuntu1.6, 3.4.4-5ubuntu0.5, 3.6.5-1ubuntu0.2; Red Hat ships errata RHSA-2025:8140/8252/8482/8663/9179; the upstream merge request is GNOME/libsoup!408.

Red Hat and the NVD list this as HIGH (7.5) because the CVSS calculator sees AV:N/AC:L/PR:N/UI:N/A:H and stamps HIGH. That math is correct in the abstract but misleading in practice: this is a pure availability bug, no code execution, no info disclosure, and it only matters on hosts that actually expose a WebSocket endpoint built on libsoup — which is a small slice of the libsoup install base. Most libsoup consumers (GNOME desktop apps, evolution, gnome-online-accounts, geary, librest-driven clients) never run a WebSocket server. Reassessing at MEDIUM reflects the real exposure population, not the calculator output.

"Unauthenticated WebSocket memory exhaustion DoS in libsoup — real but narrow. Vendor 7.5 overstates the blast radius for most deployments."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Locate a libsoup-backed WebSocket endpoint

Attacker enumerates services exposing Upgrade: websocket and fingerprints Server: libsoup or libsoup-derived banners. Targets are typically GNOME-stack web tools, embedded device control planes, or niche WS servers — not mainline NGINX/Node services. Tooling: wscat, httpx, masscan + a custom WS probe.
Conditions required:
  • Reachable TCP port speaking HTTP+WS
  • Server upgrades to WebSocket without auth, or attacker has valid creds
Where this breaks in practice:
  • Most enterprise WS endpoints sit behind reverse proxies (NGINX/HAProxy/Envoy) that buffer or enforce client_max_body_size and frame caps before libsoup sees the bytes
  • Libsoup-as-server is uncommon — the vast majority of libsoup processes are client-side desktop apps
Detection/coverage: Tenable plugin 215xxx series, Qualys QID 38xxx, and distro dnf updateinfo/apt list --upgradable will flag the package, but neither identifies which processes actually expose a WS listener — you need runtime asset context.
STEP 02

Establish a WebSocket session

Attacker completes the HTTP/1.1 Upgrade handshake. Any unauth-acceptable endpoint works; auth-gated endpoints require valid creds first. Standard websocket-client or autobahn libraries; no exploit kit needed.
Conditions required:
  • Endpoint accepts the Upgrade handshake from attacker's network position
Where this breaks in practice:
  • Origin checks, JWT/cookie auth, or mTLS on the WS path block unauthenticated abuse
  • Cloudflare/Akamai WS proxies enforce idle and message-size limits
Detection/coverage: WAF logs and reverse-proxy access logs show Upgrade requests; baseline anomaly detection catches new source IPs initiating WS.
STEP 03

Stream an oversized or heavily-fragmented message

Attacker sends a single WS message with a multi-GB payload length, or chains thousands of CONTINUATION frames. libsoup buffers each fragment in the message accumulator without checking a configured maximum, so RSS grows linearly with bytes sent. PoC: python -c 'import websocket; ws=websocket.create_connection(url); ws.send(b"A"*(8*1024*1024*1024))'.
Conditions required:
  • Established WS session
  • Server process has no external memory cgroup tighter than its working set
Where this breaks in practice:
  • Systemd MemoryMax=, Kubernetes pod memory limits, or cgroup quotas will OOM-kill the offending worker before host-wide damage
  • Reverse proxy frame-size limits truncate the message before libsoup buffers it
Detection/coverage: Sudden RSS spike on the libsoup process; node_exporter process_resident_memory_bytes will show it. No CVE-specific signature exists.
STEP 04

Process is OOM-killed; service interrupted

Kernel oom-killer reaps the libsoup process (or the entire container). If the service is single-instance and not behind a load balancer with health-check restart, availability drops. Attacker repeats from a different IP to defeat naive rate limits.
Conditions required:
  • No supervisor auto-restart faster than attacker reconnect interval
Where this breaks in practice:
  • systemd Restart=always, Kubernetes liveness/restart policies, and HA pairs make the impact a recurring blip rather than a real outage
Detection/coverage: OOM in dmesg/journald; pod restart counter; SLO burn-rate alerts.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone publicly reported. Not in CISA KEV. No named threat-actor campaigns.
Public PoCTrivial conceptual PoC (oversized WS frame loop); no weaponized exploit in Metasploit/Exploit-DB as of June 2026. Patch discussion in GNOME/libsoup!408.
EPSS0.00728 (~0.7%, low percentile) — FIRST scores this near the bottom of the exploitability distribution.
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 — network, no auth, no UI, availability-only. No confidentiality or integrity impact.
CWECWE-770 Allocation of Resources Without Limits or Throttling.
Affected versionslibsoup 2.4 and libsoup 3.x through pre-patch releases on all distros.
Fixed versionsUbuntu: libsoup2.4 2.74.3-6ubuntu1.6 / 2.74.3-10ubuntu0.4; libsoup3 3.4.4-5ubuntu0.5 / 3.6.5-1ubuntu0.2. Red Hat: RHSA-2025:8140, 8252, 8482, 8663, 9179, 21657. SUSE/Rocky tracking parallel.
Exposure dataShodan Server: libsoup returns a small set (low thousands) of mostly embedded/IoT and GNOME desktop helper instances — not a hyperscale exposure population.
Disclosed2025-04-03, reported via Red Hat Product Security (Bugzilla #2357066).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.3/10)

The decisive factor is availability-only impact with a narrow real exposure population: libsoup is ubiquitous, but libsoup running as a WebSocket *server* on a reachable port is a small slice — most installs are GNOME desktop client code. A successful exploit costs the attacker a process restart, not data and not a foothold.

HIGH Technical impact (memory exhaustion, no RCE)
HIGH Vendor patch availability
MEDIUM Real exposure population estimate

Why this verdict

  • Availability-only bug: CVSS vector explicitly shows C:N/I:N/A:H — no code execution, no info disclosure, no privilege change. The worst-case outcome is process OOM, recoverable in seconds with any supervisor.
  • Narrow reachable population: libsoup is installed on virtually every GNOME-based Linux host, but the affected code path requires the process to operate as a WebSocket server or accept WS frames as a client from an attacker-controlled server. The desktop-client majority of installs simply does not expose this surface to the internet.
  • Friction stacks compound the downgrade: reverse proxies (NGINX/Envoy/Cloudflare) enforce frame-size and body limits before libsoup; cgroup/Kubernetes memory limits scope the blast to a pod restart; systemd Restart=always makes the DoS a blip.
  • Low exploit interest: EPSS 0.00728, no KEV, no public weaponization, no campaign reporting — attackers prefer L7 floods or HTTP/2 abuses with more leverage.
  • Role multiplier — high-value roles: libsoup is NOT canonically the software powering domain controllers, hypervisors, identity providers, PAM, backup, or kernel-mode agents. The bug does not enable lateral movement, credential theft, or supply-chain pivot in any high-value role. The deployment-role floor therefore does not push above MEDIUM.
  • Role multiplier — embedded/OT edge case: the one role where this stings harder is embedded device control planes (printers, IoT gateways, kiosks) that ship libsoup-as-server with no proxy and weak supervision. For those, treat as HIGH and patch on the HIGH SLA. For general-purpose servers and workstations, MEDIUM stands.

Why not higher?

HIGH is reserved for vulnerabilities whose realistic exploit outcome includes code execution, credential theft, or fleet-scale availability damage. This bug delivers a recoverable process kill on a narrow subset of hosts, with no integrity or confidentiality impact. The vendor 7.5 is a CVSS-calculator artifact, not a reflection of real-world blast radius.

Why not lower?

LOW would be wrong because the bug is unauthenticated, network-reachable on affected services, and trivially scriptable — embedded/IoT fleets behind no reverse proxy can genuinely be knocked offline by a script kiddie. The compounding factors narrow it but do not erase it.

05 · Compensating Control

What to do — in priority order.

  1. Inventory which hosts actually run libsoup as a WS server — Use lsof -i -nP | grep -E ':[0-9]+ \(LISTEN\)' cross-referenced with lsof -p $(pgrep -f libsoup) | grep libsoup-, or check service definitions for gnome-online-accounts, evolution-data-server, or any custom apps linking libsoup-2.4.so.1 / libsoup-3.0.so.0 and binding a public port. Patch those first; the desktop majority can ride the standard 365-day MEDIUM remediation window.
  2. Enforce WebSocket frame-size limits at the reverse proxy — On NGINX add proxy_buffering off; client_max_body_size 1m; on the WS location and consider proxy_request_buffering off; with explicit timeouts. On Envoy set max_request_bytes and a per-message budget. Apply now — same day for any externally exposed endpoint.
  3. Constrain memory at the process / pod level — Add MemoryMax=512M (or appropriate) to systemd units backing libsoup-WS servers; set Kubernetes pod resources.limits.memory. This bounds the blast to a restart instead of a host kill. Deploy within the noisgate mitigation SLA window.
  4. Require auth on WebSocket Upgrade — Reject Upgrade requests without a valid session cookie / JWT / mTLS at the proxy layer. Eliminates unauthenticated remote DoS.
  5. Patch libsoup to fixed package versiondnf upgrade libsoup / apt upgrade libsoup2.4 libsoup-3.0-0 to the distro-fixed version (see Intelligence table) within the noisgate remediation SLA (≤365 days for MEDIUM). For embedded/IoT fleets escalate to HIGH SLA (≤180 days).
What doesn't work
  • EDR / AV signatures — there is no malicious payload to detect; the attack is well-formed WS traffic.
  • IP allowlists alone — internal attackers (compromised workstation, malicious tenant) still trigger the bug; allowlists narrow but don't eliminate.
  • TLS — TLS doesn't bound message size; the WS message is decrypted into the same buffer.
  • Removing libsoup — most GNOME-stack and many distro packages have hard dependencies on libsoup; uninstalling breaks update tooling, online accounts, etc. Patch, don't remove.
06 · Verification

Crowdsourced verification payload.

Run on each Linux target host with sudo (needed to read /proc/*/maps). Invoke as sudo bash check-libsoup-32049.sh. Reports PATCHED / VULNERABLE / UNKNOWN based on installed package version AND whether a running process has libsoup mapped.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate verification: CVE-2025-32049 libsoup WebSocket DoS
# Exit 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -u

found_pkg=0
vuln_pkg=0
patched_pkg=0

check_deb() {
  for p in libsoup2.4-1 libsoup-3.0-0; do
    if dpkg -s "$p" >/dev/null 2>&1; then
      found_pkg=1
      ver=$(dpkg-query -W -f='${Version}' "$p")
      echo "[*] $p installed: $ver"
      case "$p" in
        libsoup2.4-1)
          # Ubuntu fixes: 2.74.3-6ubuntu1.6, 2.74.3-10ubuntu0.4
          if dpkg --compare-versions "$ver" ge "2.74.3-6ubuntu1.6"; then patched_pkg=1; else vuln_pkg=1; fi ;;
        libsoup-3.0-0)
          # Ubuntu fixes: 3.4.4-5ubuntu0.5, 3.6.5-1ubuntu0.2, 3.0.7-0ubuntu1
          if dpkg --compare-versions "$ver" ge "3.4.4-5ubuntu0.5"; then patched_pkg=1; else vuln_pkg=1; fi ;;
      esac
    fi
  done
}

check_rpm() {
  for p in libsoup libsoup3; do
    if rpm -q "$p" >/dev/null 2>&1; then
      found_pkg=1
      ver=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' "$p")
      echo "[*] $p installed: $ver"
      # Red Hat patched in RHSA-2025:8140 family. Check via rpm changelog for CVE ref.
      if rpm -q --changelog "$p" 2>/dev/null | grep -q 'CVE-2025-32049'; then
        patched_pkg=1
      else
        vuln_pkg=1
      fi
    fi
  done
}

if command -v dpkg >/dev/null 2>&1; then check_deb; fi
if command -v rpm  >/dev/null 2>&1; then check_rpm; fi

if [ "$found_pkg" -eq 0 ]; then
  echo "UNKNOWN: libsoup not installed via package manager (could be vendored)"
  exit 2
fi

# Surface check: any running process mapping libsoup?
exposed=0
if command -v ss >/dev/null 2>&1; then
  while read -r pid; do
    [ -z "$pid" ] && continue
    if grep -q 'libsoup-[23]' "/proc/$pid/maps" 2>/dev/null; then
      pname=$(cat "/proc/$pid/comm" 2>/dev/null || echo unknown)
      ports=$(ss -tlnp 2>/dev/null | awk -v p="$pid" '$0 ~ "pid="p"," {print $4}' | tr '\n' ' ')
      if [ -n "$ports" ]; then
        echo "[!] PID $pid ($pname) maps libsoup AND listens on: $ports"
        exposed=1
      fi
    fi
  done < <(ls /proc | grep -E '^[0-9]+$')
fi

if [ "$vuln_pkg" -eq 1 ]; then
  echo "VULNERABLE: unpatched libsoup present"
  [ "$exposed" -eq 1 ] && echo "  + exposed listener detected — prioritize"
  exit 1
fi
if [ "$patched_pkg" -eq 1 ]; then
  echo "PATCHED: libsoup at fixed version"
  exit 0
fi
echo "UNKNOWN: could not determine patch state"
exit 2
07 · Bottom Line

If you remember one thing.

TL;DR
Reassessed as MEDIUM (5.3) — availability-only, narrow real exposure, no in-the-wild exploitation, EPSS in the bottom percentile. Monday morning: run the verification script across the estate to separate libsoup-as-WS-server hosts from the GNOME-desktop majority. For any externally exposed WS endpoint backed by libsoup, enforce reverse-proxy frame-size limits and process memory caps today (override the noisgate mitigation SLA — no formal MEDIUM mitigation deadline applies, but exposed services warrant ≤7 days). For everything else, there is no mitigation SLA — go straight to the 365-day remediation window under the noisgate remediation SLA and let the distro patch ride the normal package-update cadence. Escalate embedded/IoT fleets running libsoup-as-server with no proxy to the HIGH bucket (mitigate ≤30 days, remediate ≤180 days).

Sources

  1. Red Hat Bugzilla #2357066 — CVE-2025-32049
  2. Ubuntu Security — CVE-2025-32049
  3. SUSE Security — CVE-2025-32049
  4. RHSA-2025:8252
  5. RHSA-2025:8140
  6. Debian bug #1102067 — libsoup3 fragmented WebSocket
  7. IBM Power HMC bulletin (libsoup CVEs)
  8. OSV — UBUNTU-CVE-2025-32049
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.