oss-sec mailing list archives

CVE-2023-3439: Linux MCTP use-after-free in mctp_sendmsg


From: "Lin Ma" <linma () zju edu cn>
Date: Sun, 2 Jul 2023 11:38:22 +0800 (GMT+08:00)

Hello,

We have found a concurrency use-after-free case in Linux kernel and assigned with CVE-2023-3439 by Red Hat Team.

Below is the details about this issue.

=*=*=*=*=*=*=*=*=  Details  =*=*=*=*=*=*=*=*=

bug fix patch (upstream): 
https://github.com/torvalds/linux/commit/b561275d633b

bug introduce commit:
https://github.com/torvalds/linux/commit/583be982d934

required privilege:
CAP_NET_ADMIN

crash stack:
[   86.051955] ==================================================================
    [   86.051955] BUG: KASAN: use-after-free in mctp_local_output+0x4e9/0xb7d
    [   86.051955] Read of size 1 at addr ffff888005f298c0 by task poc/295
    [   86.051955]
    [   86.051955] Call Trace:
    [   86.051955]  <TASK>
    [   86.051955]  dump_stack_lvl+0x33/0x42
    [   86.051955]  print_report.cold.13+0xb2/0x6b3
    [   86.051955]  ? preempt_schedule_irq+0x57/0x80
    [   86.051955]  ? mctp_local_output+0x4e9/0xb7d
    [   86.051955]  kasan_report+0xa5/0x120
    [   86.051955]  ? mctp_local_output+0x4e9/0xb7d
    [   86.051955]  mctp_local_output+0x4e9/0xb7d
    [   86.051955]  ? mctp_dev_set_key+0x79/0x79
    [   86.051955]  ? copyin+0x38/0x50
    [   86.051955]  ? _copy_from_iter+0x1b6/0xf20
    [   86.051955]  ? sysvec_apic_timer_interrupt+0x97/0xb0
    [   86.051955]  ? asm_sysvec_apic_timer_interrupt+0x12/0x20
    [   86.051955]  ? mctp_local_output+0x1/0xb7d
    [   86.051955]  mctp_sendmsg+0x64d/0xdb0
    [   86.051955]  ? mctp_sk_close+0x20/0x20
    [   86.051955]  ? __fget_light+0x2fd/0x4f0
    [   86.051955]  ? mctp_sk_close+0x20/0x20
    [   86.051955]  sock_sendmsg+0xdd/0x110
    [   86.051955]  __sys_sendto+0x1cc/0x2a0
    [   86.051955]  ? __ia32_sys_getpeername+0xa0/0xa0
    [   86.051955]  ? new_sync_write+0x335/0x550
    [   86.051955]  ? alloc_file+0x22f/0x500
    [   86.051955]  ? __ip_do_redirect+0x820/0x1820
    [   86.051955]  ? vfs_write+0x44d/0x7b0
    [   86.051955]  ? vfs_write+0x44d/0x7b0
    [   86.051955]  ? fput_many+0x15/0x120
    [   86.051955]  ? ksys_write+0x155/0x1b0
    [   86.051955]  ? __ia32_sys_read+0xa0/0xa0
    [   86.051955]  __x64_sys_sendto+0xd8/0x1b0
    [   86.051955]  ? exit_to_user_mode_prepare+0x2f/0x120
    [   86.051955]  ? syscall_exit_to_user_mode+0x12/0x20
    [   86.051955]  do_syscall_64+0x3a/0x80
    [   86.051955]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [   86.051955] RIP: 0033:0x7f82118a56b3
    [   86.051955] RSP: 002b:00007ffdb154b110 EFLAGS: 00000293 ORIG_RAX: 000000000000002c
    [   86.051955] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f82118a56b3
    [   86.051955] RDX: 0000000000000010 RSI: 00007f8211cd4000 RDI: 0000000000000007
    [   86.051955] RBP: 00007ffdb154c1d0 R08: 00007ffdb154b164 R09: 000000000000000c
    [   86.051955] R10: 0000000000000000 R11: 0000000000000293 R12: 000055d779800db0
    [   86.051955] R13: 00007ffdb154c2b0 R14: 0000000000000000 R15: 0000000000000000
    [   86.051955]  </TASK>
    [   86.051955]
    [   86.051955] Allocated by task 295:
    [   86.051955]  kasan_save_stack+0x1c/0x40
    [   86.051955]  __kasan_kmalloc+0x84/0xa0
    [   86.051955]  mctp_rtm_newaddr+0x242/0x610
    [   86.051955]  rtnetlink_rcv_msg+0x2fd/0x8b0
    [   86.051955]  netlink_rcv_skb+0x11c/0x340
    [   86.051955]  netlink_unicast+0x439/0x630
    [   86.051955]  netlink_sendmsg+0x752/0xc00
    [   86.051955]  sock_sendmsg+0xdd/0x110
    [   86.051955]  __sys_sendto+0x1cc/0x2a0
    [   86.051955]  __x64_sys_sendto+0xd8/0x1b0
    [   86.051955]  do_syscall_64+0x3a/0x80
    [   86.051955]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [   86.051955]
    [   86.051955] Freed by task 301:
    [   86.051955]  kasan_save_stack+0x1c/0x40
    [   86.051955]  kasan_set_track+0x21/0x30
    [   86.051955]  kasan_set_free_info+0x20/0x30
    [   86.051955]  __kasan_slab_free+0x104/0x170
    [   86.051955]  kfree+0x8c/0x290
    [   86.051955]  mctp_dev_notify+0x161/0x2c0
    [   86.051955]  raw_notifier_call_chain+0x8b/0xc0
    [   86.051955]  unregister_netdevice_many+0x299/0x1180
    [   86.051955]  unregister_netdevice_queue+0x210/0x2f0
    [   86.051955]  unregister_netdev+0x13/0x20
    [   86.051955]  mctp_serial_close+0x6d/0xa0
    [   86.051955]  tty_ldisc_kill+0x31/0xa0
    [   86.051955]  tty_ldisc_hangup+0x24f/0x560
    [   86.051955]  __tty_hangup.part.28+0x2ce/0x6b0
    [   86.051955]  tty_release+0x327/0xc70
    [   86.051955]  __fput+0x1df/0x8b0
    [   86.051955]  task_work_run+0xca/0x150
    [   86.051955]  exit_to_user_mode_prepare+0x114/0x120
    [   86.051955]  syscall_exit_to_user_mode+0x12/0x20
    [   86.051955]  do_syscall_64+0x46/0x80
    [   86.051955]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [   86.051955]
    [   86.051955] The buggy address belongs to the object at ffff888005f298c0
    [   86.051955]  which belongs to the cache kmalloc-8 of size 8
    [   86.051955] The buggy address is located 0 bytes inside of
    [   86.051955]  8-byte region [ffff888005f298c0, ffff888005f298c8)
    [   86.051955]
    [   86.051955] The buggy address belongs to the physical page:
    [   86.051955] flags: 0x100000000000200(slab|node=0|zone=1)
    [   86.051955] raw: 0100000000000200 dead000000000100 dead000000000122 ffff888005c42280
    [   86.051955] raw: 0000000000000000 0000000080660066 00000001ffffffff 0000000000000000
    [   86.051955] page dumped because: kasan: bad access detected
    [   86.051955]
    [   86.051955] Memory state around the buggy address:
    [   86.051955]  ffff888005f29780: 00 fc fc fc fc 00 fc fc fc fc 00 fc fc fc fc 00
    [   86.051955]  ffff888005f29800: fc fc fc fc 00 fc fc fc fc 00 fc fc fc fc 00 fc
    [   86.051955] >ffff888005f29880: fc fc fc fb fc fc fc fc fa fc fc fc fc fa fc fc
    [   86.051955]                                            ^
    [   86.051955]  ffff888005f29900: fc fc 00 fc fc fc fc 00 fc fc fc fc 00 fc fc fc
    [   86.051955]  ffff888005f29980: fc 00 fc fc fc fc 00 fc fc fc fc 00 fc fc fc fc
    [   86.051955] ==================================================================

root cause:
Just like the CVE-2021-3573, this bug occurs when a malicious user fakes a MCTP device and issues 
sendmsg syscall when closing the device. By using userfaultfd, this bug can be stably triggered.
As the bug fix possibly self-explantory, please to refer to the above link for more details.


PoC code:
please see attachment.

=*=*=*=*=*=*=*=*=  Credit  =*=*=*=*=*=*=*=*=
Lin Ma (@f0rm2l1n) from ZheJiang University & Ant Group Light-Year Security Lab

Attachment: attachment.zip
Description:


Current thread: