Der in Entwicklung befindliche Linux-Kernel 5.12 umfasst die Implementierung des KFence-Mechanismus (Kernel Electric Fence), der den Umgang mit Speicher ĂŒberwacht, indem er PufferĂŒberlĂ€ufe, Zugriffe auf bereits freigegebenen Speicher und andere Ă€hnliche Fehler aufspĂŒrt.
Eine derartige FunktionalitĂ€t war bereits in Form der KASAN-Build-Option (Kernel Address Sanitizer, nutzt Address Sanitizer in modernen gcc und clang) im Kernel vorhanden â sie war jedoch hauptsĂ€chlich fĂŒr Debugging-Zwecke gedacht. Das KFence-Subsystem unterscheidet sich von KASAN durch eine hohe Geschwindigkeit, die es ermöglicht, diese Funktion selbst auf Kerneln in produktiven Systemen zu nutzen.
Der Einsatz in produktiven Systemen wird es ermöglichen, Speicherfehler zu erkennen, die in TestlĂ€ufen nicht sichtbar werden und erst bei Arbeitslasten oder ĂŒber lĂ€ngere ZeitrĂ€ume (bei hoher VerfĂŒgbarkeit) auftauchen. Zudem ermöglicht der Einsatz von KFence in produktiven Systemen eine signifikante Erhöhung der Anzahl der Maschinen, die an der ĂberprĂŒfung des Speichermanagements des Kernels beteiligt sind.
Die minimalen, lastunabhĂ€ngigen Betriebskosten werden bei KFence durch das EinfĂŒgen von Schutzseiten (guard pages) in den Heap in festen Intervallen erreicht. Nach Ablauf einer Schutzintervallzeit fĂŒgt KFence ĂŒber den vorhandenen Speicherverteilungsmechanismus (SLAB oder SLUB-Allocator) eine neue Schutzseite aus dem KFence-Objektpool hinzu und startet einen neuen Zeitgeber. Jedes KFence-Objekt wird auf einer separaten Speicherseite platziert, und die Speicherseiten an der linken und rechten Grenze bilden die Schutzseiten (guard pages), deren GröĂe zufĂ€llig gewĂ€hlt wird.
Somit werden Seiten mit Objekten durch Schutzseiten getrennt, die so konfiguriert sind, dass sie einen âSeitenfehlerâ bei jedem Zugriff erzeugen. Um Schreiboperationen auĂerhalb des Puffers innerhalb der Objektseiten zu identifizieren, werden zusĂ€tzlich ârote Zonenâ basierend auf Mustern verwendet, die Speicher belegen, der von Objekten nicht verwendet wird und beim Ausrichten der SeitenlĂ€ngen im Speicher verbleibt. â+ââââ+ââââ+ââââ+ââââ+ââââ+â | xxxxxxxxx | O : | xxxxxxxxx | : O | xxxxxxxxx | | xxxxxxxxx | B : | xxxxxxxxx | : B | xxxxxxxxx | | x GUARD x | J : ROT- | x GUARD x | ROT- : J | x GUARD x | | xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx | â+ââââ+ââââ+ââââ+ââââ+ââââ+â
Wenn Sie versuchen, auf einen Bereich auĂerhalb der Grenzen des Puffers zuzugreifen, betrifft die Operation die Schutzseite, was zu einem âSeitenfehlerâ fĂŒhrt, der von KFence abgefangen wird und die erkannten Problemdaten in das Protokoll schreibt. StandardmĂ€Ăig blockiert KFence den Fehler nicht und gibt lediglich eine Warnung im Protokoll aus, es gibt jedoch eine Konfiguration âpanic_on_warnâ, die es ermöglicht, den Kernel im Falle eines Fehlers in einen Absturzstatus (panic) zu versetzen.
Quelle: opennet.ru
