Si sta cancellando memoria al codice / fine buona pratica?

1

A volte password / hash / chiavi e amp; altre informazioni private sono memorizzate in variabili e quindi nella memoria / RAM durante l'esecuzione del codice.

mentre alcune situazioni (ad esempio, i kernel di Linux vedono qui c'è qualche distro di Linux o patch del kernel che cancella uno spazio di memoria del processo dopo il processo di uscita? ) cura di cancellare la memoria utilizzata mi chiedevo di più sul quadro più ampio:

La domanda è quindi: Il programmatore del codice dovrebbe preoccuparsi di cancellare le informazioni sensibili (cioè l'azzeramento) da parte di se stesso? Più preciso dovrei fare qualcosa di simile

int main()
{
    char bufferWithSecret [10];
    sprintf (bufferWithSecret, "%d",generateKey());

    // do some stuff
    // ...
    // ...

    sprintf (bufferWithSecret, "000000000"); // wipe the memory
}
    
posta humanityANDpeace 24.04.2014 - 12:37
fonte

2 risposte

5

Se cancelli le informazioni sensibili in anticipo, potresti probabilmente ridurre la finestra temporale per un exploit mentre il tuo programma è in esecuzione, ma in generale (e in particolare in un contesto di quando-processo-uscita) è uno sforzo piuttosto inutile.

È molto più importante bloccare la memoria che contiene dati sensibili, quindi non può essere scambiato. I dati sensibili che vengono scambiati sono qualcosa che si vuole evitare a tutti i costi.
La cosa peggiore di una pagina con dati sensibili che vengono scambiati è, a proposito, nemmeno il fatto che sia scritta su disco, ma il fatto che non si possa garantire che sarà mai cancellato dal disco di nuovo (a causa delle unità che si consumano -livellamento). Questo è totalmente fuori controllo del sistema operativo o persino della tua applicazione.

Le pagine di memoria vengono azzerate prima di essere consegnate a un nuovo processo su ogni sistema operativo non-joke, quindi azzerarle manualmente non aggiunge nulla (comunque non su un modello di minaccia realistico ). < br> Ovviamente qualcuno potrebbe usare un exploit DMA (come Firewire) per leggere le pagine RAM fisiche che non sono state cancellate, ma potrebbero già farlo mentre il programma è in esecuzione, in quanto non si guadagna molto cancellandole un po 'prima.

    
risposta data 24.04.2014 - 12:51
fonte
1

No, non dovresti fare qualcosa "così". Dovresti usare una funzione di libreria che è intesa per cancellare dati sensibili.

Il problema con l'utilizzo di routine generiche come sprintf , memset o il proprio loop è che il compilatore può eseguire analisi delle dipendenze dei dati, determinare che il nuovo valore non è importante e ottimizzare la scrittura.

Windows fornisce una funzione SecureZeroMemory esattamente per questo motivo. Alcuni framework rendono questo molto facile, altri no. Puoi controllare questa domanda per ulteriori informazioni:

Infine, SecureZeroMemory e .NET SecureString esistono solo perché questa è una buona pratica.

    
risposta data 01.05.2014 - 21:56
fonte

Leggi altre domande sui tag