Il progetto Openwall ha pubblicato il modulo del kernel LKRG 1.0.0 (Linux Kernel Runtime Guard), destinato a verificare l'integrità delle strutture del kernel e a rilevare tentativi di sfruttamento delle vulnerabilità nel kernel. Si segnala che l'assegnazione del numero di versione 1.0.0 segna il raggiungimento da parte del progetto di uno stato maturo. Il codice del progetto è distribuito sotto licenza GPLv2.
Il modulo è adatto sia per la protezione dagli attacchi, che manipolano vulnerabilità già note del kernel Linux, sia per contrastare exploit che utilizzano vulnerabilità ancora sconosciute, se non vengono adottate misure speciali per eludere LKRG. La protezione si basa sull'individuazione di modifiche non autorizzate nel kernel attivo (verifica dell'integrità) e sul monitoraggio delle modifiche ai permessi dei processi utenti (identificazione dell'utilizzo di exploit).
La verifica dell'integrità avviene attraverso il confronto degli hash calcolati per le aree di memoria e le strutture dati più importanti del kernel, come IDT (Interrupt Descriptor Table), MSR, tabelle delle chiamate di sistema, tutte le procedure e funzioni, gestori di interruzione, elenchi dei moduli caricati, contenuto della sezione «.text» dei moduli e attributi dei processi. La procedura di verifica viene attivata periodicamente tramite timer o al verificarsi di determinati eventi nel kernel, ad esempio, quando vengono eseguite chiamate di sistema setuid, setreuid, fork, exit, execve e do_init_module.
L'individuazione di possibili exploit e il blocco degli attacchi avviene prima che il kernel conceda accesso alle risorse (ad esempio, prima dell'apertura di un file), ma dopo che un processo ha ottenuto permessi non autorizzati (ad esempio, cambio di UID). All'individuazione di comportamenti non autorizzati dei processi, questi vengono forzatamente terminati, il che è sufficiente per bloccare molti exploit. I costi in termini di prestazioni derivanti dall'operato del modulo sono stimati tra il 2 e il 2,5%.
Il supporto è garantito per i sistemi con architetture x86-64, AArch64 (ARM64), ARM32 e x86. Il funzionamento di LKRG 1.0.0 è stato testato con kernel di diverse distribuzioni, a partire dal kernel 3.10 di RHEL/CentOS 7 fino al 6.17-rc4 del repository in cui è in preparazione il rilascio di Fedora 44. I pacchetti sono disponibili per le distribuzioni ALT Linux, Arch Linux, Astra Linux, Gentoo, Guix, NixOS, Rocky Linux, Whonix, Yocto e OpenBMC. I pacchetti costruiti per Rocky Linux possono essere utilizzati in RHEL 8/9 e distribuzioni derivate come AlmaLinux 8/9, mentre i pacchetti per Whonix possono essere utilizzati in Debian e Ubuntu.
Tra le novità nella nuova versione:
- È stata garantita la compatibilità con i kernel Linux fino alla versione 6.17-rc4.
- Con kernel a partire dalla versione 6.13, è stato interrotto l'intercettamento delle chiamate remote override_creds() e revert_creds(), limitando così l'individuazione di attacchi che ridefiniscono il puntatore cred. Le limitazioni sono state compensate attraverso l'aggiunta di controlli sulla riscrittura del puntatore cred in altre parti del kernel.
- È stata interrotta la registrazione eccessiva delle credenziali per cui non è in corso il controllo dell'integrità. Questa modifica ha permesso di ridurre la base di codice di circa 1500 righe.
- Aggiunto supporto per il meccanismo apparso nel kernel Linux 6.10 per la creazione di file temporanei nel file system OverlayFS, utilizzando l'opzione O_TMPFILE (ovl_tmpfile). Questo supporto è necessario per prevenire falsi positivi che si manifestano durante l'uso di container isolati su sistemi con kernel 6.10-6.12.
- Per i sistemi x86_64 è stato aggiunto il supporto per la tecnologia Intel CET (Control-flow Enforcement Technology) per proteggere il codice eseguibile utilizzando le istruzioni IBT (indirect branch tracking), nonché una protezione software kCFI (kernel Control Flow Integrity) per bloccare le violazioni dell'ordine di esecuzione normale (control flow) a causa di exploit che modificano i puntatori delle funzioni memorizzati in memoria.
- Per la connessione di molti gestori al posto di kretprobes è stato utilizzato il meccanismo kprobes, semplificando il codice per l'impostazione degli hook e consentendo di raggiungere prestazioni superiori.
- Rivisitato il modo in cui vengono gestite le lock dei dati nel kernel, specifiche per il processo (per-task shadow data). Grazie all'esclusione di lock superflui, è stato possibile migliorare le prestazioni nell'accesso a tali dati.
- Risolvibili errori che provocavano condizioni di competizione, problemi di verifica dell'integrità e falsi positivi.
- Migliorato il supporto per la compilazione con Clang.
Fonte: opennet.ru
