Linux は、メモリのすべてのページを解放するときではなく、別のプロセスに渡すときにすべてのページをゼロにします (つまり、ゼロで埋めます)。したがって、どのプロセスも別のプロセスからデータの抜粋を取得することはできません。ただし、ページは再利用されるまで古いコンテンツを保持します。ページのリリース時にゼロ化を行うパッチは知りません (編集: @ user2313067が彼の回答で指摘しているように、PaXパッチはこのオプションを提供しますが、特定のシステムでは問題になる場合とそうでない場合があります);一般的に、それはキャッシュをゼロで埋め、より多くの「有用な」データを削除するため、パフォーマンスに悪影響を及ぼします (これはスワップ領域をカウントしていません。組み込みデバイスにはおそらく不足していますが、そこにあるほとんどの 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 にとって一種の自殺行為です (試行 ではありませんが、これらは単なるヒューリスティックです)。ただし、これはあなたの場合には適切であるように思われます:改ざんが検出された場合、デバイスは名誉ある解体以外に選択肢がありません。
そのため、重要なアプリケーションが終了すると (おそらく改ざんが検出されたため)、上記のプログラムを起動するラッパー (単純なスクリプト) で重要なアプリケーションを起動する必要があります。
Grsecurity には、これを行うための PAX_MEMORY_SANITIZE があります。このページのオプションを参照してください。