← Back to Feed CACHED · 2026-07-08 02:13:39 · CACHE_KEY CVE-2024-26582
CVE-2024-26582 · CWE-416 · Disclosed 2024-02-21

In the Linux kernel

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

A kTLS socket that frees the decryption buffer while a second reader is still reading it

The kernel TLS (kTLS) offload path has a use-after-free in tls_decrypt_done when a userland reader issues a partial read while asynchronous decryption is still in-flight. The async completion path and the sync read path both operate on the same sk_buff/context, and the freeing order can leave a dangling pointer that later gets dereferenced or written. Affected kernels are essentially every mainline branch that carries the async kTLS rework — roughly >=5.1 through the pre-patch commits in 6.1.x/6.6.x/6.7.x LTS lines. Fix landed upstream in the Feb 2024 stable pushes (6.1.79, 6.6.18, 6.7.6 and later) and was backported into distro kernels (RHEL, Ubuntu, SUSE, Debian) over the following weeks.

Red Hat, SUSE and NVD all tag this HIGH / 7.8 with an AV:L/PR:L vector, which is the correct *ceiling* for a kernel UAF that could conceivably be shaped into LPE. But the vendor score does not price in the reachability gate: the offending path only fires when a process is actively using TLS_RX kTLS AND triggers async decryption AND uses partial reads. That combination is rare outside kernel TLS-offload workloads. In practice this is a real bug worth patching, but not a fleet-wide fire — MEDIUM better reflects the operational risk on a general-purpose enterprise fleet.

"Local UAF in kTLS async-decrypt path — needs a local user actively using kTLS sockets; realistic footprint is narrow, exploit is fiddly."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Attacker obtains an unprivileged local shell

The vulnerability is AV:L/PR:L — the attacker must already execute code as some local user on the target host. That means initial access has already happened via another vector (web-shell, compromised service account, malicious container escape into host user namespace, insider).
Conditions required:
  • Local code execution as any UID
  • Ability to invoke socket syscalls (not blocked by seccomp)
Where this breaks in practice:
  • Most production servers do not hand out interactive shells
  • Containers typically drop CAP_NET_ADMIN and restrict syscalls via seccomp/AppArmor
Detection/coverage: Standard EDR (CrowdStrike, SentinelOne, Elastic) flags on shell spawn from web tier; auditd on execve.
STEP 02

Attacker enables kTLS on a socket

Attacker opens a TCP socket, calls setsockopt(SOL_TCP, TCP_ULP, "tls") then setsockopt(SOL_TLS, TLS_RX, ...) to attach a symmetric key. Requires CONFIG_TLS=y in the running kernel — enabled on RHEL9, Ubuntu 22.04+, SUSE 15 SP4+, most cloud kernels; disabled on hardened minimal kernels.
Conditions required:
  • Kernel built with CONFIG_TLS
  • tls kernel module loadable or already loaded
  • No LSM policy blocking TCP_ULP
Where this breaks in practice:
  • Minimal/hardened kernels (many container-optimized OSes) omit CONFIG_TLS
  • SELinux/AppArmor can block ULP attach for confined domains
Detection/coverage: auditd rule on setsockopt with TCP_ULP; Falco ktls_enable macro.
STEP 03

Trigger async decrypt with a partial read

Attacker races two threads: one feeds ciphertext into the socket to keep async crypto workers busy (AF_ALG or hardware offload), the other issues recvmsg() with a buffer smaller than the record — the partial-read path. Under contention the completion callback in tls_decrypt_done operates on freed context memory. This is a classic UAF race window measured in microseconds.
Conditions required:
  • Multi-core scheduling (async worker on another CPU)
  • Attacker controls both sender and receiver side of the kTLS session
Where this breaks in practice:
  • Race is timing-sensitive; hitting it reliably takes many iterations
  • KASAN kernels will halt on the first bad access — dev/QA only
Detection/coverage: No signature-based coverage; KASAN/KFENCE would catch during fuzz but not in prod.
STEP 04

Shape UAF into kernel R/W and escalate

