A Linux 5.12-es kernel a KFence alrendszert alkalmazta a memóriával végzett munka során fellépő hibák észlelésére

A fejlesztés alatt álló 5.12-es Linux kernel tartalmazza a KFence (Kernel Electric Fence) mechanizmus megvalósítását, amely ellenőrzi a memóriakezelést, a puffertúlcsordulások elkapását, a felszabadítás utáni memóriaeléréseket és más hasonló osztályú hibákat.

Hasonló funkcionalitás már jelen volt a kernelben a KASAN build opció formájában (kernel address sanitizer, az Address Sanitizer-t használja a modern gcc-ben és clang-ben) – azonban elsősorban hibakeresési célokra helyezték el. A KFence alrendszer nagy működési sebességében különbözik a KASAN-tól, ami lehetővé teszi ennek a funkciónak a használatát akár működő rendszerek magjain is.

Az éles rendszereken történő alkalmazás lehetővé teszi a tesztüzemben nem megjelenő memóriahibák elkapását, és csak terheléskor vagy hosszú távú (nagy üzemidő mellett) működés közben. Ezenkívül a KFence termelési rendszereken történő használata lehetővé teszi a kernel memóriával történő működésének ellenőrzésében részt vevő gépek számának jelentős növelését.

A KFence minimális terheléstől független többletköltséget ér el, ha rögzített időközönként védőlapokat helyez a kupacba. A következő védelmi intervallum lejárta után a KFence a szabványos memórialefoglaló rendszeren (SLAB vagy SLUB allokátor) keresztül hozzáadja a következő védelmi oldalt a KFence objektumkészletből, és új időszámláló jelentést indít. Minden KFence objektum külön memóriaoldalon található, és a bal és jobb oldali szegély mentén lévő memórialapok őroldalakat alkotnak, amelyek méretét véletlenszerűen választjuk meg.

Így az objektumokat tartalmazó oldalakat védelmi oldalak választják el egymástól, amelyek úgy vannak beállítva, hogy minden hozzáféréskor „oldalhibát” generáljanak. Az objektumoldalakon belüli, határon kívüli írások észlelésére ezenkívül mintaalapú „vörös zónákat” használnak, amelyek az objektumok által nem használt memóriát foglalják el, és megmaradnak, ha a memórialapok méretét igazítják. —+————+————+————+————+————+— | xxxxxxxxxx | O: | xxxxxxxxxx | :O | xxxxxxxxxx | | xxxxxxxxxx | B: | xxxxxxxxxx | :B | xxxxxxxxxx | | x GUARD x | J : PIROS- | x GUARD x | PIROS- : J | x GUARD x | | xxxxxxxxxx | E: ZÓNA | xxxxxxxxxx | ZÓNA: E | xxxxxxxxxx | | xxxxxxxxxx | C: | xxxxxxxxxx | :C | xxxxxxxxxx | | xxxxxxxxxx | T: | xxxxxxxxxx | : T | xxxxxxxxxx | —+————+————+————+————+————+—

Ha a puffer határain kívüli területhez próbálunk hozzáférni, a művelet hatással van a védelmi oldalra, ami „oldalhiba” generálásához vezet, amely elfogja a KFence-et, és információkat naplóz az észlelt problémáról. Alapértelmezés szerint a KFence nem blokkolja a hibát, és csak figyelmeztetést jelenít meg a naplóban, de van egy „panic_on_warn” beállítás, amely lehetővé teszi a kernel pánikállapotba helyezését, ha hibát észlel.

Forrás: opennet.ru

Hozzászólás