Description
In the Linux kernel, the following vulnerability has been resolved: net: tun: Fix use-after-free in tun_detach() syzbot reported use-after-free in tun_detach() [1]. This causes call trace like below: ================================================================== BUG: KASAN: use-after-free in notifier_call_chain+0x1ee/0x200 kernel/notifier.c:75 Read of size 8 at addr ffff88807324e2a8 by task syz-executor.0/3673 CPU: 0 PID: 3673 Comm: syz-executor.0 Not tainted 6.1.0-rc5-syzkaller-00044-gcc675d22e422 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/26/2022 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xd1/0x138 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:284 [inline] print_report+0x15e/0x461 mm/kasan/report.c:395 kasan_report+0xbf/0x1f0 mm/kasan/report.c:495 notifier_call_chain+0x1ee/0x200 kernel/notifier.c:75 call_netdevice_notifiers_info+0x86/0x130 net/core/dev.c:1942 call_netdevice_notifiers_extack net/core/dev.c:1983 [inline] call_netdevice_notifiers net/core/dev.c:1997 [inline] netdev_wait_allrefs_any net/core/dev.c:10237 [inline] netdev_run_todo+0xbc6/0x1100 net/core/dev.c:10351 tun_detach drivers/net/tun.c:704 [inline] tun_chr_close+0xe4/0x190 drivers/net/tun.c:3467 __fput+0x27c/0xa90 fs/file_table.c:320 task_work_run+0x16f/0x270 kernel/task_work.c:179 exit_task_work include/linux/task_work.h:38 [inline] do_exit+0xb3d/0x2a30 kernel/exit.c:820 do_group_exit+0xd4/0x2a0 kernel/exit.c:950 get_signal+0x21b1/0x2440 kernel/signal.c:2858 arch_do_signal_or_restart+0x86/0x2300 arch/x86/kernel/signal.c:869 exit_to_user_mode_loop kernel/entry/common.c:168 [inline] exit_to_user_mode_prepare+0x15f/0x250 kernel/entry/common.c:203 __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline] syscall_exit_to_user_mode+0x1d/0x50 kernel/entry/common.c:296 do_syscall_64+0x46/0xb0 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x63/0xcd The cause of the issue is that sock_put() from __tun_detach() drops last reference count for struct net, and then notifier_call_chain() from netdev_state_change() accesses that struct net. This patch fixes the issue by calling sock_put() from tun_detach() after all necessary accesses for the struct net has done.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
83c1f36f9880814b24cdf6c2f91f66f61db65326 to < 1f23f1890d91812c35d32eab1b49621b6d32dc7baffected83c1f36f9880814b24cdf6c2f91f66f61db65326 to < 16c244bc65d1175775325ec0489a5a5c830e02c7affected83c1f36f9880814b24cdf6c2f91f66f61db65326 to < 5f442e1d403e0496bacb74a58e2be7f500695e6faffected83c1f36f9880814b24cdf6c2f91f66f61db65326 to < 04b995e963229501401810dab89dc73e7f12d054affected83c1f36f9880814b24cdf6c2f91f66f61db65326 to < 4cde8da2d814a3b7b176db81922d4ddaad7c0f0eaffected83c1f36f9880814b24cdf6c2f91f66f61db65326 to < 5daadc86f27ea4d691e2131c04310d0418c6cd12affected
Linux Linux
Default version status: affected
4.17affected0 to < 4.17unaffected4.19.268 to ≤ 4.19.*unaffected5.4.226 to ≤ 5.4.*unaffected5.10.158 to ≤ 5.10.*unaffected5.15.82 to ≤ 5.15.*unaffected6.0.12 to ≤ 6.0.*unaffected6.1 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/1f23f1890d91812c35d32eab1b49621b6d32dc7b ↗
- https://git.kernel.org/stable/c/16c244bc65d1175775325ec0489a5a5c830e02c7 ↗
- https://git.kernel.org/stable/c/5f442e1d403e0496bacb74a58e2be7f500695e6f ↗
- https://git.kernel.org/stable/c/04b995e963229501401810dab89dc73e7f12d054 ↗
- https://git.kernel.org/stable/c/4cde8da2d814a3b7b176db81922d4ddaad7c0f0e ↗
- https://git.kernel.org/stable/c/5daadc86f27ea4d691e2131c04310d0418c6cd12 ↗