Re: [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths
Nikolay Aleksandrov <[email protected]>
| Newsgroups | gmane.linux.network.bridge,gmane.linux.network,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
On 26/03/2026 05:44, 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: [email protected]
> Reported-by: Yifan Wu <[email protected]>
> Reported-by: Juefei Pu <[email protected]>
> Tested-by: Ao Zhou <[email protected]>
> Co-developed-by: Yuan Tan <[email protected]>
> Signed-off-by: Yuan Tan <[email protected]>
> Suggested-by: Xin Liu <[email protected]>
> Signed-off-by: Yang Yang <[email protected]>
> ---
> 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;
> }
> }
Acked-by: Nikolay Aleksandrov <[email protected]>