Attacchi a livello kernel

Il kernel di un sistema operativo è una componente fondamentale per ogni sistema informatico. Esso infatti si occupa, tra le altre cose, dell'interazione con l'hardware e della gestione dei processi e della memoria. Si occupa inoltre di effettuare controlli di sicurezza quando ad esempio accediamo a un file oppure utilizziamo un dispositivo hardware, a seconda del grado di privilegio dell'utente che ha iniziato la richiesta. Ad esempio supponiamo di avere un server a cui possono accedere più utenti: il kernel si occuperà di controllare che i vari utenti possano accedere solo ai file su cui hanno i permessi, e che non possano interagire con file o processi di altri utenti o del sistema.

Il kernel esegue del codice al privilegio massimo, il cosiddetto "ring 0", e può accedere liberamente a hardware e a tutta la memoria fisica. I processi tipicamente vengono eseguiti a "ring 1", e hanno bisogno di fare chiamate al kernel per accedere all'hardware. Questo viene fatto tipicamente tramite l'utilizzo di system call, oppure con meccanismi analoghi.

Il kernel, però, è un componente come gli altri e può anche esso contenere bug che possono portare alla corruzione della memoria. Bisogna osservare che se un bug porta all'esecuzione di codice arbitrario nel contesto del kernel, questo codice viene eseguito al livello di privilegio massimo, e possiamo fondamentalmente aggirare ogni tipo di protezione sulle risorse di sistema. Uno degli scopi principali di un attacco a livelli kernel potrebbe essere elevare il grado di privilegio del proprio processo, questo tipo di attacco viene definito Local Privilege Escalation (LPE). Presuppone di avere la possibilità di eseguire un programma su una macchina in maniera non privilegiata; sfruttando una o più vulnerabilità presenti nel kernel il programma riesce a modificare la struttura contenuta nella memoria kernel che contiene le informazioni riguardanti il suo processo e a elevare i suoi privilegi. Nella pratica, un tipico risultato di questo tipo di attacco potrebbe essere far ottenere una shell di root a un utente non privilegiato.

Questo tipo di attacchi è particolarmente rilevante in ambiente cloud, dove si tende sempre si più a isolare i processi e le applicazion tramite l'utilizzo di container come Docker. Una delle caratteristiche cruciali che differenzia l'utilizzo di container dall'utilizzo di macchine virtuali è il fatto che i container condividono lo stesso kernel host. Un'applicazione che viene eseguita in un container, se riesce a effettuare un attacco di tipo Local Privilege Escalation, può ottenere i privilegi di root nella macchina host, e quindi accedere anche ai dati e i processi degli altri container in esecuzione. Un attacco analogo esiste anche nel contesto delle macchine virtuali, ma si basa sullo sfruttare vulnerabilità presenti nell'hypervisor della macchina virtuale. Tali tipi di attacchi dove si riesce a eseguire codice arbitrario nella macchina host dal guest si chiamano Virtual Machine Escape.