Wednesday, May 29, 2013

SecureZeroMemoryの目的は何か?

What's the point of SecureZeroMemory?@The Old New Thing の翻訳。

SecureZeroMemory関数は、コンパイラの最適化によって削除される事なくメモリーをゼロで埋める。しかし、その目的は何だろうか? これは本当にアプリケーションをよりセキュアにするのだろうか? 私が言いたいのは、確かにデータはスワップファイルやハイバネーションファイルに行くのだが、それらのファイルにアクセスするには管理者権限が必要で、悪意のある管理者に対して防御する事は不可能であるということだ。それに、もしメモリーがゼロで埋められるまえにスワップアウトしたならば、結局その値はスワップファイルに行くことになる。他のアプリケーションからプロセスメモリーを読まれることを防ぐのだという者もいるが、それらのアプリケーションはSecureZeroMemory関数が呼ばれる前にいつでもメモリーを読む事ができる。ならば、なにが目的なのか?

SecureZeroMemory関数は物事をセキュアにするわけではない。単に、よりセキュアにするのだ。これは程度の問題であり、絶対性の問題ではない。

もし悪意のある管理者や、あなたのメモリーを監視する他のアプリケーションがいた場合、悪意のある者は、機微な情報が生成されてからゼロで埋められるまでの間にデータを吸い出さなくてはならない。これは一般的には長い時間ではないため、SecureZeroMemory関数は攻撃者がデータを得ることを難しくする。同様に、データは、機微な情報が生成されてからゼロで埋められるまでの間にスワップアウトされなければならない。これに対して、もしあなたがSecureZeroMemory関数を呼ばなければ、機微な情報は何か別の内容で上書きされるまで保持されるため、攻撃者はその情報を探すための良い時間を得る事になる。

加えて、情報の漏洩は悪意のある操作によってではなく、あなたのアプリケーションによって行われるかもしれない。もしあなたのプログラムがクラッシュし、あなたがWindows Error Reportingプログラムにサインアップしたならば、なぜあなたのプログラムが失敗しているのかダウンロードし調査するために、クラッシュダンプファイルが生成、Microsoftにアップロードされる。アップロードの準備のために、クラッシュダンプがユーザーのハードディスクにファイルとして保存され、攻撃者は機微な情報を得るためにそのクラッシュダンプを調査できるかもしれない。機微な情報を持つメモリーをゼロで埋める事は、その情報がクラッシュダンプに含まれてしまう可能性を減らすのだ。

不注意により機微な情報が公開されうる他の場所は、未初期化バッファの使用である。もし完全に初期化されていない変数を使用するバグがあるならば、機微な情報がそこに漏れだし、偶然にネットワークに転送されたりディスクに書かれるかもしれない。使い終わった機微な情報に対してSecureZeroMemory関数を使用する事は、機微な情報が意図しないところに行ってしまうことを難しくする多層防御の手段なのだ。