← Back to Feed CACHED · 2026-06-29 18:55:09 · CACHE_KEY CVE-2026-13595
CVE-2026-13595 · CWE-416 · Disclosed 2026-06-29

A flaw was found in the libblkid library of util-linux

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

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.

"Local-only libblkid UAF that crashes a parser process. Vendor's 6.8 is generous; treat as backlog hygiene unless you run blkid on attacker-controlled images."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Get a crafted block device in front of libblkid

Attacker needs 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.
Conditions required:
  • Local code execution OR physical/console access OR ability to submit an image to a privileged parser
Where this breaks in practice:
  • Servers don't autoprobe USB
  • Containers don't expose /dev block nodes by default
  • Cloud VMs never see attacker-controlled removable media
Detection/coverage: Vuln scanners flag the util-linux package version; no behavioral detection at this stage.
STEP 02

Trigger the use-after-free in the partition/superblock probe

The crafted layout walks 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).
Conditions required:
  • Parser actually executes against the malicious media
Where this breaks in practice:
  • udev typically runs the probe sandboxed under systemd's hardening
  • Many distros ship libblkid with FORTIFY_SOURCE and _GLIBCXX_ASSERTIONS
Detection/coverage: Crash will show in journalctl as a systemd-udevd[*]: segfault or via coredumpctl.
STEP 03

Cash the impact — denial of service on the probing process

Realistic outcome is a crash of 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.
Conditions required:
  • UAF reaches a usable control-flow primitive (unproven here)
Where this breaks in practice:
  • glibc tcache hardening, MTE on ARMv9, ASLR, and udev worker restart all blunt weaponization
Detection/coverage: EDR can alert on repeated udevd crashes; otherwise this is a logs-only event.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo known exploitation. Not in CISA KEV as of 2026-06-30.
Public PoCNo 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.
EPSSNot yet scored at disclosure (T+1 day); historical libblkid local DoS CVEs sit at <0.1% percentile.
KEV statusNot listed. Local-only DoS classes rarely qualify.
CVSS vectorCVSS: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 versionsutil-linux upstream branches carrying current libblkid prober logic; distro backports pending in RHEL/CentOS Stream, SUSE, Debian, Ubuntu, Alpine.
Fixed versionsPending — watch upstream util-linux Git and your distro's security tracker; apt/dnf/zypper will ship before behavior changes.
Exposure dataNot a network-reachable bug — Shodan/Censys/GreyNoise are irrelevant. Installed base of util-linux ≈ every Linux host.
Disclosed2026-06-29 via Red Hat product security.
ReporterCredited to upstream fuzzing infrastructure per the Red Hat Bugzilla pattern; specific researcher not yet named in the advisory.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (3.3/10)

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.

HIGH that this is a local-only availability bug as scored
MEDIUM that no RCE primitive is reachable (heap UAFs occasionally surprise)
HIGH that EPSS will stay sub-1% and KEV listing is unlikely

Why this verdict

  • Local vector caps reach: AV:L means no network attacker can ever touch this without a prior foothold.
  • No integrity, no privilege gain: CVSS I:N and 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 udevd crashing*; 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 --privileged or 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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. Audit container runtimes for --privileged and raw block device passthrough — Tenants that can present a loopback device to a host-side blkid invocation are the only multi-tenant path to this bug. Review Kubernetes securityContext, Docker --device, and LXC profiles; remediate as normal hygiene.
  3. Patch util-linux when your distro ships the fix — Pull apt/dnf/zypper updates 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.
  4. Add a coredumpctl / journald alert for repeat systemd-udevd segfaults — Cheap detection. If someone is actually fuzzing libblkid against your hosts in the field, the udev workers will tell you.
What doesn't work
  • 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 blkid the binary — the vulnerable code is in libblkid.so, loaded by udev, mount, lsblk, installers, and many others; removing the CLI doesn't help.
  • SELinux/AppArmor 'enforcing' alone — default policies allow udevd to read block devices; you'd need a custom policy to meaningfully constrain the probe.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: do not scramble. This is LOW. Per the noisgate mitigation SLA for LOW there is no mitigation deadline — go straight to the noisgate remediation SLA of ≤ 365 days and absorb the util-linux update in your normal monthly patch cycle. While you wait, confirm udev autoprobe is off on servers and that no container hosts grant raw block-device passthrough to untrusted tenants. Bump the verdict and treat it as critical-path only if (a) a weaponized UAF-to-RCE PoC drops, or (b) CISA adds it to KEV — neither is likely.

Sources

  1. util-linux upstream (GitHub)
  2. libblkid(3) manual page
  3. Red Hat Bugzilla — historical libblkid issue example
  4. CWE-416: Use After Free
  5. CISA Known Exploited Vulnerabilities Catalog
  6. FIRST EPSS
  7. SUSE / openSUSE util-linux advisories (recent)
  8. GitHub Advisory Database
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.