В ядрото Linux 5.12, което е в процес на разработка, е включена реализация на механизма KFence (Kernel Electric Fence), който следи за коректността на работа с паметта, улавяйки изходите извън границите на буферите, достъп до памет след освобождаване и други подобни грешки.
Подобна функционалност вече беше налична в ядрото под формата на опцията за сборка KASAN (kernel address sanitizer, използваща Address Sanitizer в съвременни версий gcc и clang) — но основно беше предназначена за отстраняване на грешки. Подсистемата KFence се отличава от KASAN с висока скорост, което позволява използването й дори на ядра в работни системи.
Използването на работни системи ще предостави възможност за улавяне на грешки в работата с паметта, които не се проявяват по време на тестови изпълнения и излизат наяве само при натоварване или продължителна работа (при дълъг uptime). Освен това, приложението на KFence в работни системи ще увеличи съществено броя на машините, включени в проверката на работата на ядрото с паметта.
Минималните разходи, независещи от натоварването, се постигант в KFence благодарение на добавянето на защитни страници (guard pages) в купчината на фиксирани интервали. След изтичане на времето на текущия защитен интервал, KFence чрез стандартната система за разпределение на паметта (SLAB или SLUB allocator) добавя нова защитна страница от пула на обектите на KFence и започва ново отчитане на времето. Всеки обект KFence е разположен на отделна страница памет, а страниците памет, разположени вляво и вдясно, образуват защитните страници (guard pages), чиито размери се избират случайно.
По този начин, страниците с обекти са отделени една от друга чрез защитни страници, които са настроени да генерират "page fault" при всяко достъпване. За идентифициране на записи извън границите на буфера в страниците с обекти се използват допълнително "червени зони" на базата на шаблони, които заемат памет, не използвана от обектите, оставаща след подравняването на размера на страниците памет.
Когато се опитате да осъществите достъп до област извън границите на буфера, операцията въздейства на защитната страница, което води до генериране на „page fault“, който KFence прихваща и записва данни за открития проблем в логовия файл. По подразбиране KFence не блокира грешката и просто записва предупреждение в логовия файл, но е предвидена настройка „panic_on_warn“, която позволява в случай на откритие на грешка да преведе ядрото в състояние на срив (panic).
Източник: opennet.ru
