CVE-2026-93105: esp: do not unref managed frag pages in esp_ssg_unref()
In the Linux kernel, the following vulnerability has been resolved:
esp: do not unref managed frag pages in espssgunref()
espssgunref() releases the page references held on the source scatterlist after the AEAD operation completes. It calls skbpageunref() on every frag page for an out-of-place transform (req->src != req->dst), and in the error path of espoutputtail() (alreadyunref == true) on the request's own scatterlist.
This is wrong when the skb carries managed frags (SKBFLMANAGEDFRAGREFS). Managed frags are owned by a zerocopy ubuf and the skb does not hold a per-frag page reference; iouring SENDZC with a registered buffer attaches the bvec pages this way via iosgfromiter(). The rest of the stack honours this invariant: skbreleasedata() skips the per-frag unref when SKBFLMANAGEDFRAGREFS is set, and skbzcopymanaged() is the guard used at the other unref sites.
espssgunref() 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 skbzcopymanaged() so both unref paths are skipped for managed-frag skbs, matching skbreleasedata().
Affected Software
Event History
Frequently Asked Questions
Which systems and workloads are implicated?
The issue applies to Linux kernel ESP processing when an skb has managed fragment references. The described source of such skbs is io_uring SEND_ZC using a registered buffer, which attaches buffer-vector pages as managed fragments.
What conditions are needed for the reference-count error?
An ESP AEAD operation must process a managed-fragment skb through an out-of-place transform, or reach the specified esp_output_tail() error path. In those paths, the vulnerable code can release page references that the skb did not acquire.
What is the consequence if the vulnerable path is reached?
The page reference count can underflow, causing a page that remains in use to be freed. The fix skips both affected unreference paths for skbs identified as having managed zerocopy fragments.