All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Suraj Jitindar Singh" <surajjs@amazon.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH 6.12.y] xsk: cache csum_start/csum_offset to fix TOCTOU in xsk_skb_metadata()
Date: Thu, 03 Sep 2026 22:27:16 +0000	[thread overview]
Message-ID: <20260903222717.3FF6E1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260903221130.27316-1-surajjs@amazon.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

Pre-existing issues:
- [High] Premature checksum calculation for multi-buffer AF_XDP packets.
- [High] Incorrect error recovery on `-EOVERFLOW` leads to packet fragmentation and garbage transmission.
- [High] Integer overflow in `skb->csum_start` leads to negative checksum offset and memory corruption or IOMMU faults.
--

commit 82f4b9c7cad6fc646be8342f727421a308e35ec1
Author: Jason Xing <kernelxing@tencent.com>

xsk: cache csum_start/csum_offset to fix TOCTOU in xsk_skb_metadata()

This commit fixes a time-of-check to time-of-use vulnerability in the AF_XDP
transmit path by caching csum_start and csum_offset in local variables. This
ensures userspace cannot race to overwrite these values between bounds
validation and assignment, preventing potential memory corruption.

Closes: https://lore.kernel.org/all/20260503200927.73EA1C2BCB4@smtp.kernel.org/
Link: https://patch.msgid.link/20260530042630.80626-1-kerneljasonxing@gmail.com

> diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
> index da7e11e3bfad2..76675ce70f03d 100644
> --- a/net/xdp/xsk.c
> +++ b/net/xdp/xsk.c
[ ... ]
> @@ -733,15 +734,17 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
>  			}
>  
>  			if (meta->flags & XDP_TXMD_FLAGS_CHECKSUM) {
> -				if (unlikely(meta->request.csum_start +
> -					     meta->request.csum_offset +
> +				csum_start = READ_ONCE(meta->request.csum_start);
> +				csum_offset = READ_ONCE(meta->request.csum_offset);
> +
> +				if (unlikely(csum_start + csum_offset +
>  					     sizeof(__sum16) > len)) {
>  					err = -EINVAL;
>  					goto free_err;
>  				}
>  
> -				skb->csum_start = hr + meta->request.csum_start;
> -				skb->csum_offset = meta->request.csum_offset;
> +				skb->csum_start = hr + csum_start;

[Severity: High]
This is a pre-existing issue, but does this calculation overflow the 16-bit
skb->csum_start field?

On architectures with a 64KB page size, if userspace provides a csum_start
value close to 65535, adding hr (headroom, e.g., 64 bytes) could exceed the
16-bit maximum and silently wrap. Later, when skb_checksum_start_offset(skb)
subtracts the headroom, this could result in a negative offset, causing
out-of-bounds memory accesses into the headroom or hardware DMA faults.

> +				skb->csum_offset = csum_offset;
>  				skb->ip_summed = CHECKSUM_PARTIAL;
>  
>  				if (unlikely(xs->pool->tx_sw_csum)) {
>  					err = skb_checksum_help(skb);
>  					if (err)
>  						goto free_err;
>  				}
>  			}

[Severity: High]
This isn't a bug introduced by this patch, but does this compute the
software checksum prematurely for multi-buffer packets?

When a userspace application requests XDP_TXMD_FLAGS_CHECKSUM along with
tx_sw_csum for a multi-buffer packet, xsk_build_skb() appears to compute
the checksum over only the first fragment by calling skb_checksum_help().

Since subsequent payload fragments are added later, the final packet would
be transmitted with an invalid checksum covering only the first fragment,
leading to silent packet drops at the destination.

[ ... ]
>  free_err:
>  	if (first_frag && skb)
>  		kfree_skb(skb);
>  
>  	if (err == -EOVERFLOW) {
>  		/* Drop the packet */
>  		xsk_set_destructor_arg(xs->skb);
>  		xsk_drop_skb(xs->skb);
>  		xskq_cons_release(xs->tx);
>  	} else {

[Severity: High]
This is a pre-existing issue, but does the error recovery path for an
oversized multi-buffer packet desynchronize the transmission state machine?

If userspace sends a multi-buffer packet exceeding MAX_SKB_FRAGS, this path
correctly clears and drops xs->skb. However, because it doesn't signal the
caller to skip the remaining descriptors of the dropped packet, the next
descriptor (a middle or tail fragment) is processed with a NULL xs->skb.

Will this cause the fragment to be incorrectly treated as a new packet,
leading to raw payload fragments being transmitted as garbage?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260903221130.27316-1-surajjs@amazon.com?part=1

  reply	other threads:[~2026-09-03 22:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 22:11 [PATCH 6.12.y] xsk: cache csum_start/csum_offset to fix TOCTOU in xsk_skb_metadata() Suraj Jitindar Singh
2026-09-03 22:27 ` sashiko-bot [this message]
2026-09-06 13:32 ` Sasha Levin

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=20260903222717.3FF6E1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=surajjs@amazon.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.