From: Simon Horman <horms@kernel.org>
To: hexlabsecurity@proton.me
Cc: David Heidelberg <david@ixit.cz>,
Doruk Tan Ozturk <doruk@0sec.ai>,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
Robert Dolca <robert.dolca@intel.com>,
oe-linux-nfc@lists.linux.dev,
Samuel Ortiz <sameo@linux.intel.com>
Subject: Re: [PATCH v3] nfc: fdp: bound the device-reported read length and fix an skb leak
Date: Thu, 30 Jul 2026 14:36:47 +0100 [thread overview]
Message-ID: <20260730133647.GC51943@horms.kernel.org> (raw)
In-Reply-To: <20260724-b4-disp-e8ec6012-v3-1-3a6f3a2fee47@proton.me>
On Fri, Jul 24, 2026 at 06:22:55AM -0500, Bryam Vargas via B4 Relay wrote:
> From: Bryam Vargas <hexlabsecurity@proton.me>
>
> fdp_nci_i2c_read() takes the next packet length from two device-supplied
> bytes and never validates it. The value is a u16 used as the
> i2c_master_recv() count into a 261-byte on-stack buffer: a malicious,
> counterfeit or malfunctioning controller (or an i2c bus interposer) can
> drive it far past the buffer for a stack out-of-bounds write that
> clobbers the canary and return address, or below the minimum frame size
> (directly, or by truncating the computed sum) so the header/LRC strip
> and the next length read run past a short receive. Reject a length
> outside [FDP_NCI_I2C_MIN_PAYLOAD, FDP_NCI_I2C_MAX_PAYLOAD], as a
> corrupted packet already is, and force resynchronization.
>
> The same loop allocates one data skb per iteration and assumes a length
> packet followed by a data packet; a device that sends two data packets
> in one call leaks the first skb when the second allocation overwrites
> it. Free a previously allocated skb before allocating the next.
>
> Fixes: a06347c04c13 ("NFC: Add Intel Fields Peak NFC solution driver")
> Cc: stable@vger.kernel.org
> Suggested-by: Simon Horman <horms@kernel.org>
> Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
> ---
> v3:
> - Rebase on current net; no code change since v2. Doruk Tan Ozturk
> independently found the same missing bound (0sec,
> https://lore.kernel.org/all/20260720132133.69635-1-doruk@0sec.ai) and
> noted there that this v2 is the more complete fix -- it also rejects the
> sub-minimum length Simon flagged and closes the skb leak. Reposting now
> that the driver has an active maintainer.
> v2: https://lore.kernel.org/all/20260616-b4-disp-b1f8ab4c-v2-1-2d1fe5955325@proton.me
>
> v2:
> - Also reject next_read_size < FDP_NCI_I2C_MIN_PAYLOAD, not just
> > FDP_NCI_I2C_MAX_PAYLOAD (Simon Horman). The small value is reachable
> both directly (tmp[2] == 0 && tmp[3] < 2) and through the u16
> truncation of the computed sum (e.g. 0xff,0xff -> 65538 -> 2); a single
> range check on the stored value covers both, and also keeps the next
> length-field read from running on stale buffer bytes.
> - Fold in a fix for an skb leak in the same function (two data packets
> in one call overwrite and leak the first skb).
> v1: https://lore.kernel.org/all/20260615-b4-disp-f42dce2d-v1-1-186ff3dcbf37@proton.me
>
> Reproduced in-kernel on x86-64 (Linux 7.1.0-rc5, CONFIG_KASAN_STACK=y)
> with a faithful port of the read loop, and at full device magnitude with
> a userspace AddressSanitizer model:
>
> Stack OOB write
> A no bound, next_read_size 281 -> 20 B past tmp[261]:
> BUG: KASAN: stack-out-of-bounds in i2c_master_recv...
> Write of size 281 ... This frame has 1 object: [48, 309) 'tmp'
> B bounded to <= FDP_NCI_I2C_MAX_PAYLOAD: no KASAN report
> C well-formed (len 5): no KASAN report
> ASan model, full u16 next_read_size = 65535 -> 65274-byte
> stack-buffer-overflow WRITE on both -m32 and -m64; bounded build clean.
>
> skb leak (slabinfo active-object delta over 20000 reads, two data
> packets each, measured after a slab shrink)
> without the fix: skbuff_head_cache +20047, skbuff_small_head +20057
> (one orphaned skb per call, unreclaimable)
> with the fix: ~0
Reviewed-by: Simon Horman <horms@kernel.org>
prev parent reply other threads:[~2026-07-30 13:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-24 11:22 [PATCH v3] nfc: fdp: bound the device-reported read length and fix an skb leak Bryam Vargas via B4 Relay
2026-07-24 11:22 ` Bryam Vargas
2026-07-30 13:36 ` 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=20260730133647.GC51943@horms.kernel.org \
--to=horms@kernel.org \
--cc=david@ixit.cz \
--cc=doruk@0sec.ai \
--cc=hexlabsecurity@proton.me \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=oe-linux-nfc@lists.linux.dev \
--cc=robert.dolca@intel.com \
--cc=sameo@linux.intel.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.