[Devel,3/3] netfilter: nfnetlink: fix insufficient validation in nfnetlink_bind

Submitted by Igor Redko on Oct. 25, 2016, 1:33 p.m.

Details

Message ID 1477402406-843859-3-git-send-email-redkoi@virtuozzo.com
State New
Series "Series without cover letter"
Headers show

Commit Message

Igor Redko Oct. 25, 2016, 1:33 p.m.
From: Pablo Neira Ayuso <pablo@netfilter.org>

PSBM-54189
upstream: 97840cb67ff5ac8add836684f011fd838518d698

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>
Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
---
 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);
 

Comments

Igor Redko Nov. 28, 2016, 3:29 p.m.
On 25.10.2016 16:33, Igor Redko wrote:
> From: Pablo Neira Ayuso <pablo@netfilter.org>
>
> PSBM-54189
Changed from upstream commit:
- drop NFNLGRP_ACCT_QUOTA type since we didn't backport it
> upstream: 97840cb67ff5ac8add836684f011fd838518d698
>
> 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>
> Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
> ---
>  net/netfilter/nfnetlink.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> 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,
from original patch was dropped string
+       [NFNLGRP_ACCT_QUOTA]            = NFNL_SUBSYS_ACCT,
since we doesn't backport this type.
BUG_ON was triggered when I by accident also dropped NFNLGRP_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);
>
>
Sorry for misleading comment in Jira(
Andrey Vagin Nov. 28, 2016, 8:07 p.m.
On Mon, Nov 28, 2016 at 06:29:54PM +0300, Igor Redko wrote:
> On 25.10.2016 16:33, Igor Redko wrote:
> > From: Pablo Neira Ayuso <pablo@netfilter.org>
> > 
> > PSBM-54189
> Changed from upstream commit:
> - drop NFNLGRP_ACCT_QUOTA type since we didn't backport it
> > upstream: 97840cb67ff5ac8add836684f011fd838518d698
> > 
> > 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.
> >

Acked-by: Andrei Vagin <avagin@openvz.org>

> > Reported-by: Andrey Ryabinin <a.ryabinin@samsung.com>
> > Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> > Signed-off-by: Igor Redko <redkoi@virtuozzo.com>
> > ---
> >  net/netfilter/nfnetlink.c | 11 ++++++++++-
> >  1 file changed, 10 insertions(+), 1 deletion(-)
> > 
> > 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,
> from original patch was dropped string
> +       [NFNLGRP_ACCT_QUOTA]            = NFNL_SUBSYS_ACCT,
> since we doesn't backport this type.
> BUG_ON was triggered when I by accident also dropped NFNLGRP_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);
> > 
> > 
> Sorry for misleading comment in Jira(
> _______________________________________________
> Devel mailing list
> Devel@openvz.org
> https://lists.openvz.org/mailman/listinfo/devel