ここでの説明に続いて、機密情報(パスワードなど)をメモリに保存するための安全なクラスが必要な場合は、次のことを行う必要があります。
- memset/メモリを解放する前にクリアする
- 再割り当ても同じルールに従う必要があります。reallocを使用する代わりに、mallocを使用して新しいメモリ領域を作成し、古いメモリを新しいメモリにコピーしてから、最後に解放する前に古いメモリをmemset/クリアします。
これは良さそうです。テストクラスを作成して、これが機能するかどうかを確認しました。そこで、「LOL」と「WUT」という単語を追加し続け、その後にこのセキュアバッファクラスに約1000回番号を追加して、そのオブジェクトを破棄してから、最終的にコアダンプを引き起こす簡単なテストケースを作成しました。
クラスは破棄する前にメモリを安全にクリアすることになっているので、コアダンプで「LOLWUT」を見つけることができないはずです。しかし、私はそれらをまだ見つけることができ、私の実装はバグがあるのではないかと思いました。ただし、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
これを引き起こしているのは何ですか?SecByteBlockの追加によって再割り当てが発生したため、アプリケーションのメモリ領域全体が再割り当てされましたか?
編集:vimを使用してコアダンプをチェックした後、私はこれを手に入れました:http: //imgur.com/owkaw
edit2:より簡単にコンパイルできるようにコードを更新し、コンパイル手順
最終編集3:memcpyが原因のようです。mymemcpy
以下の彼の答えについては、ラスムスの実装を参照してください。