An RbTree Family Drama: Exploiting a Linux Kernel 0-day Through Red-Black Tree Transformations
William Liu (Security Researcher · NVIDIA), Savino Dicanosa (Security Researcher · Independent)
Hexacon 2025 · Day 2 · Main Stage
Overview
In this Hexacon talk, security researchers William Liu of NVIDIA and Savino Dicanosa, an independent researcher, unveiled a sophisticated Linux kernel zero-day exploit, dubbed "An RbTree Family Drama." This presentation details CVE-2025-38001, a critical vulnerability found within the Linux network scheduler (traffic controller) subsystem. The researchers, part of the Crusaders of Rust Security Research Group, demonstrate how a seemingly innocuous kernel soft lockup can be escalated through intricate Red-Black Tree (RB-tree) manipulations into a full page Use-After-Free (UAF) and ultimately, arbitrary code execution, achieving root privileges.

Key moments
- 0:00 Introduction: Linux Kernel 0-day via Red-Black Trees
- 2:00 Linux Network Scheduler (TC) and Qdisc Basics
- 2:40 Netem Qdisc: Packet Duplication Feature Explained
- 4:50 Historical Vulnerabilities in Traffic Control Subsystem
- 5:30 Discovery of CVE 2025-38001 (Network Soft Lockup)
- 6:10 Reproducing the CVE: HFSC-Netem Setup
- 6:48 Initial Code Walkthrough: HFSC-Netem Infinite Loop
An RbTree Family Drama: Exploiting a Linux Kernel 0-day Through Red-Black Tree Transformations
Speakers: William Liu (NVIDIA), Savino Dicanosa (Independent)
Conference: Hexacon
YouTube: https://www.youtube.com/watch?v=C-52Gwmce3w
Overview
In this Hexacon talk, security researchers William Liu of NVIDIA and Savino Dicanosa, an independent researcher, unveiled a sophisticated Linux kernel zero-day exploit, dubbed "An RbTree Family Drama." This presentation details CVE-2025-38001, a critical vulnerability found within the Linux network scheduler (traffic controller) subsystem. The researchers, part of the Crusaders of Rust Security Research Group, demonstrate how a seemingly innocuous kernel soft lockup can be escalated through intricate Red-Black Tree (RB-tree) manipulations into a full page Use-After-Free (UAF) and ultimately, arbitrary code execution, achieving root privileges.
The talk stands out not only for the technical depth of its exploit but also for its cross-platform and cross-architecture implications, successfully compromising various Linux distributions, including Ubuntu on ARM, Debian on x86, and multiple instances of Google's Kernel CTF (LTS, COS, and even a mitigation-hardened instance). The team's work earned them $82,000 in bounties from Google, along with a $10,000 stability bonus. Their innovative approach to circumventing Kernel CTF's proof-of-work mechanism also left a lasting "cultural impact," leading to its permanent removal from future bounty submissions. This article delves into the specifics of their discovery, the elegant RB-tree attack, and their ingenious methods for bypassing modern kernel mitigations.
Background
▶ Watch: Introduction: Linux Kernel 0-day via Red-Black Trees (0:00)
The Linux network scheduler, also known as the traffic controller (TC), is a fundamental subsystem designed to provide users with fine-grained control over how network packets enter and leave kernel network interfaces. It achieves this through objects called Queuing Disciplines (Qdiscs), which manage packet enqueuing and dequeuing. The simplest Qdisc, P50Fast, operates as a basic First-In, First-Out queue. More complex Qdiscs include the Token Bucket Filter (TBF), which regulates packet transmission based on available tokens, and NetEm (Network Emulator), a notoriously buggy Qdisc that can simulate network conditions like duplication, loss, corruption, and delay. Qdiscs can be chained together to form complex hierarchical structures or Qdisc trees, offering highly customized network behavior. Each Qdisc is identified by a major:minor handle, with root Qdiscs typically having a minor handle of zero.
The Hierarchical Fair Service Curve (HFSC) Qdisc, a central component in this exploit, supports multiple children and is known for its intricate interactions within these Qdisc trees. Historically, the network scheduler has been a fertile ground for vulnerabilities, with numerous Use-After-Frees (UAFs) and Denial-of-Service (DoS) bugs reported in Qdiscs like FQ_Codel, DRR, and HFSC itself. These vulnerabilities often arise from "nonsensical complex setups" created by security researchers, as one network maintainer notably complained on a mailing list, highlighting the tension between complex configurations and robust kernel invariants.
The journey to discovering CVE-2025-38001 began with William Liu's custom fuzzer, developed for his master's thesis at MIT. Targeting the network scheduler due to its history of bugs, the fuzzer soon identified a kernel soft lockup—a state where the kernel thread remains stuck for over 20 seconds without a context switch, typically indicating an infinite loop. The specific trigger involved an HFSC parent Qdisc with a NetEm child, where NetEm's packet duplication feature was enabled. This seemingly straightforward configuration, combining two "buggy" Qdiscs, laid the groundwork for the elaborate exploit that followed.
Key Findings
▶ Watch: Netem Qdisc: Packet Duplication Feature Explained (2:40)
The core of the "RbTree Family Drama" is CVE-2025-38001, initially manifesting as a kernel soft lockup (an infinite loop). The vulnerability arises from a specific interaction between the HFSC (Hierarchical Fair Service Curve) Qdisc and the NetEm (Network Emulator) Qdisc when NetEm's packet duplication feature is enabled and it's configured as a child of HFSC.
Here's a breakdown of the root cause:
- Packet Entry and Classification: When a packet first enters the HFSC Qdisc via
hfsc_enqueue, it's classified for the correct child (in this case, NetEm). A crucialfirstvariable is set totrue, indicating no packets were previously in the queue. - NetEm Duplication: The packet is then enqueued to the NetEm child. Because duplication is enabled, NetEm clones the packet.
- Global Duplication Disable and Re-enqueue: NetEm's internal logic temporarily disables global duplication for the current NetEm object. It then re-enqueues the cloned packet back to the root of the Qdisc tree (HFSC). After this recursive call returns, NetEm restores the original duplication value.
- Second Level of Recursion: The cloned packet re-enters
hfsc_enqueue. Again, classification is trivial. Crucially, because no other packets have been inserted at this specific level of recursion, thefirstvariable is once again set totrue. eltree_insertCall: After the NetEm enqueue call (where duplication is now disabled for the cloned packet), the HFSCenqueuefunction callseltree_insert. This function constructs the eligible tree (L-tree) of classes eligible for dequeuing. Becausefirstwastrueat this level, the NetEm object is inserted into the L-tree.- Double Insertion: The control flow then returns to the initial
hfsc_enqueuecall. Here,firstwas alsotrue. Consequently,eltree_insertis called again for the same NetEm object. This results in the NetEm object being inserted twice into the L-tree. - Self-Referencing RB-node: During the second
eltree_insert, therb_nodecorresponding to the NetEm object becomes self-referential: itsrb_leftpointer is linked back to the object itself. - Infinite Loop (Soft Lockup): When the kernel attempts to dequeue a packet, it calls
L_tree_get_my_l, which usesrb_firstto find the least element.rb_firsttraverses therb_leftpointers. Because the NetEm object'srb_leftpoints to itself, the kernel enters an infinite loop, causing the observed soft lockup.
While an infinite loop is a Denial-of-Service (DoS) bug, the researchers aimed for a more severe impact. They successfully escalated this DoS into a Use-After-Free (UAF) by preventing the kernel from dequeuing. This was achieved by introducing a TBF (Token Bucket Filter) Qdisc as the root, configured with a very low token rate.
- Block Dequeue: With TBF at the root and a minimal token rate, dequeuing is blocked when tokens are exhausted.
- Trigger Double Insertion: The HFSC-NetEm setup triggers the double insertion bug, creating the self-referencing
rb_nodein the L-tree. - Return to User Space: Since dequeuing is blocked, the kernel returns to user space instead of entering the infinite loop.
- Free the Class: From user space, the researchers can then free the HFSC class object using a traffic control command. This frees one of the self-referencing
rb_nodeinstances while the other remains in the L-tree, creating a dangling pointer. - UAF Trigger: Any subsequent network activity that interacts with the L-tree (e.g., attempting to dequeue) will attempt to access the freed memory, triggering a Use-After-Free condition. This UAF on the
rb_nodestructure became the foundation for their full kernel compromise.
Technical Deep Dive
▶ Watch: Historical Vulnerabilities in Traffic Control Subsystem (4:50)
The core of the exploit hinges on a sophisticated data-oriented attack against the Linux kernel's Red-Black Tree (RB-tree) implementation. Savino Dicanosa devised a method to leverage the UAF on an rb_node to achieve pointer duplication and ultimately a page Use-After-Free (UAF), which is highly portable and stable across various Linux systems and Kernel CTF instances.
Red-Black Tree Fundamentals
A Red-Black Tree is a self-balancing binary search tree that maintains specific properties (color rules) to ensure logarithmic time complexity for insertions, deletions, and lookups. When a node is inserted or removed, these operations can violate the color rules, necessitating tree rebalancing through rotations and recoloring. The Linux kernel's rb_node structure is critical here:
__rb_parent_color: Stores the parent node's address and the current node's color (1 for black, 0 for red).rb_right: Pointer to the right child.rb_left: Pointer to the left child.
By gaining control over a freed rb_node, the attackers can manipulate these pointers.
Page Vector Allocation
The second key component is the page vector, which consists of a vector of pages. These are allocated by creating packet sockets and then using tpacket_setup to create a packet ring. A packet ring is a ring buffer shared between kernel and user space, typically for asynchronous packet I/O, but here used for exploitation. The attackers control the number of pages in the vector and the page order (size of each page block). Pages are allocated using get_free_pages, which returns their virtual addresses. Crucially, packet_map iterates through the page vector and maps each page to user space using vm_insert_page.
Exploit Strategy: From UAF to Page UAF
The overarching strategy is as follows:
- Trigger Vulnerability: Cause the double insertion of the HFSC class into the eligible tree (L-tree) using the HFSC-NetEm bug.
- Free and Replace: Free the HFSC class object (which contains the self-referencing
rb_node) and spray the freed memory with a page vector. This effectively replaces therb_node's fields with pointers to user-controlled pages, allowing the kernel to treat these pages asrb_nodes. - Pointer Leak (First Attempt - Failed): Savino's initial idea was to trigger an RB-tree transformation that would overwrite one of the
page_vector's pointers (now seen as anrb_nodepointer) with anotherrb_nodeaddress. Then,packet_mapwould be called to remap the corruptedpage_vectorto user space, granting arbitrary read/write. This failed becausepacket_mapusesvalidate_page_before_insert, which rejects pages that are part of kernel slab allocations, preventing mapping of the manipulatedrb_nodepointers.
- Successful Pointer Leak and Duplication (Second Attempt):
- Setup:
- Configure a TBF Qdisc as the root with a very low rate (e.g., 1 token) to block packet dequeuing, preventing the infinite loop and allowing control to return to user space.
- Saturate the
kmalloc-1kslab cache to ensure new allocations land in fresh slabs. - Allocate the vulnerable HFSC class (class 1).
- Allocate a second class, class 2, specifically surrounded by
page_vectorobjects in memory (e.g., 16page_vectors before and 16 after). This memory layout is crucial. - Trigger the HFSC-NetEm vulnerability by sending a packet to class 1. This inserts
class 1twice into the L-tree. The DQ is blocked, so no infinite loop. - Free
class 1and replace it with apage_vector. Therb_nodefields ofclass 1are now controlled by pointers to user-allocated pages. The first quadword of thispage_vectormust be set to1(representing a black node parent).
- Pointer Leak:
- Send a packet to class 2. The kernel calls
L_tree_insertto insertclass 2into the L-tree. - During insertion, the kernel compares
class 2'sCLAfield with theCLAfield ofclass 1(now thepage_vector). Sincepage_vector'sCLAfield is a large user-controlled value,class 2takes the left path. class 2is inserted as the right child ofpage_P(one of the controlled pages within thepage_vectorthat replacedclass 1).__rb_insert_coloris called to rebalance the tree. However, becausepage_P's parent (the first quadword of thepage_vector) was set to1(black), the rebalancing loop immediately breaks.- This results in a pointer to
class 2being written intopage_P(a user-controlled page), effectively leaking a kernel pointer to user space.
- Forging "Evil Grandpa" and Pointer Copy Primitive:
- The leaked pointer allows the researchers to locate
class 2in memory. - A new malicious
rb_node, nicknamed "evil grandpa," is forged. It's strategically placed 16 bytes before the nextpage_vectorin memory that surroundsclass 2. When cast as anrb_node,evil grandpa'srb_leftchild will now point to the first page of this targetpage_vector. - First Tree Update: A Netlink message is sent to
class 2, triggering an update (remove and re-insert). L_tree_removeremovesclass 2.L_tree_insertre-insertsclass 2. During this,page_P's parent is modified to point toevil grandpa, and its color becomes red.- The tree rebalances:
page_Pmoves down,evil grandpamoves down, leading to a complex configuration wheregrandpabecomes the child of its grandchild. Crucially, the first page of the targetpage_vectoris set to zero during this process. - Second Tree Update (Pointer Copy):
class 2is removed again from the tree. During this deletion,evil grandpabecomes the designated successor node. The critical outcome is that the address ofpage_P(which contains the leaked pointer) is copied intoevil grandpa'srb_leftchild, which, due to its strategic placement, corresponds to the first page of the targetpage_vector. - This creates a powerful pointer duplication primitive: the address of
page_P(a user-controlled page containing a leaked kernel pointer) now exists in two differentpage_vectors—its original one and the target one.
Page Use-After-Free Exploitation
With the pointer duplication, the researchers can now trigger a page UAF:
- Locate Duplicated Page: Iterate through all
page_vectors and identify the duplicated page (e.g., using a unique marker like0xff). - Map Page: Map the page from user space. Its reference count increases to 2.
- Free Original
page_vector: Close the first packet socket, freeing the originalpage_vector. The page's reference count drops to 1. - Reclaim Page: Reclaim the page by writing to pre-allocated pipes. The
pipe_writefunction internally callsalloc_page, which can reuse the freed physical page. - Trigger UAF: Close the second packet socket, freeing the target
page_vector. Since thispage_vectorstill held a reference to the page (which has now been reclaimed by the pipes), this action triggers a page Use-After-Free on the reclaimed page.
Achieving Root with Page UAF
With a reliable page UAF, the path to root is clear. The researchers employed a variation of the F_SETOWN_EX technique with fcntl:
F_SETOWN_EX: Thisfcntlcommand allows a user to provide a file descriptor and a mask. If the file descriptor is-1, a newfilestruct is allocated, and the mask is stored in itsf_datafield. Otherwise, an existing mask can be updated.- Control
fileStructure: By controlling thefilestructure through the UAF, the researchers can manipulate its fields. - Swap Pointers: The goal is to swap the
f_datafield (which can be user-controlled via the mask) with thef_credfield, which is a pointer to the current process's credentials. - Zero Out Credentials: Once
f_datapoints to the credentials, multiple writes can be performed (viaF_SETOWN_EX) to set the credential values (UID, GID, etc.) to zero, effectively granting root privileges. - Lower Byte Trick: A challenge arises because the lower bytes of the mask cannot be directly controlled. The trick is to use the upper bytes to write backwards, effectively zeroing out the entire credential structure.
This intricate sequence of RB-tree manipulations, memory spray, pointer leaks, and page UAF exploitation demonstrates a profound understanding of kernel internals and data structures.
Demo / Proof of Concept
▶ Watch: Reproducing the CVE: HFSC-Netem Setup (6:10)
The researchers provided compelling live demonstrations of their exploit's effectiveness and stability across various Linux environments. They successfully achieved root privileges on:
- LTS (Long Term Support) Kernel CTF instance: Demonstrated obtaining a reverse shell and extracting the flag.
- COS (Container Optimized OS) Kernel CTF instance: Again, a reverse shell and flag extraction were shown. This is Google's container-optimized version of their Kernel CTF, highlighting the exploit's capability against hardened environments.
A notable aside during the demo section involved the Kernel CTF submission process. At the time, Google's CTF used a Sloth EDF (Equally Difficult Function) proof-of-work (PoW) system to rate-limit submissions, requiring a 5-second computation. The Crusaders of Rust team, driven by a desire to guarantee their bounty, meticulously optimized the PoW solver. They discovered simplifications in the modulus used, reducing computation time to ~3 seconds. Further optimizations, including leveraging Zen 5's AVX512 ifma extensions for multiplication and streamlining the Google Form submission, brought their total submission time down to a record-breaking 3.6 seconds. This aggressive optimization led Google to permanently remove the proof-of-work component from future bounty submissions, a significant "cultural impact" credited to their efforts.
Finally, they demonstrated the exploit against a mitigation-hardened Kernel CTF instance. While the exploit against this target was acknowledged to have an 80% stability rate (implying a higher chance of a kernel crash), the live demo successfully dumped the flag, proving the exploit's ability to bypass modern kernel defenses, even if it resulted in a subsequent kernel crash. This showcases the extreme difficulty of fully neutralizing such complex exploitation techniques.
Defensive Implications
▶ Watch: Initial Code Walkthrough: HFSC-Netem Infinite Loop (6:48)
The talk provided a comprehensive look at how modern Linux kernel mitigations attempt to thwart such exploits and, critically, how the researchers devised strategies to bypass them.
Mitigations Encountered:
kalloc_split_var_size: This mitigation separates kernel allocations. Objects with a compile-time constant size go intokmalloc-Xslabs, while objects with a runtime-determined size go intoden_kmalloc-Xslabs.
- Impact: This directly impacts the initial
page_vectoroverlap strategy. The HFSC class (fixed size) would go intokmalloc-1k, butpage_vector(runtime size) would go intoden_kmalloc-1k, preventing the crucial same-slab overlap required for the pointer duplication technique.
slab_virtual(Pwn Apocalypse): A more robust mitigation, inspired by Chrome'sPartitionAlloc. Instead of simply preventing slabs from being returned to the buddy allocator,slab_virtualensures that every new slab allocation receives a new virtual memory address, even if the underlying physical page is reused.
- Impact: This effectively kills pointer-style cross-cache attacks. While physical pages can still be reused, their virtual addresses are randomized, preventing an attacker from predicting where a reclaimed page will appear in memory. Furthermore,
slab_virtualalso zeroes out pages every time a new slab is allocated, preventing data-only cross-cache attacks. This mitigation was a significant hurdle, forcing the researchers to abandon their originalpage_vectorapproach for mitigation-hardened targets.
random_k_caches: Upstreamed by Huawei around kernel 6.6, this mitigation introduces 16 random copies of each slab cache. Whenkmallocis called, the specific slab cache used is determined by the allocation's return address and a kernel-internal random seed.
- Impact: This aims to diversify slab allocations, making it harder to predict where an object will land. It typically complements cross-cache attacks, but with
slab_virtualpreventing those, its primary effect is further randomization.
Bypassing Mitigations (Mitigation Exploit Attempt 2):
Given the limitations imposed by kalloc_split_var_size and slab_virtual, the researchers had to adapt their strategy for mitigation-hardened targets. The key insight was to leverage random_k_caches in an unexpected way: while it randomizes slab selection, it also implies that objects of the same slab size allocated from the same allocation site (i.e., the same return address) will consistently land in the same slab. This creates a limited type confusion opportunity.
- Shared Allocation Code Path: They identified a shared allocation code path among Qdisc classes. Specifically, the
TCTL_classNetlink command, when it calls thechangefunction pointer, leads tokmalloccalls for different Qdisc classes (e.g.,hfsc_change_classandhtb_change_class) that share the same return address. - Type Confusion Target: This allows for a type confusion between an HFSC class and an HTB (Hierarchical Token Bucket) class, as they can be forced into the same slab, bypassing
random_k_caches. - Exploit Flow:
- Construct the same L-tree with the vulnerable HFSC class and cause a UAF.
- Replace the freed HFSC class with an HTB class (type confusion). This creates an
rb_nodetype confusion, as HTB is not meant to be in the HFSC eligible tree. - Trigger a series of RB-tree transformations (by deleting and inserting other nodes) to achieve the specific goal: overwrite the
htbx_statsfield of the HTB class with anrb_nodepointer. - Leak Pointer: Dump the HTB class's
xstats(extended statistics) via Netlink to leak therb_leftpointer that was written into it. - Increment Pointer: The lower bytes of the leaked
rb_leftpointer overlap with thexstats.lensfield. By sending packets to the HTB class, thelensvariable (and thus the lower bytes of therb_leftpointer) can be incremented. This provides a controlled arbitrary increment primitive on a kernel pointer. - Fake Pointers: Three layers of fake pointers are created in user space. The incremented kernel pointer is made to point 8 bytes before a controlled quadword.
- Overwrite
qdiscPointer: Through further complex RB-tree transformations (details of which are extensive and referred to the full write-up), the researchers managed to overwrite the HTBqdiscpointer with the incremented pointer. - Delayed Trigger: A challenge was that the
nq(enqueue) function pointer (the first quadword) couldn't be directly controlled. A workaround was a delayed trigger: TBF was set with a rate of 100, allowing ~5 seconds to perform the attack before packets would dequeue. - Fake
DQFunction Pointer: With theqdiscpointer corrupted, a fakeDQ(dequeue) function pointer could be inserted. - ROP Chain and KASLR Bypass: When packets finally dequeue, the fake
DQfunction pointer executes a ROP (Return-Oriented Programming) chain gadget, leading to a stack pivot into the CPU entry area. - KASLR Bypass for CPU Entry Area: Since the CPU entry area address is randomized in kernel 6.6+, they used William's prefetch channel implementation (an
entry_rb_itvariant without a syscall) to reliably prefetch and leak this address, effectively bypassing KASLR (Kernel Address Space Layout Randomization).
This multi-stage, highly intricate bypass demonstrates that even with sophisticated mitigations, specific vulnerabilities in complex subsystems, combined with deep knowledge of data structures and memory management, can still lead to full system compromise.
Key Takeaways
- The Linux network scheduler, particularly Qdiscs like HFSC and NetEm, remains a complex and vulnerable attack surface, susceptible to intricate interactions leading to critical bugs.
- CVE-2025-38001 demonstrates how a seemingly innocuous kernel soft lockup (infinite loop) can be escalated into a powerful Use-After-Free by strategically delaying kernel operations (e.g., using TBF to block dequeuing).
- Sophisticated Red-Black Tree (RB-tree) manipulations are a viable and potent technique for achieving kernel primitives like pointer leaks and pointer duplication, even from a UAF on an
rb_nodestructure. - Modern kernel mitigations like
kalloc_split_var_size,slab_virtual, andrandom_k_cachessignificantly raise the bar for exploitation, making direct memory overlaps and cross-cache attacks much harder or impossible. - However, these mitigations can be bypassed through deep analysis, such as identifying shared allocation code paths to enable controlled type confusion, and leveraging obscure side channels (like prefetch channels for KASLR bypass).
- Even partial control over kernel data structures (e.g., specific fields within an
rb_nodeorxstats) can be sufficient to construct multi-stage exploits leading to full kernel compromise. The exploit's 80% stability on mitigation-hardened targets and 100% stability on standard targets highlights its robustness.
About the Speaker(s)
William Liu is a security researcher at NVIDIA. His work includes significant contributions to Linux kernel vulnerability research, leading to multiple zero-day bounties and CVEs. He conducted his master's thesis research at the Massachusetts Institute of Technology (MIT), where he developed custom fuzzers for identifying kernel vulnerabilities, leading to the discovery of CVE-2025-38001. William is a member of the Crusaders of Rust Security Research Group and is known for previous work such as the entry_rb_it KASLR bypass and message_message attacks.
Savino Dicanosa is an independent security researcher and a key member of the Crusaders of Rust Security Research Group. He specializes in intricate kernel exploitation techniques, particularly those involving data structure manipulations like Red-Black Trees. His previous work includes the development of sophisticated techniques for escalating kernel bugs into full compromise, such as turning an infinite loop into a Use-After-Free. Savino's expertise was instrumental in developing the RB-tree attack presented in "An RbTree Family Drama."
Reviews
Dr. Zero (Offensive Security Researcher) — MUST SEE
This is exactly the kind of research that makes conference review worth doing. Liu and Dicanosa don't just find a bug — they build a complete, multi-stage exploitation chain from a soft lockup through RB-tree manipulation to page UAF to root, then do it again on hardened targets using type confusion, xstats leakage, and a prefetch side channel for KASLR bypass. The fact that they pulled $82K in bounties, broke the Kernel CTF proof-of-work hard enough to get it permanently retired, and still had the depth to document mitigation bypasses in detail tells you everything about the caliber of work here. This is a must-see.
Heather Calloway (CISO) — PASS
Elite kernel exploitation research with real technical merit — a zero-day in the Linux network scheduler escalated through red-black tree manipulation to full root on multiple distributions including hardened targets. This is serious work. But it is deep-stack exploit development with no governance angle, no defender path, and no operator relevance. The audience for this is a narrow slice of kernel security researchers and CTF competitors. That is a legitimate audience. It is not mine.