• Wei Wang's avatar
    ipv6: don't let tb6_root node share routes with other node · 591ff9ea
    Wei Wang authored
    After commit 4512c43e, if we add a route to the subtree of tb6_root
    which does not have any route attached to it yet, the current code will
    let tb6_root and the node in the subtree share the same route.
    This could cause problem cause tb6_root has RTN_INFO flag marked and the
    tree repair and clean up code will not work properly.
    This commit makes sure tb6_root->leaf points back to null_entry instead
    of sharing route with other node.
    
    It fixes the following syzkaller reported issue:
    BUG: KASAN: use-after-free in ipv6_prefix_equal include/net/ipv6.h:540 [inline]
    BUG: KASAN: use-after-free in fib6_add_1+0x165f/0x1790 net/ipv6/ip6_fib.c:618
    Read of size 8 at addr ffff8801bc043498 by task syz-executor5/19819
    
    CPU: 1 PID: 19819 Comm: syz-executor5 Not tainted 4.15.0-rc7+ #186
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     __dump_stack lib/dump_stack.c:17 [inline]
     dump_stack+0x194/0x257 lib/dump_stack.c:53
     print_address_description+0x73/0x250 mm/kasan/report.c:252
     kasan_report_error mm/kasan/report.c:351 [inline]
     kasan_report+0x25b/0x340 mm/kasan/report.c:409
     __asan_report_load8_noabort+0x14/0x20 mm/kasan/report.c:430
     ipv6_prefix_equal include/net/ipv6.h:540 [inline]
     fib6_add_1+0x165f/0x1790 net/ipv6/ip6_fib.c:618
     fib6_add+0x5fa/0x1540 net/ipv6/ip6_fib.c:1214
     __ip6_ins_rt+0x6c/0x90 net/ipv6/route.c:1003
     ip6_route_add+0x141/0x190 net/ipv6/route.c:2790
     ipv6_route_ioctl+0x4db/0x6b0 net/ipv6/route.c:3299
     inet6_ioctl+0xef/0x1e0 net/ipv6/af_inet6.c:520
     sock_do_ioctl+0x65/0xb0 net/socket.c:958
     sock_ioctl+0x2c2/0x440 net/socket.c:1055
     vfs_ioctl fs/ioctl.c:46 [inline]
     do_vfs_ioctl+0x1b1/0x1520 fs/ioctl.c:686
     SYSC_ioctl fs/ioctl.c:701 [inline]
     SyS_ioctl+0x8f/0xc0 fs/ioctl.c:692
     entry_SYSCALL_64_fastpath+0x23/0x9a
    RIP: 0033:0x452ac9
    RSP: 002b:00007fd42b321c58 EFLAGS: 00000212 ORIG_RAX: 0000000000000010
    RAX: ffffffffffffffda RBX: 000000000071bea0 RCX: 0000000000452ac9
    RDX: 0000000020fd7000 RSI: 000000000000890b RDI: 0000000000000013
    RBP: 000000000000049e R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000212 R12: 00000000006f4f70
    R13: 00000000ffffffff R14: 00007fd42b3226d4 R15: 0000000000000000
    
    Fixes: 4512c43e ("ipv6: remove null_entry before adding default route")
    Signed-off-by: default avatarWei Wang <weiwan@google.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    591ff9ea
ip6_fib.c 54.5 KB