Mayhem: attacco di corruzione di bit di memoria per bypassare l'autenticazione sudo e OpenSSH

I ricercatori del Worcester Polytechnic Institute (USA) hanno introdotto un nuovo tipo di attacco Mayhem che utilizza la tecnica di distorsione dei bit di memoria ad accesso casuale dinamico Rowhammer per modificare i valori delle variabili dello stack utilizzate come flag nel programma per decidere se i controlli di autenticazione e sicurezza hanno passato. Vengono dimostrati esempi pratici di attacco per aggirare l'autenticazione in SUDO, OpenSSH e MySQL, nonché per modificare il risultato dei controlli relativi alla sicurezza nella libreria OpenSSL.

L'attacco può essere applicato ad applicazioni che utilizzano controlli per confrontare valori diversi da zero. Esempio di codice vulnerabile: int auth = 0; ... // codice di verifica che modifica il valore di autenticazione in caso di autenticazione riuscita if(auth != 0) return AUTH_SUCCESS; altrimenti restituisce AUTH_FAILURE;

Nel contesto di questo esempio, per un attacco riuscito è sufficiente corrompere qualsiasi bit nella memoria associata alla variabile auth a 32 bit sullo stack. Se qualsiasi bit nella variabile è danneggiato, il valore non sarà più zero e l'operatore condizionale determinerà il corretto completamento dell'autenticazione. Tali modelli di validazione sono abbastanza comuni nelle applicazioni e si trovano, ad esempio, in SUDO, OpenSSH, MySQL e OpenSSL.

Mayhem: attacco di manipolazione dei bit di memoria per bypassare l'autenticazione sudo e OpenSSH

L'attacco può essere applicato anche a confronti della forma “if(auth == 1)”, ma in questo caso la sua implementazione diventa più complicata, poiché è necessario distorcere non un bit qualsiasi di 32, ma l'ultimo bit. Il metodo può anche essere utilizzato per influenzare i valori delle variabili nei registri del processore, poiché il contenuto dei registri può essere temporaneamente scaricato nello stack quando viene attivato un cambio di contesto, una chiamata di funzione o un gestore di segnali. Durante il periodo di tempo in cui i valori del registro sono in memoria, è possibile che vengano introdotte distorsioni in questa memoria e il valore modificato verrà ripristinato nel registro.

Mayhem: attacco di manipolazione dei bit di memoria per bypassare l'autenticazione sudo e OpenSSH

Per distorcere i bit, viene utilizzata una delle modifiche dell'attacco della classe RowHammer. Poiché la memoria DRAM è una matrice bidimensionale di celle, ciascuna composta da un condensatore e un transistor, l'esecuzione di letture continue della stessa regione di memoria provoca fluttuazioni di tensione e anomalie che causano una piccola perdita di carica nelle celle vicine. Se l'intensità della lettura è elevata, la cella vicina potrebbe perdere una quantità di carica sufficientemente grande e il successivo ciclo di rigenerazione non avrà il tempo di ripristinare il suo stato originale, il che porterà a un cambiamento nel valore dei dati memorizzati nella cella . Per proteggersi da RowHammer, i produttori di chip hanno aggiunto un meccanismo TRR (Target Row Refresh), che blocca la corruzione delle celle in casi speciali, ma non protegge da tutte le possibili varianti di attacco.

Per proteggersi dall'attacco Mayhem, si consiglia di utilizzare nei confronti non una valutazione delle differenze da zero o una coincidenza con uno, ma un controllo della corrispondenza utilizzando un valore seme casuale con ottetti diversi da zero. In questo caso, per impostare il valore desiderato della variabile, è necessario distorcere accuratamente un numero significativo di bit, il che non è realistico, al contrario della distorsione di un bit. Esempio di codice non attaccabile: int auth = 0xbe406d1a; ... // codice di verifica che imposta il valore auth su 0x23ab8701 in caso di autenticazione riuscita if(auth == 0x23ab8701) return AUTH_SUCCESS; altrimenti restituisce AUTH_FAILURE;

Il metodo di protezione indicato è già stato utilizzato dagli sviluppatori sudo ed è stato incluso nella versione 1.9.15 come correzione della vulnerabilità CVE-2023-42465. Hanno in programma di pubblicare un prototipo del codice per eseguire l'attacco dopo che saranno stati corretti i principali progetti vulnerabili.

Fonte: opennet.ru

Aggiungi un commento