Skip to content

Commit

Permalink
ipv6: addrconf: validate new MTU before applying it
Browse files Browse the repository at this point in the history
Currently we don't check if the new MTU is valid or not and this allows
one to configure a smaller than minimum allowed by RFCs or even bigger
than interface own MTU, which is a problem as it may lead to packet
drops.

If you have a daemon like NetworkManager running, this may be exploited
by remote attackers by forging RA packets with an invalid MTU, possibly
leading to a DoS. (NetworkManager currently only validates for values
too small, but not for too big ones.)

The fix is just to make sure the new value is valid. That is, between
IPV6_MIN_MTU and interface's MTU.

Note that similar check is already performed at
ndisc_router_discovery(), for when kernel itself parses the RA.

Change-Id: I6b70d0c12a77c7932066982f8797d8024f130d7c
Signed-off-by: Marcelo Ricardo Leitner <[email protected]>
Signed-off-by: Sabrina Dubroca <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
Signed-off-by: franciscofranco <[email protected]>
  • Loading branch information
marceloleitner authored and franciscofranco committed Oct 6, 2016
1 parent d832421 commit ce0bdf3
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion net/ipv6/addrconf.c
Original file line number Diff line number Diff line change
Expand Up @@ -4747,6 +4747,21 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write,
return ret;
}

static
int addrconf_sysctl_mtu(struct ctl_table *ctl, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
struct inet6_dev *idev = ctl->extra1;
int min_mtu = IPV6_MIN_MTU;
struct ctl_table lctl;

lctl = *ctl;
lctl.extra1 = &min_mtu;
lctl.extra2 = idev ? &idev->dev->mtu : NULL;

return proc_dointvec_minmax(&lctl, write, buffer, lenp, ppos);
}

static void dev_disable_change(struct inet6_dev *idev)
{
if (!idev || !idev->dev)
Expand Down Expand Up @@ -4855,7 +4870,7 @@ static struct addrconf_sysctl_table
.data = &ipv6_devconf.mtu6,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
.proc_handler = addrconf_sysctl_mtu,
},
{
.procname = "accept_ra",
Expand Down

0 comments on commit ce0bdf3

Please sign in to comment.