• Eric Dumazet's avatar
    ipv6: tcp: restore IP6CB for pktoptions skbs · 705b5aca
    Eric Dumazet authored
    [ Upstream commit 8ce48623 ]
    
    Baozeng Ding reported following KASAN splat :
    
    BUG: KASAN: use-after-free in ip6_datagram_recv_specific_ctl+0x13f1/0x15c0 at addr ffff880029c84ec8
    Read of size 1 by task poc/25548
    Call Trace:
     [<ffffffff82cf43c9>] dump_stack+0x12e/0x185 /lib/dump_stack.c:15
     [<     inline     >] print_address_description /mm/kasan/report.c:204
     [<ffffffff817ced3b>] kasan_report_error+0x48b/0x4b0 /mm/kasan/report.c:283
     [<     inline     >] kasan_report /mm/kasan/report.c:303
     [<ffffffff817ced9e>] __asan_report_load1_noabort+0x3e/0x40 /mm/kasan/report.c:321
     [<ffffffff85c71da1>] ip6_datagram_recv_specific_ctl+0x13f1/0x15c0 /net/ipv6/datagram.c:687
     [<ffffffff85c734c3>] ip6_datagram_recv_ctl+0x33/0x40
     [<ffffffff85c0b07c>] do_ipv6_getsockopt.isra.4+0xaec/0x2150
     [<ffffffff85c0c7f6>] ipv6_getsockopt+0x116/0x230
     [<ffffffff859b5a12>] tcp_getsockopt+0x82/0xd0 /net/ipv4/tcp.c:3035
     [<ffffffff855fb385>] sock_common_getsockopt+0x95/0xd0 /net/core/sock.c:2647
     [<     inline     >] SYSC_getsockopt /net/socket.c:1776
     [<ffffffff855f8ba2>] SyS_getsockopt+0x142/0x230 /net/socket.c:1758
     [<ffffffff8685cdc5>] entry_SYSCALL_64_fastpath+0x23/0xc6
    Memory state around the buggy address:
     ffff880029c84d80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
     ffff880029c84e00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    > ffff880029c84e80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
                                                  ^
     ffff880029c84f00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
     ffff880029c84f80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    
    He also provided a syzkaller reproducer.
    
    Issue is that ip6_datagram_recv_specific_ctl() expects to find IP6CB
    data that was moved at a different place in tcp_v6_rcv()
    
    This patch moves tcp_v6_restore_cb() up and calls it from
    tcp_v6_do_rcv() when np->pktoptions is set.
    
    Fixes: 971f10ec ("tcp: better TCP_SKB_CB layout to reduce cache line misses")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reported-by: default avatarBaozeng Ding <sploving1@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    705b5aca
tcp_ipv6.c 50.3 KB