Netdev List
 help / color / mirror / Atom feed
From: Simon Horman <horms@kernel.org>
To: yun.zhou@windriver.com
Cc: 'Simon Horman' <horms@kernel.org>,
	david+nfc@ixit.cz, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, bongsu.jeon@samsung.com,
	oe-linux-nfc@lists.linux.dev, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] nfc: nci: fix use of uninitialized memory in CORE_INIT_RSP parsing
Date: Tue, 26 May 2026 20:07:30 +0100	[thread overview]
Message-ID: <20260526190728.2294767-3-horms@kernel.org> (raw)
In-Reply-To: <20260522021326.1164807-1-yun.zhou@windriver.com>

From: 'Simon Horman' <horms@kernel.org>

This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://sashiko.dev
---
nfc: nci: fix use of uninitialized memory in CORE_INIT_RSP parsing

This commit adds bounds checking to nci_core_init_rsp_packet_v1() and
nci_core_init_rsp_packet_v2() to prevent reads of uninitialized memory
when parsing malformed CORE_INIT_RSP packets.

Link: https://syzkaller.appspot.com/bug?extid=46ca2592193f2fb3debc

> diff --git a/net/nfc/nci/rsp.c b/net/nfc/nci/rsp.c
> index 9eeb862825c5f..61fbe31b427eb 100644
> --- a/net/nfc/nci/rsp.c
> +++ b/net/nfc/nci/rsp.c
> @@ -50,11 +50,19 @@ static u8 nci_core_init_rsp_packet_v1(struct nci_dev *ndev,
[ ... ]
>  	ndev->nfcc_features = __le32_to_cpu(rsp_1->nfcc_features);
>  	ndev->num_supported_rf_interfaces = rsp_1->num_supported_rf_interfaces;
>  
>  	ndev->num_supported_rf_interfaces =
>  		min((int)ndev->num_supported_rf_interfaces,
>  		    NCI_MAX_SUPPORTED_RF_INTERFACES);
>  
> +	if (skb->len < sizeof(*rsp_1) + rsp_1->num_supported_rf_interfaces +
> +		       sizeof(*rsp_2))
> +		return NCI_STATUS_SYNTAX_ERROR;

Simon says: As noted, the issue flagged below pre-dates this patch.
	    I do not suggest increasing the scope of this patchset for
	    this.  But you may want to look at it in the context of
	    follow-up.

[Severity: High]
This isn't a bug introduced by this patch, but does temporarily updating
ndev->num_supported_rf_interfaces without holding ndev->req_lock create a
TOCTOU race?

The nci_core_init_rsp_packet_v1() function is processed asynchronously in
nci_rx_work(), temporarily setting ndev->num_supported_rf_interfaces to
the unclamped value from the packet before it is clamped to
NCI_MAX_SUPPORTED_RF_INTERFACES.

Concurrently, if a thread executing nci_init_complete_req() iterates over
ndev->supported_rf_interfaces using ndev->num_supported_rf_interfaces as
the limit, could it read past the bounds of the 4-element array?

Simon says: On the other hand, the issue flagged below seems to have
            been introduced by this patch and I'd appreciate it if
	    you could look over it.

Additionally, if the new length validation check returns early with
NCI_STATUS_SYNTAX_ERROR, doesn't it leave ndev->num_supported_rf_interfaces
updated but the array contents uninitialized, causing further state
corruption?

>  	memcpy(ndev->supported_rf_interfaces,
>  	       rsp_1->supported_rf_interfaces,
>  	       ndev->num_supported_rf_interfaces);
[ ... ]
> @@ -87,15 +99,26 @@ static u8 nci_core_init_rsp_packet_v2(struct nci_dev *ndev,
>  				      const struct sk_buff *skb)
>  {
>  	const struct nci_core_init_rsp_nci_ver2 *rsp = (void *)skb->data;
> -	const u8 *supported_rf_interface = rsp->supported_rf_interfaces;
> +	const u8 *supported_rf_interface;
> +	const u8 *skb_end = skb->data + skb->len;

Simon says: I believe the issue described below is a non-issue
            because I think that skbs are always linear in this context.

[Severity: Medium]
Does using skb->len to compute skb_end assume SKBs are strictly linear?

The skb->len field represents the total packet length, including any paged
fragments. If the SKB is nonlinear, skb_end will point past the end of the
linear buffer allocation.

Iterating through *supported_rf_interface++ up to skb_end could result in
out-of-bounds memory reads.

Could we use skb_tail_pointer() or pskb_may_pull() to guarantee contiguous
bytes in the linear region?

[ ... ]

Simon says: Like the first issue, I believe this one is pre-existing,
            should not effect the progress of this patch, but could
	    be looked at in the context of follow-up.

[Severity: High]
This is a pre-existing issue, but does lockless iteration and concurrent
modification of ndev->conn_info_list lead to linked list corruption and
use-after-free?

The ndev->conn_info_list is iterated locklessly by functions like
nci_get_conn_info_by_conn_id() (called from nci_tx_work()) and
nci_get_conn_info_by_dest_type_params() (called from nci_nfcc_loopback()).

Concurrently, nci_rx_work() can process an injected
NCI_OP_CORE_CONN_CLOSE_RSP packet via nci_core_conn_close_rsp_packet(),
which directly calls list_del() and devm_kfree() on the connection object
without acquiring any synchronization locks.

Because tx_work and rx_work operate on independent workqueues, couldn't an
injected packet free the object while it is actively being iterated by
another CPU, resulting in a use-after-free read and linked list corruption?

      reply	other threads:[~2026-05-26 19:12 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-22  2:13 [PATCH v2] nfc: nci: fix use of uninitialized memory in CORE_INIT_RSP parsing Yun Zhou
2026-05-26 19:07 ` 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=20260526190728.2294767-3-horms@kernel.org \
    --to=horms@kernel.org \
    --cc=bongsu.jeon@samsung.com \
    --cc=davem@davemloft.net \
    --cc=david+nfc@ixit.cz \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=oe-linux-nfc@lists.linux.dev \
    --cc=pabeni@redhat.com \
    --cc=yun.zhou@windriver.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