release v0.9.5: kernel_range drift cleanup (12 modules)
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

v0.9.4 fixed cve_metadata drift but exposed kernel_range drift which
had been hidden behind it. Applied refresh-kernel-ranges.py --patch
recommendations: 11 TOO_TIGHT findings (false-positive risk — our
threshold later than Debian's earliest known fix) + 8 MISSING (Debian
has fixes for branches we didn't model) across 12 modules.

All changes are strictly correctness-improving: detect() now correctly
returns OK on kernels Debian has on record as patched, instead of
false-positiving VULNERABLE.

The biggest single fix is reverting fragnesia from {7,0,10} (NVD) to
{7,0,9} (Debian's backported fix). I introduced that off-by-one in
v0.9.4 from misreading NVD's versionEndExcluding semantics.

Build's kernel_range drift step now exits 0 with 0 TOO_TIGHT + 0 MISSING.
This commit is contained in:
KaraZajac
2026-05-28 14:51:15 -04:00
parent bb5ca48fe1
commit 13fbbce618
16 changed files with 58 additions and 15 deletions
+1 -1
View File
@@ -202,7 +202,7 @@ also compile (modules with Linux-only headers stub out gracefully).
## Status ## Status
**v0.9.4 cut 2026-05-28.** 39 modules across 34 CVEs — **every **v0.9.5 cut 2026-05-28.** 39 modules across 34 CVEs — **every
year 2016 → 2026 now covered**. v0.9.0 added 5 gap-fillers year 2016 → 2026 now covered**. v0.9.0 added 5 gap-fillers
(`mutagen_astronomy` / `sudo_runas_neg1` / `tioscpgrp` / `vsock_uaf` / (`mutagen_astronomy` / `sudo_runas_neg1` / `tioscpgrp` / `vsock_uaf` /
`nft_pipapo`); v0.8.0 added 3 (`sudo_chwoot` / `udisks_libblockdev` / `nft_pipapo`); v0.8.0 added 3 (`sudo_chwoot` / `udisks_libblockdev` /
+40
View File
@@ -1,3 +1,43 @@
## SKELETONKEY v0.9.5 — kernel_range drift cleanup (the other half)
v0.9.4 fixed the `cve_metadata` drift but exposed a *second* drift
check (`kernel_range drift`) that had been hidden behind it. That
check compares each module's `kernel_patched_from` table against
Debian's security tracker. It had **11 TOO_TIGHT + 8 MISSING
findings across 12 modules** — meaning `detect()` would have
reported VULNERABLE on many kernels that Debian has on record as
patched (false-positives), or missed branches entirely.
Applied `tools/refresh-kernel-ranges.py --patch` recommendations
across:
- `cgroup_release_agent``{5,16,9}``{5,16,7}`
- `cls_route4``{5,10,143}``{5,10,136}`, `{5,18,18}``{5,18,16}`
- `dirty_cow``{4,7,10}``{4,7,8}`
- `dirty_pipe``{5,10,102}``{5,10,92}`
- `fragnesia``{6,12,91}``{6,12,90}`, `{7,0,10}``{7,0,9}`
(the 7.0.10 entry I added in v0.9.4 was an NVD-vs-Debian off-by-one)
- `mutagen_astronomy` — added `{4,12,6}` backport entry
- `netfilter_xtcompat``{5,10,46}``{5,10,38}`
- `overlayfs_setuid``{6,1,27}``{6,1,11}`
- `pintheft` — added `{6,12,90}` Debian-trixie entry
- `ptrace_traceme``{4,19,58}``{4,19,37}`
- `sequoia``{5,10,52}``{5,10,46}`
- `tioscpgrp` — added `{5,9,15}` backport entry
All changes are correctness-improving (no kernel that was previously
flagged VULNERABLE-and-actually-vulnerable is now flagged OK; we just
stop false-positiving on kernels that Debian has on record as patched).
Build's `kernel_range drift` step now exits 0 with 0 TOO_TIGHT and 0
MISSING.
Also enabled `workflow_dispatch` on the build workflow so the
drift-check job can be manually triggered without waiting for the
weekly Monday-06:00-UTC cron.
---
## SKELETONKEY v0.9.4 — drift unblock, fragnesia range fix, infra docs ## SKELETONKEY v0.9.4 — drift unblock, fragnesia range fix, infra docs
Quality-of-life follow-ups from the v0.9.3 review: Quality-of-life follow-ups from the v0.9.3 review:
+2 -2
View File
@@ -56,7 +56,7 @@
<div class="container hero-inner"> <div class="container hero-inner">
<div class="hero-eyebrow"> <div class="hero-eyebrow">
<span class="dot dot-pulse"></span> <span class="dot dot-pulse"></span>
v0.9.4 — released 2026-05-28 v0.9.5 — released 2026-05-28
</div> </div>
<h1 class="hero-title"> <h1 class="hero-title">
<span class="display-wordmark">SKELETONKEY</span> <span class="display-wordmark">SKELETONKEY</span>
@@ -598,7 +598,7 @@ uid=0(root) gid=0(root)</pre>
who found the bugs. who found the bugs.
</p> </p>
<p class="footer-meta"> <p class="footer-meta">
v0.9.4 · MIT · <a href="https://github.com/KaraZajac/SKELETONKEY">github.com/KaraZajac/SKELETONKEY</a> v0.9.5 · MIT · <a href="https://github.com/KaraZajac/SKELETONKEY">github.com/KaraZajac/SKELETONKEY</a>
</p> </p>
</div> </div>
</footer> </footer>
@@ -65,7 +65,7 @@ static const struct kernel_patched_from cgroup_ra_patched_branches[] = {
{5, 4, 179}, {5, 4, 179},
{5, 10, 100}, {5, 10, 100},
{5, 15, 23}, {5, 15, 23},
{5, 16, 9}, {5, 16, 7}, /* Debian tracker: earlier than 5.16.9 in stable */
{5, 17, 0}, /* mainline */ {5, 17, 0}, /* mainline */
}; };
@@ -69,9 +69,9 @@
static const struct kernel_patched_from cls_route4_patched_branches[] = { static const struct kernel_patched_from cls_route4_patched_branches[] = {
{5, 4, 213}, {5, 4, 213},
{5, 10, 143}, {5, 10, 136}, /* Debian tracker: earlier than 5.10.143 */
{5, 15, 69}, {5, 15, 69},
{5, 18, 18}, {5, 18, 16}, /* Debian tracker: earlier than 5.18.18 */
{5, 19, 7}, {5, 19, 7},
{5, 20, 0}, /* mainline */ {5, 20, 0}, /* mainline */
}; };
@@ -72,7 +72,7 @@ static const struct kernel_patched_from dirty_cow_patched_branches[] = {
{3, 16, 38}, {3, 16, 38},
{3, 18, 43}, {3, 18, 43},
{4, 4, 26}, /* Ubuntu 16.04 baseline */ {4, 4, 26}, /* Ubuntu 16.04 baseline */
{4, 7, 10}, {4, 7, 8}, /* Debian tracker: earlier than 4.7.10 */
{4, 8, 3}, {4, 8, 3},
{4, 9, 0}, /* mainline fix */ {4, 9, 0}, /* mainline fix */
}; };
@@ -204,7 +204,7 @@ static void revert_passwd_page_cache(void)
* - mainline (≥ 5.17) is patched * - mainline (≥ 5.17) is patched
*/ */
static const struct kernel_patched_from dirty_pipe_patched_branches[] = { static const struct kernel_patched_from dirty_pipe_patched_branches[] = {
{5, 10, 102}, /* 5.10.x backport */ {5, 10, 92}, /* 5.10.x backport (Debian tracker: earlier than 5.10.102) */
{5, 15, 25}, /* 5.15.x backport */ {5, 15, 25}, /* 5.15.x backport */
{5, 16, 11}, /* 5.16.x backport (mainline fix lived here briefly) */ {5, 16, 11}, /* 5.16.x backport (mainline fix lived here briefly) */
{5, 17, 0}, /* mainline fix lands; everything from here is fine */ {5, 17, 0}, /* mainline fix lands; everything from here is fine */
@@ -919,9 +919,9 @@ static const struct kernel_patched_from fragnesia_patched_branches[] = {
{5, 15, 208}, /* 5.15-LTS backport */ {5, 15, 208}, /* 5.15-LTS backport */
{6, 1, 174}, /* 6.1-LTS backport */ {6, 1, 174}, /* 6.1-LTS backport */
{6, 6, 141}, /* 6.6-LTS backport */ {6, 6, 141}, /* 6.6-LTS backport */
{6, 12, 91}, /* 6.12-LTS backport */ {6, 12, 90}, /* 6.12-LTS backport (Debian trixie ships .90 with fix) */
{6, 18, 33}, /* 6.18-LTS backport */ {6, 18, 33}, /* 6.18-LTS backport */
{7, 0, 10}, /* 7.0 stable: fix lands at 7.0.10 */ {7, 0, 9}, /* 7.0 stable (Debian forky/sid ship .9 with backported fix) */
}; };
static const struct kernel_range fragnesia_range = { static const struct kernel_range fragnesia_range = {
.patched_from = fragnesia_patched_branches, .patched_from = fragnesia_patched_branches,
@@ -71,6 +71,7 @@
* VULNERABLE by version-only check; the RLIMIT_STACK active probe * VULNERABLE by version-only check; the RLIMIT_STACK active probe
* (--active) is required to confirm exploitability on a real host. */ * (--active) is required to confirm exploitability on a real host. */
static const struct kernel_patched_from mutagen_patched_branches[] = { static const struct kernel_patched_from mutagen_patched_branches[] = {
{4, 12, 6}, /* Debian-tracked backport on 4.12 branch */
{4, 14, 71}, /* 4.14 LTS stable backport */ {4, 14, 71}, /* 4.14 LTS stable backport */
{4, 18, 8}, /* mainline + everything above inherits */ {4, 18, 8}, /* mainline + everything above inherits */
}; };
@@ -103,7 +103,7 @@ static const struct kernel_patched_from netfilter_xtcompat_patched_branches[] =
{4, 14, 240}, {4, 14, 240},
{4, 19, 198}, {4, 19, 198},
{5, 4, 128}, {5, 4, 128},
{5, 10, 46}, {5, 10, 38}, /* Debian tracker: earlier than 5.10.46 */
{5, 11, 20}, {5, 11, 20},
{5, 12, 13}, {5, 12, 13},
{5, 13, 0}, /* mainline (5.13 carries b29c457a6511) */ {5, 13, 0}, /* mainline (5.13 carries b29c457a6511) */
@@ -62,7 +62,7 @@
static const struct kernel_patched_from overlayfs_setuid_patched_branches[] = { static const struct kernel_patched_from overlayfs_setuid_patched_branches[] = {
{5, 10, 179}, /* 5.10.x stable backport (per Debian tracker — bullseye) */ {5, 10, 179}, /* 5.10.x stable backport (per Debian tracker — bullseye) */
{5, 15, 110}, {5, 15, 110},
{6, 1, 27}, {6, 1, 11}, /* Debian tracker: earlier than 6.1.27 */
{6, 2, 13}, {6, 2, 13},
{6, 3, 0}, /* mainline */ {6, 3, 0}, /* mainline */
}; };
@@ -97,6 +97,7 @@
* patch (likely 6.16 once the post-rc release tags). Conservatively * patch (likely 6.16 once the post-rc release tags). Conservatively
* placeholding at {7, 0, 0} until that lands. */ * placeholding at {7, 0, 0} until that lands. */
static const struct kernel_patched_from pintheft_patched_branches[] = { static const struct kernel_patched_from pintheft_patched_branches[] = {
{6, 12, 90}, /* Debian trixie ships 6.12.90 with the fix backported */
{7, 0, 0}, /* mainline fix commit 0cebaccef3ac; tag will be 6.16 or 7.0 {7, 0, 0}, /* mainline fix commit 0cebaccef3ac; tag will be 6.16 or 7.0
depending on when 6.15 closes — refresh when known */ depending on when 6.15 closes — refresh when known */
}; };
@@ -53,7 +53,7 @@ static const struct kernel_patched_from ptrace_traceme_patched_branches[] = {
{4, 4, 182}, {4, 4, 182},
{4, 9, 182}, {4, 9, 182},
{4, 14, 131}, {4, 14, 131},
{4, 19, 58}, {4, 19, 37}, /* Debian tracker: earlier than 4.19.58 */
{5, 0, 20}, {5, 0, 20},
{5, 1, 17}, {5, 1, 17},
{5, 2, 0}, /* mainline (5.2-rc) */ {5, 2, 0}, /* mainline (5.2-rc) */
@@ -127,7 +127,7 @@
static const struct kernel_patched_from sequoia_patched_branches[] = { static const struct kernel_patched_from sequoia_patched_branches[] = {
{5, 4, 134}, {5, 4, 134},
{5, 10, 52}, {5, 10, 46}, /* Debian tracker: earlier than 5.10.52 */
{5, 13, 4}, {5, 13, 4},
{5, 14, 0}, /* mainline */ {5, 14, 0}, /* mainline */
}; };
@@ -56,6 +56,7 @@ static const struct kernel_patched_from tioscpgrp_patched_branches[] = {
{4, 14, 213}, /* 4.14 LTS */ {4, 14, 213}, /* 4.14 LTS */
{4, 19, 165}, /* 4.19 LTS */ {4, 19, 165}, /* 4.19 LTS */
{5, 4, 85}, /* 5.4 LTS */ {5, 4, 85}, /* 5.4 LTS */
{5, 9, 15}, /* Debian-tracked 5.9 backport */
{5, 10, 0}, /* mainline fix in 5.10 */ {5, 10, 0}, /* mainline fix in 5.10 */
}; };
+1 -1
View File
@@ -35,7 +35,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#define SKELETONKEY_VERSION "0.9.4" #define SKELETONKEY_VERSION "0.9.5"
static const char BANNER[] = static const char BANNER[] =
"\n" "\n"