De KFence-subsysteem is aangenomen in Linux-kernel 5.12 voor het opsporen van geheugenfouten.

De in ontwikkeling zijnde Linux-kernel 5.12 bevat de implementatie van het KFence-mechanisme (Kernel Electric Fence), dat geheugenoperaties controleert door bufferoverlopen, toegang tot geheugen na vrijgave en andere fouten van soortgelijke aard te detecteren.

Een vergelijkbare functionaliteit was al aanwezig in de kernel in de vorm van de KASAN-bundeloptie (kernel address sanitizer, die Address Sanitizer gebruikt in moderne gcc en clang) — maar deze was voornamelijk gericht op debugtoepassingen. De KFence-subsysteem verschilt van KASAN door zijn hoge snelheid, wat het mogelijk maakt om deze functie zelfs op kernels in productiesystemen te gebruiken.

Toepassing in productiesystemen biedt de mogelijkheid om geheugenfouten te detecteren die zich niet manifesteren tijdens testuitvoeringen en alleen naar voren komen bij werkbelastingen of langdurig gebruik (bij een hoge uptime). Bovendien biedt de toepassing van KFence op productiesystemen een aanzienlijke toename van het aantal machines dat betrokken is bij het testen van de werking van de kernel met geheugen.

Minimale overhead, ongeacht de belasting, wordt in KFence bereikt door beschermingpagina's (guard pages) in de heap in te voegen in vaste intervallen. Na het verstrijken van de tijd voor het huidige beschermingsinterval voegt KFence via het standaard geheugentoewijzingssysteem (SLAB of SLUB allocator) een nieuwe beschermingpagina uit de KFence-objectpool toe en start het nieuwe tijdsregistratieteller. Elk KFence-object wordt geplaatst op een aparte geheugenpagina, en de geheugenpagina's aan de linker- en rechterzijde vormen de beschermingpagina's (guard pages), waarvan de grootte willekeurig wordt gekozen.

Op deze manier worden pagina's met objecten van elkaar gescheiden door beschermingpagina's, die zijn ingesteld om een "page fault" te genereren bij elke toegang. Voor het identificeren van schrijfoperaties buiten de buffer binnen de pagina's met objecten worden bovendien "rode zones" op basis van sjablonen gebruikt, die geheugen gebruiken dat niet door objecten wordt gebruikt en overblijft bij het uitlijnen van de grootte van geheugenpagina's. —+————+————+————+————+————+— | xxxxxxxxx | O : | xxxxxxxxx | : O | xxxxxxxxx | | xxxxxxxxx | B : | xxxxxxxxx | : B | xxxxxxxxx | | x GUARD x | J : RED- | x GUARD x | RED- : J | x GUARD x | | xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Bij de poging om een gebied buiten de grenzen van de buffer aan te spreken, beïnvloedt de operatie de beschermingspagina, wat resulteert in de generatie van een «page fault», die door KFence wordt onderschept en loggegevens over het geconstateerde probleem registreert. Standaard blokkeert KFence de fout niet en logt alleen een waarschuwing, maar er is een instelling «panic_on_warn» beschikbaar die, in geval van een fout, de kernel in een crashtoestand (panic) kan brengen.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster