プロセス メモリがページ アウトされるときに、スワップ ファイルの読み取りからメモリ内データを保護しようとしています。
メモリ バッファーの暗号化に使用できる Windows SDK の CryptProtectMemory() を知っています。
Linuxではそのような機能が見つかりませんでした。誰か知っているなら教えてください。
メモリがページアウトされないように mlock() を使用できますが、それは私のシークレットが安全であることを意味しますか?
プロセス メモリがページ アウトされるときに、スワップ ファイルの読み取りからメモリ内データを保護しようとしています。
メモリ バッファーの暗号化に使用できる Windows SDK の CryptProtectMemory() を知っています。
Linuxではそのような機能が見つかりませんでした。誰か知っているなら教えてください。
メモリがページアウトされないように mlock() を使用できますが、それは私のシークレットが安全であることを意味しますか?
Linux で最も近いものCryptProtectMemory()
はlibgcryptgcry_malloc_secure()
にあります。割り当てられたセキュア メモリはメモリ内でロックされます。ゼロ化し、割り当てを解除します。Botan のテンプレートなど、他の暗号化ライブラリにも同様の呼び出しがあります。gcry_free()
secure_vector
もう 1 つのアプローチは、バッファ全体で下位レベルの POSIX 呼び出しmlock()を使用することです。ただし、バッファーをゼロ化する負担はあなたにあります。バッファーが使用されなくなったとき、またはプログラムが終了したときに、手動でmemset()を呼び出す必要があります。
CryptProtectMemory()
上記の 2 つのアプローチのいずれとも少し異なることを行っているようです。小さなランダムなセッション キーを作成し、それを使用してバッファを暗号化します。利点は、バッファ全体ではなく、キーが存在する非常に小さなページのみをロックして最終的にゼロ化する必要があることです。バッファーが非常に大きい場合、違いが生じる可能性があります。ただし、バッファ内のデータを操作または処理することはできません。秘密のデータがスワップ可能な小さな時間枠もあります。
プロセスのメモリ (の一部) を暗号化すると、ニワトリが先か卵が先かという問題が発生するのではないかと考えています。つまり、対象のメモリのブロックを暗号化/復号化するためのパスワードは、プロセスのアドレス空間内のメモリ内のどこかにある必要があります。悪意のあるコードが実行時にプロセスのアドレス空間にアクセス/検査できる場合、問題を解決することはできません (ただし、オブザーバーの生活をより困難にしています;))
ユーザー空間で作業している場合は、利用可能な暗号化ライブラリ (つまり、OpenSSL libcrypto) を使用して、変数/メモリを暗号化/復号化するためのラッパーを構築できます。ある種の「安全な変数」オブジェクトを作成することもできますが、一部の暗号アルゴリズムにはパディングが必要であることに注意してください (基本型のサイズを適宜変更する必要がある場合があります)。カーネル空間では、LKCF (Linux Kernel Crypto API) を使用できます。