[PATCH net] netfilter: check for out-of-bounds while copying compat entries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently, when coping ebt compat entries, no checks are in place
for the offsets provided by user space, so that syzbot was able to
trigger the following splat:

BUG: unable to handle kernel paging request at ffffc90001819e4f
IP: ebt_size_mwt net/bridge/netfilter/ebtables.c:2037 [inline]
IP: size_entry_mwt net/bridge/netfilter/ebtables.c:2122 [inline]
IP: compat_copy_entries+0x49f/0x1050 net/bridge/netfilter/ebtables.c:2160
PGD 1dad2f067 P4D 1dad2f067 PUD 1dad30067 PMD 1b2408067 PTE 0
Oops: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
    (ftrace buffer empty)
Modules linked in:
CPU: 1 PID: 4249 Comm: syz-executor0 Not tainted 4.16.0-rc3+ #248
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
Google 01/01/2011
RIP: 0010:ebt_size_mwt net/bridge/netfilter/ebtables.c:2037 [inline]
RIP: 0010:size_entry_mwt net/bridge/netfilter/ebtables.c:2122 [inline]
RIP: 0010:compat_copy_entries+0x49f/0x1050
net/bridge/netfilter/ebtables.c:2160
RSP: 0018:ffff8801b34bf7e8 EFLAGS: 00010246
RAX: 000000000000000a RBX: ffff8801b34bf9d4 RCX: ffffc90001819e4f
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff8801b34bf9d8
RBP: ffff8801b34bf968 R08: 0000000000000000 R09: 0000000000000000
R10: ffffffff88613340 R11: 0000000000000001 R12: 000000000000ee5f
R13: dffffc0000000000 R14: ffff8801b34bf9c8 R15: ffffc90001819e2f
FS:  0000000000000000(0000) GS:ffff8801db300000(0063) knlGS:00000000085b9900
CS:  0010 DS: 002b ES: 002b CR0: 0000000080050033
CR2: ffffc90001819e4f CR3: 00000001b2bd7003 CR4: 00000000001606e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
  compat_do_replace+0x398/0x7c0 net/bridge/netfilter/ebtables.c:2249
  compat_do_ebt_set_ctl+0x22a/0x2d0 net/bridge/netfilter/ebtables.c:2330
  compat_nf_sockopt net/netfilter/nf_sockopt.c:144 [inline]
  compat_nf_setsockopt+0x88/0x130 net/netfilter/nf_sockopt.c:156
  compat_ip_setsockopt+0x8b/0xd0 net/ipv4/ip_sockglue.c:1285
  inet_csk_compat_setsockopt+0x95/0x120 net/ipv4/inet_connection_sock.c:1041
  compat_tcp_setsockopt+0x3d/0x70 net/ipv4/tcp.c:2916
  compat_sock_common_setsockopt+0xb2/0x140 net/core/sock.c:2986
  C_SYSC_setsockopt net/compat.c:403 [inline]
  compat_SyS_setsockopt+0x17c/0x410 net/compat.c:386
  do_syscall_32_irqs_on arch/x86/entry/common.c:330 [inline]
  do_fast_syscall_32+0x3ec/0xf9f arch/x86/entry/common.c:392
  entry_SYSENTER_compat+0x70/0x7f arch/x86/entry/entry_64_compat.S:139
RIP: 0023:0xf7fbbc99
RSP: 002b:00000000ffd5ab8c EFLAGS: 00000286 ORIG_RAX: 000000000000016e
RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 0000000000000000
RDX: 0000000000000080 RSI: 0000000020000280 RDI: 0000000000000208
RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
Code: 8d 4f 20 48 89 c8 48 89 8d c8 fe ff ff 48 c1 e8 03 42 0f b6 14 28 48
89 c8 83 e0 07 83 c0 03 38 d0 7c 08 84 d2 0f 85 b2 0a 00 00 <45> 8b 67 20
44 39 a5 04 ff ff ff 0f 82 bd 08 00 00 e8 cb 52 56

This change addresses the issue, checking that the provided offset are
all inside the provided buffer.

Fixes: 81e675c227ec ("netfilter: ebtables: add CONFIG_COMPAT support")
Reported-and-tested-by: syzbot+5705ba91388d7bc30828@xxxxxxxxxxxxxxxxxxxxxxxxx
Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
---
 net/bridge/netfilter/ebtables.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 02c4b409d317..54ceaff701fb 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -2114,7 +2114,7 @@ static int size_entry_mwt(struct ebt_entry *entry, const unsigned char *base,
 		unsigned int size;
 		char *buf = buf_start + offsets[i];
 
-		if (offsets[i] > offsets[j])
+		if (offsets[i] > offsets[j] || offsets[j] > *total)
 			return -EINVAL;
 
 		match32 = (struct compat_ebt_entry_mwt *) buf;
-- 
2.14.3

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux