
Linux 5.4.31カーネルを実行するIoTゲートウェイがあります。これらのゲートウェイは、それぞれ独自の暗号化キーを持つ数千のモバイルデバイスを管理する必要があります。デバイスが範囲内に入ると(セキュリティチャネルを介して)サーバーからデバイスのキーを取得し、デバイスが範囲内にある間に復号化に使用し、デバイスが出るときにメモリからキーを削除することがアイデアです。受信したデータに基づいて特定のタスクを実行する必要があるため、復号化はゲートウェイで実行する必要があります。
鍵にアクセスするたびに鍵を復号化する必要がないため、暗号化されていない鍵をRAMに保存しようとします。私たちは次の仮定を持っています:
- ゲートウェイに物理的にアクセスできません。
- サービスは root ではなくユーザーとして実行されます。
- 攻撃者は、root 以外のユーザー(重要な場合はサービスユーザーとは異なります)でゲートウェイにアクセスする可能性があります。
- 攻撃者はバッファオーバーフロー攻撃を実行する可能性があります。
この仮定の下で、攻撃者がRAMの暗号化キーにアクセスするために使用できるオプションは何ですか?
- (スタックではなくCのstaticキーワードを介して)静的に割り当てられたメモリにキーを格納します。
- 動的に割り当てられたメモリにキーを保存します(リソースが制限されているため、ワンタイム割り当てになる可能性があります)。
また、root以外のユーザーにプロセスRAMへのアクセスを防ぐために、スワップメモリ、コアダンプ、パッケージのインストール、gdbの使用などへのアクセスを許可しないなど、どのような制限を適用する必要がありますか?
注:攻撃者がrootアクセス権を持っている場合、サーバーへのアクセスに使用される秘密鍵を使用してすべての鍵にアクセスできるため、この問題についてはこのシナリオを考慮しません。
答え1
より良い答えを得ることもできます情報セキュリティSE。
関連するメモリ範囲をロックして、キーがスワップに書き込まれないようにする必要があります(参照:mlock
);キーにメモリプールを割り当てると簡単です。
また、root以外のユーザーにプロセスRAMへのアクセスを防ぐために、スワップメモリ、コアダンプ、パッケージのインストール、gdbの使用などへのアクセスを許可しないなど、どのような制限を適用する必要がありますか?
ルート以外のユーザーはとにかくスワップ領域にアクセスできません。メモリのキーをロックすると、問題を完全に回避できます。ルート以外のユーザーは、自分のプロセスによって生成されたもの以外のコアダンプにアクセスすることはできません。ptrace
他のユーザーのプロセス(つまり、gdb
他のプロセスのメモリを表示するために実行できないことを意味します)
CPUが必要な機能を提供する場合は、使用を検討することができます。pkeys
さらなる保護のため。別の可能性は、キー処理をカーネルに完全に委任することです。このkeyrings
ページもっと学ぶ。