Like a building where anyone with a lobby badge can rewrite the master key because the elevator never checks which floors you can reach
CVE-2026-80844 — nicknamed DirtyAH6 — is an out-of-bounds write in the Linux kernel's IPv6 Authentication Header (ah6) processing. The function ipv6_rearrange_rthdr() trusts that the segments_left field in a Type 0 routing header never exceeds the address count implied by hdrlen. A raw IPv6 HDRINCL socket can send a packet with hdrlen=2 (one address) but segments_left=255, causing the pointer to rewind 4,064 bytes before a memmove() call. This corrupts adjacent kernel heap structures. The bug has existed since Linux 2.6.12 (2005) and affects every unpatched kernel through 7.2.2. Fixed in stable branches: 5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.109, 6.18.50, 7.2.4.
There is no vendor CVSS score for this CVE — NVD has not published an analysis. The researcher's PoC (github.com/manizada/DirtyAH6) demonstrates local privilege escalation to root on Fedora 43 and Ubuntu 24.04 via unprivileged user namespaces, which are enabled by default on those distros. Remote exploitation is theoretically possible against IPv6 routers running AH transport mode, but the researcher calls remote RCE *extremely difficult* and limits the remote impact to denial-of-service. noisgate assesses this as HIGH / 7.8 — the public PoC, universal kernel footprint, and high-value-role blast radius (hypervisors, k8s nodes, CI runners) prevent a downgrade below HIGH, but the local-access prerequisite and kernel-specific PoC tuning prevent CRITICAL.
5 steps from start to impact.
Obtain local code execution
- Local or container-level code execution on the target host
- Requires a prior compromise — this is not an initial-access vector
- Hosts behind SSO/MFA and bastion infrastructure narrow the reachable population
Create unprivileged user namespace + raw IPv6 socket
unshare(CLONE_NEWUSER | CLONE_NEWNET) to enter an unprivileged user namespace where the attacker gains CAP_NET_RAW. This lets them open a raw IPv6 HDRINCL socket without root. On Ubuntu ≥23.10 and Fedora ≥38, unprivileged user namespaces are enabled by default. RHEL/CentOS typically restrict them via user.max_user_namespaces=0.- Unprivileged user namespaces enabled (sysctl user.max_user_namespaces > 0)
- IPv6 stack enabled on the host
ah6kernel module loadable (built-in or available)
- RHEL/CentOS hardened defaults block unprivileged user namespaces
- Some container runtimes (gVisor, Kata) intercept namespace creation
- AppArmor profiles on Ubuntu ≥24.04 may restrict unshare for some binaries
unshare syscalls; Falco / Tetragon alerts on namespace creation; dmesg for user namespace eventsSend crafted AH6 packet with oversized segments_left
hdrlen=2 but segments_left=255. When the kernel processes this packet through ipv6_rearrange_rthdr(), it calculates a negative offset and calls memmove() with a 4,064-byte length starting from an out-of-bounds pointer. This corrupts adjacent sk_buff metadata or slab objects on the kernel heap.- Raw IPv6 socket from step 2
- Kernel has not been patched (pre-fix versions)
- The OOB write target depends on heap layout — PoC is tuned per-kernel and per-distro
- KASLR, SMEP, SMAP, and CONFIG_SLAB_FREELIST_HARDENED add exploitation friction
- Non-default SLUB configurations or kernel hardening (grsecurity/LKRG) may prevent stable corruption
dmesg; some EDRs detect raw socket creation from non-root contextsCorrupt kernel structures for arbitrary write
memmove() to overwrite a function pointer or cred structure. The published PoC overwrites /etc/pam.d/su via a kernel write to gain passwordless su to root.- Successful heap grooming — requires matching the target kernel's slab allocator layout
- Heap grooming is fragile and kernel-version-specific — the PoC warns it may crash the host instead
- CONFIG_CFI_CLANG (Control Flow Integrity) blocks function-pointer overwrites on newer kernels
- Lockdown LSM in integrity mode prevents some kernel write paths
/etc/pam.d/ files; kernel oops/panic in dmesg; EDR behavioral detection for credential file tamperingEscalate to root
su to obtain a root shell. From root on a high-value host (hypervisor, k8s node, CI runner, database server), the blast radius expands to fleet-scale or supply-chain-scale compromise. On a KVM hypervisor this means VM escape potential; on a k8s node, access to all pod secrets and kubelet credentials.- Successful arbitrary write from step 4
- If the OOB write corrupts the wrong object, the kernel panics — noisy and one-shot
- SELinux in enforcing mode may block the PAM file overwrite
/etc/pam.d/su; auditd rules for su/sudo usage; EDR root-shell behavioral alertsThe supporting signals.
| In-the-Wild Exploitation | No confirmed in-the-wild exploitation as of 2026-09-18. Not listed on CISA KEV. No GreyNoise or Shadowserver mass-scanning signals observed. |
|---|---|
| Proof-of-Concept | Public. github.com/manizada/DirtyAH6 — LPE PoC tuned to Fedora 43 (kernel 6.18.x) and Ubuntu 24.04 (kernel 6.8.x). Researcher warns it is kernel-specific and may crash instead of exploiting. |
| EPSS Score | 0.00195 (≈bottom 20th percentile) — model has not yet absorbed the public PoC signal; expect this to rise. |
| KEV Status | Not listed as of 2026-09-18. |
| CVSS Vector | No official vector published. noisgate estimated: CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H → 7.8 (local access, high complexity due to heap grooming, low privileges with userns, changed scope on high-value roles). |
| Affected Versions | Linux kernel 2.6.12 through 5.10.268, 5.11–5.15.219, 5.16–6.1.186, 6.2–6.6.155, 6.7–6.12.107, 6.13–6.18.48, 6.19–7.1.12, 7.2.0–7.2.2. Bug introduced in 2005. |
| Fixed Versions | 5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.109, 6.18.50, 7.2.4. Distro backports: RHEL 8.10 via errata RHSA-2026:19568; Ubuntu/Debian pending USN. |
| Scanning / Exposure | Not remotely fingerprint-able — this is a local kernel flaw. Asset inventory of unpatched kernel versions is the detection vector. Use uname -r fleet-wide or your CMDB. |
| Disclosure Date | 2026-09-04 (public advisory). Reported to [email protected] mid-July 2026. |
| Researcher | Asim Viladi Oglu Manizada — reported to kernel security team; patch authored and submitted via netdev mailing list ([PATCH ipsec v2]) |
noisgate verdict.
The single most decisive factor is the role multiplier: the Linux kernel is the affected component, and ≥10% of Linux installs occupy high-value roles (hypervisors, k8s nodes, CI/CD runners, database tiers) where local-to-root means fleet-scale or supply-chain-scale blast radius. This floors the verdict at HIGH despite the local-access prerequisite, and the public PoC with heap-grooming fragility prevents escalation to CRITICAL.
Why this verdict
- Public PoC with demonstrated root: The DirtyAH6 PoC on GitHub achieves local-to-root on two mainstream distros. Even though it requires per-kernel tuning, weaponization by a skilled actor is realistic within weeks.
- Universal kernel footprint: The bug spans 21 years of Linux kernels (2.6.12 to 7.2.2). Every unpatched Linux host in the fleet — physical, virtual, containerized — is theoretically in scope.
- Role multiplier: The Linux kernel is canonically deployed in high-value roles. On a KVM/QEMU hypervisor host, root = VM escape pathway. On a Kubernetes worker node, root = access to all pod secrets, kubelet creds, and lateral movement to the control plane. On a CI/CD runner, root = supply-chain pivot via build artifact tampering. On a production database server, root = full data exfiltration. These roles represent well over 10% of the installed Linux base, establishing a HIGH floor.
- Unprivileged user namespaces lower the bar: On Ubuntu and Fedora — two of the most common enterprise desktop and server distros — unprivileged userns are enabled by default, meaning any local user can reach the vulnerable code path without prior
CAP_NET_RAW. - Friction adjustment — local access required (no downgrade past floor): The chain requires post-initial-access positioning. The attacker must already have a shell. This is significant friction that would otherwise push toward MEDIUM, but the role-multiplier floor prevents descent below HIGH.
Why not higher?
CRITICAL would require either active in-the-wild exploitation (KEV-listed), a reliable remote code execution path, or a one-click/zero-click chain. DirtyAH6 requires local access and kernel-specific heap grooming that may crash the host. The researcher explicitly calls remote RCE *extremely difficult*. The PoC is fragile and tuned to two specific kernels — broader weaponization requires non-trivial effort.
Why not lower?
MEDIUM would require the blast radius to be limited to low-value roles or the exploit path to be largely theoretical. Neither applies: the PoC is public and functional, the affected component is the kernel itself (not a userspace application), and the high-value-role floor (hypervisors, k8s, CI/CD) is binding. A 21-year-old bug with a working PoC in the most privileged software layer on the host cannot be MEDIUM.
What to do — in priority order.
- Disable unprivileged user namespaces — Set
sysctl kernel.unprivileged_userns_clone=0(oruser.max_user_namespaces=0on RHEL). This blocks the PoC's entry point by preventing unprivileged users from obtainingCAP_NET_RAW. Deploy within 30 days per the noisgate mitigation SLA for HIGH. On Ubuntu ≥24.04, also review AppArmor userns restrictions. - Restrict ah6 module loading — If your environment does not use IPsec AH with IPv6, blacklist the
ah6module:echo 'install ah6 /bin/false' > /etc/modprobe.d/disable-ah6.conf. This removes the vulnerable code path entirely. Verify withmodprobe -n -v ah6. Deploy within 30 days. - Enable SELinux enforcing mode — SELinux in enforcing mode with targeted policy blocks the PAM file overwrite that the PoC uses for its final escalation step. This does not prevent the OOB write itself but breaks the specific post-exploitation chain.
- Deploy FIM on critical auth files — File integrity monitoring on
/etc/pam.d/,/etc/shadow, and/etc/sudoerswill alert on the PoC's payload. Tools: AIDE, OSSEC, Wazuh, or your EDR's FIM module. - Audit namespace creation — Add auditd rules:
-a always,exit -F arch=b64 -S unshare -F a0&=0x10000000 -k userns_create. Forward to SIEM for alerting on unexpected user namespace creation outside known container orchestrators.
- Network firewalls / WAFs — this is a local kernel exploit, not a network attack. Perimeter controls are irrelevant to the primary LPE path.
- Disabling IPv6 at the network layer only — the PoC uses a user-namespace network stack. Disabling IPv6 on the host's physical interfaces does not prevent the exploit if userns are enabled. You must disable it kernel-wide (
ipv6.disable=1boot param) or block userns. - Container isolation alone — standard Docker/containerd containers share the host kernel. The exploit runs inside a container and escalates to host root. Only kernel-isolating runtimes (gVisor, Kata Containers) mitigate this.
Crowdsourced verification payload.
Run on each target Linux host as any user (no root required). Invoke: bash check_cve_2026_80844.sh. Checks the running kernel version against known-fixed stable branches and reports VULNERABLE, PATCHED, or UNKNOWN. Also checks for compensating controls (userns disabled, ah6 blacklisted).
#!/bin/bash
# check_cve_2026_80844.sh — DirtyAH6 kernel version check
# Run on target Linux host. No root required.
# Exit codes: 1=VULNERABLE, 0=PATCHED, 2=UNKNOWN
set -euo pipefail
KERNEL=$(uname -r)
# Extract major.minor.patch from kernel version string
VER=$(echo "$KERNEL" | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+')
if [ -z "$VER" ]; then
echo "UNKNOWN — could not parse kernel version from: $KERNEL"
exit 2
fi
MAJOR=$(echo "$VER" | cut -d. -f1)
MINOR=$(echo "$VER" | cut -d. -f2)
PATCH=$(echo "$VER" | cut -d. -f3)
# version_gte: returns 0 if $1.$2.$3 >= $4.$5.$6
version_gte() {
[ "$1" -gt "$4" ] && return 0
[ "$1" -lt "$4" ] && return 1
[ "$2" -gt "$5" ] && return 0
[ "$2" -lt "$5" ] && return 1
[ "$3" -ge "$6" ] && return 0
return 1
}
# Fixed versions per stable branch:
# 5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.109, 6.18.50, 7.2.4
PATCHED=false
if [ "$MAJOR" -eq 5 ] && [ "$MINOR" -eq 10 ]; then
version_gte $MAJOR $MINOR $PATCH 5 10 270 && PATCHED=true
elif [ "$MAJOR" -eq 5 ] && [ "$MINOR" -eq 15 ]; then
version_gte $MAJOR $MINOR $PATCH 5 15 221 && PATCHED=true
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 1 ]; then
version_gte $MAJOR $MINOR $PATCH 6 1 188 && PATCHED=true
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 6 ]; then
version_gte $MAJOR $MINOR $PATCH 6 6 157 && PATCHED=true
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 12 ]; then
version_gte $MAJOR $MINOR $PATCH 6 12 109 && PATCHED=true
elif [ "$MAJOR" -eq 6 ] && [ "$MINOR" -eq 18 ]; then
version_gte $MAJOR $MINOR $PATCH 6 18 50 && PATCHED=true
elif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -eq 2 ]; then
version_gte $MAJOR $MINOR $PATCH 7 2 4 && PATCHED=true
elif [ "$MAJOR" -ge 8 ]; then
PATCHED=true # Future kernels assumed patched
else
# Kernels on non-stable branches (e.g. 6.2.x-6.5.x, 6.7.x-6.11.x) are EOL
# and likely vulnerable unless distro-backported
echo "UNKNOWN — kernel $KERNEL is on a non-LTS branch. Check your distro advisory."
exit 2
fi
# Also check if ah6 module is even loadable
AH6_STATUS="loadable"
if grep -q 'install ah6 /bin/false' /etc/modprobe.d/*.conf 2>/dev/null; then
AH6_STATUS="blacklisted"
elif ! modinfo ah6 >/dev/null 2>&1; then
AH6_STATUS="not_available"
fi
# Check unprivileged userns
USERNS="unknown"
if [ -f /proc/sys/kernel/unprivileged_userns_clone ]; then
USERNS=$(cat /proc/sys/kernel/unprivileged_userns_clone)
elif [ -f /proc/sys/user/max_user_namespaces ]; then
VAL=$(cat /proc/sys/user/max_user_namespaces)
[ "$VAL" -eq 0 ] && USERNS="0" || USERNS="$VAL"
fi
if $PATCHED; then
echo "PATCHED — kernel $KERNEL is at or above the fix level."
echo " ah6 module: $AH6_STATUS"
echo " unprivileged userns: $USERNS"
exit 0
else
echo "VULNERABLE — kernel $KERNEL is below the fix for CVE-2026-80844 (DirtyAH6)."
echo " ah6 module: $AH6_STATUS (blacklisted = mitigated)"
echo " unprivileged userns: $USERNS (0 = mitigated)"
[ "$AH6_STATUS" = "blacklisted" ] || [ "$USERNS" = "0" ] && \
echo " NOTE: Compensating control detected — exploit path likely blocked."
exit 1
fiIf you remember one thing.
ah6) within 30 days. Per the noisgate remediation SLA for HIGH, apply the vendor kernel patch across all hosts within 180 days. There is no active in-the-wild exploitation yet and EPSS is low, so you have runway — but the public PoC means weaponization timelines are short. If your fleet is predominantly Ubuntu or Fedora with default userns settings, accelerate the mitigation: disable unprivileged user namespaces this week as a zero-cost hardening measure while you stage kernel updates.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.