• Eric Dumazet's avatar
    ipv6: tunnels: fix two use-after-free · cbb49697
    Eric Dumazet authored
    xfrm6_policy_check() might have re-allocated skb->head, we need
    to reload ipv6 header pointer.
    
    sysbot reported :
    
    BUG: KASAN: use-after-free in __ipv6_addr_type+0x302/0x32f net/ipv6/addrconf_core.c:40
    Read of size 4 at addr ffff888191b8cb70 by task syz-executor2/1304
    
    CPU: 0 PID: 1304 Comm: syz-executor2 Not tainted 4.20.0-rc7+ #356
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     <IRQ>
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0x244/0x39d lib/dump_stack.c:113
     print_address_description.cold.7+0x9/0x1ff mm/kasan/report.c:256
     kasan_report_error mm/kasan/report.c:354 [inline]
     kasan_report.cold.8+0x242/0x309 mm/kasan/report.c:412
     __asan_report_load4_noabort+0x14/0x20 mm/kasan/report.c:432
     __ipv6_addr_type+0x302/0x32f net/ipv6/addrconf_core.c:40
     ipv6_addr_type include/net/ipv6.h:403 [inline]
     ip6_tnl_get_cap+0x27/0x190 net/ipv6/ip6_tunnel.c:727
     ip6_tnl_rcv_ctl+0xdb/0x2a0 net/ipv6/ip6_tunnel.c:757
     vti6_rcv+0x336/0x8f3 net/ipv6/ip6_vti.c:321
     xfrm6_ipcomp_rcv+0x1a5/0x3a0 net/ipv6/xfrm6_protocol.c:132
     ip6_protocol_deliver_rcu+0x372/0x1940 net/ipv6/ip6_input.c:394
     ip6_input_finish+0x84/0x170 net/ipv6/ip6_input.c:434
     NF_HOOK include/linux/netfilter.h:289 [inline]
     ip6_input+0xe9/0x600 net/ipv6/ip6_input.c:443
    IPVS: ftp: loaded support on port[0] = 21
     ip6_mc_input+0x514/0x11c0 net/ipv6/ip6_input.c:537
     dst_input include/net/dst.h:450 [inline]
     ip6_rcv_finish+0x17a/0x330 net/ipv6/ip6_input.c:76
     NF_HOOK include/linux/netfilter.h:289 [inline]
     ipv6_rcv+0x115/0x640 net/ipv6/ip6_input.c:272
     __netif_receive_skb_one_core+0x14d/0x200 net/core/dev.c:4973
     __netif_receive_skb+0x2c/0x1e0 net/core/dev.c:5083
     process_backlog+0x24e/0x7a0 net/core/dev.c:5923
     napi_poll net/core/dev.c:6346 [inline]
     net_rx_action+0x7fa/0x19b0 net/core/dev.c:6412
     __do_softirq+0x308/0xb7e kernel/softirq.c:292
     do_softirq_own_stack+0x2a/0x40 arch/x86/entry/entry_64.S:1027
     </IRQ>
     do_softirq.part.14+0x126/0x160 kernel/softirq.c:337
     do_softirq+0x19/0x20 kernel/softirq.c:340
     netif_rx_ni+0x521/0x860 net/core/dev.c:4569
     dev_loopback_xmit+0x287/0x8c0 net/core/dev.c:3576
     NF_HOOK include/linux/netfilter.h:289 [inline]
     ip6_finish_output2+0x193a/0x2930 net/ipv6/ip6_output.c:84
     ip6_fragment+0x2b06/0x3850 net/ipv6/ip6_output.c:727
     ip6_finish_output+0x6b7/0xc50 net/ipv6/ip6_output.c:152
     NF_HOOK_COND include/linux/netfilter.h:278 [inline]
     ip6_output+0x232/0x9d0 net/ipv6/ip6_output.c:171
     dst_output include/net/dst.h:444 [inline]
     ip6_local_out+0xc5/0x1b0 net/ipv6/output_core.c:176
     ip6_send_skb+0xbc/0x340 net/ipv6/ip6_output.c:1727
     ip6_push_pending_frames+0xc5/0xf0 net/ipv6/ip6_output.c:1747
     rawv6_push_pending_frames net/ipv6/raw.c:615 [inline]
     rawv6_sendmsg+0x3a3e/0x4b40 net/ipv6/raw.c:945
    kobject: 'queues' (0000000089e6eea2): kobject_add_internal: parent: 'tunl0', set: '<NULL>'
    kobject: 'queues' (0000000089e6eea2): kobject_uevent_env
     inet_sendmsg+0x1a1/0x690 net/ipv4/af_inet.c:798
    kobject: 'queues' (0000000089e6eea2): kobject_uevent_env: filter function caused the event to drop!
     sock_sendmsg_nosec net/socket.c:621 [inline]
     sock_sendmsg+0xd5/0x120 net/socket.c:631
     sock_write_iter+0x35e/0x5c0 net/socket.c:900
     call_write_iter include/linux/fs.h:1857 [inline]
     new_sync_write fs/read_write.c:474 [inline]
     __vfs_write+0x6b8/0x9f0 fs/read_write.c:487
    kobject: 'rx-0' (00000000e2d902d9): kobject_add_internal: parent: 'queues', set: 'queues'
    kobject: 'rx-0' (00000000e2d902d9): kobject_uevent_env
     vfs_write+0x1fc/0x560 fs/read_write.c:549
     ksys_write+0x101/0x260 fs/read_write.c:598
    kobject: 'rx-0' (00000000e2d902d9): fill_kobj_path: path = '/devices/virtual/net/tunl0/queues/rx-0'
     __do_sys_write fs/read_write.c:610 [inline]
     __se_sys_write fs/read_write.c:607 [inline]
     __x64_sys_write+0x73/0xb0 fs/read_write.c:607
     do_syscall_64+0x1b9/0x820 arch/x86/entry/common.c:290
    kobject: 'tx-0' (00000000443b70ac): kobject_add_internal: parent: 'queues', set: 'queues'
     entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x457669
    Code: fd b3 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 cb b3 fb ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007f9bd200bc78 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
    RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 0000000000457669
    RDX: 000000000000058f RSI: 00000000200033c0 RDI: 0000000000000003
    kobject: 'tx-0' (00000000443b70ac): kobject_uevent_env
    RBP: 000000000072bf00 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00007f9bd200c6d4
    R13: 00000000004c2dcc R14: 00000000004da398 R15: 00000000ffffffff
    
    Allocated by task 1304:
     save_stack+0x43/0xd0 mm/kasan/kasan.c:448
     set_track mm/kasan/kasan.c:460 [inline]
     kasan_kmalloc+0xc7/0xe0 mm/kasan/kasan.c:553
     __do_kmalloc_node mm/slab.c:3684 [inline]
     __kmalloc_node_track_caller+0x50/0x70 mm/slab.c:3698
     __kmalloc_reserve.isra.41+0x41/0xe0 net/core/skbuff.c:140
     __alloc_skb+0x155/0x760 net/core/skbuff.c:208
    kobject: 'tx-0' (00000000443b70ac): fill_kobj_path: path = '/devices/virtual/net/tunl0/queues/tx-0'
     alloc_skb include/linux/skbuff.h:1011 [inline]
     __ip6_append_data.isra.49+0x2f1a/0x3f50 net/ipv6/ip6_output.c:1450
     ip6_append_data+0x1bc/0x2d0 net/ipv6/ip6_output.c:1619
     rawv6_sendmsg+0x15ab/0x4b40 net/ipv6/raw.c:938
     inet_sendmsg+0x1a1/0x690 net/ipv4/af_inet.c:798
     sock_sendmsg_nosec net/socket.c:621 [inline]
     sock_sendmsg+0xd5/0x120 net/socket.c:631
     ___sys_sendmsg+0x7fd/0x930 net/socket.c:2116
     __sys_sendmsg+0x11d/0x280 net/socket.c:2154
     __do_sys_sendmsg net/socket.c:2163 [inline]
     __se_sys_sendmsg net/socket.c:2161 [inline]
     __x64_sys_sendmsg+0x78/0xb0 net/socket.c:2161
     do_syscall_64+0x1b9/0x820 arch/x86/entry/common.c:290
     entry_SYSCALL_64_after_hwframe+0x49/0xbe
    kobject: 'gre0' (00000000cb1b2d7b): kobject_add_internal: parent: 'net', set: 'devices'
    
    Freed by task 1304:
     save_stack+0x43/0xd0 mm/kasan/kasan.c:448
     set_track mm/kasan/kasan.c:460 [inline]
     __kasan_slab_free+0x102/0x150 mm/kasan/kasan.c:521
     kasan_slab_free+0xe/0x10 mm/kasan/kasan.c:528
     __cache_free mm/slab.c:3498 [inline]
     kfree+0xcf/0x230 mm/slab.c:3817
     skb_free_head+0x93/0xb0 net/core/skbuff.c:553
     pskb_expand_head+0x3b2/0x10d0 net/core/skbuff.c:1498
     __pskb_pull_tail+0x156/0x18a0 net/core/skbuff.c:1896
     pskb_may_pull include/linux/skbuff.h:2188 [inline]
     _decode_session6+0xd11/0x14d0 net/ipv6/xfrm6_policy.c:150
     __xfrm_decode_session+0x71/0x140 net/xfrm/xfrm_policy.c:3272
    kobject: 'gre0' (00000000cb1b2d7b): kobject_uevent_env
     __xfrm_policy_check+0x380/0x2c40 net/xfrm/xfrm_policy.c:3322
     __xfrm_policy_check2 include/net/xfrm.h:1170 [inline]
     xfrm_policy_check include/net/xfrm.h:1175 [inline]
     xfrm6_policy_check include/net/xfrm.h:1185 [inline]
     vti6_rcv+0x4bd/0x8f3 net/ipv6/ip6_vti.c:316
     xfrm6_ipcomp_rcv+0x1a5/0x3a0 net/ipv6/xfrm6_protocol.c:132
     ip6_protocol_deliver_rcu+0x372/0x1940 net/ipv6/ip6_input.c:394
     ip6_input_finish+0x84/0x170 net/ipv6/ip6_input.c:434
     NF_HOOK include/linux/netfilter.h:289 [inline]
     ip6_input+0xe9/0x600 net/ipv6/ip6_input.c:443
     ip6_mc_input+0x514/0x11c0 net/ipv6/ip6_input.c:537
     dst_input include/net/dst.h:450 [inline]
     ip6_rcv_finish+0x17a/0x330 net/ipv6/ip6_input.c:76
     NF_HOOK include/linux/netfilter.h:289 [inline]
     ipv6_rcv+0x115/0x640 net/ipv6/ip6_input.c:272
     __netif_receive_skb_one_core+0x14d/0x200 net/core/dev.c:4973
     __netif_receive_skb+0x2c/0x1e0 net/core/dev.c:5083
     process_backlog+0x24e/0x7a0 net/core/dev.c:5923
    kobject: 'gre0' (00000000cb1b2d7b): fill_kobj_path: path = '/devices/virtual/net/gre0'
     napi_poll net/core/dev.c:6346 [inline]
     net_rx_action+0x7fa/0x19b0 net/core/dev.c:6412
     __do_softirq+0x308/0xb7e kernel/softirq.c:292
    
    The buggy address belongs to the object at ffff888191b8cac0
     which belongs to the cache kmalloc-512 of size 512
    The buggy address is located 176 bytes inside of
     512-byte region [ffff888191b8cac0, ffff888191b8ccc0)
    The buggy address belongs to the page:
    page:ffffea000646e300 count:1 mapcount:0 mapping:ffff8881da800940 index:0x0
    flags: 0x2fffc0000000200(slab)
    raw: 02fffc0000000200 ffffea0006eaaa48 ffffea00065356c8 ffff8881da800940
    raw: 0000000000000000 ffff888191b8c0c0 0000000100000006 0000000000000000
    page dumped because: kasan: bad access detected
    kobject: 'queues' (000000005fd6226e): kobject_add_internal: parent: 'gre0', set: '<NULL>'
    
    Memory state around the buggy address:
     ffff888191b8ca00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
     ffff888191b8ca80: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
    >ffff888191b8cb00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                                                                 ^
     ffff888191b8cb80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff888191b8cc00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    
    Fixes: 0d3c703a ("ipv6: Cleanup IPv6 tunnel receive path")
    Fixes: ed1efb2a ("ipv6: Add support for IPsec virtual tunnel interfaces")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cbb49697
ip6_vti.c 29.3 KB