Il kernel Linux 5.12 ha adottato il sottosistema KFence per rilevare errori quando si lavora con la memoria

Il kernel Linux 5.12, che è in fase di sviluppo, include un'implementazione del meccanismo KFence (Kernel Electric Fence), che controlla la gestione della memoria, rilevando sovraccarichi del buffer, accessi alla memoria dopo la liberazione e altri errori di una classe simile.

Funzionalità simili erano già presenti nel kernel sotto forma dell'opzione di build KASAN (kernel address sanitizer, utilizza Address Sanitizer nei moderni gcc e clang) - tuttavia, era posizionata principalmente per l'uso di debug. Il sottosistema KFence differisce da KASAN per l'elevata velocità operativa, che consente di utilizzare questa funzionalità anche sui core dei sistemi funzionanti.

L'applicazione sui sistemi di produzione consentirà di individuare errori di memoria che non compaiono nelle esecuzioni di test e compaiono solo durante i carichi di lavoro o durante il funzionamento a lungo termine (con un tempo di attività elevato). Inoltre, l'utilizzo di KFence sui sistemi di produzione consentirà di aumentare notevolmente il numero di macchine coinvolte nel controllo del funzionamento del kernel con memoria.

KFence raggiunge un sovraccarico minimo indipendente dal carico inserendo pagine di guardia nell'heap a intervalli fissi. Una volta scaduto il successivo intervallo di protezione, KFence, attraverso il sistema di allocazione della memoria standard (allocatore SLAB o SLUB), aggiunge la pagina di protezione successiva dal pool di oggetti di KFence e avvia un nuovo rapporto sul contatore temporale. Ogni oggetto KFence si trova in una pagina di memoria separata e le pagine di memoria lungo i bordi sinistro e destro formano pagine di guardia, la cui dimensione viene scelta casualmente.

Pertanto, le pagine con oggetti sono separate le une dalle altre da pagine di protezione, che sono configurate per generare un "errore di pagina" a qualsiasi accesso. Per rilevare le scritture fuori limite all'interno delle pagine degli oggetti, vengono inoltre utilizzate "zone rosse" basate su pattern, che occupano la memoria non utilizzata dagli oggetti, rimanendo quando la dimensione delle pagine di memoria è allineata. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARDIA x | J: ROSSO- | x GUARDIA x | ROSSO-: J | x GUARDIA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Se si tenta di accedere ad un'area fuori dai confini del buffer, l'operazione influisce sulla pagina di protezione, che porta alla generazione di un “page fault”, che intercetta KFence e registra le informazioni sul problema identificato. Per impostazione predefinita, KFence non blocca un errore e visualizza solo un avviso nel registro, ma esiste un'impostazione "panic_on_warn" che consente di mettere il kernel in uno stato di panico se viene rilevato un errore.

Fonte: opennet.ru

Aggiungi un commento