Veröffentlichung von LKRG 1.0.0 zum Schutz vor der Ausnutzung von Schwachstellen im Linux-Kernel

Das Openwall-Projekt hat das Kernel-Modul LKRG 1.0.0 (Linux Kernel Runtime Guard) veröffentlicht, das zur Überprüfung der Integrität von Kernel-Strukturen und zur Erkennung von Versuchen zur Ausnutzung von Schwachstellen im Kernel dient. Es wird hervorgehoben, dass die Vergabe der Versionsnummer 1.0.0 das Erreichen eines reifen Zustands des Projekts markiert. Der Code des Projekts wird unter der GPLv2-Lizenz verbreitet.

Das Modul eignet sich sowohl für Schutz vor Angriffen, die bereits bekannte Schwachstellen im Linux-Kernel ausnutzen, als auch zur Abwehr von Exploits, die noch unbekannte Schwachstellen verwenden, sofern keine speziellen Maßnahmen zur Umgehung von LKRG angewendet werden. Der Schutz basiert auf der Erkennung unbefugter Änderungen am laufenden Kernel (Integritätsüberprüfung) und der Überwachung von Berechtigungsänderungen bei Benutzerprozessen (Bestimmung der Anwendung von Exploits).

Die Integritätsüberprüfung erfolgt auf der Grundlage des Vergleichs von Hashes, die für die wichtigsten Speicherbereiche und Datenstrukturen des Kernels berechnet werden, wie etwa IDT (Interrupt Descriptor Table), MSR, Systemaufruftabellen, alle Prozeduren und Funktionen, Interrupt-Handler, Listen der geladenen Module, der Inhalt des Abschnitts „.text“ der Module und die Attribute von Prozessen. Der Prüfungsprozess wird periodisch durch einen Timer aktiviert oder bei bestimmten Ereignissen im Kernel, beispielsweise bei der Ausführung der Systemaufrufe setuid, setreuid, fork, exit, execve und do_init_module.

Die Erkennung möglicher Anwendungen von Exploits und die Blockierung von Angriffen erfolgt noch bevor der Kernel den Zugriff auf Ressourcen gewährt (zum Beispiel vor dem Öffnen einer Datei), jedoch nachdem der Prozess unbefugte Berechtigungen erhalten hat (zum Beispiel durch Änderung der UID). Bei der Feststellung unbefugten Verhaltens von Prozessen erfolgt deren zwangsweise Beendigung, was zur Blockierung vieler Exploits ausreicht. Die Belastung durch den Betrieb des Moduls wird auf 2-2,5 % geschätzt.

Die Arbeit auf Systemen mit Architekturen x86-64, AArch64 (ARM64), ARM32 und x86 wird unterstützt. Die Arbeiten an LKRG 1.0.0 wurden mit Kernen aus verschiedenen Distributionen getestet, beginnend mit Kernel 3.10 aus RHEL/CentOS 7 bis hin zu 6.17-rc4 aus dem Repository, in dem die Veröffentlichung von Fedora 44 vorbereitet wird. Pakete sind für die Distributionen ALT Linux, Arch Linux, Astra Linux, Gentoo, Guix, NixOS, Rocky Linux, Whonix, Yocto und OpenBMC verfügbar. Die für Rocky Linux erstellten Pakete können in RHEL 8/9 und abgeleiteten Distributionen wie AlmaLinux 8/9 verwendet werden, während die Pakete für Whonix in Debian und Ubuntu verfügbar sind.

Zu den Neuerungen in der neuen Version gehören:

  • Die Kompatibilität mit Linux-Kernen bis zur Version 6.17-rc4 wurde sichergestellt.
  • Bei der Verwendung mit Kernen ab 6.13 wurde der Abgriff von Remote-Calls override_creds() und revert_creds() eingestellt, was die Erkennung von Angriffen einschränkt, die den cred-Pointer überschreiben. Die Einschränkungen wurden versucht durch Hinzufügung von Überprüfungen der überschriebenen cred-Pointer an anderen Stellen im Kernel zu kompensieren.
  • Die übermäßige Nachverfolgung von Anmeldeinformationen, für die keine Integritätsprüfung durchgeführt wird, wurde eingestellt. Diese Änderung führte zur Reduzierung des Codes um etwa 1500 Zeilen.
  • Die Unterstützung für einen in Linux-Kernel 6.10 eingeführten Mechanismus zur Erstellung temporärer Dateien im OverlayFS wurde hinzugefügt, wobei die Option O_TMPFILE (ovl_tmpfile) verwendet wird. Diese Unterstützung ist notwendig, um falsche Alarme zu verhindern, die bei der Verwendung isolierter Container auf Systemen mit Kernen 6.10-6.12 auftreten können.
  • Für Systeme x86_64 wurde die Unterstützung für die Intel CET (Control-flow Enforcement Technology) zur Schutz von ausführbarem Code unter Verwendung von IBT (indirekt Branch Tracking) sowie einer softwarebasierten Schutzmaßnahme kCFI (Kernel Control Flow Integrity) zur Blockierung von Verstößen gegen die normale Ausführungsreihenfolge eingeführt, die durch Exploits verursacht werden, die die in den Speicher geladenen Funktionszeiger ändern.
  • Für den Anschluss mehrerer Handler wurde anstelle von kretprobes der Mechanismus kprobes verwendet, der den Code zur Einrichtung von Hooks vereinfacht und eine höhere Leistung ermöglicht.
  • Die Arbeit mit Prozess-spezifischen Datensperren (per-task shadow data) im Kernel wurde überarbeitet. Durch den Ausschluss überflüssiger Sperren konnte die Leistungsfähigkeit beim Zugriff auf solche Daten gesteigert werden.
  • Fehler, die zu einem Zustand des Wettlaufs, Integritätsprüfungsproblemen und falschen Alarme führten, wurden behoben.
  • Der Support für den Build mit Clang wurde verbessert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4