CVE-2026-81003: net/iucv: filter frames in afiucv_hs_rcv() by ingress device
In the Linux kernel, the following vulnerability has been resolved:
net/iucv: filter frames in afiucvhsrcv() by ingress device
afiucvhsrcv() selects a socket from iucvsklist by matching four 8-byte name fields in the transport header alone. No check is made against the netdevice the frame arrived on.
This can cause a frame arriving on any netdev to be delivered to an AFIUCV socket. Three problems follow.
First, a frame arriving over HiperSockets can be delivered to a socket bound to the classic z/VM IUCV transport, which has iucv->hsdev == NULL. iucvsockbind() takes the classic path whenever the requested userid matches iucvuserid, even on a guest that also has a HiperSockets device carrying the same identifier. The child socket created by afiucvhscallbacksyn() for such a match inherits hsdev = NULL and transport = AFIUCVTRANSHIPER, so the first send() on it returns -ENODEV. The socket delivered to accept() is unusable.
Second, a frame arriving on one netdev can be delivered to a socket bound to a different IQD device. Which can lead to - Accept-queue exhaustion (DoS) - Attacker-controlled peer identity in the child socket - Data injection into existing sockets - Fabric noise on the IQD fabric, where bogus replies are sent - killing established connections
Third, all AFIUCV sockets live in initnet, as iucvsockalloc() calls skalloc(&initnet, ...). But even frames arriving on netdev devices in a namespace can be delivered to an IUCV socket. So a process in an unprivileged user and network namespace holding only the CAPNETRAW capability valid within that namespace can send a raw ETHPAFIUCV frame on its own lo device and have it matched against initnet sockets.
Fix all three by skipping any socket whose hsdev does not match the ingress device. A classic z/VM IUCV socket has hsdev == NULL; the ingress dev is never NULL, so classic sockets are skipped automatically. An unbound HIPER socket also has hsdev == NULL and is skipped. A bound HIPER socket is only reachable from the exact IQD device it was bound to. Because hsdev is always a device in initnet (iucvsockbind() scans foreachnetdevrcu(&initnet, ...) exclusively), a frame whose ingress device belongs to another namespace never matches any socket.
Note that AFIUCV over HiperSockets provides no per-connection authentication: no sequence numbers, no TLS, no nonce. The four name fields identifying a connection are exchanged in plaintext on the shared HiperSockets segment (VCHID). Any host on the same HiperSockets segment could spoof any frame type against an existing connection. That is a protocol-level property unchanged by this patch. The fix reduces the attack surface to peers present on the same HiperSockets segment.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Patch net/iucv to filter AF_IUCV/HiperSockets frames in afiucv_hs_rcv() by the ingress net_device before delivering the frame to an AF_IUCV socket, skipping sockets whose hs_dev does not match the HiperSockets segment (VCHID) / ingress device.
Linux kernel net/iucv (AF_IUCV over HiperSockets) ingress-device filtering in afiucv_hs_rcv() = enabled
Event History
Frequently Asked Questions
Is a fix available for this issue?
Yes. The provided references identify fixes in three Linux stable commits: dfac2936b83be00035ae176f8252e1c1e1de9207, 8e3763f1ccac3fc395f9af2b87114c023ced8a3f, and a7f0130a091724e69827ab58e74777a88747e892.
Which kernel releases contain the fix?
The available data does not specify affected or fixed Linux kernel version numbers. Verify whether the fix commit applicable to your maintained kernel branch has been incorporated.