Task 1: Introduction
Fragnesia is the third Linux kernel local privilege escalation vulnerability in the page-cache write class to be disclosed in under three weeks. It was reported by William Bowling, head of assurance at Zellic, who discovered the bug using V12, Zellic's AI-agentic security auditing tool. The vulnerability was assigned CVE-2026-46300 with a CVSS v3.1 base score of 7.8 (High). Public disclosure landed on 13 May 2026, alongside a working proof-of-concept and a candidate upstream patch.
What makes Fragnesia notable is not the primitive itself, which is now familiar from Copy Fail and Dirty Frag, but the way it came into existence. The Dirty Frag patch (f4c50a4034e6, merged 8 May 2026) added code that trusts a particular socket buffer flag to be accurate. As of 13 May, that flag is not always accurate. Fragnesia is the vulnerability that the Dirty Frag fix introduced. Hyunwoo Kim, who reported the original Dirty Frag pair, has publicly acknowledged that Fragnesia emerged as an unintended side effect of one of the patches written to remediate his own bug.
Two points are worth establishing upfront. First, this is the same broad attack surface as Dirty Frag (XFRM, ESP, the page cache) but it lives in a different code path. The original Dirty Frag bugs were in esp_input() and rxkad_verify_packet_1(). Fragnesia is in skb_try_coalesce(), the function that merges socket buffers. Second, the published proof-of-concept covers only the espintcp variant; a second variant in skb_segment() was disclosed by the same researcher the day after the initial Fragnesia patch landed, and as of 15 May 2026 that variant remains unpatched.
The vulnerability class continues to evolve, which is the operational lesson the room is built around.
| Property | Copy Fail | Dirty Frag | Fragnesia |
|---|---|---|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 / 43500 | CVE-2026-46300 |
| Kernel subsystem | AF_ALG / splice | xfrm-ESP UDP / RxRPC | xfrm-ESP-in-TCP / skb coalescing |
| Write primitive size | 4 bytes | 4 bytes (ESP) / 8 bytes (RxRPC) | 1 byte (per trigger) |
| Race condition required | No | No | No |
| Container escape impact | Yes | Yes | Yes |
| Patch state | Mainline | xfrm-ESP mainline; RxRPC unpatched | First variant on netdev; second variant unpatched |
The 1-byte write primitive looks small compared to its predecessors, but it is deterministic. Each trigger writes one chosen byte at one chosen offset in the page cache. A 192-byte ELF stub is delivered across as many triggers as needed (typically around 176, since some bytes coincidentally already match the target file), and the full sequence completes in a few hundred milliseconds.
Learning Objectives
By the end of this room, you will be able to:
- Explain why a kernel patch can introduce a new vulnerability in the same attack surface it was meant to close
- Describe the role of
skb_try_coalesce()and theSKBFL_SHARED_FRAGmarker in the Fragnesia chain - Identify the conditions that allow the espintcp receive path to perform in-place AES-GCM decryption over page-cache pages
- Apply the published modprobe mitigation and confirm the proof-of-concept is blocked
- Recognise the operational pattern of recurring same-area regressions and design detection accordingly
Prerequisites
This room assumes comfort with the Linux command line and a working understanding of local privilege escalation. The companion rooms Copy Fail and Dirty Frag are strongly recommended; Fragnesia builds directly on the page-cache write primitive introduced in those rooms.
Connecting to the Machine
Click the Start Lab Machine button at the top of this task and allow about a minute for it to boot. The room launches an in-browser split-view terminal already logged in as the unprivileged user karen. Credentials for SSH access from your own machine are provided in Task 4.
Answer the questions below
I have successfully started my machine.