FR
live

GhostLock turns a fifteen-year-old rtmutex use-after-free into root in five seconds

CVE-2026-43499, dubbed GhostLock, is a use-after-free in rtmutex priority-inheritance code that has shipped since kernel 2.6.39 and is reachable by any unprivileged local process. The fix landed in 7.1, but two months after the public PoC, blind spots like RHEL 9 kernel-rt remain: check your version and block PI futexes in the meantime.

Two dark interlocking metal gears, one cracked tooth marked with an amber glow.

July 7, 2026. Nebula Security publishes its analysis of GhostLock (CVE-2026-43499), a use-after-free in the rtmutex priority-inheritance code. July 8, 2026. A public proof-of-concept lands a root shell in five seconds, with 97% reliability. September 2026. Red Hat is still expediting fixes in bulletin RHSB-2026-010. Why it matters: the bug has slept in the kernel since 2011, requires no privilege, and escapes a container to the host.

The bug: a use-after-free on kernel stack memory

The flaw lives in kernel/locking/rtmutex.c, in remove_waiter(), the helper that unwinds a lock request when an operation must be rolled back. The routine was written on the assumption that the thread doing the cleanup always owns the request it is tearing down.

That assumption breaks on the FUTEX_CMP_REQUEUE_PI path. During a priority-inheritance requeue, the kernel can detect a deadlock cycle and call remove_waiter() in a context where the assumption no longer holds: the lock belongs to a different task. The function then clears pi_blocked_on on the wrong task and leaves a dangling pointer into already-freed kernel stack memory — a textbook use-after-free.

Exploitation reclaims the freed region with a carefully shaped allocation, plants a forged kernel structure in it, and dereferences the dangling pointer into a controlled write. From there, root is straightforward. The only requirement is CONFIG_FUTEX_PI, enabled by default in every major distribution: no privilege, no capability, no namespace.

The discovery matters on its own terms: Nebula Security found the bug with VEGA, an AI-assisted static analysis tool. Google paid $92,337 for the submission through kernelCTF. A fifteen-year-old use-after-free, found by a machine, sums up the new state of bug hunting.

The episode validates a trend worth taking seriously: AI-assisted bug hunting is starting to surface decades-old flaws that years of human review missed. That is not an indictment of the people who wrote the code — it is a reminder that adversaries now have tools that read code differently from how auditors historically have. A use-after-free sleeping since 2011 in locking code, found by a machine, is the symbol of that shift.

Why “local only” is not reassuring

Local privilege-escalation bugs are often filed under “less urgent” because they assume a foothold. GhostLock deserves more respect.

On a shared server, local access is the baseline: every tenant’s PHP process, every cron job, every mail account counts. A single SQL injection or stale plugin is enough to drop a web shell, and GhostLock turns that local process into root on the entire host, not just the compromised account.

Containers are not sheltered either. The bug works from inside a standard container, with no privileged user namespace. The IonStack chain proved the point: researchers chained a Firefox sandbox escape (CVE-2026-10702) with GhostLock into a web-page-to-kernel compromise on Firefox Android. For a hosting provider running containerized workloads, the threat model collapses the moment any container can trigger this path.

The patch state, two months on

The upstream fix (3bfdc63936dd, “rtmutex: Use waiter::task instead of current in remove_waiter()”) landed in 7.1 and was backported across every maintained line: 7.0.4, 6.18.27, 6.12.86, 6.6.140, 6.1.175, 5.15.212, and 5.10.261, between May and July 2026. Debian resolved its suites down to bullseye LTS (DLA-4717-1, on August 4), just before its end of life.

Blind spots remain. Red Hat confirms that CVE-2026-43499 and its companion CVE-2026-53166 — a crash introduced by the initial fix — affect RHEL 6 through 10 and every layered product (OpenShift, OpenStack, Virtualization). The community tracker kimmo.cloud notes that the RHEL 9 kernel-rt had not yet received the fix at last check, and that Amazon Linux 2, end-of-support since June 30, will receive no fix at all.

CVE-2026-53166 deserves separate attention: it stems from the initial fix, which is why the patch landscape took two months to settle.

How to close the path

The kernel fix is the only complete remediation, but interim mitigations exist.

bash
# Check the running kernel version
uname -r

# RHEL 8 / 9 / 10: apply the fixed kernel and reboot
dnf update kernel
reboot

# On CloudLinux: verify a GhostLock livepatch is applied
kcarectl --patch-info | grep CVE-2026-43499

A seccomp profile that blocks the three PI futex operations — FUTEX_LOCK_PI, FUTEX_WAIT_REQUEUE_PI, and FUTEX_CMP_REQUEUE_PI — closes the trigger path without touching the kernel. The cost is real: any application using priority-inheritance mutexes will break. For most web workloads it is a viable stopgap; for real-time services it is not.

The build options RANDOMIZE_KSTACK_OFFSET and STATIC_USERMODE_HELPER raise the exploitation bar, but do not fix the bug and must not be treated as mitigation on their own.

The real-time paradox

There is an irony in the bug living precisely in rtmutex, the kernel path reserved for real-time scheduling and priority inheritance. -rt (PREEMPT_RT) kernels use this code the most — yet they are the ones distributions fix last, because the -rt patchset lives in a separate tree, often weeks behind the standard kernel.

That explains the blind spot documented by kimmo.cloud: the RHEL 9 kernel-rt was still awaiting its fix at the last check, while the standard kernel of the same release was already covered. For a trading floor, an industrial controller, or any system running a real-time kernel, the seccomp workaround that blocks PI futexes is precisely the one most likely to break the priority inheritance the application depends on. Real time therefore combines maximum exposure with minimum room to maneuver.

Verdict

GhostLock is a reminder that a fifteen-year-old bug in generic locking code affects every kernel, every architecture, every hosting provider.

If your kernel predates the fixed versions (7.0.4, 6.18.27, 6.12.86, 6.6.140, 6.1.175, 5.15.212, 5.10.261), apply the backport and reboot now, then deploy a seccomp block on PI futexes where the workload allows. If you run RHEL 9 kernel-rt or Amazon Linux 2, you are in a blind spot: migrate to a patched kernel or a still-supported distribution, because no fix is guaranteed. And until then, treat any application compromise as a kernel-level event.

References

The cyber brief, every Tuesday

The flaws that matter and the patches to apply, in a ten-minute read.

No spam. One-click unsubscribe.
read next

On the same topic

GNU Coreutils 9.12 speeds up cut and uniq and fixes a recursive traversal race

GNU Coreutils 9.12, released on September 14, 2026, delivers measurable wins — cut up to 4× faster, uniq up to 2.5× — and fixes a race that made -R commands fail against files deleted in parallel. A maintenance release that reminds us the GNU toolkit remains, against its Rust rewrite, the default foundation of every distribution.

A Void Linux maintainer orphans 113 packages after an AI-policy dispute

On September 12, 2026, contributor Andrea Brancaleoni orphaned 113 Void Linux packages — including Kubernetes, Docker, Terraform, and Thermald — after being called out for using an LLM in an undisclosed update comment. AI policies are becoming a maintenance-continuity problem as much as a contribution-ethics one.

← Back to the feed

Type at least two characters.

navigate open esc dismiss