web-dev-qa-db-ja.com

プロセスの終了後にプロセスのメモリ空間を消去するLinuxディストリビューションまたはカーネルパッチはありますか?

アプリケーションは、RAMにシークレットを保存する、一部の制限された公衆がアクセスできる組み込みのバッテリ駆動PCで実行されます。コールドブート攻撃を防止し、PCが盗まれてその秘密を引き出すことを防ぐために、PCには不正防止センサーが付いています。改ざんが検出された場合、アプリケーションは存在します(ただし、実行前にすべてのプロセスメモリをワイプしません)。この動作は変更できません。

Linuxカーネルは、リリースされたプロセスメモリをデフォルトでワイプしますか? Linuxディストリビューションはそれをしますか?それを行うパッチはありますか?

ワイプとは、ゼロフィルまたはマルチパスの書き換えを意味します。

10
SDL

Linuxは、メモリが解放されたときではなく、別のプロセスに渡されたときに、メモリのすべてのページをゼロに設定します(つまり、ゼロで埋めます)。したがって、他のプロセスからデータの抜粋を取得するプロセスはありません。ただし、ページは再利用されるまで古いコンテンツを保持します。 @ user2313067が彼の答え PaXで指摘しているように、ページのリリース時にゼロ化を行うパッチ(Edit:は知らない) パッチはこのオプションを提供しますが、特定のシステムで問題になる場合と問題にならない場合があります。一般的には、キャッシュがゼロで満たされ、より「有用な」データが追い出されるため、パフォーマンスに悪影響を及ぼします(これは、組み込みデバイスにおそらくないスワップスペースをカウントしていませんが、ほとんどのLinuxシステムにはスワップがあります)。 。

別のプロセスからすべての可能なページを割り当てるだけで、データの一種のワイプアウトを強制できます。このようなもの:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
    for (;;) {
        void *x = malloc(2000);
        if (x == NULL) {
            break;
        }
        memset(x, 'T', 2000);
    }
    return 0;
}

このプログラムをrootとして実行すると、使用可能なすべてのメモリが取得されて(実際の割り当てを強制するために)満たされ、メモリが残っていない場合にのみ終了します。カーネルが最後の数ページをrootに予約するため、rootとして実行する必要があります。

メモリーがいっぱいになるとトリガー OOM条件 になることに注意してください。この時点で、カーネルは、ある程度のスペースを作るためにプロセスを撃つことができると感じます。これは、空きページが残っていない場合、つまり達成したい状態の場合にのみ発生します(空きページが残っていない場合は、すべての古いページが再割り当てされたため、ゼロに設定されます)。 OOM処理コードはいくつかの重要なプロセスを強制終了する可能性があるため、これはOSにとって一種の自殺です(それは試行しないしないでくださいね。ただし、これはあなたの場合には適切と思われます。改ざんが検出された場合、デバイスは 名誉毀損 以外の選択肢がありません。

したがって、重要なアプリケーションが終了したときに(おそらく改ざんが検出されたため)、上記のプログラムを起動するラッパー(単純なスクリプト)で重要なアプリケーションを起動する必要があります。

11
Thomas Pornin

Grsecurityには、これを行うためのPAX_MEMORY_SANITIZEがあります。 このページ のオプションを参照してください。

5
user2313067