U kernel Linux 5.12 hà aduttatu u subsistema KFence per detectà l'errori quandu travaglia cù memoria

U kernel Linux 5.12, chì hè in sviluppu, include una implementazione di u mecanismu KFence (Kernel Electric Fence), chì verifica a gestione di a memoria, catturà i buffer overruns, l'accessu di memoria dopu a liberazione, è altri errori di una classe simile.

Funzionalità simili era digià presente in u kernel in a forma di l'opzione di creazione KASAN (sanitizer di l'indirizzu di u kernel, usa Address Sanitizer in gcc mudernu è clang) - in ogni modu, era posizionatu principalmente per l'usu di debugging. U subsistema KFence difiere da KASAN in a so alta velocità di u funziunamentu, chì permette di utilizà sta funzione ancu in core in sistemi di travagliu.

L'applicazione nantu à i sistemi di produzzione permetterà di catturà errori di memoria chì ùn si prisentanu micca in e teste di prova è appariscenu solu durante i carichi di travagliu o durante l'operazione à longu andà (cù un grande uptime). Inoltre, l'usu di KFence nantu à i sistemi di produzzione permetterà di aumentà significativamente u nùmeru di machini implicati in a verificazione di l'operazione di u kernel cù memoria.

KFence raggiunge un sovraccarico minimo indipendente da carica inserindo pagine di guardia in un mucchio a intervalli fissi. Dopu chì u prossimu intervallu di prutezzione hè scadutu, KFence, attraversu u sistema di allocazione di memoria standard (SLAB o SLUB allocator), aghjunghje a prossima pagina di prutezzione da u gruppu d'oggetti KFence, è principia un novu rapportu di contatore di u tempu. Ogni ughjettu di KFence si trova in una pagina di memoria separata, è e pagine di memoria longu à e fruntiere di manca è destra formanu pagine di guardia, a dimensione di quale hè sceltu aleatoriamente.

Cusì, e pagine cù l'uggetti sò siparati l'una di l'altru da e pagine di prutezzione, chì sò cunfigurati per generà un "errore di pagina" in ogni accessu. Per detectà scritte fora di u cunfini in e pagine di l'ughjettu, sò ancu aduprate "zoni rossi" basate in mudelli, chì occupanu a memoria micca utilizata da l'uggetti, chì restanu quandu a dimensione di e pagine di memoria hè allinata. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARDIA x | J : ROSSU- | x GUARDIA x | RED- : J | x GUARDIA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA : E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Se un tentativu hè fattu per accede à una zona fora di i cunfini di u buffer, l'operazione affetta a pagina di prutezzione, chì porta à a generazione di una "pagina di difettu", chì intercepte KFence è registra l'infurmazioni nantu à u prublema identificatu. Per automaticamente, KFence ùn blucca micca un errore è mostra solu un avvisu in u logu, ma ci hè un paràmetru "panic_on_warn" chì permette di mette u kernel in un statu di panicu se un errore hè rilevatu.

Source: opennet.ru

Add a comment