Substystem KFence do wykrywania błędów w pamięci przyjęty do jądra Linux 5.12

Do rozwijanego jądra Linux 5.12 włączono implementację mechanizmu KFence (Kernel Electric Fence), który kontroluje operacje na pamięci, wykrywając przekroczenia granic buforów, odwołania do pamięci po jej zwolnieniu oraz inne błędy tego typu.

Podobna funkcjonalność była już dostępna w jądrze jako opcja kompilacji KASAN (kernel address sanitizer, wykorzystuje Address Sanitizer w nowoczesnych gcc i clang), jednak była przeznaczona głównie do zastosowań debugowych. Podsystem KFence wyróżnia się znacznie wyższą wydajnością niż KASAN, dzięki czemu można go używać nawet w jądrach działających w systemach produkcyjnych.

Zastosowanie w systemach produkcyjnych pozwoli wykrywać błędy operacji na pamięci, które nie ujawniają się podczas testów i wychodzą na jaw dopiero pod rzeczywistym obciążeniem lub przy długim czasie pracy systemu (dużym uptime). Ponadto użycie KFence w systemach produkcyjnych pozwoli znacząco zwiększyć liczbę maszyn uczestniczących w weryfikacji działania jądra pod kątem obsługi pamięci.

Minimalny narzut, niezależny od obciążenia, KFence osiąga dzięki wstawianiu stron ochronnych (guard pages) do sterty w stałych odstępach. Po upływie kolejnego interwału ochrony KFence, za pośrednictwem standardowego systemu przydziału pamięci (alokatora SLAB lub SLUB), dodaje następną stronę ochronną z puli obiektów KFence i rozpoczyna nowy pomiar czasu. Każdy obiekt KFence jest umieszczany na osobnej stronie pamięci, a strony po lewej i prawej stronie tworzą strony ochronne (guard pages), których rozmiar jest dobierany losowo.

W ten sposób strony z obiektami są od siebie oddzielone stronami ochronnymi, które są skonfigurowane tak, aby generować „page fault” przy każdej próbie dostępu. Aby wykrywać operacje zapisu poza granicę bufora wewnątrz stron z obiektami, dodatkowo stosowane są „red zones” oparte na wzorcach, które zajmują pamięć niewykorzystywaną przez obiekty i pozostającą po wyrównaniu rozmiaru stron pamięci. —+————+————+————+————+————+— | 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 | —+————+————+————+————+————+—

W przypadku próby odwołania się do obszaru poza granicami bufora operacja obejmuje stronę ochronną, co prowadzi do wygenerowania „page fault”, przechwytywanego przez KFence, który zapisuje w logu informacje o wykrytym problemie. Domyślnie KFence nie przerywa działania po wykryciu błędu i jedynie zapisuje ostrzeżenie w logu, ale dostępne jest ustawienie „panic_on_warn”, które pozwala w razie wykrycia błędu przełączyć jądro w stan awarii (panic).

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster