A use-after-free in the disk-label parser that mostly just kills the parser
CVE-2026-13595 is a use-after-free (CWE-416) in libblkid, the partition/filesystem probing library shipped with util-linux and consumed by blkid, lsblk, udev/systemd-udevd, mount, and various installers. Triggering it requires the library to parse a maliciously crafted block device or image — nested partition tables, malformed superblocks, or a hand-rolled GPT/MBR header. Affected versions track the upstream util-linux tree (the disclosure points at current 2.39.x/2.40.x branches; distros will land backports in their util-linux packages — RHEL/CentOS, SUSE, Debian, Ubuntu).
Vendor scored this MEDIUM 6.8 with vector AV:L/AC:L/PR:N/UI:N/C:L/I:N/A:H. That A:H is doing all the heavy lifting and it's only fair if you assume udev or a privileged installer auto-probes attacker-supplied media. In the realistic enterprise case — server fleet, no USB autoprobe, no untrusted image mounts — the chain doesn't even start. 6.8 over-states risk for the typical host; LOW is the honest read.
3 steps from start to impact.
Get a crafted block device in front of libblkid
libblkid to parse content they control. Realistic vectors: USB stick inserted into a host with udev autoprobe, a loop-mounted disk image handed to an installer or forensic workstation, or a multi-tenant system where an unprivileged user can attach a block device (LXC/containers with --privileged, raw loopback). Tooling: genisoimage, mkfs variants, or a hand-crafted GPT via dd/Python struct.- Local code execution OR physical/console access OR ability to submit an image to a privileged parser
- Servers don't autoprobe USB
- Containers don't expose
/devblock nodes by default - Cloud VMs never see attacker-controlled removable media
Trigger the use-after-free in the partition/superblock probe
libblkid through a parsing path that frees a structure and then re-dereferences it. Public reproducer style: nested partition table loops or oversized partition entries that cause the prober's iterator to outlive its backing buffer. Tools: a custom fuzzer (AFL++, libFuzzer harness against blkid_do_probe).- Parser actually executes against the malicious media
- udev typically runs the probe sandboxed under
systemd's hardening - Many distros ship libblkid with FORTIFY_SOURCE and
_GLIBCXX_ASSERTIONS
journalctl as a systemd-udevd[*]: segfault or via coredumpctl.Cash the impact — denial of service on the probing process
blkid/udev workers, which can wedge device enumeration and stall mounts/boot on the affected host. Memory-corruption-to-RCE on a heap UAF in libblkid is *theoretically* possible but not demonstrated in the public advisory; CVSS I:N confirms upstream does not believe integrity is reachable.- UAF reaches a usable control-flow primitive (unproven here)
- glibc tcache hardening, MTE on ARMv9, ASLR, and
udevworker restart all blunt weaponization
udevd crashes; otherwise this is a logs-only event.The supporting signals.
| In-the-wild status | No known exploitation. Not in CISA KEV as of 2026-06-30. |
|---|---|
| Public PoC | No weaponized PoC published at disclosure; bug-class is well-fuzzed (syzkaller, AFL++ against libblkid is routine), so a crash-only reproducer is likely to surface within weeks. |
| EPSS | Not yet scored at disclosure (T+1 day); historical libblkid local DoS CVEs sit at <0.1% percentile. |
| KEV status | Not listed. Local-only DoS classes rarely qualify. |
| CVSS vector | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H — local, unauthenticated, availability-dominant. The PR:N only holds when an unprivileged user can present a block device. |
| Affected versions | util-linux upstream branches carrying current libblkid prober logic; distro backports pending in RHEL/CentOS Stream, SUSE, Debian, Ubuntu, Alpine. |
| Fixed versions | Pending — watch upstream util-linux Git and your distro's security tracker; apt/dnf/zypper will ship before behavior changes. |
| Exposure data | Not a network-reachable bug — Shodan/Censys/GreyNoise are irrelevant. Installed base of util-linux ≈ every Linux host. |
| Disclosed | 2026-06-29 via Red Hat product security. |
| Reporter | Credited to upstream fuzzing infrastructure per the Red Hat Bugzilla pattern; specific researcher not yet named in the advisory. |
noisgate verdict.
The single decisive factor is the attack vector: AV:L plus the requirement that an attacker get crafted media in front of a privileged parser means the realistic enterprise blast radius is a crashed udevd worker, not host compromise. There is no integrity impact and no demonstrated RCE primitive, so MEDIUM over-rates the operational risk on a fleet that doesn't autoprobe removable media.
Why this verdict
- Local vector caps reach:
AV:Lmeans no network attacker can ever touch this without a prior foothold. - No integrity, no privilege gain: CVSS
I:Nand the absence of a published control-flow primitive limit the worst outcome to a crashed parser. - Role multiplier — workstation/desktop with USB autoprobe: chain succeeds, blast radius is *one workstation's
udevdcrashing*; not fleet-scale. - Role multiplier — server/cloud VM: chain does not start because there is no attacker-controlled block device path; this is the dominant deployment role.
- Role multiplier — multi-tenant container/Kubernetes host: chain only succeeds if you grant
--privilegedor expose raw block devices, which is a misconfiguration, not the default. - No KEV, no in-the-wild, no weaponized PoC at T+1 day.
Why not higher?
Upgrading to MEDIUM or HIGH would require either a demonstrated path from UAF to code execution, or a network-reachable trigger. Neither exists. The vendor 6.8 leans on a udev-autoprobe worst case that doesn't reflect server fleets.
Why not lower?
Not IGNORE because forensic workstations, kiosks, and any host with udev USB autoprobe enabled do have a real (if niche) DoS exposure, and a UAF heap primitive could surprise us if a researcher weaponizes it. Track it; don't ignore it.
What to do — in priority order.
- Disable udev autoprobe on servers and headless infrastructure — Mask
systemd-udevd's automatic probing of hot-plugged block devices on hosts that have no business mounting USBs. There is no mitigation SLA for LOW — fold this into your standard hardening baseline within the 365-day remediation window. - Audit container runtimes for
--privilegedand raw block device passthrough — Tenants that can present a loopback device to a host-sideblkidinvocation are the only multi-tenant path to this bug. Review KubernetessecurityContext, Docker--device, and LXC profiles; remediate as normal hygiene. - Patch util-linux when your distro ships the fix — Pull
apt/dnf/zypperupdates in your standard monthly cadence. Per the noisgate remediation SLA for LOW, target ≤ 365 days; most defenders will get this in the next routine patch window. - Add a
coredumpctl/ journald alert for repeatsystemd-udevdsegfaults — Cheap detection. If someone is actually fuzzing libblkid against your hosts in the field, the udev workers will tell you.
- WAFs, IDS, firewall rules — irrelevant;
AV:L, nothing crosses the wire. - MFA / identity hardening — the bug is in a parser, not an auth path.
- Disabling
blkidthe binary — the vulnerable code is inlibblkid.so, loaded byudev,mount,lsblk, installers, and many others; removing the CLI doesn't help. - SELinux/AppArmor 'enforcing' alone — default policies allow
udevdto read block devices; you'd need a custom policy to meaningfully constrain the probe.
Crowdsourced verification payload.
Run on each Linux target host as any user (root not required for the version check). Example: ./check-cve-2026-13595.sh. Exits 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN. Update the FIXED_* variables once your distro publishes fixed package versions.
#!/usr/bin/env bash
# check-cve-2026-13595.sh — libblkid UAF (util-linux)
# Usage: ./check-cve-2026-13595.sh
set -u
# TODO: set these per-distro once vendor advisories publish fixed versions
FIXED_RHEL="2.37.4-99" # placeholder
FIXED_DEB="2.40.2-1" # placeholder
FIXED_SUSE="2.39.3-150600.99" # placeholder
result() { echo "$1"; exit "$2"; }
if ! command -v blkid >/dev/null 2>&1; then
result "UNKNOWN: util-linux/blkid not installed" 2
fi
INSTALLED_VER=""
DISTRO_FAMILY="unknown"
if command -v rpm >/dev/null 2>&1; then
DISTRO_FAMILY="rpm"
INSTALLED_VER=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' util-linux-core 2>/dev/null || rpm -q --qf '%{VERSION}-%{RELEASE}\n' util-linux 2>/dev/null)
elif command -v dpkg-query >/dev/null 2>&1; then
DISTRO_FAMILY="deb"
INSTALLED_VER=$(dpkg-query -W -f='${Version}\n' util-linux 2>/dev/null)
fi
if [ -z "$INSTALLED_VER" ]; then
result "UNKNOWN: could not determine util-linux version" 2
fi
echo "installed util-linux: $INSTALLED_VER ($DISTRO_FAMILY)"
# Crude version compare via dpkg --compare-versions / rpm -E
case "$DISTRO_FAMILY" in
deb)
if dpkg --compare-versions "$INSTALLED_VER" ge "$FIXED_DEB"; then
result "PATCHED" 0
else
result "VULNERABLE" 1
fi
;;
rpm)
# rpmdev-vercmp returns 11 if first < second, 12 if first > second, 0 if equal
if command -v rpmdev-vercmp >/dev/null 2>&1; then
rpmdev-vercmp "$INSTALLED_VER" "$FIXED_RHEL" >/dev/null
rc=$?
case $rc in
0|12) result "PATCHED" 0 ;;
11) result "VULNERABLE" 1 ;;
*) result "UNKNOWN: rpmdev-vercmp rc=$rc" 2 ;;
esac
else
# fall back to sort -V
if [ "$(printf '%s\n%s\n' "$FIXED_RHEL" "$INSTALLED_VER" | sort -V | head -n1)" = "$FIXED_RHEL" ]; then
result "PATCHED" 0
else
result "VULNERABLE" 1
fi
fi
;;
*)
result "UNKNOWN: unsupported distro family" 2
;;
esac
If you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.