Eric Dumazet
99c07327ae
netlink: reset network and mac headers in netlink_dump()
...
netlink_dump() is allocating an skb, reserves space in it
but forgets to reset network header.
This allows a BPF program, invoked later from sk_filter()
to access uninitialized kernel memory from the reserved
space.
Theorically mac header reset could be omitted, because
it is set to a special initial value.
bpf_internal_load_pointer_neg_helper calls skb_mac_header()
without checking skb_mac_header_was_set().
Relying on skb->len not being too big seems fragile.
We also could add a sanity check in bpf_internal_load_pointer_neg_helper()
to avoid surprises in the future.
syzbot report was:
BUG: KMSAN: uninit-value in ___bpf_prog_run+0xa22b/0xb420 kernel/bpf/core.c:1637
___bpf_prog_run+0xa22b/0xb420 kernel/bpf/core.c:1637
__bpf_prog_run32+0x121/0x180 kernel/bpf/core.c:1796
bpf_dispatcher_nop_func include/linux/bpf.h:784 [inline]
__bpf_prog_run include/linux/filter.h:626 [inline]
bpf_prog_run include/linux/filter.h:633 [inline]
__bpf_prog_run_save_cb+0x168/0x580 include/linux/filter.h:756
bpf_prog_run_save_cb include/linux/filter.h:770 [inline]
sk_filter_trim_cap+0x3bc/0x8c0 net/core/filter.c:150
sk_filter include/linux/filter.h:905 [inline]
netlink_dump+0xe0c/0x16c0 net/netlink/af_netlink.c:2276
netlink_recvmsg+0x1129/0x1c80 net/netlink/af_netlink.c:2002
sock_recvmsg_nosec net/socket.c:948 [inline]
sock_recvmsg net/socket.c:966 [inline]
sock_read_iter+0x5a9/0x630 net/socket.c:1039
do_iter_readv_writev+0xa7f/0xc70
do_iter_read+0x52c/0x14c0 fs/read_write.c:786
vfs_readv fs/read_write.c:906 [inline]
do_readv+0x432/0x800 fs/read_write.c:943
__do_sys_readv fs/read_write.c:1034 [inline]
__se_sys_readv fs/read_write.c:1031 [inline]
__x64_sys_readv+0xe5/0x120 fs/read_write.c:1031
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x54/0xd0 arch/x86/entry/common.c:81
entry_SYSCALL_64_after_hwframe+0x44/0xae
Uninit was stored to memory at:
___bpf_prog_run+0x96c/0xb420 kernel/bpf/core.c:1558
__bpf_prog_run32+0x121/0x180 kernel/bpf/core.c:1796
bpf_dispatcher_nop_func include/linux/bpf.h:784 [inline]
__bpf_prog_run include/linux/filter.h:626 [inline]
bpf_prog_run include/linux/filter.h:633 [inline]
__bpf_prog_run_save_cb+0x168/0x580 include/linux/filter.h:756
bpf_prog_run_save_cb include/linux/filter.h:770 [inline]
sk_filter_trim_cap+0x3bc/0x8c0 net/core/filter.c:150
sk_filter include/linux/filter.h:905 [inline]
netlink_dump+0xe0c/0x16c0 net/netlink/af_netlink.c:2276
netlink_recvmsg+0x1129/0x1c80 net/netlink/af_netlink.c:2002
sock_recvmsg_nosec net/socket.c:948 [inline]
sock_recvmsg net/socket.c:966 [inline]
sock_read_iter+0x5a9/0x630 net/socket.c:1039
do_iter_readv_writev+0xa7f/0xc70
do_iter_read+0x52c/0x14c0 fs/read_write.c:786
vfs_readv fs/read_write.c:906 [inline]
do_readv+0x432/0x800 fs/read_write.c:943
__do_sys_readv fs/read_write.c:1034 [inline]
__se_sys_readv fs/read_write.c:1031 [inline]
__x64_sys_readv+0xe5/0x120 fs/read_write.c:1031
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x54/0xd0 arch/x86/entry/common.c:81
entry_SYSCALL_64_after_hwframe+0x44/0xae
Uninit was created at:
slab_post_alloc_hook mm/slab.h:737 [inline]
slab_alloc_node mm/slub.c:3244 [inline]
__kmalloc_node_track_caller+0xde3/0x14f0 mm/slub.c:4972
kmalloc_reserve net/core/skbuff.c:354 [inline]
__alloc_skb+0x545/0xf90 net/core/skbuff.c:426
alloc_skb include/linux/skbuff.h:1158 [inline]
netlink_dump+0x30f/0x16c0 net/netlink/af_netlink.c:2242
netlink_recvmsg+0x1129/0x1c80 net/netlink/af_netlink.c:2002
sock_recvmsg_nosec net/socket.c:948 [inline]
sock_recvmsg net/socket.c:966 [inline]
sock_read_iter+0x5a9/0x630 net/socket.c:1039
do_iter_readv_writev+0xa7f/0xc70
do_iter_read+0x52c/0x14c0 fs/read_write.c:786
vfs_readv fs/read_write.c:906 [inline]
do_readv+0x432/0x800 fs/read_write.c:943
__do_sys_readv fs/read_write.c:1034 [inline]
__se_sys_readv fs/read_write.c:1031 [inline]
__x64_sys_readv+0xe5/0x120 fs/read_write.c:1031
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x54/0xd0 arch/x86/entry/common.c:81
entry_SYSCALL_64_after_hwframe+0x44/0xae
CPU: 0 PID: 3470 Comm: syz-executor751 Not tainted 5.17.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Fixes: db65a3aaf29e ("netlink: Trim skb to alloc size to avoid MSG_TRUNC")
Fixes: 9063e21fb026 ("netlink: autosize skb lengthes")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: syzbot <syzkaller@googlegroups.com>
Link: https://lore.kernel.org/r/20220415181442.551228-1-eric.dumazet@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2022-04-19 15:05:03 +02:00
..
2022-02-04 14:15:11 -08:00
2022-03-15 20:34:40 -05:00
2021-11-19 11:23:23 +00:00
2022-03-17 16:34:49 -07:00
2022-01-22 08:33:37 +02:00
2022-03-29 10:24:34 +02:00
2022-03-07 11:40:41 +00:00
2022-03-18 17:12:08 +01:00
2022-03-11 22:01:26 +01:00
2022-02-25 09:36:06 +01:00
2022-03-23 10:32:44 -07:00
2022-03-04 12:02:19 +00:00
2022-04-17 17:21:22 +02:00
2022-03-01 18:26:36 +01:00
2022-04-14 09:01:26 +02:00
2022-03-03 08:01:55 -08:00
2022-01-27 13:53:27 +00:00
2022-02-28 13:21:32 +00:00
2022-04-19 09:49:38 +02:00
2021-11-24 17:21:42 -08:00
2022-02-23 20:33:05 -08:00
2022-03-11 23:17:24 -08:00
2022-03-03 14:38:48 +00:00
2022-04-15 14:27:30 -07:00
2022-04-15 14:28:50 -07:00
2022-02-22 16:09:13 -08:00
2021-12-29 08:48:14 -08:00
2022-03-10 07:39:47 +01:00
2021-12-10 06:38:27 -08:00
2022-04-15 14:27:24 -07:00
2022-03-25 16:55:41 -07:00
2022-04-11 11:57:27 +02:00
2021-10-20 14:27:40 +01:00
2022-04-01 12:04:15 +01:00
2022-02-10 15:29:39 +00:00
2022-03-23 10:53:49 -07:00
2022-01-15 08:47:31 -08:00
2022-04-12 11:36:37 +02:00
2022-03-21 10:59:11 +00:00
2022-04-19 15:05:03 +02:00
2022-01-07 14:11:05 +00:00
2022-04-13 14:44:44 +01:00
2022-04-15 11:50:02 +01:00
2022-04-15 11:17:30 +01:00
2022-03-07 11:40:41 +00:00
2021-12-17 17:17:14 +01:00
2021-12-16 16:13:19 -08:00
2022-03-18 13:09:17 +02:00
2021-12-29 08:48:14 -08:00
2022-04-15 10:54:49 +01:00
2022-04-15 14:26:11 -07:00
2022-04-11 20:33:10 -07:00
2022-04-15 11:14:38 +01:00
2021-11-09 01:05:28 +01:00
2022-04-12 14:23:19 -10:00
2022-02-24 21:31:43 -08:00
2022-03-23 10:53:49 -07:00
2022-04-01 11:53:35 +01:00
2022-03-23 10:53:49 -07:00
2022-03-24 18:36:36 -07:00
2022-04-11 11:55:36 +02:00
2022-03-26 11:48:16 -07:00
2022-03-28 19:56:28 -07:00
2022-04-04 13:32:56 +02:00
2022-03-03 09:55:28 +00:00
2021-12-10 06:38:26 -08:00
2022-03-22 15:57:03 -07:00
2021-11-09 10:02:50 -08:00