Pregunta

Me gustaría poder pasar un SecureString (una frase de contraseña almacenada en caché) a un proceso secundario en C# (.Net 3.5), pero no sé cuál es la forma más segura de hacerlo.Si volviera a convertir SecureString en una cadena normal y la pasara como argumento de línea de comandos, por ejemplo, entonces pensar el valor puede ser propenso a la paginación del disco, lo que haría que el texto sin formato toque el sistema de archivos y arruinaría el sentido de usar SecureString.

¿Se puede pasar el IntPtr para SecureString en su lugar?¿Puedo utilizar una canalización con nombre sin aumentar el riesgo?

¿Fue útil?

Solución

En general, debería definir su modelo de amenaza antes de preocuparse por ataques más exóticos.En este caso:¿Le preocupa que alguien apague la computadora y haga un análisis forense del disco duro?La memoria de la aplicación también se puede intercambiar, por lo que el simple hecho de que uno El proceso lo tiene en la memoria, hace posible que termine en el archivo de intercambio.¿Qué pasa con la hibernación?Durante la hibernación, todo el contenido de la memoria se escribe en el disco duro (incluido SecureString, ¡y presumiblemente la clave de cifrado!).¿Qué pasa si el atacante tiene acceso al sistema? mientras esta corriendo y se puede buscar en la memoria de aplicaciones?

En general, la seguridad del lado del cliente es muy complicada y, a menos que tenga hardware dedicado (como un chip TPM), es casi imposible hacerlo bien.Dos soluciones serían:

  • Si solo necesita probar la igualdad entre dos cadenas (es decir:¿Esta cadena es la misma que la que tenía antes?), almacene solo un valor hash (salado) de la misma.
  • Hacer que el usuario vuelva a ingresar la información cuando la necesite por segunda vez (no es muy conveniente, pero la seguridad y la conveniencia se oponen entre sí)

Otros consejos

A menos que su proceso hijo también entienda cómo trabajar con SecureString, no creo que haya una manera de pasarlo directamente.Por ejemplo, el método Process.Start() tiene dos sobrecargas que toman un SecureString, por lo que se minimiza el riesgo de que se detecte el valor real de la cadena (todavía es posible ya que en algún momento del camino se debe recuperar/desordenar el valor real).

Creo que mucho de cómo hacer esto dependerá de cuál sea el proceso secundario y cómo se inicie.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top