In Netfilter, il sottosistema del kernel Linux utilizzato per filtrare e modificare i pacchetti di rete, è stata identificata una vulnerabilità (CVE-2021-22555) che consente a un utente locale di ottenere privilegi di root nel sistema, anche all'interno di un contenitore isolato. È stato preparato un prototipo funzionante dell'exploit per testare, in grado di eludere i meccanismi di protezione KASLR, SMAP e SMEP. Il ricercatore che ha identificato la vulnerabilità ha ricevuto da Google un premio di 20.000 dollari per aver scoperto un metodo di bypass dell'isolamento dei contenitori Kubernetes nel cluster kCTF.
Il problema si manifesta a partire dal kernel 2.6.19, rilasciato 15 anni fa, ed è causato da un errore nei gestori IPT_SO_SET_REPLACE e IP6T_SO_SET_REPLACE, che porta a un overflow del buffer quando vengono inviati parametri opportunamente formattati tramite la chiamata setsockopt in modalità compat. In condizioni normali, la chiamata compat_setsockopt() può essere eseguita solo dall'utente root, ma i privilegi necessari per condurre l'attacco possono anche essere ottenuti da un utente non privilegiato in sistemi con supporto abilitato per gli spazi dei nomi identitari degli utenti (user namespaces).
L'utente può creare un contenitore con un utente root separato e sfruttare da esso la vulnerabilità. Ad esempio, i 'user namespaces' sono abilitati per default in Ubuntu e Fedora, ma non sono attivi in Debian e RHEL. La patch che corregge la vulnerabilità è stata accettata nel kernel Linux il 13 aprile. Gli aggiornamenti dei pacchetti sono già stati preparati dai progetti Debian, Arch Linux e Fedora. In Ubuntu, RHEL e SUSE gli aggiornamenti sono in fase di preparazione.
Il problema si verifica nella funzione xt_compat_target_from_user() a causa di un calcolo errato della dimensione della memoria durante il salvataggio delle strutture del kernel dopo la conversione da una rappresentazione a 32 bit a una a 64 bit. L'errore consente di scrivere quattro byte zero in qualsiasi posizione oltre il buffer allocato, limitata da uno spostamento di 0x4C. Questa possibilità è stata sufficiente per creare un exploit in grado di ottenere privilegi di root: attraverso la pulizia del puntatore m_list->next nella struttura msg_msg si creavano condizioni per accedere a dati dopo la liberazione della memoria (use-after-free), che successivamente venivano utilizzate per ottenere informazioni sugli indirizzi e modificare altre strutture attraverso la manipolazione della chiamata di sistema msgsnd().
Fonte: opennet.ru
