• Chen Zhongjin's avatar
    profiling: fix shift too large makes kernel panic · 0fe6ee8f
    Chen Zhongjin authored
    2d186afd ("profiling: fix shift-out-of-bounds bugs") limits shift
    value by [0, BITS_PER_LONG -1], which means [0, 63].
    
    However, syzbot found that the max shift value should be the bit number of
    (_etext - _stext).  If shift is outside of this, the "buffer_bytes" will
    be zero and will cause kzalloc(0).  Then the kernel panics due to
    dereferencing the returned pointer 16.
    
    This can be easily reproduced by passing a large number like 60 to enable
    profiling and then run readprofile.
    
    LOGS:
     BUG: kernel NULL pointer dereference, address: 0000000000000010
     #PF: supervisor write access in kernel mode
     #PF: error_code(0x0002) - not-present page
     PGD 6148067 P4D 6148067 PUD 6142067 PMD 0
     PREEMPT SMP
     CPU: 4 PID: 184 Comm: readprofile Not tainted 5.18.0+ #162
     Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014
     RIP: 0010:read_profile+0x104/0x220
     RSP: 0018:ffffc900006fbe80 EFLAGS: 00000202
     RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
     RDX: ffff888006150000 RSI: 0000000000000001 RDI: ffffffff82aba4a0
     RBP: 000000000188bb60 R08: 0000000000000010 R09: ffff888006151000
     R10: 0000000000000000 R11: 0000000000000000 R12: ffffffff82aba4a0
     R13: 0000000000000000 R14: ffffc900006fbf08 R15: 0000000000020c30
     FS:  000000000188a8c0(0000) GS:ffff88803ed00000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000000000000010 CR3: 0000000006144000 CR4: 00000000000006e0
     Call Trace:
      <TASK>
      proc_reg_read+0x56/0x70
      vfs_read+0x9a/0x1b0
      ksys_read+0xa1/0xe0
      ? fpregs_assert_state_consistent+0x1e/0x40
      do_syscall_64+0x3a/0x80
      entry_SYSCALL_64_after_hwframe+0x46/0xb0
     RIP: 0033:0x4d4b4e
     RSP: 002b:00007ffebb668d58 EFLAGS: 00000246 ORIG_RAX: 0000000000000000
     RAX: ffffffffffffffda RBX: 000000000188a8a0 RCX: 00000000004d4b4e
     RDX: 0000000000000400 RSI: 000000000188bb60 RDI: 0000000000000003
     RBP: 0000000000000003 R08: 000000000000006e R09: 0000000000000000
     R10: 0000000000000041 R11: 0000000000000246 R12: 000000000188bb60
     R13: 0000000000000400 R14: 0000000000000000 R15: 000000000188bb60
      </TASK>
     Modules linked in:
     CR2: 0000000000000010
    Killed
     ---[ end trace 0000000000000000 ]---
    
    Check prof_len in profile_init() to prevent it be zero.
    
    Link: https://lkml.kernel.org/r/20220531012854.229439-1-chenzhongjin@huawei.com
    Fixes: 1da177e4 ("Linux-2.6.12-rc2")
    Signed-off-by: default avatarChen Zhongjin <chenzhongjin@huawei.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    0fe6ee8f
profile.c 13.4 KB