From: Simon Horman <horms@kernel.org>
To: tobgaertner <tob.gaertner@me.com>
Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org,
gregkh@linuxfoundation.org, oneukum@suse.com, bjorn@mork.no
Subject: Re: [PATCH] net: usb: cdc_ncm: add ndpoffset to nframes bounds check
Date: Mon, 2 Mar 2026 08:29:06 +0000 [thread overview]
Message-ID: <aaVKUp4pDjfo5EYm@horms.kernel.org> (raw)
In-Reply-To: <20260227072241.566212-1-tob.gaertner@me.com>
On Thu, Feb 26, 2026 at 11:22:41PM -0800, tobgaertner wrote:
> From: Tobi Gaertner <tob.gaertner@me.com>
>
> cdc_ncm_rx_verify_ndp16() and cdc_ncm_rx_verify_ndp32() validate that
> the NDP header and its DPE entries fit within the skb. The first check
> correctly accounts for ndpoffset:
>
> if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len)
>
> but the second check omits it:
>
> if ((sizeof(struct usb_cdc_ncm_ndp16) +
> ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len)
>
> This validates the DPE array size against the total skb length as if
> the NDP were at offset 0, rather than at ndpoffset. When the NDP is
> placed near the end of the NTB (large wNdpIndex), the DPE entries can
> extend past the skb data buffer even though the check passes.
> cdc_ncm_rx_fixup() then reads out-of-bounds memory when iterating
> the DPE array.
>
> Add ndpoffset to the nframes bounds check in both the NDP16 and NDP32
> verification functions.
>
> Found by coverage-guided fuzzing with QEMU system-mode emulation.
>
> Fixes: ff06ab13a4cc ("net: cdc_ncm: splitting rx_fixup for code reuse")
Hi Tobi,
I think the tag above covers the ndp16 case.
But that it would be appropriate to also have the following tag
for the ndp32 case.
Fixes: 0fa81b304a79 ("cdc_ncm: Implement the 32-bit version of NCM Transfer Block")
Which does make me lean towards a patchset with two patches.
> Signed-off-by: Tobi Gaertner <tob.gaertner@me.com>
> ---
> drivers/net/usb/cdc_ncm.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
> index 5d123df0a..39d2ad95d 100644
> --- a/drivers/net/usb/cdc_ncm.c
> +++ b/drivers/net/usb/cdc_ncm.c
> @@ -1675,7 +1675,7 @@ int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset)
> sizeof(struct usb_cdc_ncm_dpe16));
> ret--; /* we process NDP entries except for the last one */
>
> - if ((sizeof(struct usb_cdc_ncm_ndp16) +
> + if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16) +
> ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len) {
Perhaps out of scope for a strict bug fix. But I think this can be
expressed more succinctly using struct_size_t and fewer parentheses.
(compile tested only!)
if (ndpoffset + struct_size_t(struct usb_cdc_ncm_ndp16,
dpe16, ret) > skb_in->len) {
> netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
> ret = -EINVAL;
> @@ -1711,7 +1711,7 @@ int cdc_ncm_rx_verify_ndp32(struct sk_buff *skb_in, int ndpoffset)
> sizeof(struct usb_cdc_ncm_dpe32));
> ret--; /* we process NDP entries except for the last one */
>
> - if ((sizeof(struct usb_cdc_ncm_ndp32) +
> + if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp32) +
> ret * (sizeof(struct usb_cdc_ncm_dpe32))) > skb_in->len) {
Likewise here.
> netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
> ret = -EINVAL;
> --
> 2.43.0
>
>
prev parent reply other threads:[~2026-03-02 8:29 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-27 7:22 [PATCH] net: usb: cdc_ncm: add ndpoffset to nframes bounds check tobgaertner
2026-03-02 8:29 ` Simon Horman [this message]
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=aaVKUp4pDjfo5EYm@horms.kernel.org \
--to=horms@kernel.org \
--cc=bjorn@mork.no \
--cc=gregkh@linuxfoundation.org \
--cc=linux-usb@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=oneukum@suse.com \
--cc=tob.gaertner@me.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox