La RAM ECC non è necessariamente immune; La memoria ECC fissa in modo affidabile i flips a un bit e rileva la maggior parte dei lanci a due bit, il che rende l'attacco più difficile, ma non concettualmente impercettibile.
La RAM non ECC non è necessariamente debole; infatti, come per la definizione di come dovrebbe comportarsi la RAM, non dovrebbe mai capitare un singolo bit flip. Quello di cui stiamo parlando è la RAM con un difetto: la RAM non funziona come dovrebbe. Il fatto deprimente è che tali difetti sono molto più comuni di quanto si pensi normalmente, poiché in condizioni normali , tali difetti non vengono attivati spesso (o affatto).
La soluzione è ottenere RAM non difettosa. Il problema sottostante diventa quindi: in che modo rilevare che la RAM è difettosa? Il noto strumento MemTest86 include un test "row hammer" (almeno dal v6, disponibile nella versione gratuita).
Per una soluzione solo software, si potrebbe immaginare un "aggiornamento manuale" fatto dal kernel. Qualche thread del kernel farebbe regolarmente quanto segue, per tutte le pagine nella RAM fisica:
- Blocca la pagina (cioè contrassegnala come non accessibile per il codice userland).
- Capovolgi tutti i bit nella pagina, assicurandoti una cancellazione della cache con i relativi codici opzionali.
- Capovolgi di nuovo tutti i bit, di nuovo con un flush della cache. Questo ripristina i dati originali nella pagina.
- Sblocca la pagina.
Se userland accede alla pagina mentre è in fase di aggiornamento, il gestore trap attende semplicemente il completamento dell'aggiornamento, quindi torna al processo in modo che possa riprovare.
Il double-flip ha lo scopo di assicurare che anche l'hardware intelligente che cerca di seguire le effettive modifiche scarichi i dati e quindi riscrivi la pagina (che riempirà i potenziali pozzi nei chip DRAM).
In larga misura, questo processo simulerebbe ciò che l'hardware già fa per l'aggiornamento della memoria. Quindi sarebbe una questione di decidere quanto spesso questo dovrebbe essere fatto; l'aggiornamento più spesso significa più larghezza di banda CPU / RAM spesa per l'aggiornamento, quindi c'è un compromesso. Se un compromesso accettabile può essere raggiunto dipende da quanta RAM ci sia, quanto è veloce la RAM e quanto è difettosa la RAM.
L'implementazione in un dato sistema operativo viene lasciata come esercizio al lettore. Presumo che questo possa avere un impatto non banale sull'euristica di paging / swap (durante il paging o lo swapping, il kernel tenta di sfrattare le pagine che non sono state visitate di recente e questa contabilità viene eseguita dalla MMU stessa; distruggere con questa raccolta di informazioni).