Tras el debate here, si usted quiere tener una clase segura para almacenar información sensible (por ejemplo, contraseñas) en la memoria, usted tiene que:Borrado de la memoria de forma segura y reasignaciones
- memset/cancelar la memoria antes liberándola
- reasignaciones también deben seguir la misma regla - en lugar de utilizar realloc, usar malloc para crear una nueva región de memoria, copie el antiguo al nuevo, y luego memset/borrar la memoria antigua antes de liberar finalmente
Así que esto funciona bien, y creé una clase de prueba para ver si esto funciona. Así que hice un caso de prueba simple donde sigo agregando las palabras "LOL" y "WUT", seguidas de un número para esta clase de buffer seguro alrededor de mil veces, destruyendo ese objeto, antes de finalmente hacer algo que causa un volcado del núcleo.
Como se supone que la clase limpia la memoria de forma segura antes de la destrucción, se supone que no puedo encontrar un "LOLWUT" en el núcleo. Sin embargo, logré encontrarlos todavía, y me pregunté si mi implementación es incorrecta. Sin embargo, he intentado lo mismo usando SecByteBlock de CryptoPP biblioteca:
#include <cryptopp/osrng.h>
#include <cryptopp/dh.h>
#include <cryptopp/sha.h>
#include <cryptopp/aes.h>
#include <cryptopp/modes.h>
#include <cryptopp/filters.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int main(){
{
CryptoPP::SecByteBlock moo;
int i;
for(i = 0; i < 234; i++){
moo += (CryptoPP::SecByteBlock((byte*)"LOL", 3));
moo += (CryptoPP::SecByteBlock((byte*)"WUT", 3));
char buffer[33];
sprintf(buffer, "%d", i);
string thenumber (buffer);
moo += (CryptoPP::SecByteBlock((byte*)thenumber.c_str(), thenumber.size()));
}
moo.CleanNew(0);
}
sleep(1);
*((int*)NULL) = 1;
return 0;
}
Y a continuación, compilar usando:
g++ clearer.cpp -lcryptopp -O0
Y a continuación, active de vaciado de
ulimit -c 99999999
Pero entonces, lo que permite volcado de memoria y ejecutándolo
./a.out ; grep LOLWUT core ; echo hello
da la siguiente salida
Segmentation fault (core dumped)
Binary file core matches
hello
¿Qué está causando esto? ¿Toda la región de la memoria para la aplicación se reasignó a sí misma, debido a la reasignación causada por el apéndice SecByteBlock?
Además, This is SecByteBlock's Documentation
edición: Después de comprobar el vaciado de memoria usando vim, tengo esto: http://imgur.com/owkaw
Edit2: código actualizado por lo que es más fácilmente compilables y compilación instrucciones
final edit3: Parece que memcpy es el culpable. Consulte la implementación de Rasmus mymemcpy
en su respuesta a continuación.
No creo que sea la razón de lo que estás viendo, pero ¿sabes que llamar a 'memset' en un poco de memoria no impide que todavía haya una copia en algún archivo de intercambio en alguna parte? Y, en general, el resultado del 'memset' no necesita penetrar todas las capas de caché, pero menciono el archivo de intercambio porque es el lugar más persistente y, por lo tanto, el más descaradamente peligroso para los datos confidenciales. –
@SteveJessop hmm, esa es probablemente la razón por la que windows tiene SecureZeroMemory o algo así. Me pregunto qué sería el equivalente de Linux/Posix ... si lo hay. – kamziro
Un optimizador suficientemente agresivo podría eliminar 'memset' de bloques que nunca se vuelven a leer. 'SecureZeroMemory' está ahí por una razón! –