v0.7.1 — released 2026-05-23

SKELETONKEY

One binary. 31 Linux LPE modules from 2016 to 2026. 22 of 26 CVEs empirically verified against real Linux kernels in VMs. SOC-ready detection rules in four SIEM formats. MITRE ATT&CK + CWE + CISA KEV annotated. --explain gives a one-page operator briefing per CVE.

terminal
$ 
0modules
0✓ VM-verified
0★ in CISA KEV
0detection rules

Authorized testing only. See ETHICS.md.

Grounded in authoritative sources
  • CISA KEV catalog
  • NVD CVE API
  • MITRE ATT&CK
  • kernel.org stable tree
  • Debian Security Tracker
  • NIST CWE

One command. Complete briefing.

skeletonkey --explain <module> renders the page every team needs: CVE / CWE / MITRE ATT&CK / CISA KEV status, host fingerprint, live detect() trace with verdict, OPSEC footprint, and the detection-rule coverage matrix. Triage tickets and SOC handoffs in one paste.

skk-host ~ $

    
1
Triage metadata in the header

CWE class, MITRE ATT&CK technique, CISA KEV status with date_added. Fed from tools/refresh-cve-metadata.py which pulls fresh from federal data sources.

2
Live host fingerprint

Cached once at startup by core/host.c. Every module sees the same kernel / arch / distro / userns / apparmor / selinux / lockdown picture.

3
Real detect() trace

The verbose stderr of the module's own probe — each gate fires, each kernel_range entry checked, each verdict justified. No more black-box "VULNERABLE" outputs.

4
OPSEC footprint

Per-exploit description of what the SOC would see if this fired: file artifacts, dmesg signatures, syscall observables, network activity, cleanup behavior.

Built for every side of the desk

Auto-pick the safest exploit

--auto ranks vulnerable modules by stability (structural escapes > page-cache writes > userspace races > kernel races) and runs the safest one. Never crashes a production box looking for root.

$ skeletonkey --auto --i-know
[*] 3 vulnerable; safest is 'pwnkit' (rank 100)
[*] launching --exploit pwnkit...
# id
uid=0(root) gid=0(root)
🛡

119 detection rules

auditd · sigma · yara · falco. One command emits the corpus for your SIEM. Each rule grounded in the module's own syscalls.

auditd30/31
sigma31/31
yara28/31
falco30/31

CISA KEV prioritized

10 of 26 CVEs in the corpus are in CISA's Known Exploited Vulnerabilities catalog — actively exploited in the wild. Refreshed on demand via tools/refresh-cve-metadata.py.

🧬

OPSEC notes per exploit

Each module ships a runtime-footprint paragraph: files, dmesg, syscall observables, network, persistence. The inverse of the detection rules — what an attacker would leave behind on your host.

🎯

One host fingerprint, every module

core/host.c probes kernel / arch / distro / userns / apparmor / selinux / lockdown / sudo version / polkit version once at startup. Every detect() reads the same cached snapshot, so verdicts stay coherent across the corpus.

struct skeletonkey_host {
    struct kernel_version kernel;
    char arch[32], distro_id[64];
    bool unprivileged_userns_allowed;
    bool apparmor_restrict_userns;
    bool kpti_enabled, selinux_enforcing;
    char meltdown_mitigation[64];
    char sudo_version[64], polkit_version[64];
    ...
};
📡

JSON for pipelines

--scan --json emits a stable schema (see JSON_SCHEMA.md) with triage metadata, opsec notes, and rule coverage embedded. Ready for Splunk / Elastic / Sentinel ingest.

🔒

No SaaS. No telemetry.

One static binary. No phone-home, no analytics, no cloud accounts. Reads /proc + /sys, runs the probe, exits. JSON or plain text — your pipeline owns the data.

22 modules empirically verified

tools/verify-vm/ spins up known-vulnerable kernels (stock distro + mainline from kernel.ubuntu.com), runs --explain --active per module, and records the verdict. 22 of 26 CVEs confirmed against real Linux across Ubuntu 18.04 / 20.04 / 22.04 + Debian 11 / 12 + mainline 5.15.5 / 6.1.10. Records baked into the binary; --list shows ✓ per module.

26 CVEs across 10 years. ★ = actively exploited (CISA KEV).

Lands root on a vulnerable host structural escapes + page-cache writes; no per-kernel offsets needed

copy_fail copy_fail_gcm dirty_frag_esp dirty_frag_esp6 dirty_frag_rxrpc ★ dirty_pipe ★ dirty_cow ★ pwnkit ★ overlayfs ★ overlayfs_setuid cgroup_release_agent ★ ptrace_traceme sudoedit_editor entrybleed

