diff options
| author | Natasha Klaus <natalie.klaus@runtimeverification.com> | 2026-10-09 16:38:07 +0300 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2026-10-09 08:33:09 -0600 |
| commit | aa5d5f8e502318e783545ba5d04bb40130b83e20 (patch) | |
| tree | 67c6256f0e53e7a056e8240e01f87bf773f5d16c /tools/perf/scripts/python | |
| parent | 6da8f402e362b2f546e2efb7167fc9597aef6faf (diff) | |
| download | linux-next-aa5d5f8e502318e783545ba5d04bb40130b83e20.tar.gz linux-next-aa5d5f8e502318e783545ba5d04bb40130b83e20.zip | |
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.
Fixes: 899bea8248ce ("io_uring/net: allow filtering on IORING_OP_CONNECT")
Cc: stable@vger.kernel.org # 7.2
Signed-off-by: Natasha Klaus <natalie.klaus@runtimeverification.com>
Link: https://patch.msgid.link/20261009133807.730724-1-natalie.klaus@runtimeverification.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'tools/perf/scripts/python')
0 files changed, 0 insertions, 0 deletions