Attacker sprays kmalloc-cache objects (e.g. msg_msg, pipe_buffer, sk_buff) to reoccupy the freed slot and force controlled writes into adjacent kernel data. Public PoC-class techniques (Dirty-Pagetable, msg_msg, cross-cache) turn UAFs like this into LPE, but no public weaponized exploit for CVE-2024-26582 exists as of this writing.
Conditions required:
  • Attacker knows kernel slab layout (usually via infoleak or slab-cache heuristics)
  • SLUB freelist hardening / CONFIG_RANDOM_KMALLOC_CACHES not preventing spray
Where this breaks in practice:
  • Modern SLAB hardening (CONFIG_SLAB_FREELIST_HARDENED, RANDOM_KMALLOC_CACHES=y) breaks naive sprays
  • KASLR/SMEP/SMAP/KPTI raise cost significantly
Detection/coverage: EDR kernel-integrity monitors (CS Falcon Kernel Sensor, MS Defender KDP) may flag credential-struct tampering post-escalation.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. No public reports of exploitation, no incident-response writeups, not tracked by any threat-intel vendor as of Jul 2026.
Public PoCNo weaponized PoC published. Upstream fix commit (f19391415abd) documents the race but no exploit code circulates on GitHub, exploit-db, or Chinese security forums.
EPSS0.00254 (~0.25th percentile) — essentially no predicted exploitation.
CISA KEVNot listed.
CVSS 3.1AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H7.8 HIGH. Local, low-privilege, no user interaction; correct ceiling for kernel UAF but assumes successful weaponization.
Affected versionsLinux kernel from the introduction of async kTLS RX (~v5.1) through pre-patch mainline. Vulnerable up to 6.1.78, 6.6.17, 6.7.5.
Fixed versionsUpstream: 6.1.79, 6.6.18, 6.7.6. Distro backports: RHEL 9 kernel-5.14.0-427.13.1, Ubuntu USN-6739-1/6740-1 for 22.04 & 23.10, SUSE SUSE-SU-2024:1149-1, Debian DSA-5658-1.
Exposure / scanner dataNot remotely fingerprintable — no Shodan/Censys/GreyNoise signal. Population = every unpatched Linux host with CONFIG_TLS=y, but reachable only from local users.
Disclosed2024-02-21 via kernel.org stable list; fix authored by Sabrina Dubroca (Red Hat) with review from Jakub Kicinski.
CWECWE-416 Use-After-Free.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.8/10)

The single decisive factor is reachability: the bug is AV:L/PR:L and only fires when an attacker with an existing local shell actively uses kTLS RX with async decrypt and partial reads — that is a narrow, self-inflicted trigger path with no remote surface. Combined with zero KEV/PoC/ITW signal, MEDIUM is the correct bucket for a general enterprise fleet; HIGH would be right for kernels running dedicated TLS-offload workloads (CDN edge, load balancer termination tier).

HIGH Vulnerability classification & fix mapping
HIGH Reachability requirements (local + kTLS RX)
MEDIUM Weaponizability into reliable LPE
HIGH Absence of in-the-wild exploitation

Why this verdict

  • Local-only vector: attacker must already own a shell on the box; the vuln is not a pivot into the host, it's a privilege step *after* initial access — worth a full CVSS point off the enterprise-realistic score.
  • Trigger surface is attacker-controlled, not victim-controlled: unlike a network daemon UAF, no benign traffic triggers this. The attacker opens their own kTLS socket. Nothing about defending inbound traffic changes exposure — so perimeter and detection controls that usually mitigate kernel bugs (WAF, IDS) don't apply either way, but neither does organic exposure.
  • No public exploit, no KEV, EPSS 0.0025: a kernel UAF in a niche subsystem that has sat for 16+ months without a weaponized PoC surfacing signals genuine exploitation difficulty; SLUB hardening on modern distro kernels breaks naive sprays.
  • Role multiplier — general server / workstation: chain ends in local root on that one host. Blast radius = single host compromise from an already-compromised local account. Not fleet-scale.
  • Role multiplier — TLS-terminating edge (HAProxy/nginx with kTLS, CDN nodes): these are exactly the hosts running kTLS RX in production. A compromised low-priv service account on such a node could plausibly reach root and pivot into cert material / session keys. This is the tail that keeps the verdict from dropping to LOW. Population <5% of enterprise Linux fleets — insufficient to floor at HIGH.
  • Not a canonical high-value-role component: kTLS is a kernel feature, not a role — the affected code is not IN a hypervisor / IdP / PAM / backup / kernel-mode EDR. Floor rule does not force CRITICAL.

