Асос дар ҳоли таҳия аст Linux 5.12 татбиқи механизми KFence (Kernel Electric Fence)-ро дар бар мегирад, ки истифодаи хотира, пайдо кардани сарбории буфер, дастрасӣ ба хотира пас аз озодкунӣ ва дигар хатогиҳои шабеҳро тафтиш мекунад.
Функсияҳои шабеҳ аллакай дар ядро ҳамчун варианти сохтан бо номи KASAN мавҷуд буд (санитизатори суроғаи ядро, ки Address Sanitizer дар gcc ва clang-и муосирро истифода мебарад), аммо он пеш аз ҳама барои мақсадҳои ислоҳкунӣ пешбинӣ шуда буд. Зерсистемаи KFence, бар хилофи KASAN, бо суръати баландтар кор мекунад ва имкон медиҳад, ки ин хусусият ҳатто дар ядроҳои системаҳои истеҳсолӣ истифода шавад.
Истифодаи KFence дар системаҳои истеҳсолӣ ба мо имкон медиҳад, ки хатогиҳои хотираро, ки дар озмоишҳо нишон намедиҳанд ва танҳо ҳангоми сарбории кории истеҳсолӣ ё кори дарозмуддат (бо вақти баланд) рӯ ба рӯ шавем. Ғайр аз он, истифодаи KFence дар системаҳои истеҳсолӣ шумораи мошинҳоеро, ки дар санҷиши хотираи ядро иштирок мекунанд, хеле зиёд мекунад.
KFence сарфи ҳадди ақалро, новобаста аз сарборӣ, тавассути тақсим кардани саҳифаҳои муҳофизатӣ ба тӯда дар фосилаҳои муайян ба даст меорад. Пас аз ба охир расидани ҳар як фосилаи муҳофизат, KFence системаи ҷудокунии хотираи дарунсохтро (SLAB ё SLUB тақсимкунанда) барои илова кардани саҳифаи дигари муҳофизатӣ аз ҳавзи объекти KFence истифода мебарад ва ҳисобкунаки нави вақтро оғоз мекунад. Ҳар як объекти KFence дар саҳифаи хотираи алоҳида ҷудо карда мешавад ва саҳифаҳои хотира дар сарҳадҳои чап ва рост саҳифаҳои муҳофизатиро ташкил медиҳанд, ки андозаи онҳо ба таври тасодуфӣ интихоб карда мешавад.
Ҳамин тариқ, саҳифаҳои дорои объектҳо аз ҳамдигар тавассути саҳифаҳои муҳофизатӣ ҷудо карда мешаванд, ки барои тавлиди "айби саҳифа" дар ҳама гуна дастрасӣ танзим карда мешаванд. Барои ошкор кардани навиштаҷоти берун аз ҳудуди саҳифаҳо бо объектҳо, "минтақаҳои сурх" ба таври иловагӣ дар асоси намунаҳое истифода мешаванд, ки хотираро ишғол мекунанд, ки аз ҷониби объектҳо истифода намешаванд ва ҳангоми мувофиқ кардани андозаи саҳифаи хотира боқӣ мемонад. —+————+————+—————+————+—————+— | xxxxxxxxx | О : | xxxxxxxxx | : О | xxxxxxxxx | | xxxxxxxxx | Б : | xxxxxxxxx | : В | xxxxxxxxx | | x Гвардия x | J : СУРХ- | x Гвардия x | СУРХ- : J | x Гвардия x | | xxxxxxxxx | E : ЗОНА | xxxxxxxxx | МИНТАКАИ : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | Т: | xxxxxxxxx | : Т | xxxxxxxxx | —+————+————+—————+————+—————+—
Агар кӯшиши дастрасӣ ба минтақа берун аз ҳудуди буфер анҷом дода шавад, амалиёт ба саҳифаи муҳофизатшуда ламс мекунад, ки дар натиҷа "айби саҳифа" ба амал меояд, ки KFence масъалаи ошкоршударо боздошта ва сабт мекунад. Бо нобаёнӣ, KFence хатогиро манъ намекунад ва танҳо огоҳиро сабт мекунад, аммо танзимоти "panic_on_warn" мавҷуд аст, ки имкон медиҳад ядро дар ҳолати ошкор шудани хато ба ҳолати ваҳшатнок ворид шавад.
Манбаъ: opennet.ru
