From: Ido Schimmel <idosch@nvidia.com>
To: Eric Dumazet <edumazet@google.com>
Cc: "David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Simon Horman <horms@kernel.org>,
netdev@vger.kernel.org, eric.dumazet@gmail.com,
syzbot+a35f9259d08f907c06e6@syzkaller.appspotmail.com,
Nikolay Aleksandrov <razor@blackwall.org>
Subject: Re: [PATCH net] net: bridge: prevent too big nested attributes in br_fill_linkxstats()
Date: Tue, 19 May 2026 20:15:01 +0300 [thread overview]
Message-ID: <20260519171501.GA520442@shredder> (raw)
In-Reply-To: <20260518130531.1015332-1-edumazet@google.com>
On Mon, May 18, 2026 at 01:05:31PM +0000, Eric Dumazet wrote:
> After commit ff205bf8c554 ("netlink: add one debug check in nla_nest_end()")
> syzbot found that br_fill_linkxstats() can send corrupted netlink packets.
>
> Make sure the nested attribute size is bounded.
>
> Fixes: a60c090361ea ("bridge: netlink: export per-vlan stats")
> Reported-by: syzbot+a35f9259d08f907c06e6@syzkaller.appspotmail.com
> Closes: https://lore.kernel.org/netdev/6a0b0da3.050a0220.175f0c.0000.GAE@google.com/
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> ---
> Cc: Nikolay Aleksandrov <razor@blackwall.org>
> Cc: Ido Schimmel <idosch@nvidia.com>
> ---
> net/bridge/br_netlink.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
> index 6fd5386a1d646542c184702e13cc2e6c8ee1820d..e15a08a34aeab2429b6c49c5a0ecab9b47582f06 100644
> --- a/net/bridge/br_netlink.c
> +++ b/net/bridge/br_netlink.c
> @@ -1827,6 +1827,7 @@ static int br_fill_linkxstats(struct sk_buff *skb,
> struct nlattr *nla __maybe_unused;
> struct net_bridge_port *p = NULL;
> struct net_bridge_vlan_group *vg;
> + unsigned int limit = U16_MAX;
> struct net_bridge_vlan *v;
> struct net_bridge *br;
> struct nlattr *nest;
> @@ -1841,6 +1842,7 @@ static int br_fill_linkxstats(struct sk_buff *skb,
> p = br_port_get_rtnl(dev);
> if (!p)
> return 0;
> + limit -= nla_total_size_64bit(sizeof(p->stp_xstats));
> br = p->br;
> vg = nbp_vlan_group(p);
> break;
> @@ -1855,6 +1857,9 @@ static int br_fill_linkxstats(struct sk_buff *skb,
> if (vg) {
> u16 pvid;
>
> + limit -= nla_total_size(sizeof(struct br_mcast_stats)) +
> + nla_total_size_64bit(sizeof(struct br_mcast_stats));
> +
> pvid = br_get_pvid(vg);
> list_for_each_entry(v, &vg->vlan_list, vlist) {
> struct bridge_vlan_xstats vxi;
> @@ -1862,6 +1867,10 @@ static int br_fill_linkxstats(struct sk_buff *skb,
>
> if (++vl_idx < *prividx)
> continue;
> +
> + if (skb_tail_pointer(skb) - (unsigned char *)nest >= limit)
> + goto nla_put_failure;
> +
> memset(&vxi, 0, sizeof(vxi));
> vxi.vid = v->vid;
> vxi.flags = v->flags;
Thanks for the patch. A few things:
1. I used [1] to reproduce the issue. I can confirm that without the
patch (but with ff205bf8c554) the warning is triggered.
2. After applying the fix we get a different warning [2] due to
EMSGSIZE. I believe the WARN_ON() in rtnl_stats_get() should be removed.
3. I am aware that the double accounting of the multicast stats makes
the patch correct, but it looks like a mistake. I find something like
[3] clearer (on top of your patch).
[1]
ip link add name br1 up type bridge vlan_filtering 1 vlan_default_pvid 0
ip link add name dummy1 up master br1 type dummy
for i in {1..4094}; do bridge vlan add vid $i dev dummy1; done
ip stats show dev dummy1
[2]
WARNING: net/core/rtnetlink.c:6332 at rtnl_stats_get+0x294/0x2c0, CPU#4: ip/4404
[3]
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index e15a08a34aea..eb1292d67f4d 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -1842,7 +1842,6 @@ static int br_fill_linkxstats(struct sk_buff *skb,
p = br_port_get_rtnl(dev);
if (!p)
return 0;
- limit -= nla_total_size_64bit(sizeof(p->stp_xstats));
br = p->br;
vg = nbp_vlan_group(p);
break;
@@ -1850,6 +1849,16 @@ static int br_fill_linkxstats(struct sk_buff *skb,
return -EINVAL;
}
+ /* Limit the amount of VLAN stats we put in a message so that both the
+ * inner nest (LINK_XSTATS_TYPE_BRIDGE) and the outer nest
+ * (IFLA_STATS_LINK_XSTATS{,_SLAVE}) will not overflow.
+ */
+ limit -= nla_total_size(0) + /* IFLA_STATS_LINK_XSTATS{,_SLAVE} */
+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
+ nla_total_size_64bit(sizeof(struct br_mcast_stats)) +
+#endif
+ (p ? nla_total_size_64bit(sizeof(p->stp_xstats)) : 0);
+
nest = nla_nest_start_noflag(skb, LINK_XSTATS_TYPE_BRIDGE);
if (!nest)
return -EMSGSIZE;
@@ -1857,9 +1866,6 @@ static int br_fill_linkxstats(struct sk_buff *skb,
if (vg) {
u16 pvid;
- limit -= nla_total_size(sizeof(struct br_mcast_stats)) +
- nla_total_size_64bit(sizeof(struct br_mcast_stats));
-
pvid = br_get_pvid(vg);
list_for_each_entry(v, &vg->vlan_list, vlist) {
struct bridge_vlan_xstats vxi;
@@ -1868,7 +1874,8 @@ static int br_fill_linkxstats(struct sk_buff *skb,
if (++vl_idx < *prividx)
continue;
- if (skb_tail_pointer(skb) - (unsigned char *)nest >= limit)
+ if (skb_tail_pointer(skb) - (unsigned char *)nest +
+ nla_total_size(sizeof(vxi)) >= limit)
goto nla_put_failure;
memset(&vxi, 0, sizeof(vxi));
next prev parent reply other threads:[~2026-05-19 17:15 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-18 13:05 [PATCH net] net: bridge: prevent too big nested attributes in br_fill_linkxstats() Eric Dumazet
2026-05-19 17:15 ` Ido Schimmel [this message]
2026-05-20 4:59 ` Eric Dumazet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260519171501.GA520442@shredder \
--to=idosch@nvidia.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eric.dumazet@gmail.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=razor@blackwall.org \
--cc=syzbot+a35f9259d08f907c06e6@syzkaller.appspotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.