Assegnare chiavi decifrate a una variabile nell'applicazione protetta? [duplicare]

22

Diciamo che ho recuperato una chiave segreta crittografata dal server. Lo decrypt per ottenere l'attuale chiave segreta, assegnare la chiave decodificata a una variabile nella mia app. Qualcosa su questo:

const encryptedKey = fetchKeyFromServer();
const secretKey = decrypt(encryptedKey);
//Now, the variable secretKey has the actual secret key in memory

Ora, è una cosa vulnerabile da fare in termini di sicurezza? Poiché ho memorizzato la chiave decrittografata nella memoria, c'è la possibilità che qualcuno possa rivelare la chiave segreta leggendo dalla memoria dell'app?

Tuttavia, se non assegno la chiave decrittografata a una variabile, come dovrei usare la chiave? Ho pensato di assegnare la chiave crittografata alla variabile e decodificarla ogni volta che ho bisogno di usarla. Ma non sono ancora sicuro se questo è il modo migliore di fare le cose.

    
posta xenon 10.05.2017 - 07:35
fonte

1 risposta

32

Sì, significa che la chiave verrà archiviata nella memoria dell'applicazione. Sì, c'è il rischio che il malware (con privilegi sufficienti) possa leggerlo da lì. Questo rischio è difficile da evitare: se si desidera utilizzare la chiave, è necessario metterla in memoria, proprio come è necessario inserire la chiave di casa in tasca dopo aver bloccato la porta.

Questo di solito non è considerato un grosso problema per una ragione: se c'è un malware con i privilegi di root su un computer è già game over comunque. Non c'è modo di tenere tutto al sicuro a quel punto. Anche se non decifri la chiave, il malware potrebbe solo leggere la chiave utilizzata per tale decodifica da qualunque posizione sia archiviata.

Ecco tre cose che puoi fare per mitigare il rischio:

  • Utilizza un qualche tipo di HSM . (Grazie a DRF per averlo indicato.) Questo è l'approccio migliore, ma la fattibilità dipende da quale piattaforma tu stanno lavorando. Si noti però che il malware con privilegi sufficienti per leggere la memoria di altri processi può probabilmente utilizzare anche l'HSM. Quindi questo non è a prova di proiettile contro un'infezione da malware.
  • Riduci al minimo il tempo in cui la chiave è in memoria per ridurre la finestra di attacco sovrascrivendo la memoria dopo aver terminato. (Come sottolinea MSalters , questo potrebbe non essere semplice come sembra, ad esempio in C ++ l'ottimizzatore potrebbe rimuovere una scrittura che non viene letta e in Java le stringhe sono imutibili in modo che non possano essere sovrascritte).
  • Poiché suggerisce Vitor , contrassegna la pagina di memoria in cui la chiave è archiviata come non riscrivibile, in modo che non venga mai scritta su disco.
risposta data 10.05.2017 - 08:09
fonte

Leggi altre domande sui tag