Domanda

Mi piacerebbe poter passare una SecureString (una passphrase memorizzata nella cache) a un processo figlio in C# (.Net 3.5), ma non so quale sia il modo più sicuro per farlo.Se dovessi riconvertire SecureString in una stringa normale e passarla come argomento della riga di comando, ad esempio, allora pensare il valore potrebbe essere soggetto alla paginazione del disco, il che farebbe sì che il testo in chiaro tocchi il filesystem e rovinerebbe lo scopo dell'utilizzo di SecureString.

È possibile passare invece IntPtr per SecureString?Potrei utilizzare una pipe denominata senza aumentare il rischio?

È stato utile?

Soluzione

In generale dovresti definire il tuo modello di minaccia prima di preoccuparti di attacchi più esotici.In questo caso:sei preoccupato che qualcuno spenga il computer e faccia un'analisi forense del disco rigido?La memoria dell'applicazione può anche essere sostituita, quindi il semplice fatto è che uno il processo lo ha in memoria, rende potenzialmente possibile che finisca nel file di scambio.E il letargo?Durante l'ibernazione l'intero contenuto della memoria viene scritto sul disco rigido (incluso SecureString - e presumibilmente la chiave di crittografia!).Cosa succede se l'aggressore ha accesso al sistema mentre è in esecuzione ed è possibile effettuare ricerche nella memoria delle applicazioni?

In generale, la sicurezza lato client è molto complicata e, a meno che non si disponga di hardware dedicato (come un chip TPM), è quasi impossibile ottenerla correttamente.Due soluzioni sarebbero:

  • Se hai solo bisogno di verificare l'uguaglianza tra due stringhe (ad esempio:questa stringa è uguale a quella che avevo in precedenza), memorizza solo un valore hash (salato) di essa.
  • Fare in modo che l'utente reinserisca le informazioni quando necessario una seconda volta (non molto comodo, ma sicurezza e comodità si contrappongono)

Altri suggerimenti

A meno che il tuo processo figlio non capisca anche come lavorare con SecureString, non penso che ci sia un modo per passarlo direttamente.Ad esempio, il metodo Process.Start() ha due sovraccarichi che accettano un SecureString in modo che il rischio che il valore effettivo della stringa venga sniffato è ridotto al minimo (è ancora possibile poiché da qualche parte lungo il percorso il valore effettivo deve essere recuperato/non sottoposto a marshall).

Penso che molto di come farlo dipenderà da quale è il processo figlio e da come viene avviato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top