Linux Kernel Updates  Bild © DALL-ELinux Kernel Updates (Bild © DALL-E)

Die Arbeit wird von Josh Poimboeuf geleitet, der mehr als ein Jahrzehnt Erfahrung aus dem kpatch-Projekt in eine vollständige Neufassung einfließen ließ. Kpatch hat zwar gezeigt, dass sicheres Live-Patching in Produktionsumgebungen möglich ist, aber es hat auch zu Komplexität und Wartungsaufwand außerhalb des Baums geführt. Klp-build löst diese Probleme mit einer kleineren Codebasis, Upstream-Integration und einem modernen Diffing-/Linking-Flow, der sich nahtlos in das Kernel-Build-System einfügt.

Neu in Linux 6.19

  • Upstream, nicht außerhalb des Baums. Klp-build wird als Teil der objtool-Änderungen von Linux 6.19 ausgeliefert, wodurch fragile #ifdef-Workarounds entfallen und der langfristige Wartungsaufwand reduziert wird.
  • Objtool-gesteuerte Analyse. Durch die Nutzung des Kontrollflussgraphen und der Funktionsprüfsummen von objtool kann klp-build veränderte Funktionen zuverlässig erkennen und zwischengeschaltete binäre Diff-Objekte für Live-Patches erstellen.
  • Kompatibilität mit modernen Toolchains. Durch die Arbeit mit vmlinux.o kann klp-build LTO und IBT unterstützen und spät verknüpfte Objekte verarbeiten, wodurch Live-Patching mit aktuellen Hardening- und Performance-Praktiken in Einklang gebracht wird.
  • Kleiner, übersichtlicher, sicherer. Die Neuprogrammierung reduziert den Code im Vergleich zu kpatch-build um etwa 3.000 Zeilen und vereinfacht die Verarbeitung von Symbolen, Abschnitten und Verschiebungen, wodurch die Fehleranfälligkeit verringert wird.

Reproduzierbarer End-to-End-Workflow

Klp-build bietet eine übersichtliche Schnittstelle, die die erforderlichen Schritte zum Umwandeln eines Quell-Patches in ein ladbares Livepatch-Modul miteinander verbindet:

  • 1.Baseline-Build: Kompilieren Sie den ungepatchten Kernel mit -ffunction-sections und -fdata-sections, um objtool-Funktionsprüfsummen zu aktivieren.
  • 2.Gepatchter Build: Wenden Sie die .patch an und erstellen Sie den Build mit denselben Optionen neu.
  • 3.Funktionsvergleich: Führe objtool klp diff aus, um geänderte Funktionen zu erkennen und binäre Diff-Objekte auszugeben.
  • 4.Modulzusammenstellung: Verknüpfe diese Objekte mit scripts/livepatch/init.c, um das Livepatch-Modul zu erstellen.
  • 5.Fertigstellung: Verwende objtool klp post-link, um das Modul für das Laden aufzuräumen und fertigzustellen.

Um falsche Unterschiede durch das C-Makro LINE zu vermeiden, enthält die Toolchain fix-patch-lines, das #line-Direktiven einfügt, damit die kompilierten Zeilennummern mit dem Originalquellcode übereinstimmen. Dadurch werden falsche binäre Unterschiede beseitigt und die Genauigkeit der Patches erhöht.

Da klp-build jetzt Teil der Kernel-eigenen Tools ist, haben Teams, die für flottenweite Systeme zuständig sind, einen schnelleren und besser zu wartenden Weg, um Maschinen gepatcht und konform zu halten.