Following the discussion here, if you want to have a secure class for storing sensitive information (e.g passwords) on memory, you have to:
- memset/clear the memory before freeing it
- reallocations must also follow the same rule - instead of using realloc, use malloc to create a new memory region, copy the old to the new, and then memset/clear the old memory before freeing it finally
So this sounds good, and I created a test class to see if this works. So I made a simple test case where I keep adding the words "LOL" and "WUT", followed by a number to this secure buffer class around a thousand times, destroying that object, before finally doing something that causes a core dump.
Since the class is supposed to securely clear the memory before the destruction, I'm not supposed to be able to find a "LOLWUT" on the coredump. However, I managed to find them still, and wondered if my implementation is just buggy. However, I tried the same thing using CryptoPP library's SecByteBlock:
#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;
}
And then compile using:
g++ clearer.cpp -lcryptopp -O0
And then enable core dump
ulimit -c 99999999
But then, enabling core dump and running it
./a.out ; grep LOLWUT core ; echo hello
gives the following output
Segmentation fault (core dumped)
Binary file core matches
hello
What is causing this? Did the whole memory region for the application realloc itself, because of the reallocation caused by SecByteBlock's append?
Also, This is SecByteBlock's Documentation
edit: After checking the core dump using vim, I got this: https://i.stack.imgur.com/3iXb3.jpg
edit2: updated code so it's more readily compilable, and compilation instructions
final edit3: It looks like memcpy is the culprit. See Rasmus' mymemcpy
implementation on his answer below.