Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964856AbcK3KYg (ORCPT ); Wed, 30 Nov 2016 05:24:36 -0500 Received: from mx2.suse.de ([195.135.220.15]:45822 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755920AbcK3KY1 (ORCPT ); Wed, 30 Nov 2016 05:24:27 -0500 Date: Wed, 30 Nov 2016 11:24:24 +0100 From: Michal Kubecek To: Jon Maloy , Ying Xue Cc: "David S. Miller" , tipc-discussion@lists.sourceforge.net, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Ben Hutchings , Qian Zhang Subject: Re: [PATCH net] tipc: check minimum bearer MTU Message-ID: <20161130102424.GC19119@unicorn.suse.cz> References: <20161130095702.DD033A0F14@unicorn.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20161130095702.DD033A0F14@unicorn.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1491 Lines: 38 On Wed, Nov 30, 2016 at 10:57:02AM +0100, Michal Kubecek wrote: > Qian Zhang (张谦) reported a potential socket buffer overflow in > tipc_msg_build() which is also known as CVE-2016-8632: due to > insufficient checks, a buffer overflow can occur if MTU is too short for > even tipc headers. As anyone can set device MTU in a user/net namespace, > this issue can be abused by a regular user. > > As agreed in the discussion on Ben Hutchings' original patch, we should > check the MTU at the moment a bearer is attached rather than for each > processed packet. We also need to repeat the check when bearer MTU is > adjusted to new device MTU. UDP case also needs a check to avoid > overflow when calculating bearer MTU. > > Fixes: b97bf3fd8f6a ("[TIPC] Initial merge") > Signed-off-by: Michal Kubecek > Reported-by: Qian Zhang (张谦) Self-NACK. Im sorry, while testing this, I overlooked that an attempt to change MTU of an underlying device to low value issues a warning but it succeeds anyway. > @@ -624,6 +626,9 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt, > tipc_reset_bearer(net, b); > break; > case NETDEV_CHANGEMTU: > + if (tipc_check_mtu(dev, 0)) > + return -EINVAL; > + b->mtu = dev->mtu; > tipc_reset_bearer(net, b); > break; > case NETDEV_CHANGEADDR: This is a notifier so that error value needs to be encoded into notifier error. I'll send v2 after retesting Michal Kubecek