Like finding a lock bypass on a door that nobody installs in their house
CVE-2026-95508 is a heap-based buffer overflow in libslirp, the user-mode TCP/IP emulation library consumed by QEMU (-netdev user) and slirp4netns (rootless container networking). A malicious guest VM or container can send a crafted DHCPv6 CLIENTID option or TFTP blksize option that overflows the reply buffer in the host-side libslirp process, potentially achieving denial of service or arbitrary code execution on the host. The bug is triggered only when the host has configured a non-default small interface MTU for the slirp network; the default MTU is not affected. Affected versions span the entire libslirp 4.x line through 4.9.4; the fix landed in 4.9.5 via two GitLab commits addressing the DHCPv6 and TFTP response builders respectively.
The vendor severity of HIGH 7.4 overstates the real-world risk for enterprises. The CVSS vector marks AV:N (network), but the actual attacker position is *inside a guest VM or container* using slirp networking — that is post-compromise of the guest, not a true unauthenticated-remote-from-internet posture. More importantly, production QEMU/KVM deployments universally use tap/bridge or virtio networking, never slirp user-mode. Rootless Podman has defaulted to pasta since v5.0 and removed slirp4netns entirely in v6. The remaining population running slirp in anger is developer laptops, CI runners, and test labs — none of which are fleet-critical. On top of that, the trigger requires a non-default small MTU, further narrowing exposure. The vendor score is technically defensible in a vacuum but practically misleading for anyone managing production infrastructure.
4 steps from start to impact.
Attacker gains code execution inside guest VM or container
-netdev user (slirp mode) or a rootless container using slirp4netns. This is the prerequisite guest-side foothold. In enterprise environments this means the attacker has already achieved initial access and lateral movement into a development or CI environment.- Code execution inside a guest VM or rootless container
- Host must be running QEMU with
-netdev useror using slirp4netns
- Production VMs use tap/bridge/virtio networking, not slirp
- Podman 5+ defaults to pasta; Podman 6 removes slirp4netns entirely
- Attacker must already be inside the guest — this is post-initial-access
-netdev user is the best detection.Non-default small MTU must be configured
- Host slirp interface configured with non-default small MTU
- Default MTU configurations are explicitly not vulnerable
- No mainstream QEMU deployment guide recommends lowering slirp MTU
- Configuration auditing tools can flag non-default MTU values
-netdev user,...,mtu=<small_value> or equivalent.Craft malicious DHCPv6 CLIENTID or TFTP blksize
- Network connectivity from guest to host slirp stack (automatic in slirp mode)
- Small MTU causing undersized reply buffer
- No public PoC exists as of 2026-09-24
- Exploit development requires understanding libslirp heap layout and host ASLR/NX
Heap corruption in host QEMU process
S:U (scope unchanged) and C:N (no confidentiality impact), suggesting the vendor considers full code execution unlikely and the primary impact is integrity/availability.- Successful heap overflow with attacker-controlled data
- Modern Linux ASLR, NX, and heap hardening (glibc tcache protections) make reliable exploitation difficult
- QEMU processes often run as unprivileged
qemuuser, limiting post-exploitation blast radius - Scope unchanged per vendor — no VM escape boundary crossing credited
The supporting signals.
| In-the-Wild Exploitation | No known exploitation in the wild. Not listed in CISA KEV. No threat intelligence reports reference active campaigns. |
|---|---|
| Proof-of-Concept | No public PoC as of 2026-09-24. The vulnerability was responsibly disclosed by Stuart Thomas to Red Hat. Two GitLab commits fix the issue but no standalone exploit code has been published. |
| EPSS Score | 0.00423 (36.3rd percentile) — indicates low predicted exploitation probability in the next 30 days. |
| KEV Status | Not listed. No CISA deadline applies. |
| CVSS Vector | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H — The AV:N is misleading; actual attack requires guest-side access. AC:H reflects the non-default MTU requirement. S:U means no cross-boundary (guest-to-host) scope change is credited. |
| Affected Versions | libslirp 4.0.0 through 4.9.4 across all consumers: QEMU, slirp4netns, and any application linking libslirp. Debian oldstable (4.7.0), stable (4.8.0), testing/unstable (4.9.4) all affected. |
| Fixed Version | libslirp 4.9.5. Debian has not yet released backported packages as of 2026-09-24. Red Hat tracking via Bugzilla #2537748. |
| Scanning / Exposure | No GreyNoise or Shodan signatures — the slirp network stack is not externally reachable; it sits between guest and host, invisible to internet scanners. Exposure is determined by local asset inventory of QEMU -netdev user instances. |
| Disclosure Date | 2026-09-22 (public), reported to Red Hat on 2026-09-16. |
| Reporting Researcher | Stuart Thomas, credited by Red Hat. |
Why this verdict
- Attacker position is post-compromise, not remote: The CVSS
AV:Nimplies internet-reachable, but the real prerequisite is code execution inside a guest VM or container. That is a post-initial-access position — the attacker is already inside. This alone warrants a 1–2 point downward adjustment from the 7.4 baseline. - Slirp is a dev/test networking mode, not production: Production QEMU/KVM universally uses tap, bridge, or virtio networking. Enterprise hypervisor fleets (vCenter, OpenStack, oVirt) never configure slirp. The affected population in a 10,000-host enterprise is near zero for VM use cases.
- Rootless container path is deprecated: Podman 5+ defaults to
pasta; Podman 6 removes slirp4netns. The container-side exposure is shrinking quarterly. Only legacy Podman 4.x rootless setups still use slirp4netns by default. - Non-default configuration required: The overflow triggers only with a small, explicitly configured MTU — the default MTU is safe. This is a configuration-gated vulnerability, further reducing the reachable population.
- Role multiplier: libslirp is *technically* a hypervisor-adjacent component (used by QEMU), but slirp user-mode networking is explicitly NOT the production networking path. Fewer than 5% of QEMU instances in enterprise environments use slirp. The high-value hypervisor role is occupied by QEMU+tap/bridge, which is unaffected. For rootless containers, the blast radius is a single unprivileged container host process, not fleet-scale. The hypervisor high-value floor does NOT apply because the affected code path (slirp networking) is not the canonical production deployment mode.
- No PoC, low EPSS, no KEV: Zero public exploit code, 36th percentile EPSS, and no CISA KEV listing. The exploitation probability in the near term is very low.
Why not higher?
The theoretical guest-to-host code execution impact could justify HIGH if slirp were a production networking mode, but it is not. Fewer than 5% of QEMU deployments use slirp in enterprise settings, and the non-default MTU requirement further gates the vulnerability. The vendor's own S:U scoring denies cross-boundary scope change, and C:N denies confidentiality impact. Without a public PoC or any exploitation signal, there is no basis to keep this at HIGH.
Why not lower?
The vulnerability *does* enable a heap overflow with attacker-controlled content and length, which is a serious primitive when it lands. Developer workstations and CI environments running QEMU with slirp are real assets that matter. A compromised CI runner can pivot to source code, secrets, and build artifacts. Dismissing this as LOW or IGNORE would ignore the CI/dev lateral-movement scenario. MEDIUM correctly reflects a real but narrowly scoped risk.
What to do — in priority order.
- MEDIUM 5.3→IGNORE 0.0Switch VMs from slirp to tap/bridge networking — Reconfigure any QEMU instances using
-netdev userto use-netdev tapor bridge networking instead. This completely removes libslirp from the attack surface. No noisgate mitigation SLA applies at MEDIUM; proceed within the 365-day remediation window, but prioritize if you have known slirp usage. - MEDIUM 5.3→IGNORE 0.0Migrate rootless Podman to pasta networking — Set
default_rootless_network_cmd = \"pasta\"incontainers.confor upgrade to Podman 5+. This removes slirp4netns from the container networking path entirely. If running Podman 6+, slirp4netns is already removed. - MEDIUM 5.3→LOW 2.0Audit and remove non-default small MTU configurations — Search QEMU command lines, libvirt XML, and container runtime configs for explicit small MTU settings on slirp interfaces. Revert to default MTU. Even if slirp remains in use, default MTU is not vulnerable.
- MEDIUM 5.3→IGNORE 0.0Update libslirp to 4.9.5 — Apply the vendor patch when your distro ships it. Debian has not yet backported as of 2026-09-24; Red Hat is tracking via Bugzilla #2537748. This is the definitive fix within the 365-day remediation window.
- Network firewalls/WAFs — the slirp traffic is internal between guest and host on a virtual interface; no network security appliance sees or filters it.
- EDR/AV on the host — the overflow occurs in userspace heap memory within the QEMU process; EDR may detect a crash or anomalous child process post-exploitation but cannot prevent the buffer overflow itself.
- Guest-side patching — the vulnerability is in the host-side libslirp code; patching the guest OS has no effect.
Crowdsourced verification payload.
Run this script on any host running QEMU or slirp4netns. No special privileges needed — it checks the installed libslirp version and scans for running QEMU processes using slirp networking. Invoke with: bash check_cve_2026_95508.sh
#!/usr/bin/env bash
# check_cve_2026_95508.sh — CVE-2026-95508 libslirp heap overflow checker
# Checks: (1) installed libslirp version, (2) running QEMU with slirp networking
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
FIXED_VERSION="4.9.5"
RESULT="UNKNOWN"
version_gte() {
printf '%s\n%s' "$1" "$2" | sort -V | head -n1 | grep -qx "$2"
}
# 1. Check installed libslirp version
INSTALLED=""
if command -v dpkg-query &>/dev/null; then
INSTALLED=$(dpkg-query -W -f='${Version}' libslirp0 2>/dev/null | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' || true)
elif command -v rpm &>/dev/null; then
INSTALLED=$(rpm -q --qf '%{VERSION}' libslirp 2>/dev/null || true)
elif command -v pacman &>/dev/null; then
INSTALLED=$(pacman -Q libslirp 2>/dev/null | awk '{print $2}' | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' || true)
fi
if [ -n "$INSTALLED" ]; then
echo "[*] libslirp installed version: $INSTALLED"
if version_gte "$INSTALLED" "$FIXED_VERSION"; then
echo "[+] Version >= $FIXED_VERSION — patched."
RESULT="PATCHED"
else
echo "[-] Version < $FIXED_VERSION — library is vulnerable."
RESULT="VULNERABLE"
fi
else
echo "[?] libslirp not found via package manager."
# Try finding shared library
SOFILE=$(find /usr/lib* /lib* -name 'libslirp.so*' 2>/dev/null | head -1 || true)
if [ -n "$SOFILE" ]; then
echo "[?] Found libslirp at $SOFILE but cannot determine version."
RESULT="UNKNOWN"
else
echo "[+] libslirp not installed on this host."
RESULT="PATCHED"
fi
fi
# 2. Check for running QEMU with slirp (user-mode) networking
SLIRP_PROCS=$(pgrep -a qemu 2>/dev/null | grep -E '(-netdev\s+user|type=user)' || true)
if [ -n "$SLIRP_PROCS" ]; then
echo ""
echo "[!] WARNING: Running QEMU processes using slirp (user-mode) networking:"
echo "$SLIRP_PROCS"
if [ "$RESULT" = "VULNERABLE" ]; then
echo "[-] ACTIVE EXPOSURE: vulnerable libslirp + slirp networking in use."
fi
else
echo ""
echo "[+] No running QEMU processes using slirp networking detected."
fi
# 3. Check for slirp4netns
if command -v slirp4netns &>/dev/null; then
S4N_PROCS=$(pgrep -a slirp4netns 2>/dev/null || true)
if [ -n "$S4N_PROCS" ]; then
echo "[!] WARNING: slirp4netns processes running (rootless container networking)."
if [ "$RESULT" = "VULNERABLE" ]; then
echo "[-] ACTIVE EXPOSURE: vulnerable libslirp + slirp4netns in use."
fi
else
echo "[+] slirp4netns installed but no active processes."
fi
fi
echo ""
echo "=== $RESULT ==="
case "$RESULT" in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esacWhat defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.