È comune implementare il software di crittografia in modo tale che i buffer sensibili vengano sovrascritti prima di liberare memoria? Ad esempio quando contengono una chiave privata o il messaggio in chiaro.
È comune ma anche un po 'mito. Nei giorni precedenti , la sovrascrittura è stata ritenuta importante a causa di quanto segue:
Al giorno d'oggi queste proprietà sono diventate piuttosto stantie. In particolare, i moderni sistemi operativi (inclusi Windows 2000, XP e successori) azzerano sistematicamente le pagine. Inoltre, l'utilizzo del file di scambio è diminuito; dispositivi come smartphone e tablet non usano affatto lo swap e sono contenti (e lo faccio anche sui miei computer portatili). Ancora più importante, le persone hanno iniziato a capire che il problema dei dati trapelati ha un ampio campo di applicazione: quando decifri un messaggio privato, la chiave privata è effettivamente una parte di dati sensibili, ma lo è anche il messaggio stesso. E i buffer di memoria usati per visualizzare anche il messaggio indicato sullo schermo. Così come tutti i buffer temporanei dell'algoritmo che calcolavano come il testo privato doveva essere scomposto in paragrafi correttamente giustificati per la visualizzazione. E così via.
Allo stesso tempo, l'ecosistema software si è evoluto e ora utilizziamo molti più linguaggi di programmazione che allocano memoria attraverso un garbage collector (es. Java, C #, Python, PHP, Javascript, Perl, Ruby ... tutti usano un GC). Gli algoritmi GC efficient spostano gli oggetti nella RAM, in modo trasparente. E con "move" intendo davvero "copy". Una conseguenza è che la "cancellazione" della memoria dal programma stesso non garantisce più che non rimanga alcuna traccia dei dati.
La conclusione sintetica è che la cancellazione dei dati dal codice dell'applicazione è una scarsa risposta al problema generale della perdita di dati. È comune , ma non è lo stesso di raccomandato . Se il modello di sicurezza locale richiede tale cancellazione, allora dovrebbe essere fatto in modo sistematico e sistemico, dall'allocatore di memoria (ad esempio il GC, per le lingue basate su GC), non ingombrando l'applicazione codice con chiamate esplicite a memset()
.
Un primo passo, che è abbastanza facile da applicare, è vedere se non è possibile disattivare completamente lo spazio di swap. Ciò eliminerebbe la fonte delle perdite più gravi (perdite nei supporti fisici).
Sì, e non solo software crittografico, anche un normale software che salva in memoria informazioni insensibili come la chiave privata e la password.
Si consiglia di conservare questi dati per breve tempo in memoria e quindi sovrascriverli (non solo eliminare).
I rischi dietro questo sono le possibilità di ibernazione, dumping di memoria e copia della memoria nel file di scambio.
Pertanto, si raccomanda di sovrascrivere la memoria e usarla per un tempo molto breve possibile.
Si prega di consultare questo progetto: Buffer con protezione da sovrascrittura e allocazione di memoria su richiesta ha anche ulteriori spiegazioni e un esempio reale.
Leggi altre domande sui tag cryptography memory software programming