У ядро ​​Linux 5.12 прийнято підсистему KFence для виявлення помилок під час роботи з пам'яттю

До складу ядра 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 при будь-якому зверненні. Для виявлення операцій запису за кордон буфера всередині сторінок з об'єктами додатково використовуються «червоні зони» на основі шаблонів, які займають пам'ять, яка не використовується об'єктами, що залишається при вирівнюванні розміру сторінок пам'яті. —+————+————+————+————+————+— | 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 | —+————+————+————+————+————+—

У разі спроби звернення до області поза межами буфера операція торкається сторінки захисту, що призводить до генерації «page fault», яка перехоплює KFence та виводить у лог дані про виявлену проблему. За замовчуванням KFence не блокує помилку і лише виводить попередження в балку, але передбачена настройка panic_on_warn, що дозволяє у разі виявлення помилки переводити ядро ​​в стан краху (panic).

Джерело: opennet.ru

Додати коментар або відгук