I ricercatori del Worcester Polytechnic Institute (USA) hanno presentato un nuovo tipo di attacco chiamato Mayhem, che utilizza la tecnica di disturbo dei bit nella memoria RAM dinamica Rowhammer per modificare i valori delle variabili nello stack, utilizzati nel programma come flag per prendere decisioni sul successo dell'autenticazione e sul superamento dei controlli di sicurezza. Esempi pratici di applicazione dell'attacco sono stati dimostrati per eludere l'autenticazione in SUDO, OpenSSH e MySQL, nonché per alterare i risultati dei controlli di sicurezza nella libreria OpenSSL.
L'attacco può essere applicato a applicazioni in cui le verifiche utilizzano il confronto di valori non nulli. Esempio di codice vulnerabile: int auth = 0; … // codice di verifica che modifica il valore di auth in caso di successo nell'autenticazione if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
In this context, to successfully execute an attack, it is sufficient to distort any bit in the memory corresponding to the 32-bit variable auth on the stack. Distorting any bit in the variable will cause its value to no longer be zero, and the conditional operator will determine a successful authentication. Such validation patterns are quite common in applications and can be found, for example, in SUDO, OpenSSH, MySQL, and OpenSSL.

The attack can also be applied to comparisons like "if(auth == 1)", but in this case, its execution becomes more complicated, as it is necessary to distort not just any bit out of 32, but the last bit. The method can also be used to influence the values of variables in processor registers, as the contents of the registers may be temporarily stored in the stack during context switching, function calls, or signal handler triggers. During the time that the register values are in memory, distortions can be introduced into that memory, and the modified value will be restored in the register.

Per distorcere i bit viene utilizzata una delle varianti dell'attacco di tipo RowHammer. Poiché la memoria DRAM è costituita da un array bidimensionale di celle, ognuna delle quali è composta da un condensatore e un transistore, eseguire una lettura continua della stessa area di memoria provoca fluttuazioni di tensione e anomalie che possono comportare una piccola perdita di carica nelle celle adiacenti. Se l'intensità della lettura è elevata, la cella vicina può perdere una quantità significativa di carica, e il ciclo di rigenerazione successivo non riuscirà a ripristinare il suo stato originale, portando a una modifica del valore dei dati memorizzati nella cella. Per proteggere dalla RowHammer, i produttori di chip hanno implementato il meccanismo TRR (Target Row Refresh), che blocca la distorsione delle celle in casi specifici, ma non offre protezione contro tutte le possibili varianti dell'attacco.
Per proteggersi dall'attacco Mayhem, è consigliabile utilizzare, nelle comparazioni, non la valutazione delle differenze rispetto a zero o le corrispondenze con uno, ma il controllo delle corrispondenze, utilizzando un valore casuale di seeding con ottetti non nulli. In questo caso, per impostare il valore desiderato della variabile, è necessario distorcere esattamente un gran numero di bit, il che è irrealistico, a differenza della distorsione di un singolo bit. Esempio di codice non suscettibile agli attacchi: int auth = 0xbe406d1a; … // codice di verifica, che imposta il valore di auth a 0x23ab8701 in caso di autenticazione riuscita if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
Il metodo di protezione indicato è già stato adottato dagli sviluppatori di sudo ed è stato incluso nella versione 1.9.15 come correzione per la vulnerabilità CVE-2023-42465. Il prototipo del codice per effettuare l'attacco verrà pubblicato dopo aver apportato correzioni ai principali progetti vulnerabili.
Fonte: opennet.ru
