• Mark Rutland's avatar
    net: ipconfig: fix ic_close_devs() use-after-free · ffefb6f4
    Mark Rutland authored
    Our chosen ic_dev may be anywhere in our list of ic_devs, and we may
    free it before attempting to close others. When we compare d->dev and
    ic_dev->dev, we're potentially dereferencing memory returned to the
    allocator. This causes KASAN to scream for each subsequent ic_dev we
    check.
    
    As there's a 1-1 mapping between ic_devs and netdevs, we can instead
    compare d and ic_dev directly, which implicitly handles the !ic_dev
    case, and avoids the use-after-free. The ic_dev pointer may be stale,
    but we will not dereference it.
    
    Original splat:
    
    [    6.487446] ==================================================================
    [    6.494693] BUG: KASAN: use-after-free in ic_close_devs+0xc4/0x154 at addr ffff800367efa708
    [    6.503013] Read of size 8 by task swapper/0/1
    [    6.507452] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 4.11.0-rc3-00002-gda42158 #8
    [    6.514993] Hardware name: AppliedMicro Mustang/Mustang, BIOS 3.05.05-beta_rc Jan 27 2016
    [    6.523138] Call trace:
    [    6.525590] [<ffff200008094778>] dump_backtrace+0x0/0x570
    [    6.530976] [<ffff200008094d08>] show_stack+0x20/0x30
    [    6.536017] [<ffff200008bee928>] dump_stack+0x120/0x188
    [    6.541231] [<ffff20000856d5e4>] kasan_object_err+0x24/0xa0
    [    6.546790] [<ffff20000856d924>] kasan_report_error+0x244/0x738
    [    6.552695] [<ffff20000856dfec>] __asan_report_load8_noabort+0x54/0x80
    [    6.559204] [<ffff20000aae86ac>] ic_close_devs+0xc4/0x154
    [    6.564590] [<ffff20000aaedbac>] ip_auto_config+0x2ed4/0x2f1c
    [    6.570321] [<ffff200008084b04>] do_one_initcall+0xcc/0x370
    [    6.575882] [<ffff20000aa31de8>] kernel_init_freeable+0x5f8/0x6c4
    [    6.581959] [<ffff20000a16df00>] kernel_init+0x18/0x190
    [    6.587171] [<ffff200008084710>] ret_from_fork+0x10/0x40
    [    6.592468] Object at ffff800367efa700, in cache kmalloc-128 size: 128
    [    6.598969] Allocated:
    [    6.601324] PID = 1
    [    6.603427]  save_stack_trace_tsk+0x0/0x418
    [    6.607603]  save_stack_trace+0x20/0x30
    [    6.611430]  kasan_kmalloc+0xd8/0x188
    [    6.615087]  ip_auto_config+0x8c4/0x2f1c
    [    6.619002]  do_one_initcall+0xcc/0x370
    [    6.622832]  kernel_init_freeable+0x5f8/0x6c4
    [    6.627178]  kernel_init+0x18/0x190
    [    6.630660]  ret_from_fork+0x10/0x40
    [    6.634223] Freed:
    [    6.636233] PID = 1
    [    6.638334]  save_stack_trace_tsk+0x0/0x418
    [    6.642510]  save_stack_trace+0x20/0x30
    [    6.646337]  kasan_slab_free+0x88/0x178
    [    6.650167]  kfree+0xb8/0x478
    [    6.653131]  ic_close_devs+0x130/0x154
    [    6.656875]  ip_auto_config+0x2ed4/0x2f1c
    [    6.660875]  do_one_initcall+0xcc/0x370
    [    6.664705]  kernel_init_freeable+0x5f8/0x6c4
    [    6.669051]  kernel_init+0x18/0x190
    [    6.672534]  ret_from_fork+0x10/0x40
    [    6.676098] Memory state around the buggy address:
    [    6.680880]  ffff800367efa600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [    6.688078]  ffff800367efa680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [    6.695276] >ffff800367efa700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [    6.702469]                       ^
    [    6.705952]  ffff800367efa780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [    6.713149]  ffff800367efa800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [    6.720343] ==================================================================
    [    6.727536] Disabling lock debugging due to kernel taint
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
    Cc: James Morris <jmorris@namei.org>
    Cc: Patrick McHardy <kaber@trash.net>
    Cc: netdev@vger.kernel.org
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ffefb6f4
ipconfig.c 39.5 KB