Mi chiedo se sia possibile scrivere un kernel che mantenga tutta la sua RAM crittografata, memorizzando la chiave nella cache della CPU, in modo che la macchina sia resistente agli attacchi con avvio a freddo?
I dati nella cache L1 non rimarranno solo nella cache L1; l'hardware lo copierà nella RAM principale in modo trasparente e quasi immediatamente. Almeno così funziona la CPU moderna. Se si desidera mantenere i dati riservati fuori dalla RAM, è necessario mantenerli solo nei registri. Gli switch di contesto costituiranno anche un problema, poiché svuotano automaticamente i registri in uno spazio RAM designato.
Mentre è teoricamente possibile operare solo nei registri e fare solo la crittografia e la decrittografia nella CPU, sarà difficile farlo correttamente (la crittografia ad accesso casuale con gli aggiornamenti è difficile da progettare senza punti deboli) e sarà molto costosa (dovresti più o meno dover implementare una macchina virtuale, in cui ogni codice operativo comporta una decrittografia, quindi aspettati un rallentamento di almeno un fattore 50).
Il progetto TRESOR sembra essere di portata molto più limitata; non vuole proteggere dati generici da perdite nella RAM, solo chiavi di crittografia . Quale, secondo la mia opinione, manca il punto. Si crittografa i dati perché i tali dati sono sensibili e devono essere mantenuti riservati. La chiave di crittografia è un obiettivo di alto valore perché concentra la segretezza, ma certamente non il target solo .
... keep all of [the] RAM encrypted, storing the key in the CPU[?]
Sì, potresti scrivere un kernel che ha memorizzato la chiave in un registro della CPU. I processori SSE (fondamentalmente qualsiasi architettura Intel in esecuzione) dispongono di registri "XMM" a 128 bit per cui è possibile memorizzare la chiave e i chip Intel più recenti possono eseguire AES basati su hardware. Un registro, una chiave, una istruzione CPU.
Perderai un registro multiuso e dovrai passare alla modalità kernel molto spesso (massicci killer di prestazioni) o dare a ciascuna applicazione la propria chiave crittografata con la chiave del kernel, ma funzionerebbe. Il malvagio è che un switch di contesto di solito mette i valori del registro nella RAM. La chiave e qualsiasi altra cosa nel kernel devono essere urtati perché qualsiasi applicazione può usare tutti i registri generici.
Ciò che è veramente necessario è un registro persistente indirizzabile solo dall'anello 0. So che esistono come registri di controllo , ma non era sicuro di alcuno scopo generale che si stendesse in giro per la presa. Poi ho guardato il link di d33tah a TRESOR e risulta che qualcuno l'ha effettivamente implementato. Leggi le avvertenze e così via.
Leggi altre domande sui tag hardware memory key-management hardening