PT-2026-90198 · Linux · Linux

CVE-2026-89482

·

Published

2026-09-11

·

Updated

2026-09-11

None

No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
nvme-tcp: do not accept C2HData based on blk rq payload bytes() alone
Commit 25e5cb780e62 ("nvme-tcp: fix possible crash in write zeroes processing") established that blk rq payload bytes() must not be read without first checking blk rq nr phys segments(), and recorded the result in nvme tcp setup cmd pdu() as req->data len. The receive side was left as it was.
The two differ for REQ OP WRITE ZEROES, which has no physical segments but a non-zero blk rq bytes(), so setup leaves req->iter untouched while the receive gate lets a C2HData through and nvme tcp recv data() copies into whatever the previous command on that tag left there. The driver-private area is zeroed only when the tag set is allocated.
Reproduced with a test target that leaves a residual iterator on a tag and then sends a C2HData for a WRITE ZEROES command on the same tag:
BUG: KASAN: wild-memory-access in copy to iter+0x642/0x1330 Write of size 512 at addr ffe728c2175dfa81 by task kworker/0:1H/103
CPU: 0 UID: 0 PID: 103 Comm: kworker/0:1H Not tainted 7.2.0-rc5-NVMETCP-gf5098b6bae76 #1 PREEMPT(lazy) Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 Workqueue: nvme tcp wq nvme tcp io work Call Trace: dump stack lvl+0x53/0x70 kasan report+0xce/0x100 ? copy to iter+0x642/0x1330 kasan check range+0x105/0x1b0 asan memcpy+0x3c/0x60 copy to iter+0x642/0x1330 ? pfx sock has perm+0x10/0x10 ? worker thread+0x45b/0xd10 ? pfx copy to iter+0x10/0x10 ? raw spin lock bh+0x83/0xe0 ? pfx raw spin lock bh+0x10/0x10 skb datagram iter+0xf3/0x820 ? pfx simple copy to iter+0x10/0x10 ? asan memcpy+0x3c/0x60 ? skb copy bits+0x58d/0x830 skb copy datagram iter+0x37/0x120 nvme tcp recv skb+0xa07/0x4320 ? pfx nvme tcp recv skb+0x10/0x10 tcp read sock+0x1ab/0x810 ? pfx nvme tcp recv skb+0x10/0x10 ? pfx lock sock nested+0x10/0x10 ? pfx tcp read sock+0x10/0x10 nvme tcp try recv+0x152/0x1e0 ? pfx nvme tcp try recv+0x10/0x10 ? pfx mutex unlock+0x10/0x10 nvme tcp io work+0x1e4/0x6c0 ? schedule+0x181a/0x49f0 ? pfx nvme tcp io work+0x10/0x10 process one work+0x633/0x1030
Keep the blk rq payload bytes() test and add req->data len to it. The old test is what rejects a C2HData naming a tag that is no longer in flight, because blk update request() zeroes rq-> data len on completion; req->data len and req->curr bio are driver-private and survive completion, so they cannot stand in for it. Setup initialises the iterator only when both req->curr bio and req->data len are set, so the gate now tests the same two.
Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

CVE-2026-89482

Affected Products

Linux