CVE-2026-74469 is a 16-bit integer wrap in the Linux kernel's SCTP subsystem.
CVE-2026-74469 is a 16-bit integer wrap in the Linux kernel's SCTP subsystem. The function sctp_assoc_add_peer() increments a u16 transport_count for each unique peer address added to an association. When the 65,536th peer wraps the counter to zero, any subsequent NETLINK_SOCK_DIAG query (e.g. ss -S, or a monitoring daemon) allocates a zero-length payload buffer but then copies one sockaddr_storage per entry in the real transport list — writing roughly 8 MiB past the skb tail into kernel heap. The bug was introduced in commit 8f840e47 (kernel 4.7, July 2016) and fixed in 6.6.151, 6.12.103, 6.18.44, 7.1.8, and 7.2-rc6. Affected distros include Ubuntu 24.04/22.04/20.04/18.04 LTS and RHEL/Rocky 8/9.
The vendor CVSS of 8.8 HIGH overstates real-world risk by at least two full points. The score assumes AV:N/AC:L, but ignores three compounding friction layers: (1) SCTP is a niche telecom protocol whose kernel module is not loaded by default on any major distro, (2) the attacker must inject 65,536 unique peer addresses into a single association — either via INIT address parameters or ASCONF ADD_IP chunks (the latter requires net.sctp.addip_enable=1, which defaults to OFF) — and (3) the actual heap overflow is not triggered by the network traffic itself but by a *separate* local NETLINK_SOCK_DIAG request, making this a two-stage attack. Ubuntu's own triage rated this Medium priority, which aligns with a realistic assessment.
5 steps from start to impact.
SCTP module must be loaded
sctp kernel module is not loaded by default on standard Linux distributions. It must be explicitly loaded via modprobe sctp or pulled in by an application that creates an SCTP socket (telecom stacks like Diameter, SIGTRAN, or 5G CNFs). Without this module, the vulnerable code path is entirely unreachable.- Target kernel has CONFIG_IP_SCTP=m or =y
- Module is loaded or auto-loads on socket creation
- SCTP is unused on the vast majority of enterprise Linux hosts — estimated <5% of the installed base
- Default firewall rules on most distros do not permit SCTP (iptables/nftables rules typically cover TCP/UDP only, implicitly dropping SCTP)
Establish SCTP association with target
- Target is running an SCTP server application
- Attacker has network path to the SCTP port
- Telecom SCTP endpoints sit on private signaling VLANs, rarely internet-facing
- Enterprise firewalls generally do not pass SCTP (IP protocol 132)
Inject 65,536 unique peer transport addresses
sctp_assoc_add_peer() to be called 65,536 times with unique addresses on a single association. This can be attempted via INIT chunks containing many addresses, or via repeated ASCONF ADD_IP chunks. ASCONF ADD_IP requires the sysctl net.sctp.addip_enable=1 (default: 0). Even via INIT, kernel-side limits on INIT chunk size and address parsing impose practical ceilings well below 65K addresses per handshake, requiring sustained multi-packet interaction.- Sustained SCTP association with the target
- Either ASCONF ADD_IP enabled OR ability to send many INIT retries with distinct addresses
- Default
addip_enable=0blocks the ASCONF vector entirely - Kernel INIT parsing limits chunk sizes; reaching 65K addresses requires extraordinary sustained traffic that any rate limiter or monitoring would flag
- Memory pressure from 65K transport structures (~hundreds of MB) may OOM-kill the association before the wrap
Trigger NETLINK_SOCK_DIAG dump
transport_count wraps to zero, a sock_diag query must occur. This happens when anyone runs ss -S, or when a monitoring agent (e.g., Prometheus node_exporter, Telegraf) queries socket diagnostics via netlink. The query is unprivileged — any local user or cron job can trigger it. The diag handler allocates a zero-byte INET_DIAG_PEERS payload but then iterates the real 65K-entry transport list, writing ~8 MiB past the skb tail.- transport_count has wrapped to zero (step 3 completed)
- Any local process issues a NETLINK_SOCK_DIAG request
- Requires a second stage — the network attacker alone cannot trigger the overflow without a local diag query
- Timing dependency: diag must fire while the wrapped association is still alive
Kernel heap corruption → DoS or code execution
- Successful heap overwrite from step 4
- KASLR, SMEP, SMAP, and heap randomization make reliable RCE from a large linear overwrite extremely difficult
- 8 MiB overwrite is more likely to hit unmapped pages and panic than land on a useful target
The supporting signals.
| In-the-Wild Exploitation | No known exploitation. Not listed in CISA KEV. No campaigns or threat actor usage reported as of 2026-09-18. |
|---|---|
| Proof of Concept | No public PoC available. No exploit code found in major PoC repositories (GitHub, Exploit-DB). The 65K-peer prerequisite makes weaponization non-trivial. |
| EPSS Score | 0.00469 (0.47%) — bottom quartile. FIRST model rates exploitation probability as very low within 30 days. |
| KEV Status | Not listed. No CISA KEV entry as of 2026-09-18. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — Vendor rates 8.8 HIGH. The AV:N component is misleading: the heap overflow trigger requires a *local* NETLINK_SOCK_DIAG request, making this effectively a two-stage local+network attack. |
| Affected Versions | Linux kernel 4.7 (commit 8f840e47, July 2016) through unpatched current branches. 10-year window across all major distro kernels. |
| Fixed Versions | Upstream: 6.6.151, 6.12.103, 6.18.44, 7.1.8, 7.2-rc6 (commit bd0e928). Ubuntu: patches tracking for noble/jammy/focal/bionic. RHEL/Rocky: CIQ kernel-src-tree PRs merged for EL8/EL9. |
| Scanning / Exposure | SCTP exposure on public internet is negligible. Shodan/Censys show minimal SCTP (IP proto 132) listeners. GreyNoise has no tagged sensors for this CVE. The attack surface is overwhelmingly on private telecom signaling networks. |
| Disclosure Date | 2026-08-15 — published via linux-cve-announce. Last NVD modification 2026-08-19. Ubuntu tracked as of 2026-09-17. |
| Reporting Researcher | Not publicly attributed. Discovered via kernel commit review; no named researcher or coordinated disclosure program cited. |
noisgate verdict.
The single most decisive factor is the vanishingly small exposure population: SCTP is a niche telecom protocol whose kernel module is not loaded on >95% of enterprise Linux hosts, and the 65,536-unique-peer prerequisite makes weaponization impractical even where SCTP is present. The two-stage attack (network peer injection + local diag trigger) further compounds the friction beyond what the vendor's AV:N/AC:L vector conveys.
Why this verdict
- SCTP is not loaded by default — the
sctpkernel module must be explicitly loaded or pulled in by a telecom application. On a fleet of 10,000 general-purpose Linux hosts, fewer than 500 are likely to have SCTP active, and most of those are on isolated signaling VLANs. - 65,536-peer barrier is enormous — the attacker must sustain a single SCTP association while injecting 65K unique transport addresses. This is orders of magnitude beyond normal SCTP usage, consumes hundreds of MB of kernel memory, and would trigger OOM or monitoring alerts long before the wrap. ASCONF ADD_IP (the easier injection vector) requires a sysctl that defaults to OFF.
- Two-stage attack negates AV:N simplicity — the network traffic alone does not trigger the overflow. A separate local
NETLINK_SOCK_DIAGquery must occur while the wrapped association is alive. This is not a single-packet remote exploit; it requires either local access or reliance on a monitoring daemon's polling interval. - Role multiplier: SCTP deployments are concentrated in telecom infrastructure (mobile core, IMS, Diameter, SIGTRAN) which qualifies as high-value / OT-adjacent. If the chain succeeds on a telecom signaling node, the blast radius is service disruption to mobile subscribers. However, the 65K-peer prerequisite remains a hard practical barrier even in telecom, and these environments have dedicated security monitoring. The high-value-role floor for MEDIUM is satisfied but does not push to HIGH because the chain's practical feasibility is too low even in the worst-case role.
- No PoC, no KEV, bottom-quartile EPSS — zero evidence of real-world exploitation or weaponization interest. The complexity of the trigger chain explains why.
Why not higher?
Upgrading to HIGH would require either active exploitation evidence, a credible PoC, or a realistic single-stage remote attack path. None of these exist. The 65K-peer prerequisite is not a theoretical limit — it is a hard practical barrier that requires sustained, noisy interaction with a niche protocol. Even in telecom (the worst-case role), the attack would be detected and the association killed long before reaching the wrap threshold.
Why not lower?
Downgrading to LOW would undercount the severity of the *impact* when the chain completes: an 8 MiB kernel heap overwrite is a guaranteed kernel panic and a plausible (if difficult) code execution primitive. The 10-year affected window means unpatched kernels will linger in LTS distros. And while SCTP is niche, it is not extinct — telecom and 5G CNF environments do run it in production, and a kernel crash on a signaling node has real operational impact.
What to do — in priority order.
- Unload the sctp kernel module where not needed — Run
modprobe -r sctpand blacklist it via/etc/modprobe.d/blacklist-sctp.confcontaininginstall sctp /bin/false. This eliminates the attack surface entirely on hosts that don't use SCTP. Verify across your fleet within the 365-day noisgate remediation SLA window, but prioritize this as a quick win. - Set net.sctp.addip_enable=0 (confirm default) — Ensure
sysctl net.sctp.addip_enable=0is enforced via/etc/sysctl.d/. This blocks ASCONF ADD_IP chunks, which is the most practical vector for injecting large numbers of peer addresses. This should already be the default but verify explicitly on SCTP-enabled hosts. - Firewall SCTP at the perimeter — Block IP protocol 132 (SCTP) at perimeter firewalls and host-based firewalls (iptables/nftables) unless explicitly required. Most enterprise firewall rulesets already omit SCTP, but audit for gaps. On hosts where SCTP is required, restrict source IPs to known signaling peers.
- Monitor SCTP association transport counts — On hosts that legitimately run SCTP, add monitoring for abnormal transport counts per association. Any association with >1,000 transports is anomalous and should trigger an alert. Use
ss -Soutput or custom netlink monitoring.
- SELinux/AppArmor alone — these MAC frameworks do not restrict NETLINK_SOCK_DIAG access for unprivileged users, so they won't prevent the diag trigger stage.
- Network-layer rate limiting on SCTP — while helpful for detection, rate limiting won't prevent a patient attacker from slowly accumulating 65K peers over hours or days within an established association.
- Kernel live patching (kpatch/livepatch) — this specific fix changes a hot path in SCTP association management; verify with your livepatch vendor that the patch is available before relying on it as a substitute for a full kernel update.
Crowdsourced verification payload.
Run this script on each target Linux host as root (needs access to /proc/config.gz and modprobe state). Invoke with: sudo bash check_cve_2026_74469.sh. No arguments required.
#!/bin/bash
# CVE-2026-74469 checker — SCTP transport_count overflow
# Run as root on target Linux host
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
RESULT="UNKNOWN"
KERNEL=$(uname -r)
# Check if SCTP module is loaded or built-in
SCTP_LOADED=0
if lsmod 2>/dev/null | grep -q '^sctp '; then
SCTP_LOADED=1
elif [ -f /proc/config.gz ]; then
if zcat /proc/config.gz 2>/dev/null | grep -q 'CONFIG_IP_SCTP=y'; then
SCTP_LOADED=1
fi
elif [ -f "/boot/config-${KERNEL}" ]; then
if grep -q 'CONFIG_IP_SCTP=y' "/boot/config-${KERNEL}" 2>/dev/null; then
SCTP_LOADED=1
fi
fi
if [ "$SCTP_LOADED" -eq 0 ]; then
# Check if module is available but not loaded
if modinfo sctp &>/dev/null; then
echo "INFO: SCTP module available but not loaded — attack surface not currently active"
echo "INFO: Module could be loaded by any process creating an SCTP socket"
else
echo "PATCHED — SCTP module not available in this kernel build"
exit 0
fi
fi
# Check for the fix commit by looking for the U16_MAX check in sctp_assoc_add_peer
# The fix adds a transport_count >= U16_MAX check
FIX_COMMIT="bd0e928"
# Version-based check against known-fixed kernels
PATCHED_VERSIONS=(
"6.6.151" "6.12.103" "6.18.44" "7.1.8"
)
version_gte() {
printf '%s\n%s' "$2" "$1" | sort -V -C
}
# Extract base version (strip distro suffix)
BASE_VER=$(echo "$KERNEL" | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+')
MAJOR_MINOR=$(echo "$KERNEL" | grep -oP '^[0-9]+\.[0-9]+')
case "$MAJOR_MINOR" in
6.6) version_gte "$BASE_VER" "6.6.151" && RESULT="PATCHED" || RESULT="VULNERABLE" ;;
6.12) version_gte "$BASE_VER" "6.12.103" && RESULT="PATCHED" || RESULT="VULNERABLE" ;;
6.18) version_gte "$BASE_VER" "6.18.44" && RESULT="PATCHED" || RESULT="VULNERABLE" ;;
7.1) version_gte "$BASE_VER" "7.1.8" && RESULT="PATCHED" || RESULT="VULNERABLE" ;;
7.2) RESULT="PATCHED" ;;
*)
# For distro kernels (e.g., 5.15.x-ubuntu, 5.14.x-el9), check distro changelogs
if [ -f /var/log/dpkg.log ] || command -v dpkg &>/dev/null; then
if dpkg-query -W -f='${Version}' linux-image-"$KERNEL" 2>/dev/null | grep -q .; then
echo "INFO: Distro kernel detected — check Ubuntu/Debian security tracker for backport status"
fi
elif command -v rpm &>/dev/null; then
RPM_VER=$(rpm -q kernel-"$KERNEL" 2>/dev/null || rpm -q kernel-core-"$KERNEL" 2>/dev/null || true)
if [ -n "$RPM_VER" ]; then
echo "INFO: RHEL/Rocky kernel detected — check distro errata for backport of commit $FIX_COMMIT"
fi
fi
# Kernels older than 4.7 are not affected
if version_gte "4.7.0" "$BASE_VER" 2>/dev/null; then
RESULT="PATCHED"
echo "INFO: Kernel $BASE_VER predates the vulnerable commit (4.7+)"
else
RESULT="UNKNOWN"
fi
;;
esac
echo "Kernel: $KERNEL"
echo "SCTP loaded/built-in: $SCTP_LOADED"
echo "Result: $RESULT"
case "$RESULT" in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esacIf you remember one thing.
sctp modules and blacklisting where unnecessary. There is no noisgate mitigation SLA for MEDIUM — go straight to the 365-day noisgate remediation SLA and bundle the kernel update into your next scheduled patching cycle. For the minority of hosts that actively use SCTP (telecom, 5G CNF, Diameter), verify net.sctp.addip_enable=0, restrict SCTP peers by IP at the firewall, and prioritize kernel updates for those hosts within 90 days. No active exploitation or PoC exists, so there is no urgency override.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.