Fires kernel primitive · opt-in --full-chain honest EXPLOIT_FAIL default; --full-chain runs the shared modprobe_path finisher

★ nf_tables nft_set_uaf nft_fwd_dup nft_payload ★ netfilter_xtcompat af_packet af_packet2 af_unix_gc cls_route4 ★ fuse_legacy stackrot ★ sudo_samedit sequoia vmwgfx

Full inventory with kernel ranges, mitigations, and detection coverage: CVES.md · KEV cross-reference · CVE_METADATA.json

Same project. Both sides of the engagement.

🔴

Red team / pentesters

--auto picks the safest exploit and runs it. Honest scope reporting — never claims root it didn't actually get. Per-exploit OPSEC notes tell you what telemetry you'll leave. No more curating stale PoC repos.

Walkthrough →
🔵

Blue team / SOC

One command ships SIEM coverage for the entire corpus. --explain renders a triage briefing per CVE with CWE / ATT&CK / KEV / OPSEC — paste into the ticket. KEV-prioritized so you fix what attackers are already using.

Playbook →
🛠

Sysadmins / IT

--scan works without sudo. JSON output for CI gates. Fleet-scan helper bundled. Compatible with everything back to glibc 2.17 via the static-musl binary. No SaaS, no analytics, no cloud accounts.

JSON schema →
🎓

Researchers / CTF

26 CVEs, 10-year span, each with the original PoC author credited and the kernel-range citation auditable. --explain shows the reasoning chain; detection rules let you practice both sides. Source is the documentation.

Architecture →

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. The shared --full-chain finisher returns EXPLOIT_OK only when a setuid bash sentinel file actually appears. Modules with a primitive but no portable cred-overwrite chain default to firing the primitive + grooming the slab + recording a witness, then return EXPLOIT_FAIL with diagnostic. Operators populate the offset table once per kernel via --dump-offsets and upstream the entry via PR.

Five commands.

# install (x86_64 / arm64; checksum-verified)
$ curl -sSL https://github.com/KaraZajac/SKELETONKEY/releases/latest/download/install.sh | sh
# default is the musl-static x86_64 binary — works back to glibc 2.17
# inventory — no sudo needed
$ skeletonkey --scan
# or machine-readable for a SIEM
$ skeletonkey --scan --json | jq '.findings[] | select(.verdict == "VULNERABLE")'
# one-page operator briefing for a single CVE
$ skeletonkey --explain nf_tables
# shows CVE/CWE/ATT&CK/KEV header, host fingerprint, live trace,
# verdict, OPSEC footprint, detection coverage. Paste into your ticket.
# pick the safest exploit and run it
$ skeletonkey --auto --i-know
# --dry-run for "what would it do?" without launching
$ skeletonkey --auto --dry-run
# deploy SIEM coverage (needs sudo to write to /etc/audit/rules.d/)
$ skeletonkey --detect-rules --format=auditd | sudo tee /etc/audit/rules.d/99-skeletonkey.rules
$ sudo augenrules --load

# or in YAML for falco / sigma / yara
$ skeletonkey --detect-rules --format=falco > /etc/falco/skeletonkey_rules.yaml

Recently shipped · in flight · next.

shipped
  • 22 of 26 CVEs empirically verified in real Linux VMs
  • kernel.ubuntu.com/mainline/ kernel fetch path — unblocks pin-not-in-apt targets
  • Per-module verified_on[] table baked into the binary
  • --explain mode — one-page operator briefing per CVE
  • OPSEC notes — per-module runtime footprint
  • CISA KEV + NVD CWE + MITRE ATT&CK metadata pipeline
  • 119 detection rules across all four SIEM formats
  • core/host.c shared host-fingerprint refactor
  • 88-test harness (kernel_range + detect integration)
in flight
  • 9 deferred TOO_TIGHT kernel-range drift findings
  • PackageKit provisioner so pack2theroot can hit the VULNERABLE path
  • Custom Vagrant box for kernels ≤ 4.4 (unblock dirty_cow verification)
next
  • arm64 musl-static binary (Raspberry-Pi-class deployments)
  • Mass-fleet scan aggregator → heat-map dashboard
  • SIEM query templates (Splunk SPL, Elastic KQL, Sentinel KQL)
  • CWE / ATT&CK filter for --scan --json
  • CI hardening: clang-tidy, scan-build, drift-check job

Full roadmap and contribution guide: ROADMAP.md · CONTRIBUTING.md