Why not higher?

HIGH would require either a remote vector, an active PoC, KEV listing, or evidence that a canonical high-value role (DC, IdP, PAM, hypervisor) universally runs kTLS RX. None of those apply. On TLS-terminating edge nodes the case for HIGH exists but the installed-base share (<5% of Linux fleet) is below the floor threshold.

Why not lower?

LOW would ignore that this is a genuine kernel UAF with a public root-cause commit — a competent attacker with msg_msg/pipe_buffer spray primitives and time on target can plausibly weaponize it, and any host that ever runs kTLS RX (nginx ssl_conf_command Options KTLS, HAProxy ssl-default-bind-options, Envoy) carries real LPE risk. The bug should still be patched on the normal kernel cadence, not deferred as backlog.

05 · Compensating Control

What to do — in priority order.

  1. Prioritize kernel patch on TLS-terminating hosts — nginx, HAProxy, Envoy, and CDN edge nodes with kTLS enabled are the realistic exploitation surface. Patch these to the fixed kernel first (RHEL 9 5.14.0-427.13.1+, Ubuntu USN-6739-1+, SUSE SUSE-SU-2024:1149-1+). Deploy within 30 days per noisgate MEDIUM cadence; if you consider this tier HIGH internally, tighten to 30 days.
  2. Disable kTLS RX where you don't need it — If you're not using kernel TLS offload for throughput, rmmod tls and blacklist the module via /etc/modprobe.d/blacklist-tls.conf (install tls /bin/true). Removes the vulnerable code path entirely on general-purpose servers.
  3. Block TCP_ULP for unprivileged users via LSM — SELinux/AppArmor policy denying setsockopt with TCP_ULP for non-service domains eliminates the setup step for the attacker. On containers, drop CAP_NET_ADMIN and add seccomp filter denying setsockopt on SOL_TCP level=31 (TCP_ULP).
  4. Tighten local-shell hygiene on kTLS hosts — Because the vector is PR:L, the mitigation compounds with any control that keeps arbitrary local users off TLS-terminating nodes: dedicated service accounts, no interactive login, PAM nologin, EDR alerts on shell spawn from nginx/haproxy UID.
What doesn't work
  • WAF / IDS / NGFW rules — vector is local, no network signature exists.
  • TLS inspection / cert pinning changes — the bug is in the kTLS *implementation*, not the TLS protocol; policy changes don't affect the freelist race.
  • Disabling async crypto (CRYPTO_ENGINE) — the race also occurs with software async paths; you'd have to disable kTLS RX entirely, not just async.
  • Kernel Lockdown mode — Lockdown restricts /dev/mem, module load, kexec; it does not gate TCP_ULP or kTLS setsockopts.
  • SMEP/SMAP/KPTI alone — these raise exploit cost but a data-only exploit (msg_msg, pipe_buffer cred overwrite) sidesteps them.
06 · Verification

Crowdsourced verification payload.

Run on each target Linux host as root (or via your config-mgmt agent). Invoke as sudo ./check-cve-2024-26582.sh. Compares the running kernel version against the per-distro fixed builds and reports whether kTLS RX is even loadable. Exit code 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate: CVE-2024-26582 kTLS async-decrypt UAF check
# Requires: root recommended (for modinfo); works read-only otherwise.
set -u

KREL="$(uname -r)"
KVER="${KREL%%-*}"
ID="unknown"; VERSION_ID=""
[ -r /etc/os-release ] && . /etc/os-release

vercmp() { # returns 0 if $1 >= $2
  [ "$1" = "$2" ] && return 0
  printf '%s\n%s\n' "$2" "$1" | sort -V -C
}

