De Linux 5.12-kernel heeft het KFence-subsysteem overgenomen om fouten te detecteren bij het werken met geheugen

De Linux-kernel 5.12, die in ontwikkeling is, bevat een implementatie van het KFence-mechanisme (Kernel Electric Fence), dat de geheugenverwerking controleert, bufferoverruns opvangt, geheugentoegang na het vrijmaken en andere fouten van een vergelijkbare klasse.

Soortgelijke functionaliteit was al aanwezig in de kernel in de vorm van de KASAN-buildoptie (kerneladressanitizer, gebruikt Address Sanitizer in moderne gcc en clang) - maar deze was voornamelijk gepositioneerd voor gebruik bij het debuggen. Het KFence-subsysteem verschilt van KASAN door zijn hoge werksnelheid, waardoor deze functie zelfs op kernen in werkende systemen kan worden gebruikt.

Toepassing op productiesystemen maakt het mogelijk om geheugenfouten op te sporen die niet voorkomen tijdens testruns en alleen verschijnen tijdens workloads of tijdens langdurig gebruik (met een grote uptime). Bovendien zal het gebruik van KFence op productiesystemen het mogelijk maken om het aantal machines dat betrokken is bij het controleren van de werking van de kernel met geheugen aanzienlijk te vergroten.

KFence bereikt een minimale lastonafhankelijke overhead door op vaste intervallen beschermpagina's in de stapel te plaatsen. Nadat het volgende beschermingsinterval is verstreken, voegt KFence, via het standaard geheugentoewijzingssysteem (SLAB of SLUB-allocator), de volgende beschermingspagina toe uit de KFence-objectpool, en start een nieuw tijdtellerrapport. Elk KFence-object bevindt zich op een aparte geheugenpagina, en de geheugenpagina's langs de linker- en rechterrand vormen beveiligingspagina's, waarvan de grootte willekeurig wordt gekozen.

Pagina's met objecten worden dus van elkaar gescheiden door beveiligingspagina's, die zijn geconfigureerd om bij elke toegang een "paginafout" te genereren. Om schrijfbewerkingen binnen objectpagina's buiten de grenzen te detecteren, worden bovendien op patronen gebaseerde 'rode zones' gebruikt, die geheugen in beslag nemen dat niet door objecten wordt gebruikt en overblijven wanneer de grootte van de geheugenpagina's is uitgelijnd. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x BESCHERM x | J : ROOD- | x BESCHERM x | ROOD- : J | x BESCHERM x | | xxxxxxxxx | E: ZONE | xxxxxxxxx | ZONE: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Als er een poging wordt gedaan om toegang te krijgen tot een gebied buiten de buffergrenzen, heeft de handeling invloed op de beveiligingspagina, wat leidt tot het genereren van een “paginafout”, die KFence onderschept en informatie over het geïdentificeerde probleem registreert. Standaard blokkeert KFence geen fout en geeft alleen een waarschuwing weer in de log, maar er is een “panic_on_warn”-instelling waarmee u de kernel in paniek kunt brengen als er een fout wordt gedetecteerd.

Bron: opennet.ru

Voeg een reactie