У ядро ​​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

Дадаць каментар