release: v0.10.0 — the exploit-verification release
build / build (clang / debug) (push) Waiting to run
build / build (clang / default) (push) Waiting to run
build / build (gcc / debug) (push) Waiting to run
build / build (gcc / default) (push) Waiting to run
build / sanitizers (ASan + UBSan) (push) Waiting to run
build / clang-tidy (push) Waiting to run
build / drift-check (CISA KEV + Debian tracker) (push) Waiting to run
build / static-build (push) Waiting to run
release / build (arm64) (push) Waiting to run
release / build (x86_64) (push) Waiting to run
release / build (x86_64-static / musl) (push) Waiting to run
release / build (arm64-static / musl) (push) Waiting to run
release / release (push) Blocked by required conditions

Bumps 0.9.14 -> 0.10.0 (skeletonkey.c, README, docs/index.html) and prepends
v0.10.0 release notes.

Milestone: the corpus moved from detect-verified to out-of-band exploit-verified.
11 modules confirmed landing uid=0 in a VM (witnessed independently, never
self-reported); four modules that falsely reported EXPLOIT_OK without ever
getting root were fixed (pwnkit, ptrace_traceme, dirty_pipe, dirty_cow); a
full false-EXPLOIT_OK audit was closed (every success claim now backed by a real
out-of-band check). New/rewritten working exploits: ptrace_traceme, sudo_samedit,
overlayfs_setuid (libfuse), dirty_pipe, dirty_cow. Plus fixes to a systemic
userns uid_map bug, the kptr_restrict offset resolver, a su-over-pty hang, a
readback buffer overflow, and an old-header portability issue; overlayfs upgraded
to a direct uid=0 witness.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0118iUgHY44hdRtANgyCmu7y
This commit is contained in:
KaraZajac
2026-07-24 00:03:53 -04:00
parent af01d112a5
commit 56f9e4d0dc
4 changed files with 92 additions and 4 deletions
+80
View File
@@ -1,3 +1,83 @@
## SKELETONKEY v0.10.0 — the exploit-verification release
This release moves the corpus from **detect-verified** to **out-of-band
exploit-verified**. Every headline claim below was witnessed in a VM by an
independent root proof (a root-owned artifact, an `/etc/shadow` read, or a
setuid-bash sentinel) — never by the module's own self-report. Full ledger:
`docs/EXPLOITED.md`; per-run records: `docs/VERIFICATIONS.jsonl`.
### Headline: 11 modules confirmed landing `uid=0` out of band
| module | CVE | verified on |
|---|---|---|
| `refluxfs` | CVE-2026-64600 | Rocky 9.8 / 5.14.0-687 — `/etc/passwd` full chain |
| `overlayfs` | CVE-2021-3493 | Ubuntu 20.04.0 / 5.4.0-26 — **direct uid=0 witness** |
| `overlayfs_setuid` | CVE-2023-0386 | Ubuntu 22.04.0 / 5.15.0-25 — **rewritten (libfuse)** |
| `pwnkit` | CVE-2021-4034 | Ubuntu 20.04.0 / polkit 0.105 — **fixed** |
| `sudo_runas_neg1` | CVE-2019-14287 | Ubuntu 18.04.2 / sudo 1.8.21p2 |
| `sudoedit_editor` | CVE-2023-22809 | Ubuntu 22.04.0 / sudo 1.9.9 — **fixed** |
| `sudo_host` | CVE-2025-32462 | Ubuntu 22.04.0 / sudo 1.9.9 |
| `ptrace_traceme` | CVE-2019-13272 | Ubuntu 18.04.0 / 4.15.0-50 — **rewritten** |
| `sudo_samedit` | CVE-2021-3156 | Ubuntu 18.04.0 / sudo 1.8.21p2 — **rewritten (Baron Samedit)** |
| `dirty_pipe` | CVE-2022-0847 | mainline 5.16.0 — **rewritten, 3 bugs fixed** |
| `dirty_cow` | CVE-2016-5195 | mainline 4.8.0 — **rewritten, false-OK fixed** |
### Integrity: four modules were falsely claiming root — all fixed
A corpus-wide **false-`EXPLOIT_OK` audit** found four modules that reported
success while obtaining **no root at all**, via the dispatcher's "an `execve`
transferred, so treat it as success" path (the exec'd helper then failed):
`pwnkit`, `ptrace_traceme`, `dirty_pipe`, `dirty_cow`. All four now verify root
by an out-of-band artifact before claiming success. `dirty_pipe`/`dirty_cow`
additionally reverted `/etc/passwd` via `drop_caches` (needs root) — as an
unprivileged caller that **corrupted the running system's `/etc/passwd`**; both
now revert through the Dirty Pipe/COW primitive itself, leaving the file
byte-identical. The audit was then broadened to **every** `EXPLOIT_OK` site: all
are now backed by a real check (root-owned artifact `stat`, `getxattr`
bug-signature, `/etc/passwd` grep, `setuid(0)==0` gate, or page-cache
`verify_plant`). No false positives remain.
### New / rewritten working exploits
- **`ptrace_traceme`** (CVE-2019-13272) — the shipped sequence had the mechanism
backwards; rewritten to the Jann Horn/bcoles technique (child becomes
non-degraded root via its own setuid-execve under a privileged tracer), lands
real root.
- **`sudo_samedit`** (CVE-2021-3156, "Baron Samedit") — the corpus's hardest
userspace target; ported blasty's NSS `libnss_X` hijack, lands root as a
non-sudoer on the first grooming attempt.
- **`overlayfs_setuid`** (CVE-2023-0386) — rewritten with libfuse (setuid-root
FUSE lower + overlay copy-up).
- **`dirty_pipe`** / **`dirty_cow`** — rewritten to the reliable "known-hash into
root's password field + `su` over a pty" escalation, with primitive-based
revert; `dirty_cow` verified on a pre-4.8.3 kernel.
### Other fixes
- **Systemic userns bug** fixed in `cgroup_release_agent` + `af_packet2`:
`getuid()`/`getgid()` were read *after* `unshare(CLONE_NEWUSER)` (→ 65534), so
the `uid_map` write was rejected and userns-root silently failed.
- **Offset resolver** (`core/offsets.c`): env-provided kernel offsets
(`SKELETONKEY_MODPROBE_PATH`, …) were silently wiped under `kptr_restrict` (i.e.
on every default host), blocking every `--full-chain` primitive. Fixed.
- **Robust `su` helper**: the su-over-pty step now polls for the prompt with a
hard 20s cap so a misbehaving `su` can never hang the module (and thus never
block a revert). Latent `readback[16]` overflow fixed. `netfilter_xtcompat`
now includes `<linux/if.h>` for `IFNAMSIZ` (builds on older kernel headers).
- **`overlayfs`** upgraded from a `getxattr` proxy to a **direct uid=0 witness**.
### Kernel primitives — scope note
The ~13 kernel-primitive modules (`nf_tables` & friends) remain honest
`EXPLOIT_FAIL` trigger/groom scaffolds. `nf_tables`' kernel was confirmed
vulnerable and the offset plumbing fixed, but landing root needs a
Notselwyn-scale port; and even the most tractable primitive
(`netfilter_xtcompat`, CVE-2021-22555) needs its exact target kernel+config —
Andy Nguyen's reference exploit does not land on mainline 5.4/5.8. These are
per-target, per-primitive exploit-dev, documented in `docs/EXPLOITED.md`.
---
## SKELETONKEY v0.9.14 — new LPE module: refluxfs (CVE-2026-64600)
Adds **`refluxfs` — CVE-2026-64600 "RefluXFS"** (Qualys Threat Research Unit),
+1 -1
View File
@@ -56,7 +56,7 @@
<div class="container hero-inner">
<div class="hero-eyebrow">
<span class="dot dot-pulse"></span>
v0.9.14 — released 2026-07-23
v0.10.0 — released 2026-07-24
</div>
<h1 class="hero-title">
<span class="display-wordmark">SKELETONKEY</span>