U sklopu razvijanog Linux kernela 5.12 implementiran je mehanizam KFence (Kernel Electric Fence), koji provjerava rad s memorijom, hvatajući izlaze iz granica bafera, pristupe memoriji nakon oslobađanja i druge slične greške.
Slična funkcionalnost već je bila prisutna u kernelu u obliku opcije za izgradnju KASAN (kernel address sanitizer, koristi Address Sanitizer u modernim gcc i clang) — međutim, prvenstveno je bila namijenjena za debugiranje. KFence podsubsystem razlikuje se od KASAN visokom brzinom rada, što omogućuje korištenje ove mogućnosti čak i u kernelima na radnim sustavima.
Primjena na radnim sustavima omogućit će otkrivanje grešaka u radu s memorijom koje se ne javljaju tijekom testnih pokretanja i pojavljuju se samo pod radnim opterećenjima ili pri dugotrajnom radu (s velikim uptime-om). Osim toga, primjena KFence na radnim sustavima će značajno povećati broj mašina uključenih u provjeru rada kernela s memorijom.
Minimalni troškovi, koji ne ovise o opterećenju, postižu se u KFence-u pomoću umetanja stranica zaštite (guard pages) u hrpu kroz fiksne intervale. Nakon isteka vremena sljedećeg intervala zaštite, KFence kroz standardni sustav raspodjele memorije (SLAB ili SLUB allocator) dodaje novu stranicu zaštite iz KFence objektnog bazena i počinje novo mjerenje vremena. Svaki KFence objekt smješten je na posebnoj memorijskoj stranici, a memorijske stranice lijevo i desno od granica čine stranice zaštite (guard pages), čija se veličina bira nasumično.
Na taj način, stranice s objektima odvojene su jedna od druge stranicama zaštite, koje se konfigurišu za generiranje 'page fault' pri svakom pristupu. Za identifikaciju operacija zapisivanja izvan granice bafera unutar stranica s objektima dodatno se koriste 'crvene zone' zasnovane na obrascima, koje zauzimaju memoriju koja nije korištena od strane objekata, a ostaje pri poravnanju veličine stranica memorije. —+————+————+————+————+————+— | 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 | —+————+————+————+————+————+—
U slučaju pokušaja pristupa području izvan granica bafera, operacija utječe na stranicu zaštite, što rezultira generiranjem "page fault" koji zahvaća KFence i bilježi podatke o otkrivenom problemu u dnevnik. Po defaultu, KFence ne blokira grešku i samo bilježi upozorenje u dnevnik, no postoji postavka "panic_on_warn" koja omogućuje da, u slučaju otkrivanja greške, jezgra pređe u stanje kvara (panic).
Izvor: opennet.ru
