CVE-2026-99042
High · 8.4CVSS
8.4
EPSS
0.2%
Published
Oct 23, 2026
CISA due date
—
Cloudanix analysis
A bug in the Linux kernel lets certain network connection requests slip past security filters that are supposed to block them.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Privilege Gain
- Component
- OS kernel
- Class
- Authorization Bypass
- Remediation
- Patch
- Effort
- Medium
- Patch risk
- Low
What it actually does
io_connect_bpf_populate() only populates connect.port and connect.v6_addr for AF_INET6 when addr_len is at least 28 bytes; 24-byte SIN6_LEN_RFC2133 structures are accepted by the IPv6 connect path but leave the BPF filter fields zeroed, so a filter that denies a specific port or address sees family AF_INET6 with zeros and allows the operation while the kernel performs the real connect.
Why it matters to the business
Local processes can bypass network egress controls enforced by BPF filters attached to io_uring, enabling unauthorized outbound connections that should have been blocked and increasing the chance of data exfiltration or command-and-control from systems that rely on these filters.
How an attack unfolds
An attacker with local access issues an io_uring connect request using a 24-byte sockaddr_in6 structure targeting a port or address that the BPF filter is configured to deny; the filter receives zeroed fields and permits the request while the kernel connects to the intended destination, completing the bypass without triggering the expected -EACCES.
How to fix it
Upgrade the Linux kernel to a version containing the fix that changes the threshold check in io_connect_bpf_populate() to use SIN6_LEN_RFC2133 (24 bytes) and ensures sin6_scope_id is handled correctly; rebuild and reboot systems using the updated kernel; until patches are available, restrict untrusted local users from using io_uring or disable the affected BPF programs.
How to confirm the fix worked
Confirm the running kernel contains the corrected length check (addr_len >= sizeof(struct sockaddr_in6) replaced by the RFC2133 constant); test with a reproducer that performs a 24-byte IPv6 connect to a filtered destination and verify the filter now receives the correct port and address fields.
Typical attack path
- Obtain local code execution or shell on the target system
- Prepare an io_uring submission queue entry for IORING_OP_CONNECT with addr_len set to 24
- Supply a sockaddr_in6 containing the desired IPv6 address and port
- Submit the request; the BPF filter evaluates zeroed fields and allows it
- Kernel performs the actual connect to the real destination
How to detect it
Search kernel logs and audit trails for io_uring connect operations that succeed when a BPF filter should have denied them; look for processes using IORING_OP_CONNECT with IPv6 addresses and unusually small address lengths; correlate with unexpected outbound IPv6 connections from processes that should be restricted.
What your security team should do
- Prioritize kernel updates on any system exposing io_uring to untrusted local users or running restrictive BPF connect filters
- Audit local applications and containers that use io_uring networking operations
- Consider temporary mitigation via seccomp or LSM policies that limit io_uring use until patches are deployed
The record
In the Linux kernel, the following vulnerability has been resolved: io_uring/net: populate CONNECT filter fields for 24-byte sockaddr_in6 io_connect_bpf_populate() fills connect.port and connect.v6_addr for AF_INET6 only when addr_len >= sizeof(struct sockaddr_in6), i.e. 28 bytes. The IPv6 connect paths accept SIN6_LEN_RFC2133 (24 bytes), which already holds sin6_port and sin6_addr. io_connect() passes addr_len to the socket layer unchanged. At addr_len 24 the filter sees family AF_INET6 with port and address zero, while the kernel connects to the real destination. A filter that denies an IPv6 port or address is bypassed. Denying connect.port == P rejects [::1]:P with -EACCES at addr_len 28 but connects at addr_len 24. Use SIN6_LEN_RFC2133 as the threshold. sin6_scope_id stays zero when absent. The threshold mismatch was found by an AI coding assistant (Claude Code) comparing this hook against the net/ipv6 length checks on my instructions; it also drafted the reproducer and this patch. I verified the bypass and the fix in a VM on 7.3-rc6 and that 7.2 has the same code.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|