После обсуждения здесь, если вы хотите иметь безопасный класс для хранения конфиденциальной информации (например, паролей) в памяти, вам необходимо:
- memset/очистить память перед ее освобождением.
- reallocations также должны следовать тому же правилу - вместо использования realloc, используйте malloc для создания новой области памяти, скопируйте старый в новый, а затем memset/очистите старую память, прежде чем освободить ее.
Итак, это звучит неплохо, и я создал тестовый класс, чтобы увидеть, работает ли это. Поэтому я сделал простой тестовый сценарий, в котором я продолжаю добавлять слова "LOL" и "WUT", а затем номер в этот класс защищенного буфера около тысячи раз, уничтожая этот объект, прежде чем, наконец, сделать что-то, что вызывает основной дамп.
Поскольку класс должен надежно очистить память до разрушения, я не должен быть в состоянии найти "LOLWUT" на coredump. Тем не менее, мне удалось найти их еще и подумал, не работает ли моя реализация. Тем не менее, я попробовал то же самое, используя библиотеку CryptoPP 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;
}
И затем скомпилируйте, используя:
g++ clearer.cpp -lcryptopp -O0
И затем включите дамп ядра
ulimit -c 99999999
Но затем включив дамп ядра и запустив его
./a.out ; grep LOLWUT core ; echo hello
дает следующий вывод
Segmentation fault (core dumped)
Binary file core matches
hello
Что вызывает это? Изменилась ли вся область памяти для приложения realloc сама из-за перераспределения, вызванного добавлением SecByteBlock?
Кроме того, Это документация SecByteBlock
изменить. После проверки дампа ядра с помощью vim я получил следующее: http://imgur.com/owkaw
edit2: обновленный код, чтобы он был более компилируемым и команды компиляции
final edit3. Похоже, что memcpy является виновником. См. Реализацию Rasmus mymemcpy
в его ответе ниже.