În kernelul Linux 5.12 a fost acceptat subsistemul KFence pentru identificarea erorilor în gestionarea memoriei.

În nucleul Linux 5.12, aflat în dezvoltare, a fost implementat mecanismul KFence (Kernel Electric Fence), care verifică utilizarea memoriei, detectând depășirile de buffer, accesul la memorie după eliberare și alte erori de acest gen.

O funcționalitate similară a existat anterior în nucleu sub forma opțiunii de compilare KASAN (kernel address sanitizer, care utilizează Address Sanitizer în GCC și Clang moderne) — dar era, în principal, destinată utilizării în depanare. Subsystema KFence se deosebește de KASAN prin viteza sa mare de procesare, ceea ce permite utilizarea acestei funcționalități chiar și pe nucleele din sistemele de producție.

Utilizarea pe sistemele de producție va permite detectarea erorilor de utilizare a memoriei, care nu apar în runde de testare și care ies la iveală doar în timpul încărcărilor de lucru sau în urma unei activități îndelungate (cu un timp de funcționare mare). În plus, aplicarea KFence pe sisteme de producție va permite creșterea semnificativă a numărului de mașini implicate în verificarea funcționării nucleului cu memoria.

Cheltuielile minime de resurse, independente de încărcare, sunt obținute în KFence prin introducerea paginilor de protecție (guard pages) în heap prin intervale fixe. După expirarea timpului pentru intervalul de protecție, KFence, prin sistemul standard de alocare a memoriei (SLAB sau SLUB allocator), adaugă o nouă pagină de protecție din pool-ul de obiecte KFence și reîncepe un nou contor de timp. Fiecare obiect KFence este plasat într-o pagină de memorie separată, iar paginile de memorie de la marginea stângă și dreaptă formează pagini de protecție (guard pages), a căror dimensiune este aleasă aleatoriu.

Astfel, paginile cu obiecte sunt separate una de cealaltă prin pagini de protecție, care sunt setate să genereze «page fault» la orice acces. Pentru a identifica operațiile de scriere în afara bufferului din paginile cu obiecte, sunt utilizate suplimentar «zone roșii» pe baza unor tipare, care ocupă memorie neutilizată de obiecte, rămasă în urma alocării dimensiunilor paginilor de memorie. —+————+————+————+————+————+— | 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 | —+————+————+————+————+————+—

În cazul unei încercări de a accesa o zonă dincolo de limitele buffer-ului, operația afectează pagina de protecție, ceea ce duce la generarea unui „page fault”, care este interceptat de KFence și înregistrează în jurnal date despre problema identificată. În mod implicit, KFence nu blochează eroarea și doar emite un avertisment în jurnal, dar există o configurație „panic_on_warn”, care permite, în cazul în care se identifică o eroare, să se treacă nucleul în starea de criză (panic).

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster