* [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths
@ 2026-03-26 3:44 Yang Yang
2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, razor, idosch
Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb,
netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98,
bird, n05ec
Hi,
This series hardens ND option parsing in bridge and vxlan paths.
Patch 1 linearizes the request skb in br_nd_send() before walking ND
options. Patch 2 adds explicit ND option length validation in
br_nd_send(). Patch 3 adds matching ND option length validation in
vxlan_na_create().
Thanks.
Yang Yang (3):
bridge: br_nd_send: linearize skb before parsing ND options
bridge: br_nd_send: validate ND option lengths
vxlan: validate ND option lengths in vxlan_na_create
drivers/net/vxlan/vxlan_core.c | 6 ++++--
net/bridge/br_arp_nd_proxy.c | 18 +++++++++++-------
2 files changed, 15 insertions(+), 9 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options
2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang
@ 2026-03-26 3:44 ` Yang Yang
2026-03-26 16:29 ` Ido Schimmel
2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang
2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang
2 siblings, 1 reply; 7+ messages in thread
From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, razor, idosch
Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb,
netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98,
bird, n05ec
br_nd_send() parses neighbour discovery options from ns->opt[] and
assumes that these options are in the linear part of request.
Its callers only guarantee that the ICMPv6 header and target address
are available, so the option area can still be non-linear. Parsing
ns->opt[] in that case can access data past the linear buffer.
Linearize request before option parsing and derive ns from the linear
network header.
Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports")
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Tested-by: Ao Zhou <n05ec@lzu.edu.cn>
Co-developed-by: Yuan Tan <tanyuan98@outlook.com>
Signed-off-by: Yuan Tan <tanyuan98@outlook.com>
Suggested-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
---
net/bridge/br_arp_nd_proxy.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c
index 1e2b51769eec8..af3d1e33f50b8 100644
--- a/net/bridge/br_arp_nd_proxy.c
+++ b/net/bridge/br_arp_nd_proxy.c
@@ -251,12 +251,12 @@ struct nd_msg *br_is_nd_neigh_msg(const struct sk_buff *skb, struct nd_msg *msg)
static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
struct sk_buff *request, struct neighbour *n,
- __be16 vlan_proto, u16 vlan_tci, struct nd_msg *ns)
+ __be16 vlan_proto, u16 vlan_tci)
{
struct net_device *dev = request->dev;
struct net_bridge_vlan_group *vg;
+ struct nd_msg *na, *ns;
struct sk_buff *reply;
- struct nd_msg *na;
struct ipv6hdr *pip6;
int na_olen = 8; /* opt hdr + ETH_ALEN for target */
int ns_olen;
@@ -264,7 +264,7 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
u8 *daddr;
u16 pvid;
- if (!dev)
+ if (!dev || skb_linearize(request))
return;
len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr) +
@@ -281,6 +281,8 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
skb_set_mac_header(reply, 0);
daddr = eth_hdr(request)->h_source;
+ ns = (struct nd_msg *)(skb_network_header(request) +
+ sizeof(struct ipv6hdr));
/* Do we need option processing ? */
ns_olen = request->len - (skb_network_offset(request) +
@@ -472,9 +474,9 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
if (vid != 0)
br_nd_send(br, p, skb, n,
skb->vlan_proto,
- skb_vlan_tag_get(skb), msg);
+ skb_vlan_tag_get(skb));
else
- br_nd_send(br, p, skb, n, 0, 0, msg);
+ br_nd_send(br, p, skb, n, 0, 0);
replied = true;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths
2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang
2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang
@ 2026-03-26 3:44 ` Yang Yang
2026-03-26 16:30 ` Ido Schimmel
2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang
2 siblings, 1 reply; 7+ messages in thread
From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, razor, idosch
Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb,
netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98,
bird, n05ec
br_nd_send() walks ND options according to option-provided lengths.
A malformed option can make the parser advance beyond the computed
option span or use a too-short source LLADDR option payload.
Validate option lengths against the remaining NS option area before
advancing, and only read source LLADDR when the option is large enough
for an Ethernet address.
Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports")
Cc: stable@vger.kernel.org
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Tested-by: Ao Zhou <n05ec@lzu.edu.cn>
Co-developed-by: Yuan Tan <tanyuan98@outlook.com>
Signed-off-by: Yuan Tan <tanyuan98@outlook.com>
Suggested-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
---
net/bridge/br_arp_nd_proxy.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c
index af3d1e33f50b8..6b5595868a39c 100644
--- a/net/bridge/br_arp_nd_proxy.c
+++ b/net/bridge/br_arp_nd_proxy.c
@@ -288,12 +288,14 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
ns_olen = request->len - (skb_network_offset(request) +
sizeof(struct ipv6hdr)) - sizeof(*ns);
for (i = 0; i < ns_olen - 1; i += (ns->opt[i + 1] << 3)) {
- if (!ns->opt[i + 1]) {
+ if (!ns->opt[i + 1] || i + (ns->opt[i + 1] << 3) > ns_olen) {
kfree_skb(reply);
return;
}
if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) {
- daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
+ if ((ns->opt[i + 1] << 3) >=
+ sizeof(struct nd_opt_hdr) + ETH_ALEN)
+ daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
break;
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create
2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang
2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang
2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang
@ 2026-03-26 3:44 ` Yang Yang
2026-03-26 16:30 ` Ido Schimmel
2 siblings, 1 reply; 7+ messages in thread
From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, razor, idosch
Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb,
netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98,
bird, n05ec
vxlan_na_create() walks ND options according to option-provided
lengths. A malformed option can make the parser advance beyond the
computed option span or use a too-short source LLADDR option payload.
Validate option lengths against the remaining NS option area before
advancing, and only read source LLADDR when the option is large enough
for an Ethernet address.
Fixes: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()")
Cc: stable@vger.kernel.org
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Tested-by: Ao Zhou <n05ec@lzu.edu.cn>
Co-developed-by: Yuan Tan <tanyuan98@outlook.com>
Signed-off-by: Yuan Tan <tanyuan98@outlook.com>
Suggested-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
---
drivers/net/vxlan/vxlan_core.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 17c941aac32db..a94ac82a61364 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -1965,12 +1965,14 @@ static struct sk_buff *vxlan_na_create(struct sk_buff *request,
ns_olen = request->len - skb_network_offset(request) -
sizeof(struct ipv6hdr) - sizeof(*ns);
for (i = 0; i < ns_olen-1; i += (ns->opt[i+1]<<3)) {
- if (!ns->opt[i + 1]) {
+ if (!ns->opt[i + 1] || i + (ns->opt[i + 1] << 3) > ns_olen) {
kfree_skb(reply);
return NULL;
}
if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) {
- daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
+ if ((ns->opt[i + 1] << 3) >=
+ sizeof(struct nd_opt_hdr) + ETH_ALEN)
+ daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
break;
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options
2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang
@ 2026-03-26 16:29 ` Ido Schimmel
0 siblings, 0 replies; 7+ messages in thread
From: Ido Schimmel @ 2026-03-26 16:29 UTC (permalink / raw)
To: Yang Yang
Cc: davem, edumazet, kuba, pabeni, razor, andrew+netdev, horms,
florian.fainelli, roopa, dlstevens, nb, netdev, bridge,
linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird
On Thu, Mar 26, 2026 at 03:44:39AM +0000, Yang Yang wrote:
> br_nd_send() parses neighbour discovery options from ns->opt[] and
> assumes that these options are in the linear part of request.
>
> Its callers only guarantee that the ICMPv6 header and target address
> are available, so the option area can still be non-linear. Parsing
> ns->opt[] in that case can access data past the linear buffer.
>
> Linearize request before option parsing and derive ns from the linear
> network header.
>
> Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports")
> Reported-by: Yifan Wu <yifanwucs@gmail.com>
> Reported-by: Juefei Pu <tomapufckgml@gmail.com>
> Tested-by: Ao Zhou <n05ec@lzu.edu.cn>
> Co-developed-by: Yuan Tan <tanyuan98@outlook.com>
> Signed-off-by: Yuan Tan <tanyuan98@outlook.com>
> Suggested-by: Xin Liu <bird@lzu.edu.cn>
> Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths
2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang
@ 2026-03-26 16:30 ` Ido Schimmel
0 siblings, 0 replies; 7+ messages in thread
From: Ido Schimmel @ 2026-03-26 16:30 UTC (permalink / raw)
To: Yang Yang
Cc: davem, edumazet, kuba, pabeni, razor, andrew+netdev, horms,
florian.fainelli, roopa, dlstevens, nb, netdev, bridge,
linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird
On Thu, Mar 26, 2026 at 03:44:40AM +0000, Yang Yang wrote:
> br_nd_send() walks ND options according to option-provided lengths.
> A malformed option can make the parser advance beyond the computed
> option span or use a too-short source LLADDR option payload.
>
> Validate option lengths against the remaining NS option area before
> advancing, and only read source LLADDR when the option is large enough
> for an Ethernet address.
>
> Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports")
> Cc: stable@vger.kernel.org
> Reported-by: Yifan Wu <yifanwucs@gmail.com>
> Reported-by: Juefei Pu <tomapufckgml@gmail.com>
> Tested-by: Ao Zhou <n05ec@lzu.edu.cn>
> Co-developed-by: Yuan Tan <tanyuan98@outlook.com>
> Signed-off-by: Yuan Tan <tanyuan98@outlook.com>
> Suggested-by: Xin Liu <bird@lzu.edu.cn>
> Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
The AI review [1] is correct that the length check for the
ND_OPT_SOURCE_LL_ADDR option is not strictly necessary, but it makes it
clear that the access is valid and it's harmless.
The other comment is about another existing issue in the code, but it's
less severe and shouldn't delay this patch.
[1] https://sashiko.dev/#/patchset/20260326034441.2037420-1-n05ec%40lzu.edu.cn
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create
2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang
@ 2026-03-26 16:30 ` Ido Schimmel
0 siblings, 0 replies; 7+ messages in thread
From: Ido Schimmel @ 2026-03-26 16:30 UTC (permalink / raw)
To: Yang Yang
Cc: davem, edumazet, kuba, pabeni, razor, andrew+netdev, horms,
florian.fainelli, roopa, dlstevens, nb, netdev, bridge,
linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird
On Thu, Mar 26, 2026 at 03:44:41AM +0000, Yang Yang wrote:
> vxlan_na_create() walks ND options according to option-provided
> lengths. A malformed option can make the parser advance beyond the
> computed option span or use a too-short source LLADDR option payload.
>
> Validate option lengths against the remaining NS option area before
> advancing, and only read source LLADDR when the option is large enough
> for an Ethernet address.
>
> Fixes: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()")
> Cc: stable@vger.kernel.org
> Reported-by: Yifan Wu <yifanwucs@gmail.com>
> Reported-by: Juefei Pu <tomapufckgml@gmail.com>
> Tested-by: Ao Zhou <n05ec@lzu.edu.cn>
> Co-developed-by: Yuan Tan <tanyuan98@outlook.com>
> Signed-off-by: Yuan Tan <tanyuan98@outlook.com>
> Suggested-by: Xin Liu <bird@lzu.edu.cn>
> Signed-off-by: Yang Yang <n05ec@lzu.edu.cn>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-03-26 16:30 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang
2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang
2026-03-26 16:29 ` Ido Schimmel
2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang
2026-03-26 16:30 ` Ido Schimmel
2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang
2026-03-26 16:30 ` Ido Schimmel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox