mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-30 01:46:30 -05:00
65 lines
2.9 KiB
Diff
65 lines
2.9 KiB
Diff
From a1b9bc540f4af79bd23e01ec08429e0efa4d2f7b Mon Sep 17 00:00:00 2001
|
|
From: Qidan He <i@flanker017.me>
|
|
Date: Thu, 13 Oct 2016 16:27:46 -0700
|
|
Subject: [PATCH] net: ping: Fix stack buffer overflow in ping_common_sendmsg()
|
|
|
|
In ping_common_sendmsg(), when len < icmph_len, memcpy_fromiovec()
|
|
will access invalid memory because msg->msg_iov only has 1 element
|
|
and memcpy_fromiovec() attempts to increment it. KASAN report:
|
|
|
|
BUG: KASAN: stack-out-of-bounds in memcpy_fromiovec+0x60/0x114 at addr ffffffc071077da0
|
|
Read of size 8 by task trinity-c2/9623
|
|
page:ffffffbe034b9a08 count:0 mapcount:0 mapping: (null) index:0x0
|
|
flags: 0x0()
|
|
page dumped because: kasan: bad access detected
|
|
CPU: 0 PID: 9623 Comm: trinity-c2 Tainted: G BU 3.18.0-dirty #15
|
|
Hardware name: Google Tegra210 Smaug Rev 1,3+ (DT)
|
|
Call trace:
|
|
[<ffffffc000209c98>] dump_backtrace+0x0/0x1ac arch/arm64/kernel/traps.c:90
|
|
[<ffffffc000209e54>] show_stack+0x10/0x1c arch/arm64/kernel/traps.c:171
|
|
[< inline >] __dump_stack lib/dump_stack.c:15
|
|
[<ffffffc000f18dc4>] dump_stack+0x7c/0xd0 lib/dump_stack.c:50
|
|
[< inline >] print_address_description mm/kasan/report.c:147
|
|
[< inline >] kasan_report_error mm/kasan/report.c:236
|
|
[<ffffffc000373dcc>] kasan_report+0x380/0x4b8 mm/kasan/report.c:259
|
|
[< inline >] check_memory_region mm/kasan/kasan.c:264
|
|
[<ffffffc00037352c>] __asan_load8+0x20/0x70 mm/kasan/kasan.c:507
|
|
[<ffffffc0005b9624>] memcpy_fromiovec+0x5c/0x114 lib/iovec.c:15
|
|
[< inline >] memcpy_from_msg include/linux/skbuff.h:2667
|
|
[<ffffffc000ddeba0>] ping_common_sendmsg+0x50/0x108 net/ipv4/ping.c:674
|
|
[<ffffffc000dded30>] ping_v4_sendmsg+0xd8/0x698 net/ipv4/ping.c:714
|
|
[<ffffffc000dc91dc>] inet_sendmsg+0xe0/0x12c net/ipv4/af_inet.c:749
|
|
[< inline >] __sock_sendmsg_nosec net/socket.c:624
|
|
[< inline >] __sock_sendmsg net/socket.c:632
|
|
[<ffffffc000cab61c>] sock_sendmsg+0x124/0x164 net/socket.c:643
|
|
[< inline >] SYSC_sendto net/socket.c:1797
|
|
[<ffffffc000cad270>] SyS_sendto+0x178/0x1d8 net/socket.c:1761
|
|
Memory state around the buggy address:
|
|
ffffffc071077c80: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 f1 f1
|
|
ffffffc071077d00: f1 f1 04 f4 f4 f4 f2 f2 f2 f2 04 f4 f4 f4 f2 f2
|
|
>ffffffc071077d80: f2 f2 00 00 f4 f4 f2 f2 f2 f2 00 00 00 00 00 00
|
|
^
|
|
ffffffc071077e00: 00 f4 f2 f2 f2 f2 00 00 00 00 00 00 00 00 00 00
|
|
ffffffc071077e80: 00 00 00 00 00 00 f3 f3 f3 f3 00 00 00 00 00 00
|
|
|
|
Bug: 31349935
|
|
Change-Id: Ib7385fc26dfe7e07e9bab42a10ff65a37cbaab54
|
|
Signed-off-by: Siqi Lin <siqilin@google.com>
|
|
---
|
|
net/ipv4/ping.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
|
|
index f8c8f60ad7e25..aaa70dd666674 100644
|
|
--- a/net/ipv4/ping.c
|
|
+++ b/net/ipv4/ping.c
|
|
@@ -651,7 +651,7 @@ int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
|
|
void *user_icmph, size_t icmph_len) {
|
|
u8 type, code;
|
|
|
|
- if (len > 0xFFFF)
|
|
+ if (len > 0xFFFF || len < icmph_len)
|
|
return -EMSGSIZE;
|
|
|
|
/*
|