2009-04-24 8 views
6

Hay una función SecureZeroMemory() en WinAPI que está diseñada para borrar la memoria utilizada para almacenar contraseñas/claves de cifrado/cosas similares cuando el búfer ya no es necesario. Difiere de ZeroMemory() en que su llamada no será optimizada por el compilador.¿El uso de SecureZeroMemory() realmente ayuda a que la aplicación sea más segura?

¿Es realmente tan necesario borrar la memoria utilizada para almacenar datos confidenciales? ¿Realmente hace que la aplicación sea más segura?

Entiendo que los datos podrían escribirse en archivo de intercambio o en archivo de hibernación y que otros procesos podrían leer la memoria de mi programa. Pero lo mismo podría pasar con los datos cuando todavía está en uso. ¿Por qué se usa , luego borre mejor que solo use?

Respuesta

9

Lo hace. El archivo de hibernación no está encriptado, por ejemplo. Y si no borras la memoria de forma segura, podrías terminar con problemas. Sin embargo, es solo un ejemplo. Siempre debe mantener cosas secretas en la memoria solo el tiempo que sea necesario.

+0

Entiendo eso, pero también es posible que la contraseña se copie en swapfile/hibernated cuando está en uso. ¿Cuál es la diferencia: la duración de almacenarlo en la memoria? – sharptooth

+6

Sí. estás reduciendo la superficie de ataque. Recuerde: la seguridad se trata de elevar el listón. Cuanto más suba la barra, mejor. –

4

También tenga en cuenta que algunos OS no borrarán la memoria antes de dársela a una aplicación, esto significa que una aplicación puede solicitar aleatoriamente memoria, explorar contenido posiblemente interesante y hacer algo con él.

Si esa aplicación solo obtiene memoria cero, por supuesto que le resultaría más difícil tratar de obtener datos interesantes.

+4

Windows sí; vea Russinovich & Solomon, Windows Internals, 4th Ed., Chap. 7 - Servicios que el Administrador de memoria proporciona, reserva y asigna páginas: "Si las páginas son privadas para el proceso y nunca se ha accedido antes, se crean en el momento del primer acceso como páginas inicializadas en cero (o demanda cero)". No hacer esto sería un agujero de seguridad bastante grande (un proceso podría leer el pasado de otros procesos). Estaría dispuesto a apostar que la mayoría de los sistemas operativos modernos hacen lo mismo. –

5

Existe por una razón. :) Si mantiene datos confidenciales en la memoria, entonces otros procesos potencialmente pueden leerlo.

Por supuesto, en su aplicación, las contraseñas u otros datos seguros pueden no ser tan importantes como para que esto sea necesario. Pero en algunas aplicaciones, es bastante esencial que el código malicioso no pueda husmear sus contraseñas o números de tarjeta de crédito o cualquier otro dato que use la aplicación.

+0

¿Por qué no puede husmear los datos mientras los datos están en uso? ¿Por qué "usar, borrar" es mejor que solo "usar"? – sharptooth

+3

Porque "usar, luego borrar" solo deja los datos en memoria para, digamos, una fracción de segundo, en lugar de "quizás hasta que la aplicación finalice, quizás más" (ver respuesta anterior sobre el sistema operativo que no está poniendo a cero la memoria) . El malware tendría que tener mucha menos suerte para encontrar sus datos si está en la memoria por un largo tiempo. –

3

SecureZeroMemory() ciertamente no hará que su aplicación sea perfectamente segura. El hecho de que la contraseña ya estaba en la memoria ya es un agujero de seguridad. Usar SecureZeroMemory() definitivamente hará menos probable que su contraseña pueda ser recuperada. No veo ninguna razón para no usarlo, ¿por qué no? Solo recuerda que hay muchas otras cosas de las que tienes que preocuparte también.

3

Si tiene datos de contraseña u otros secretos, también querrá asegurarse de que la memoria en la que se encuentra no se canjee, de lo contrario, el archivo de intercambio puede convertirse en un problema (creo que la función lo que quieres es 'VirtualLock' para una aplicación de Windows). Además, deberá detectar las ventanas que entran en hibrenate y borrar los datos en ese punto también. Creo que Windows enviará un mensaje a cada aplicación cuando esté por hibrarse.

Cuestiones relacionadas