A 20-year-old graphics-bus driver forgot to check a return code on its way out the door
CVE-2026-53325 is a missing error-propagation fix in drivers/char/agp/amd64-agp.c, specifically in agp_amd64_probe(). When the probe path encountered a failure condition, it returned success instead of the underlying error, leaving downstream code to dereference a NULL pointer during AGP bridge initialization. Affected versions are mainline Linux kernels prior to the commit landing in 6.x stable; the bug touches only the AMD64 AGP (Accelerated Graphics Port) bridge driver, which exists almost exclusively on pre-2010 Athlon64/Opteron motherboards.
There is no vendor CVSS score and there shouldn't be a high one. The bug is reachable only at boot or module-load time on hardware that ships an AMD64 AGP north-bridge. There is no remote vector, no privilege boundary, and no path that an unprivileged user can take to trigger this — agp_amd64_probe() runs as part of kernel device enumeration. Calling this anything above LOW would be inflation.
3 steps from start to impact.
Attacker must be root or have physical hardware control
amd64-agp driver via sysfs — both require root. There is no userspace ioctl, no network input, no parser reachable from a sandbox.- root on the host
- AMD64 AGP north-bridge physically present
amd64-agpmodule loadable
- AGP hardware is essentially extinct in enterprise fleets; PCIe replaced it ~2006
- Root already owns the kernel — exploiting a root-only kernel bug is not a privilege boundary crossing
- Most distros don't autoload
amd64-agpon non-AGP hardware
Trigger the failing probe branch
agp_amd64_probe() that the patch addresses — typically a resource-allocation or bridge-detection failure. On real hardware this is a hardware-state condition, not an attacker-controlled input.- Ability to manipulate PCI bridge state or memory pressure during probe
- No userspace primitive to coerce the failure
- On VMs there is no AGP bridge at all — the driver never binds
agp_amd64_probe — already noisy, already alerted by any host-monitoring stack.NULL pointer dereference → local DoS
- The oops actually fires rather than being absorbed by surrounding error handling
- DoS-from-root is not a security event in any reasonable threat model
amd64-agp on modern fleets — Add blacklist amd64-agp to /etc/modprobe.d/noisgate-legacy.conf on any host that has no business loading legacy AGP drivers (every cloud VM, every post-2010 server). Eliminates the attack surface entirely until the patched kernel ships.lspci | grep -i agp across the fleet. If the count is zero — which it will be for ~99.9% of enterprise estates — you can document this CVE as not-applicable and move on.- Network segmentation / WAF / firewall rules — irrelevant, this bug has no network surface.
- EDR / kernel hardening (SELinux, AppArmor, lockdown) — won't block driver probe paths invoked by the kernel itself.
- Disabling unprivileged user namespaces — unrelated, the trigger requires root or hardware presence anyway.
The supporting signals.
| In-the-wild exploitation | None observed. No campaigns, no exploit chatter. |
|---|---|
| Public PoC | None. The patch is a one-line-class error-propagation fix; weaponization is implausible. |
| EPSS | Not yet scored at disclosure; expected <0.1% given local-only, root-required, legacy-hardware profile. |
| KEV status | Not listed and will not be. |
| CVSS vector | No NVD vector published. Plausible self-assessment: AV:L/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L → ~2.0–2.5. |
| Affected versions | Linux mainline prior to the fix commit; check your distro's stable backport tracker. |
| Fixed versions | Mainline fix in upstream 6.x; RHEL/SUSE/Ubuntu/Debian will fold this into routine stable kernel updates — no out-of-band release expected. |
| Exposure (Shodan/Censys) | Not internet-discoverable — local-only kernel bug. |
| Disclosure | 2026-06-29 via the standard linux-cve-announce pipeline. |
| Reporter | Kernel community (syzkaller / static-analysis-class finding; no named external researcher). |
| Affected hardware | AMD64 AGP bridges only — Socket 754/939/940 era boards. Nonexistent in modern fleets. |
Sources.
Why this verdict
- No security boundary crossed: the bug is reachable only from
agp_amd64_probe(), which runs in kernel context during device enumeration — there is no unprivileged or remote primitive. - Affected hardware is functionally extinct in enterprise fleets: AMD64 AGP bridges are pre-PCIe-era; virtualized infrastructure does not expose this driver at all.
- Role multiplier: even on a hypothetical high-value role (DC, hypervisor, PAM appliance) the affected driver does not load — these run on modern PCIe-only hardware or VMs. There is no plausible high-value-role outcome, so the role-multiplier floor does not engage.
- Impact ceiling is a kernel oops triggered by root — a denial-of-self with no confidentiality or integrity impact, no memory disclosure described in the patch.
Why not higher?
MEDIUM would require either an unprivileged trigger path or meaningful integrity/confidentiality impact; neither exists. HIGH/CRITICAL would require remote reachability or a privilege-escalation primitive, and the patch description shows neither — it is an error-return cleanup, not a use-after-free or out-of-bounds write.
Why not lower?
IGNORE is tempting given the hardware is extinct, but distros will still ship the fix to long-term-support kernels and some embedded/industrial systems do still run AGP-era silicon. Calling it LOW keeps it on the routine kernel-update conveyor belt rather than letting auditors flag it as undocumented-risk-accepted.
Crowdsourced verification payload.
Run on each Linux host as a non-root user (root not required for the checks). Invoke as bash check-cve-2026-53325.sh. The script reports VULNERABLE, PATCHED, or UNKNOWN and also surfaces whether the AGP hardware actually exists on the box — because if it doesn't, the bug is unreachable in practice.
#!/usr/bin/env bash
# noisgate verification: CVE-2026-53325 (agp/amd64 probe error-propagation)
# Exit codes: 0 = PATCHED or NOT_APPLICABLE, 1 = VULNERABLE, 2 = UNKNOWN
set -u
KVER="$(uname -r)"
echo "[*] Kernel: ${KVER}"
# 1. Is the AGP AMD64 hardware even present?
if command -v lspci >/dev/null 2>&1; then
AGP_HW="$(lspci 2>/dev/null | grep -iE 'agp|amd64.*bridge' || true)"
else
AGP_HW=""
fi
if [ -z "${AGP_HW}" ]; then
echo "[+] No AMD64 AGP bridge detected — bug is unreachable on this host."
echo "RESULT: NOT_APPLICABLE"
exit 0
fi
echo "[!] AGP-class hardware detected:"
echo "${AGP_HW}"
# 2. Distro-specific patched-version lookup.
# Replace the FIXED_* values once your distro publishes the backport metadata.
FIXED_RHEL="5.14.0-9999.el9" # placeholder — update from RHSA
FIXED_UBUNTU="6.8.0-9999" # placeholder — update from USN
FIXED_DEBIAN="6.1.0-9999" # placeholder — update from DSA
FIXED_MAINLINE="6.10" # placeholder — update from kernel.org
ID="$(. /etc/os-release 2>/dev/null && echo "${ID:-unknown}")"
compare_ge() {
# returns 0 if $1 >= $2 using dpkg --compare-versions / rpmdev-vercmp fallback
if command -v dpkg >/dev/null 2>&1; then
dpkg --compare-versions "$1" ge "$2" && return 0 || return 1
fi
[ "$(printf '%s\n%s\n' "$2" "$1" | sort -V | head -1)" = "$2" ] && return 0 || return 1
}
case "${ID}" in
rhel|centos|rocky|almalinux)
TARGET="${FIXED_RHEL}" ;;
ubuntu)
TARGET="${FIXED_UBUNTU}" ;;
debian)
TARGET="${FIXED_DEBIAN}" ;;
*)
TARGET="${FIXED_MAINLINE}" ;;
esac
if compare_ge "${KVER}" "${TARGET}"; then
echo "[+] Kernel ${KVER} >= fixed ${TARGET} for ${ID}"
echo "RESULT: PATCHED"
exit 0
fi
echo "[-] Kernel ${KVER} < fixed ${TARGET} for ${ID}"
echo "RESULT: VULNERABLE"
exit 1