2012-08-13 14 views
11

プログラムが終了した後で鍵素材が確実にメモリから消去されるようにする方法はありますか?手動で消去してプログラムを実行し続けることができれば、さらに優れたものになります。 Haskellは自動ガベージコレクションを使用しています(空きメモリがある場合はまったく発生しないかもしれません)。私は2番目のタスクが不可能であると仮定します。その目的に役立つものがFFIを使用して実装されるか?コールドブート攻撃:Haskellで機密情報を拘束する方法

+1

はい、コールドブート攻撃は非常に一般的なので、気にする必要があります。 STを使用して、STREFでデータを保持し、使用後にスクランブルすることができます。あなたがSTRefsの後ろにメモリを混ぜることができるなら、Dunno。 –

答えて

14

GHCは、不要になったときにメモリをOSに返すことができるため、終了時にメモリを消去するだけでは目標を達成できません。ガベージコレクションは複雑なビジネスですが、一般に、安全なデータの古いコピーがOSのメモリプールに返されないようにする方法はありません。

しかし、OSは別のプロセスに割り当てる前にメモリを空白にします。あなたのメモリを安全に保つためにOSを信頼しないなら、あなたはもっと大きな問題を抱えています。

「信頼できない」とは何を意味するのかよく分かりません。 Haskell GCは信頼できるものですが、プログラムでは何が起こっているのかがほとんど分かりません。

しかし、大きくて複雑なデータ構造ではなく、暗号化キーに関心がある場合、人生は少し良くなります。 Foreign Pointerを使用して、キーのメモリ位置をポイントし、そのビットをファイナライザの一部にブランキングすることができます。メモリブロックを割り当てるコードを書くこともできます。mlocksとそれに続いて、要求に応じてそのメモリのキーサイズのチャンクに外部ポインタを渡します。ファイナライザはキーをワイプします。それはおそらくあなたが望むことをするでしょう。

ForeignPtrのポイントは、GCによって移動または再解釈されないことが保証されていることです。

+0

あなたの答えをありがとう。私はこの "外国人"のものすべてにあまり慣れていないので、私は待って、既存のコードを指し示す答えが現れるかどうかを確認し、そうでない場合は答えを受け入れるかどうかを確認します。 OSが他のプロセスに渡す前にメモリをクリアしても、ここでは役に立ちません。なぜなら、1つのコールドがプラグを引っ張ってRAMモジュールを別のマシンに配置するからです。あまりにも安全であるように思えたら、(ラップトップ)ディスクの暗号化を考えてください。暗号化されていない鍵素材を一時停止する前にメモリから消去することをお勧めします。私はまた、元のポストで自動GCに頼るのが嫌なことを明確にしました。 – Andres

+0

ForeignPtrについては、恐ろしいほど難しいことはありません。チュートリアルについてはhttp://en.wikibooks.org/wiki/Haskell/FFIを参照してください。 –

+0

@AndreasはそのデータのRAMを空にしてプラグを抜かないでしょうか? – amindfv

関連する問題