私が大学に通うとき、メモリ割り当て時にメモリロックを要求できると言われました。これにより、ディスクへのスワップを防ぐことができます。これは、ディスクの一時停止が完了すると交換されるため、間違っています。 (ロックビットはセキュリティではなくパフォーマンスの要求であるため、実行している作業がわかっている場合にのみ使用してください。)
それで、安全なメモリを割り当てる方法があるかどうか疑問に思います。 2つのアイデアがありますが、実装するかどうかはわかりません。
セキュリティロック:休止状態を防止するため、プロセスにメモリ解放を通知する信号を送信する方法がないと、システムの他の部分に問題が発生する可能性があります。しかし、そうでない場合はどうでしょうか?
揮発性/一時メモリ要求:システムがスワッピングや警告なしにメモリマッピングを解除できるため、RAMよりも揮発性が高いという意味で揮発性を使用します。これにより、アプリケーションが処理する必要があるメモリエラーが発生する可能性があります。
復号化キャッシュには大規模な割り当てが使用され、マッピング解除は可能ですが、再構築することもできます。パスワードフレーズの場合は、より小さいクォータに保存され、マッピングが解除されないことを願っています(休止状態を除く)。パスワードがマッピングされていない場合は、ユーザーの対話が必要です。
他の選択肢を含むそのようなものは存在しますか?
私はDebian9 Gnu / Linuxを使用していますが、他のオペレーティングシステムの機能にも興味があります。
答え1
休止状態を除いて、mlock()はLinuxのRAMにメモリが保持されることを保証します。これは、使用可能なメモリと同じサイズのメモリブロックを割り当てるためにmalloc()を呼び出し、それに対してmlock()を呼び出してからすべてのページでエラーを強制することによって、システムで非常に簡単に説明できます。生産) OOMキラーが実行され、テストプログラムが収穫対象として選択されない場合があります.したがって、休止状態の代わりにmlock()を信頼できます。
休止状態は難しいですが、問題を部分的に解決する方法があります。脅威モデルがroot
ユーザーを信頼していると仮定すると(必ずしもそうでなければ)、メモリに機密データがある場合に休止状態を防ぐためにsystemdに接続できる必要があります。これは完璧ではありませんが、おそらく得られる最も近い結果です。あるいは、プログラムがスリープし始めたら、それを知らせ、重要なメモリを消去するフックを登録できると思いますが、これについて100%確信することはできません。
どちらにしても、おそらくあなたはそれを考えすぎているでしょう。
汎用ソフトウェアを作成していて、プラットフォームに対する制御権がまったくない場合(GPGやOpenSSLなど)、ユーザーがリスクを認識し、mlock()適切なメモリ領域を提供すると仮定する必要があります。このオプションを使用すると、一時的(zramなど)または暗号化スワップを使用している人は、リソース使用量ヒットをオプトアウトして操作を完了できます。また、カーネルのデフォルトの休止状態サポートはセキュリティ上の問題(よく文書化されています)ですが、ユーザースペースの実装(例:µswsusp)には暗号化サポートが組み込まれていることがよくあります。
ただし、オペレーティングシステムを実行しているソフトウェアを制御する場合は、休止状態のサポートを無効にした状態で独自のカーネルを構築できます。
答え2
メモリの交換を防ぐことはあまり役に立ちません(カーネルを除く)。あなたが心配する脅威は、攻撃者がオペレーティングシステムをバイパスし、ディスクからスワップされたデータを読み取ることです。これは攻撃者がディスクに物理的にアクセスできることを意味します。実際、これは攻撃者がコンピュータに物理的にアクセスできるため、RAMから同じ情報を読み取ることができることを意味します。それはい数秒間電源を切ったRAMチップからデータを抽出できます。それほど信頼できませんが、最近のRAMに秘密のデータがある場合は、コンピュータをアイドル状態にしてはいけないほど心配です。
プログラマとして休止状態を防ぐために、奇妙なオペレーティングシステムのトリックを見つけないでください。セキュリティが損なわれて機能が損なわれるため、ユーザーはそれを嫌います。
ユーザーとしてスワップ領域を暗号化します。