web-dev-qa-db-ja.com

UbuntuはカーネルでRANDOM_TRUST_CPUを有効にしますか?

これによると 2018-08-28のRegister記事 およびその他の記事によると、Linuxカーネルバージョン4.19にはRANDOM_TRUST_CPUという名前のコンパイルフラグがあります。また、実際のコード変更を含む、パッチ作成者による メーリングリストエントリへのリンク もあります。私が理解したことから、これにより、さまざまなソースから安全に十分なエントロピーが収集されるまでnot待機することで、システムが特定の状況下でブートプロセスを高速化できるようになります乱数ジェネレータをシードしますが、その部分をスキップし、CPUの組み込み乱数ジェネレータのみに依存します。

これは、システムの暗号化セキュリティを弱めます(これを正しく理解している場合)、単一のエントロピーソースとしてCPUだけに依存するだけでなく、そのCPUの実装が信頼できない場合(バグ、意図的なバックドア、 ...)。

  • カーネルの乱数ジェネレーターは、CPUのジェネレーターのみからずっと初期化されますか、それとも初期のブート段階でそれを行い、後で「従来の」ソースからのエントロピーをプールに追加し、暗号化セキュリティを高めます再び現在/旧レベルに戻りますか?

  • これは明らかにコンパイル時フラグであるため、Ubuntuのリポジトリで提供されるカーネルパッケージには、このフラグが有効または無効になっていますか?

  • これからカーネルを自分でコンパイルする以外に、オプトインまたはオプトアウトする方法がありますか?

  • これにより起動時間が異なるかどうかを実際にテストする方法はありますか?現在、ブート中にエントロピーを待機するのに費やした時間について利用可能なメトリックはありますか?

  • また、どのUbuntuリリースで4.19以降のカーネルバージョンを実行できますか?

4
Byte Commander

まず、合理的には、CPUの組み込みHWRNG(IntelのRDRANDなど)が使用されているかどうかに関係なく、システムの暗号化セキュリティ(予測不可能性)は変更されません。 RNG(およびそれに依存するもの)のセキュリティがやむを得ず弱くなることに注意してください。

簡単に説明すると、ブートストラッププロセス中に、カーネルがランダムネスドライバーをロードした後、Linux RNG initializes すべてのランダムプール(エントロピープール、これはランダムデータを保持する単なるメモリ領域です)、メインプール(入力プール)を含むHWRNGが利用可能な場合はエントロピー、それ以外の場合はrandom_get_entropy()を介したエントロピー。これはget_cycles()のマクロであり、その実装はアーキテクチャによって異なります(aarch64ではCNTVCT_EL0レジスタの読み取り is done TSC regを読み取ることでx86-64で実際に使用されるクロックレートではなく、一種の周波数カウンター)。このデータはすべて、プライマリ暗号状態(primary_crng、タイプstruct crng_stateのオブジェクト、- ChaCha20アルゴリズム の実装)に渡されます。これには、最終的に提供される384個のランダムビットのキーが含まれます。 /dev/urandomインターフェイスへ。

このコンテキスト化により、あなたの質問に答えるために、early_initcallであるRand_initialize()によるカーネルのRNGの実際の初期化は、(*_initcall()と同様に)ブート時にのみ、特にstart_kernel()の最後で、特にカーネルルーチンrest_init()が呼び出されます、最初に行うことの1つは、特にinitcallを起動する目的でカーネルスレッド(kernel_init)を生成することです(add_device_randomness()before と呼ばれますが、 ' tは、エントロピーデータを実際に追加します);その結果、はい、ソースごとに、ChaCha20、プライマリおよびブロッキングプールの暗号状態は、Arch_get_random_long()で初期化されます。これは、x86プロセッサでRDRAND命令を使用します(利用可能であれば、カーネル 警告 これについて)。ただし、(RDRANDが使用可能であっても)使用される唯一のソースとは言いません。少なくとも、

  1. ファームウェアの時間が使用され、プールに混合されます 初期化中 (エントロピーではないかもしれませんが、攻撃者は非常に高い精度でタイムスタンプを推測する必要があります);

  2. 別の小さなプールがあります(CPUごとに1つ、fast poolと呼ばれます)、add_interrupt_randomness()からエントロピーを収集し、IRQ(および理論的には他のカーネルイベント、さらには入力としてCPUハードウェアRNGからのシードがあり、すべてが混合されてから、入力プールに注入されます。これは毎秒のように起こります。

そのため、HWRNGと他のソースの両方からエントロピーを収集するプロセスはすべて同時に行われます。もちろん、最初のものがシーンを支配し(エントロピーの品質が間違いなく高いため、真のRNGであるため)、ブート時に発生し、ユーザー空間から、擬似ランダムデバイス(またはgetrandom() syscall)が使用されるたびに発生します。ただし、2番目の場合、プールは既に初期化されており、primary_crng(暗号状態)だけが再シードされます。はい、お気付きのとおり、CPUに組み込まれたRNGは、全体的なランダム性を確実に改善します。

最後に、特にソースノイズ(キーボード、ハードディスクなど)が不足している可能性がある組み込みシステムでは、HWRNGの使用が大きな影響を与えることを付け加えます。そして、セキュリティに関心がある場合は、常に ドキュメントごと で、RANDOM_TRUST_CPUの導入前にRDRANDのカーネル使用を無効にできることに注意してください。

5