Der Linux 5.12-Kernel hat das KFence-Subsystem übernommen, um Fehler bei der Arbeit mit dem Speicher zu erkennen

Der in der Entwicklung befindliche Linux-Kernel 5.12 enthält eine Implementierung des KFence-Mechanismus (Kernel Electric Fence), der die Speicherverwaltung überprüft, Pufferüberläufe abfängt, Speicherzugriffe nach der Freigabe und andere Fehler ähnlicher Klasse.

Eine ähnliche Funktionalität war bereits im Kernel in Form der KASAN-Build-Option (Kernel Address Sanitizer, verwendet Address Sanitizer in modernem GCC und Clang) vorhanden – sie war jedoch hauptsächlich für Debugging-Zwecke positioniert. Das KFence-Subsystem unterscheidet sich von KASAN durch seine hohe Betriebsgeschwindigkeit, die es ermöglicht, diese Funktion auch auf Kernen in funktionierenden Systemen zu nutzen.

Die Anwendung auf Produktionssystemen ermöglicht es, Speicherfehler abzufangen, die nicht in Testläufen auftreten, sondern nur während der Arbeitslast oder im Langzeitbetrieb (mit großer Betriebszeit) auftreten. Darüber hinaus ermöglicht der Einsatz von KFence auf Produktionssystemen eine deutliche Erhöhung der Anzahl der Maschinen, die an der Überprüfung des Kernels mit Speicher beteiligt sind.

KFence erreicht einen minimalen lastunabhängigen Overhead, indem es in festen Abständen Schutzseiten in den Heap einfügt. Nachdem das nächste Schutzintervall abgelaufen ist, fügt KFence über das Standardspeicherzuweisungssystem (SLAB oder SLUB-Zuweisung) die nächste Schutzseite aus dem KFence-Objektpool hinzu und startet einen neuen Zeitzählerbericht. Jedes KFence-Objekt befindet sich auf einer separaten Speicherseite und die Speicherseiten entlang der linken und rechten Ränder bilden Schutzseiten, deren Größe zufällig ausgewählt wird.

Daher sind Seiten mit Objekten durch Schutzseiten voneinander getrennt, die so konfiguriert sind, dass sie bei jedem Zugriff einen „Seitenfehler“ generieren. Um außerhalb der Grenzen liegende Schreibvorgänge innerhalb von Objektseiten zu erkennen, werden zusätzlich musterbasierte „rote Zonen“ verwendet, die nicht von Objekten genutzten Speicher belegen und verbleiben, wenn die Größe der Speicherseiten angepasst wird. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x WÄCHTER x | J: ROT- | x WÄCHTER x | ROT- : J | x WÄCHTER x | | xxxxxxxxx | E: ZONE | xxxxxxxxx | ZONE: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Wenn versucht wird, auf einen Bereich außerhalb der Puffergrenzen zuzugreifen, wirkt sich der Vorgang auf die Schutzseite aus, was zur Erzeugung eines „Seitenfehlers“ führt, der KFence abfängt und Informationen über das identifizierte Problem protokolliert. Standardmäßig blockiert KFence keinen Fehler und zeigt nur eine Warnung im Protokoll an, es gibt jedoch eine „panic_on_warn“-Einstellung, die es Ihnen ermöglicht, den Kernel in einen Panikzustand zu versetzen, wenn ein Fehler erkannt wird.

Source: opennet.ru

Kommentar hinzufügen