linux/drivers/nfc
Doruk Tan Ozturk 2c1ad291f4 nfc: st21nfca: validate ATR_REQ length against the received frame
commit 5cdcca5d62 upstream.

st21nfca_tm_recv_atr_req() checks that the received ATR_REQ frame is at
least ST21NFCA_ATR_REQ_MIN_SIZE and that the self-declared atr_req->length
is at least sizeof(struct st21nfca_atr_req), but never checks that
atr_req->length does not exceed the actual received length (skb->len).

st21nfca_tm_send_atr_res() then trusts the declared length:

	gb_len = atr_req->length - sizeof(struct st21nfca_atr_req);
	...
	memcpy(atr_res->gbi, atr_req->gbi, gb_len);

so an RF peer that sends a short frame but sets atr_req->length larger
than the frame makes gb_len exceed the general bytes actually present,
and the memcpy reads out of bounds past the received skb. Those bytes are
placed in the ATR_RES and sent back to the peer (kernel-memory disclosure
to a proximity attacker); a larger declared length is an out-of-bounds
read (DoS).

Reject frames whose declared length exceeds the received length. The
adjacent nfc_tm_activated() path in the same function already derives its
general-bytes length from skb->len rather than the declared field.

Found by 0sec (https://0sec.ai) using automated source analysis; the
missing bound is evident from source. Compile-tested.

Fixes: 1892bf844e ("NFC: st21nfca: Adding P2P support to st21nfca in Initiator & Target mode")
Cc: stable@vger.kernel.org
Assisted-by: 0sec:claude-opus-4-8
Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260711071301.58071-1-doruk@0sec.ai
Signed-off-by: David Heidelberg <david@ixit.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-08-27 14:28:20 +02:00
..
fdp nfc: fdp: bound the device-reported read length and fix an skb leak 2026-08-27 14:28:20 +02:00
microread nfc: microread: validate target discovery payload lengths 2026-08-27 14:28:20 +02:00
nfcmrvl nfc: nfcmrvl: Fix potential memory leak in nfcmrvl_i2c_nci_send() 2022-11-10 18:15:28 +01:00
nxp-nci nfc: nxp-nci: i2c: use rising-edge IRQ on ACPI systems 2026-06-19 13:33:22 +02:00
pn533 nfc: pn533: purge fragmented skbs during cleanup 2026-08-27 14:28:20 +02:00
pn544 minmax: make generic MIN() and MAX() macros available everywhere 2025-10-19 16:21:52 +02:00
s3fwrn5 nfc: s3fwrn5: allocate rx skb before consuming bytes 2026-06-01 17:35:02 +02:00
st-nci nfc: st-nci: Fix use after free bug in ndlc_remove due to race condition 2023-03-22 13:31:26 +01:00
st21nfca nfc: st21nfca: validate ATR_REQ length against the received frame 2026-08-27 14:28:20 +02:00
st95hf nfc: st95hf: Make spi remove() callback return zero 2021-10-20 14:41:20 +01:00
Kconfig nfc: Add a virtual nci device driver 2021-01-29 18:03:33 -08:00
Makefile nfc: Add a virtual nci device driver 2021-01-29 18:03:33 -08:00
mei_phy.c nfc: mei_phy: constify buffer passed to mei_nfc_send() 2021-07-29 12:28:02 +01:00
mei_phy.h nfc: constify nfc_phy_ops 2021-07-25 09:21:21 +01:00
nfcsim.c nfcsim.c: Fix error checking for debugfs_create_dir 2023-06-28 10:29:51 +02:00
port100.c NFC: port100: fix use-after-free in port100_send_complete 2022-03-16 14:23:39 +01:00
trf7970a.c NFC: trf7970a: Ignore antenna noise when checking for RF field 2026-06-01 17:35:42 +02:00
virtual_ncidev.c Revert "nfc/nci: Add the inconsistency check between the input data length and count" 2026-02-06 16:41:53 +01:00