A fejlesztés alatt álló mag Linux Az 5.12-es verzió tartalmazza a KFence (Kernel Electric Fence) mechanizmus implementációját, amely ellenőrzi a memóriahasználatot, észleli a puffer túlcsordulásokat, a felszabadítás utáni memória-hozzáféréseket és más hasonló hibákat.
Hasonló funkcionalitás már jelen volt a kernelben KASAN (kernel address sanitizer, ami a modern gcc és clang nyelvekben az Address Sanitizert használja) nevű fordítási opcióként, de elsősorban hibakeresési célokra szánták. A KFence alrendszer a KASAN-nal ellentétben nagyobb sebességgel működik, így ez a funkció akár éles rendszereken lévő kerneleken is használható.
A KFence éles rendszereken történő használata lehetővé teszi számunkra, hogy olyan memóriahibákat is kiszűrjünk, amelyek nem jelennek meg a tesztfutások során, és csak éles terhelések vagy hosszú távú működés (nagy üzemidő) során kerülnek felszínre. Továbbá a KFence éles rendszereken történő használata jelentősen megnöveli a kernel memória tesztelésében részt vevő gépek számát.
A KFence minimális többletterhelést ér el, függetlenül a terheléstől, azáltal, hogy rögzített időközönként őrlapokat foglal le a heap-nek. Minden őrlap lejárta után a KFence a beépített memória-elosztási rendszert (SLAB vagy SLUB lefoglaló) használja egy újabb őrlap hozzáadásához a KFence objektumkészletből, és új időszámlálót indít. Minden KFence objektum egy külön memórialapon kerül lefoglalásra, és a bal és jobb oldali határon lévő memórialapok őrlapokat alkotnak, amelyek méretét véletlenszerűen választják ki.
Így az objektumokat tartalmazó oldalakat őroldalak választják el egymástól, amelyek úgy vannak konfigurálva, hogy bármilyen hozzáféréskor "oldalhibát" generáljanak. Az objektumokat tartalmazó oldalakon belüli határokon kívüli írások észleléséhez további "piros zónákat" használnak, amelyek az objektumok által nem használt memóriát foglalják el, és akkor maradnak meg, amikor a memóriaoldalak méretei igazodnak. —+————+————+————+————+————+— | 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 : ZÓNA | xxxxxxxxx | ZÓNA : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+—————+————+——
Ha a puffer határain kívül eső területre próbálnak hozzáférni, a művelet a védett oldalt érinti, ami „oldalhibát” okoz, amelyet a KFence elfog és naplóz az észlelt problémáról. Alapértelmezés szerint a KFence nem blokkolja a hibát, és csak egy figyelmeztetést naplóz, de elérhető egy „panic_on_warn” beállítás, amely lehetővé teszi a kernel számára, hogy pánikállapotba lépjen, ha hibát észlel.
Forrás: opennet.ru
