Linux 5.12 kernel je usvojio KFence podsistem za otkrivanje grešaka pri radu sa memorijom

Linux kernel 5.12, koji je u razvoju, uključuje implementaciju mehanizma KFence (Kernel Electric Fence), koji provjerava rukovanje memorijom, hvatanje prekoračenja bafera, pristup memoriji nakon oslobađanja i druge greške slične klase.

Slična funkcionalnost je već bila prisutna u kernelu u obliku KASAN build opcije (kernel address sanitizer, koristi Address Sanitizer u modernom gcc-u i clang) - međutim, bila je pozicionirana uglavnom za upotrebu za otklanjanje grešaka. KFence podsistem se razlikuje od KASAN-a po velikoj brzini rada, što omogućava korištenje ove funkcije čak i na jezgrama u radnim sistemima.

Aplikacija na proizvodnim sistemima omogućit će hvatanje grešaka u memoriji koje se ne pojavljuju u probnim radnjama i pojavljuju se samo tokom radnog opterećenja ili tokom dugotrajnog rada (sa velikim produženjem rada). Osim toga, korištenje KFence-a na proizvodnim sistemima omogućit će značajno povećanje broja mašina uključenih u provjeru rada kernela s memorijom.

KFence postiže minimalne troškove neovisne o učitavanju umetanjem zaštitnih stranica u hrpu u fiksnim intervalima. Nakon što je sledeći interval zaštite istekao, KFence, preko standardnog sistema dodeljivanja memorije (SLAB ili SLUB alokator), dodaje sledeću zaštitnu stranicu iz KFence spremišta objekata i pokreće novi izveštaj o brojaču vremena. Svaki objekat KFence nalazi se na zasebnoj memorijskoj stranici, a memorijske stranice duž lijeve i desne ivice formiraju zaštitne stranice, čija se veličina nasumično bira.

Dakle, stranice sa objektima su odvojene jedna od druge zaštitnim stranicama, koje su konfigurisane da generišu „grešku stranice“ pri svakom pristupu. Da bi se otkrilo upisivanje izvan granica unutar stranica objekata, dodatno se koriste „crvene zone“ zasnovane na uzorcima, koje zauzimaju memoriju koju objekti ne koriste, a preostaju kada je veličina memorijskih stranica poravnata. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARD x | J : RED- | x GUARD x | CRVENA- : J | x GUARD x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Ako se pokuša pristupiti području izvan granica bafera, operacija utiče na zaštitnu stranicu, što dovodi do generisanja „greške stranice“, koja presreće KFence i evidentira informacije o identifikovanom problemu. Podrazumevano, KFence ne blokira grešku i samo prikazuje upozorenje u dnevniku, ali postoji postavka “panic_on_warn” koja vam omogućava da stavite kernel u stanje panike ako se otkrije greška.

izvor: opennet.ru

Dodajte komentar