# 1) Is CONFIG_TLS present in this kernel at all?
HAS_KTLS="unknown"
if [ -r "/boot/config-${KREL}" ]; then
  grep -q '^CONFIG_TLS=[ym]' "/boot/config-${KREL}" && HAS_KTLS=yes || HAS_KTLS=no
elif [ -r /proc/config.gz ]; then
  zgrep -q '^CONFIG_TLS=[ym]' /proc/config.gz && HAS_KTLS=yes || HAS_KTLS=no
fi

# 2) Distro fixed-version table
STATUS="UNKNOWN"
case "$ID" in
  rhel|centos|rocky|almalinux)
    # RHEL9 fix: kernel-5.14.0-427.13.1
    FIXED="5.14.0-427.13.1"
    if vercmp "$KREL" "$FIXED"; then STATUS=PATCHED; else STATUS=VULNERABLE; fi
    ;;
  ubuntu)
    # 22.04 GA: 5.15.0-102; 23.10: 6.5.0-27 (approx USN-6739/6740-1)
    case "$VERSION_ID" in
      22.04) FIXED="5.15.0-102";;
      23.10) FIXED="6.5.0-27";;
      24.04) FIXED="6.8.0-31";;
      *)     FIXED="";;
    esac
    if [ -n "$FIXED" ]; then
      RUNNING="$(echo "$KREL" | awk -F- '{print $1"-"$2}')"
      if vercmp "$RUNNING" "$FIXED"; then STATUS=PATCHED; else STATUS=VULNERABLE; fi
    fi
    ;;
  debian)
    # DSA-5658-1 shipped 6.1.85-1 on bookworm
    FIXED="6.1.85"
    if vercmp "$KVER" "$FIXED"; then STATUS=PATCHED; else STATUS=VULNERABLE; fi
    ;;
  sles|opensuse*|suse)
    # SUSE-SU-2024:1149-1 series
    FIXED_MAINLINE="6.4.0"
    if vercmp "$KVER" "$FIXED_MAINLINE"; then STATUS=PATCHED; else STATUS=VULNERABLE; fi
    ;;
  *)
    # Fall back to mainline stable cutoffs
    case "$KVER" in
      6.7.*)  vercmp "$KVER" "6.7.6"  && STATUS=PATCHED || STATUS=VULNERABLE ;;
      6.6.*)  vercmp "$KVER" "6.6.18" && STATUS=PATCHED || STATUS=VULNERABLE ;;
      6.1.*)  vercmp "$KVER" "6.1.79" && STATUS=PATCHED || STATUS=VULNERABLE ;;
      5.15.*|5.10.*|5.4.*) STATUS=UNKNOWN ;;
      *)      STATUS=UNKNOWN ;;
    esac
    ;;
esac

echo "kernel=${KREL} distro=${ID}-${VERSION_ID} ktls_config=${HAS_KTLS} status=${STATUS}"
case "$STATUS" in
  PATCHED)    exit 0 ;;
  VULNERABLE) exit 1 ;;
  *)          exit 2 ;;
esac
07 · Bottom Line

If you remember one thing.

TL;DR
Treat this as a MEDIUM on the general fleet and HIGH on TLS-terminating edge (nginx/HAProxy/Envoy with kTLS, CDN nodes). Monday morning: run the verification script fleet-wide to inventory unpatched kernels and flag which hosts have CONFIG_TLS=y with the module loaded. Per noisgate mitigation SLA for MEDIUM there is no mitigation SLA — but on the kTLS-active tier, apply the compensating controls (blacklist tls module where unused, seccomp/LSM TCP_ULP denial) within 30 days. Per noisgate remediation SLA, patch the vulnerable kernels within 365 days as part of routine kernel rollup; do not defer TLS-edge nodes past the next scheduled maintenance window. No emergency change control needed — no KEV, no PoC, no in-the-wild activity.

Sources

  1. NVD — CVE-2024-26582
  2. Upstream fix commit (kernel.org)
  3. Red Hat Bugzilla / CVE tracker
  4. Ubuntu USN-6739-1
  5. SUSE CVE page
  6. Debian security tracker
  7. kernel.org stable changelog 6.1.79
  8. FIRST EPSS lookup
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.