[Devel,RHEL7,COMMIT] ms/netfilter: nfnetlink: fix insufficient validation in nfnetlink_bind

Submitted by Konstantin Khorenko on Nov. 30, 2016, 11:46 a.m.

Details

Message ID 201611301146.uAUBkn4G010277@finist_cl7.x64_64.work.ct
State New
Series "Series without cover letter"
Headers show

Commit Message

Konstantin Khorenko Nov. 30, 2016, 11:46 a.m.
The commit is pushed to "branch-rh7-3.10.0-327.36.1.vz7.20.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.36.1.vz7.20.7
------>
commit b85636d3efa6837331e8846906f43c7206c0d925
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Wed Nov 30 15:46:49 2016 +0400

    ms/netfilter: nfnetlink: fix insufficient validation in nfnetlink_bind
    
    Make sure the netlink group exists, otherwise you can trigger an out
    of bound array memory access from the netlink_bind() path. This splat
    can only be triggered only by superuser.
    
    [  180.203600] UBSan: Undefined behaviour in ../net/netfilter/nfnetlink.c:467:28
    [  180.204249] index 9 is out of range for type 'int [9]'
    [  180.204697] CPU: 0 PID: 1771 Comm: trinity-main Not tainted 3.18.0-rc4-mm1+ #122
    [  180.205365] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org
    +04/01/2014
    [  180.206498]  0000000000000018 0000000000000000 0000000000000009 ffff88007bdf7da8
    [  180.207220]  ffffffff82b0ef5f 0000000000000092 ffffffff845ae2e0 ffff88007bdf7db8
    [  180.207887]  ffffffff8199e489 ffff88007bdf7e18 ffffffff8199ea22 0000003900000000
    [  180.208639] Call Trace:
    [  180.208857] dump_stack (lib/dump_stack.c:52)
    [  180.209370] ubsan_epilogue (lib/ubsan.c:174)
    [  180.209849] __ubsan_handle_out_of_bounds (lib/ubsan.c:400)
    [  180.210512] nfnetlink_bind (net/netfilter/nfnetlink.c:467)
    [  180.210986] netlink_bind (net/netlink/af_netlink.c:1483)
    [  180.211495] SYSC_bind (net/socket.c:1541)
    
    Moreover, define the missing nf_tables and nf_acct multicast groups too.
    
    Reported-by: Andrey Ryabinin <a.ryabinin@samsung.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    
    https://jira.sw.ru/browse/PSBM-54189
    
    upstream commit: 97840cb67ff5ac8add836684f011fd838518d698
    
    Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
    Acked-by: Andrei Vagin <avagin@openvz.org>
---
 net/netfilter/nfnetlink.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 81df6ce..d1f95f5 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -47,6 +47,7 @@  static const int nfnl_group2type[NFNLGRP_MAX+1] = {
 	[NFNLGRP_CONNTRACK_EXP_NEW]	= NFNL_SUBSYS_CTNETLINK_EXP,
 	[NFNLGRP_CONNTRACK_EXP_UPDATE]	= NFNL_SUBSYS_CTNETLINK_EXP,
 	[NFNLGRP_CONNTRACK_EXP_DESTROY] = NFNL_SUBSYS_CTNETLINK_EXP,
+	[NFNLGRP_NFTABLES]              = NFNL_SUBSYS_NFTABLES,
 };
 
 void nfnl_lock(__u8 subsys_id)
@@ -402,7 +403,12 @@  static void nfnetlink_rcv(struct sk_buff *skb)
 static int nfnetlink_bind(int group)
 {
 	const struct nfnetlink_subsystem *ss;
-	int type = nfnl_group2type[group];
+	int type;
+
+	if (group <= NFNLGRP_NONE || group > NFNLGRP_MAX)
+		return -EINVAL;
+
+	type = nfnl_group2type[group];
 
 	rcu_read_lock();
 	ss = nfnetlink_get_subsys(type);
@@ -452,6 +458,9 @@  static int __init nfnetlink_init(void)
 {
 	int i;
 
+	for (i = NFNLGRP_NONE + 1; i <= NFNLGRP_MAX; i++)
+		BUG_ON(nfnl_group2type[i] == NFNL_SUBSYS_NONE);
+
 	for (i=0; i<NFNL_SUBSYS_COUNT; i++)
 		mutex_init(&table[i].mutex);