Wei Wang
6d37fa49da
l2tp: use sk_dst_check() to avoid race on sk->sk_dst_cache
In l2tp code, if it is a L2TP_UDP_ENCAP tunnel, tunnel->sk points to a
UDP socket. User could call sendmsg() on both this tunnel and the UDP
socket itself concurrently. As l2tp_xmit_skb() holds socket lock and call
__sk_dst_check() to refresh sk->sk_dst_cache, while udpv6_sendmsg() is
lockless and call sk_dst_check() to refresh sk->sk_dst_cache, there
could be a race and cause the dst cache to be freed multiple times.
So we fix l2tp side code to always call sk_dst_check() to garantee
xchg() is called when refreshing sk->sk_dst_cache to avoid race
conditions.
Syzkaller reported stack trace:
BUG: KASAN: use-after-free in atomic_read include/asm-generic/atomic-instrumented.h:21 [inline]
BUG: KASAN: use-after-free in atomic_fetch_add_unless include/linux/atomic.h:575 [inline]
BUG: KASAN: use-after-free in atomic_add_unless include/linux/atomic.h:597 [inline]
BUG: KASAN: use-after-free in dst_hold_safe include/net/dst.h:308 [inline]
BUG: KASAN: use-after-free in ip6_hold_safe+0xe6/0x670 net/ipv6/route.c:1029
Read of size 4 at addr ffff8801aea9a880 by task syz-executor129/4829
CPU: 0 PID: 4829 Comm: syz-executor129 Not tainted 4.18.0-rc7-next-20180802+ #30
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0x1c9/0x2b4 lib/dump_stack.c:113
print_address_description+0x6c/0x20b mm/kasan/report.c:256
kasan_report_error mm/kasan/report.c:354 [inline]
kasan_report.cold.7+0x242/0x30d mm/kasan/report.c:412
check_memory_region_inline mm/kasan/kasan.c:260 [inline]
check_memory_region+0x13e/0x1b0 mm/kasan/kasan.c:267
kasan_check_read+0x11/0x20 mm/kasan/kasan.c:272
atomic_read include/asm-generic/atomic-instrumented.h:21 [inline]
atomic_fetch_add_unless include/linux/atomic.h:575 [inline]
atomic_add_unless include/linux/atomic.h:597 [inline]
dst_hold_safe include/net/dst.h:308 [inline]
ip6_hold_safe+0xe6/0x670 net/ipv6/route.c:1029
rt6_get_pcpu_route net/ipv6/route.c:1249 [inline]
ip6_pol_route+0x354/0xd20 net/ipv6/route.c:1922
ip6_pol_route_output+0x54/0x70 net/ipv6/route.c:2098
fib6_rule_lookup+0x283/0x890 net/ipv6/fib6_rules.c:122
ip6_route_output_flags+0x2c5/0x350 net/ipv6/route.c:2126
ip6_dst_lookup_tail+0x1278/0x1da0 net/ipv6/ip6_output.c:978
ip6_dst_lookup_flow+0xc8/0x270 net/ipv6/ip6_output.c:1079
ip6_sk_dst_lookup_flow+0x5ed/0xc50 net/ipv6/ip6_output.c:1117
udpv6_sendmsg+0x2163/0x36b0 net/ipv6/udp.c:1354
inet_sendmsg+0x1a1/0x690 net/ipv4/af_inet.c:798
sock_sendmsg_nosec net/socket.c:622 [inline]
sock_sendmsg+0xd5/0x120 net/socket.c:632
___sys_sendmsg+0x51d/0x930 net/socket.c:2115
__sys_sendmmsg+0x240/0x6f0 net/socket.c:2210
__do_sys_sendmmsg net/socket.c:2239 [inline]
__se_sys_sendmmsg net/socket.c:2236 [inline]
__x64_sys_sendmmsg+0x9d/0x100 net/socket.c:2236
do_syscall_64+0x1b9/0x820 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
RIP: 0033:0x446a29
Code: e8 ac b8 02 00 48 83 c4 18 c3 0f 1f 80 00 00 00 00 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 eb 08 fc ff c3 66 2e 0f 1f 84 00 00 00 00
RSP: 002b:00007f4de5532db8 EFLAGS: 00000246 ORIG_RAX: 0000000000000133
RAX: ffffffffffffffda RBX: 00000000006dcc38 RCX: 0000000000446a29
RDX: 00000000000000b8 RSI: 0000000020001b00 RDI: 0000000000000003
RBP: 00000000006dcc30 R08: 00007f4de5533700 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 00000000006dcc3c
R13: 00007ffe2b830fdf R14: 00007f4de55339c0 R15: 0000000000000001
Fixes: 71b1391a41 ("l2tp: ensure sk->dst is still valid")
Reported-by: syzbot+05f840f3b04f211bad55@syzkaller.appspotmail.com
Signed-off-by: Wei Wang <weiwan@google.com>
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Cc: Guillaume Nault <g.nault@alphalink.fr>
Cc: David Ahern <dsahern@gmail.com>
Cc: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
|
2018-08-13 08:43:36 -07:00 |
| .. |
|
6lowpan
|
6lowpan: iphc: reset mac_header after decompress to fix panic
|
2018-07-06 12:32:12 +02:00 |
|
9p
|
net:mod: remove unneeded variable 'ret' in init_p9
|
2018-08-08 09:40:44 -07:00 |
|
802
|
|
|
|
8021q
|
net: remove blank lines at end of file
|
2018-07-24 14:10:43 -07:00 |
|
appletalk
|
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
|
2018-06-28 10:40:47 -07:00 |
|
atm
|
net: simplify sock_poll_wait
|
2018-07-30 09:10:25 -07:00 |
|
ax25
|
ax25: remove blank line at EOF
|
2018-07-24 14:10:42 -07:00 |
|
batman-adv
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux
|
2018-07-20 21:17:12 -07:00 |
|
bluetooth
|
Bluetooth: Add definitions for LE set address resolution
|
2018-08-10 16:57:57 +02:00 |
|
bpf
|
bpf/test_run: support cgroup local storage
|
2018-08-03 00:47:32 +02:00 |
|
bpfilter
|
bpfilter: remove trailing newline
|
2018-07-24 14:10:42 -07:00 |
|
bridge
|
net/bridge/br_multicast: remove redundant variable "err"
|
2018-08-06 10:33:44 -07:00 |
|
caif
|
net: simplify sock_poll_wait
|
2018-07-30 09:10:25 -07:00 |
|
can
|
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
|
2018-06-28 10:40:47 -07:00 |
|
ceph
|
|
|
|
core
|
net: core: protect rate estimator statistics pointer with lock
|
2018-08-11 12:37:10 -07:00 |
|
dcb
|
net: dcb: Add priority-to-DSCP map getters
|
2018-07-27 13:17:50 -07:00 |
|
dccp
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-09 11:52:36 -07:00 |
|
decnet
|
decnet: fix using plain integer as NULL warning
|
2018-08-09 14:11:24 -07:00 |
|
dns_resolver
|
net: remove blank lines at end of file
|
2018-07-24 14:10:43 -07:00 |
|
dsa
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-09 11:52:36 -07:00 |
|
ethernet
|
net: Convert GRO SKB handling to list_head.
|
2018-06-26 11:33:04 +09:00 |
|
hsr
|
|
|
|
ieee802154
|
net: ieee802154: 6lowpan: remove redundant pointers 'fq' and 'net'
|
2018-08-06 11:21:15 +02:00 |
|
ife
|
|
|
|
ipv4
|
ip: process in-order fragments efficiently
|
2018-08-11 17:54:18 -07:00 |
|
ipv6
|
ipv6: Add icmp_echo_ignore_all support for ICMPv6
|
2018-08-13 08:42:25 -07:00 |
|
iucv
|
net:af_iucv: get rid of the unneeded variable 'err' in afiucv_pm_freeze
|
2018-08-08 09:39:36 -07:00 |
|
kcm
|
net: remove blank lines at end of file
|
2018-07-24 14:10:43 -07:00 |
|
key
|
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next
|
2018-07-27 09:33:37 -07:00 |
|
l2tp
|
l2tp: use sk_dst_check() to avoid race on sk->sk_dst_cache
|
2018-08-13 08:43:36 -07:00 |
|
l3mdev
|
|
|
|
lapb
|
|
|
|
llc
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-09 11:52:36 -07:00 |
|
mac80211
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-07-24 19:21:58 -07:00 |
|
mac802154
|
net: mac802154: tx: expand tailroom if necessary
|
2018-08-06 11:21:37 +02:00 |
|
mpls
|
mpls: remove trailing whitepace
|
2018-07-24 14:10:42 -07:00 |
|
ncsi
|
|
|
|
netfilter
|
netfilter: nfnetlink_osf: fix using plain integer as NULL warning
|
2018-08-08 19:05:39 +02:00 |
|
netlabel
|
|
|
|
netlink
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-05 13:04:31 -07:00 |
|
netrom
|
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
|
2018-06-28 10:40:47 -07:00 |
|
nfc
|
net: simplify sock_poll_wait
|
2018-07-30 09:10:25 -07:00 |
|
nsh
|
nsh: set mac len based on inner packet
|
2018-07-12 16:55:29 -07:00 |
|
openvswitch
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-02 10:55:32 -07:00 |
|
packet
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-09 11:52:36 -07:00 |
|
phonet
|
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
|
2018-06-28 10:40:47 -07:00 |
|
psample
|
|
|
|
qrtr
|
net: qrtr: Reset the node and port ID of broadcast messages
|
2018-07-05 20:20:03 +09:00 |
|
rds
|
RDS: IB: fix 'passing zero to ERR_PTR()' warning
|
2018-08-07 13:19:45 -07:00 |
|
rfkill
|
|
|
|
rose
|
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
|
2018-06-28 10:40:47 -07:00 |
|
rxrpc
|
rxrpc: remove redundant static int 'zero'
|
2018-08-11 11:25:18 -07:00 |
|
sched
|
net: sched: act_police: remove dependency on rtnl lock
|
2018-08-11 12:37:10 -07:00 |
|
sctp
|
net/sctp: Replace in/out stream arrays with flex_array
|
2018-08-11 12:25:15 -07:00 |
|
smc
|
net/smc: send response to test link signal
|
2018-08-10 14:38:43 -07:00 |
|
strparser
|
strparser: remove redundant variable 'rd_desc'
|
2018-08-01 10:00:06 -07:00 |
|
sunrpc
|
net: Remove some unneeded semicolon
|
2018-08-04 13:05:39 -07:00 |
|
switchdev
|
|
|
|
tipc
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-09 11:52:36 -07:00 |
|
tls
|
net/tls: Combined memory allocation for decryption request
|
2018-08-13 08:41:09 -07:00 |
|
unix
|
af_unix: ensure POLLOUT on remote close() for connected dgram socket
|
2018-08-03 16:44:19 -07:00 |
|
vmw_vsock
|
vsock: split dwork to avoid reinitializations
|
2018-08-07 12:39:13 -07:00 |
|
wimax
|
wimax: remove blank lines at EOF
|
2018-07-24 14:10:42 -07:00 |
|
wireless
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-07-24 19:21:58 -07:00 |
|
x25
|
x25: remove blank lines at EOF
|
2018-07-24 14:10:42 -07:00 |
|
xdp
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-05 13:04:31 -07:00 |
|
xfrm
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-02 10:55:32 -07:00 |
|
compat.c
|
net: avoid unnecessary sock_flag() check when enable timestamp
|
2018-08-06 10:42:48 -07:00 |
|
Kconfig
|
net: remove blank lines at end of file
|
2018-07-24 14:10:43 -07:00 |
|
Makefile
|
bpfilter: check compiler capability in Kconfig
|
2018-06-28 13:36:39 +09:00 |
|
socket.c
|
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
|
2018-08-02 10:55:32 -07:00 |
|
sysctl_net.c
|
|
|