Ga naar inhoud

Kernel-CVE pipeline

De kernel-CVE pipeline kijkt anders naar kernel-kwetsbaarheden dan een generieke OS-CVE scanner: hij praat rechtstreeks met de distro-trackers zodat een back-port niet meer als false-positive wordt geflagd.

Generieke OSV/NVD matching geeft floods van false positives op kernels: de upstream-kernel meldt “fixed in 6.11.5” terwijl je distro (Debian 6.8.0-49, Ubuntu 6.8.0-49.49, RHEL 5.14.0-410, …) de patch al binnen de eigen LTS-lijn heeft back-geport. De pipeline matcht per running release tegen de tracker van die distro:

Wat overblijft zijn de echte open kernel-CVEs voor jouw host: vulnerable (geen patch in jouw kernel), patched (distro heeft het opgelost in jouw versie, alleen reboot nodig) of no-backport (distro heeft besloten niet te patchen, alternatief vereist).

In ExtendedInventorySnapshot.kernel_inventory (zichtbaar in de Kernel-tab op elke agent-detailpagina):

veld bron
running_release uname -r
running_version uname -v (build string)
last_boot_time /proc/stat btime
installed_kernels[] dpkg-query / rpm / pacman / qlist / apk
default_kernel /boot/grub/grubenv (saved_entry) of grubby --default-kernel
reboot_required /var/run/reboot-required of dnf needs-restarting -r
mitigations_status /sys/devices/system/cpu/vulnerabilities/*
is_custom_build true als running release in geen enkel installed package zit
kernel_cmdline /proc/cmdline

Oudere agent-binaries (vóór mei 2026) sturen kernel_inventory: null; de hub-side worker slaat die hosts stilzwijgend over: geen false positives, geen false negatives.

Een KernelUpdateBatch is één operator-beslissing (“patch CVE-2026-XXXX op alle hosts in tag web-fleet”). De orchestrator (KernelUpdateOrchestratorWorker, elke 60s) splitst dat in:

  1. Canary: 10% van de geselecteerde hosts, max 3, min 1. Krijgt direct een Level-3 EAT met update_kernel-actie. Phase tracking via kernel_update_progress.phase (queued → installing → installed → reboot_pending → rebooted_new).
  2. Primary: pas geactiveerd als alle canary-hosts rebooted_new bereiken. Bij één canary-failure wordt de hele batch geaborteerd met abort_reason.

Elk EAT loopt door dezelfde pipeline als handmatige acties: signing via MONSYS_EMERGENCY_PRIVATE_KEY, append-only transparency_log entry, persistente audit_log rij.

De agent draait nooit als root. Kernel-installs gaan via /usr/local/sbin/monsys-kernel-update met een specifieke sudoers-regel:

monsys ALL=(root) NOPASSWD: /usr/local/sbin/monsys-kernel-update

De wrapper valideert zelf elk argument (allowlist regex per package manager), snapshot de pre-install kernel-set, runt de juiste install (apt/dnf/zypper/pacman/portage), updatet de bootloader en initramfs, en zet /var/run/reboot-required zodat de hub het oppikt op de volgende inventory-cyclus.

--reboot-strategy opties:

  • none: operator reboot manueel (default, safest)
  • manual: agent toont banner; geen actie
  • auto-at-window: shutdown -r +5 (alleen binnen maintenance window)

Bronnen en de status “patch in aantocht”

Section titled “Bronnen en de status “patch in aantocht””

De worker combineert per distributie:

Distro Bron Wat het oplevert
Ubuntu USN-database patched of vulnerable met de fix-versie, per kernel-flavor
Ubuntu CVE-tracker (ubuntu.com/security/cves) kernel-CVE’s met prioriteit high/critical die nog geen pakket hebben (needed/pending)
Debian security-tracker (streaming, alleen het linux-pakket) open/resolved per suite; resolved wordt pas patched als de draaiende Debian-versie (uit uname -v) de fix-versie haalt
RHEL/Gentoo CSAF / GLSA beperkt (zie roadmap)

Een CVE waarvoor de distributie de fix nog niet heeft uitgebracht staat als vulnerable met in de kolom patch beschikbaar de tekst pending 7.0.0-43.43 (de aangekondigde versie) of no fix in archive yet. Dat is precies het venster waarin je zelf moet mitigeren; zo zag je CVE-2026-98432 (MPTCP) op 30/10/2026 vóór Canonical een USN had. De suite en codename komen uit os-release (12 → bookworm, 26.04 → resolute); een backport-kernel (~deb12u1) wordt tegen zijn eigen bronpakket (linux-6.12) gecontroleerd. Debian-CVE’s met urgentie unimportant worden niet als finding opgenomen.

patch_hygiene is sinds deze pipeline een composiet:

final = 0.7 × application_cves + 0.3 × kernel_currency

Kernel currency strafpunten (max −100):

  • elke open vulnerable finding tegen running release: −3 (cap −30)
  • reboot_required > 7 dagen: −15, > 30 dagen: −25
  • is_custom_build (geen tracker-visibility): −10
  • nieuwere installed kernel dan running (geïnstalleerd, niet gereboot): −10

Hosts op een pre-pipeline agent worden blanked (geen score-drop, UI toont “agent verouderd”).

De maandelijkse Audit Pack (zie Monthly Audit Pack) bevat sinds deze pipeline vier kernel-emitters:

kind inhoud
kernel_running per agent: huidige release, distro, reboot-required, last boot
kernel_cve_finding per maand: alle gedetecteerde CVEs met tracker bron + distro status
kernel_reboot per maand: elke reboot met prev/new release + expected flag (EAT-driven of niet)
kernel_update_batch per maand: alle orchestrator-batches met canary/primary status + abort reasons

In de PDF verschijnt een eigen sectie “Kernel currency” tussen de KEV-CVE tabel en de Emergency Action Tokens log.

Migratie 095 voegt 7 controls toe (alle draft tot legal review):

  • NIS2 Art21 §2(e): kernel-CVE patching met canary + audit log
  • NIS2 Art21 §2(g): kernel currency hygiene (outdated kernels)
  • CRA AnnexI §6: secure kernel updates (Ed25519-signed)
  • CRA AnnexI §11, vulnerability handling, kernel (backport-aware)
  • CRA AnnexI §12: capability to deploy kernel patches
  • ISO 27001 A.8.8: detection (continuous tracker monitoring)
  • ISO 27001 A.8.8: patching cadence (vulnerable > 30 dagen)