HIGH Introduced in 4.11
esp ManagedFrag UAF
CVE-2026-93105
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
KernelScan AI7.0HIGH
01Description
In the Linux kernel, the following vulnerability has been resolved: esp: do not unref managed frag pages in esp_ssg_unref() esp_ssg_unref() releases the page references held on the source scatterlist after the AEAD operation completes. It calls skb_page_unref() on every frag page for an out-of-place transform (req->src != req->dst), and in the error path of esp_output_tail() (already_unref == true) on the request's own scatterlist. This is wrong when the skb carries managed frags (SKBFL_MANAGED_FRAG_REFS). Managed frags are owned by a zerocopy ubuf and the skb does not hold a per-frag page reference; io_uring SEND_ZC with a registered buffer attaches the bvec pages this way via io_sg_from_iter(). The rest of the stack honours this invariant: skb_release_data() skips the per-frag unref when SKBFL_MANAGED_FRAG_REFS is set, and skb_zcopy_managed() is the guard used at the other unref sites. esp_ssg_unref() is missing that guard, so for a managed-frag skb it drops a page reference the skb never acquired. This can underflow the page reference count and free a page that is still in use. Guard the function with skb_zcopy_managed() so both unref paths are skipped for managed-frag skbs, matching skb_release_data().
02KernelScan AI Analysis
Risk summary
A local unprivileged user can trigger a use-after-free in the IPsec ESP encryption path by sending zerocopy traffic via io_uring that matches an active IPsec policy. The resulting page reference count underflow can free a page still in use, leading to kernel memory corruption exploitable for privilege escalation or a system crash. Systems with IPsec configured and local user access are at risk.
Vulnerability analysis
The ESP encryption output path incorrectly drops per-fragment page references on packets that use managed fragments — a mode where fragment pages are owned by a zerocopy buffer rather than by the packet itself. When such a packet is encrypted through ESP, the cleanup routine releases page references that were never acquired, underflowing the page reference count and potentially freeing a page that is still in use by the zerocopy owner or another subsystem. The fix adds a guard so the cleanup routine skips the per-fragment unref entirely for managed-fragment packets, matching the behavior already used in the rest of the network stack. The bug is triggered locally by an unprivileged process using io_uring zerocopy send with a registered buffer to transmit traffic that matches an active IPsec security policy, so it requires IPsec to be configured on the system but not any special privileges from the attacker.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 6.12 | 4.11 | 6.12.114 | 3ec55f0c8a6a |
| 6.18 | 4.11 | 6.18.57 | 1ad6456898f6 |
| 6.6 | 4.11 | 6.6.160 | 201bdf10ae92 |
| 7.2 | 4.11 | 7.2.6 | 26b6b14c7a03 |
| mainline | 4.11 | 7.3 | 21697720ff43 |
04CIP Kernels
State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.
| CIP tree | State |
|---|---|
| cip/6.12 | Affected — no CIP fix yet (latest 6.12.112-cip33) |
| cip/6.1 | Affected — no CIP fix yet (latest 6.1.189-cip61) |
| cip/6.1-rt | Affected — no CIP fix yet (latest 6.1.189-cip61-rt32) |
| cip/5.10 | Affected — no CIP fix yet (latest 5.10.271-cip78) |
| cip/5.10-rt | Affected — no CIP fix yet (latest 5.10.268-cip77-rt34) |
| cip/4.19 | Affected — no CIP fix yet (latest 4.19.325-cip136) |
| cip/4.19-rt | Affected — no CIP fix yet (latest 4.19.325-cip136-rt50) |