systemdに無効な(静的、低エントロピー)ランダムシードがあるとどうなりますか?

systemdに無効な(静的、低エントロピー)ランダムシードがあるとどうなりますか?

組み込みシステムでは、読み取り専用ファイルシステムが一般的です。読み取り専用を意味します/var/lib/systemd/random-seed 再起動後に更新できませんたぶんクローンかもしれない他のデバイスのランダムシードです。

これはかなりのセキュリティやその他の影響を与えますか?それでは、どのように緩和すべきでしょうか?

おそらく:

  • 各デバイスに新しいランダムシードを作成すると、部分的な軽減になりますか?再起動後もまだ更新できません。
  • tmpfsの開始初期にランダムシードファイルを設定するために多くの努力をしますか?何をすべきかわかりません。
  • 問題を無視しますか?

ベストアンサー1

悪いエントロピーは、特定のクラスの組み込みデバイスで一般的に発生する問題です。これは深刻なセキュリティリスクです。残念ながら、すべてのデバイスで動作する単一のソリューションはありません。

注:私はプロの組み込みデバイスセキュリティ設計者ですが、systemdやLinuxと比較して小さすぎるデバイスを使用することがよくあります。私はsystemdについてよく知りません。

エントロピーはなぜ必要ですか?

多くのセキュリティは暗号化に依存しています。ほとんどの暗号化は、他の人が知らないことを知ることに依存しています。決定論的プロセッサを実行する新しくインストールされたシステムなど、状態が完全に知られているデバイスがある場合、誰もがデバイスの状態を知っているので、敵がわからないことをデバイスは知りません。デバイスには、他人が知らないことを知り始めるか、他人が知らない情報を生成する方法が必要です。これがエントロピーです。

たとえば、ウェブサイトと交換するデータを覗くことができないように、ウェブサイトと交換するデータを偽造できないように、WiFi パスワードを覗くことができないようにするにはエントロピーが必要です。

システムにエントロピーが生じると、決定論的ランダムジェネレータ(つまり、ソフトウェアアルゴリズム)は、誰にも知られていない秘密データを無制限に生成できます。しかし、どんな決定論的過程でも、大根からエントロピーを生成することはできません。原則として、決定論的なランダム生成は解決された問題です(実装にバグがある可能性があります)。

2012年の調査によると、インターネットに接続されているデバイスのうち小さいながらも無視できない部分は、過酷なランダムジェネレータのため安全ではないことがわかりました。。彼らは間違ったランダムジェネレータが見える特定の方法だけをテストしたことに注意してください。この研究では、誤ったRNGが問題を引き起こす可能性がある他の多くの方法を無視します。しかし、逆に、いくつかのRNGの問題は、エントロピーの欠如ではなく、ソフトウェアのバグが原因で発生する可能性があります。

エントロピーはどのように取得できますか?

最も信頼性の高いソリューションは、専用のハードウェアコンポーネントを保持することです。ハードウェア乱数ジェネレータ(HRNG)1。すべてではありませんが、ほとんどの最新のPCおよびスマートフォンプロセッサには1つあり、一部の組み込みボードには1つがあります(私が知っている限り、すべてのRaspberry Piモデルには1つあります)、家庭用ルーターなどの低コストデバイスでは使用できません。あまり一般的ではありません。デバイスにHRNGがあっても、Linuxにそのドライバが常にあるとは限りません。

特別なハードウェアコンポーネントがないと、予測できないイベントによってエントロピーが生成される可能性があります。問題は、予測不可能なイベントが定量化するのが難しく、組み込みデバイスではまれです。たとえば、回転するハードドライブの正確な応答時間には予測不可能な部分がありますが、通常は内蔵デバイスにはハードドライブがありません。高速のために設計された複雑なプロセッサは、しばしば予測不可能なクロックを持ちます。ジッタしかし、安価であるか、または低電力デバイスにはジッタがあまりありません。ユーザーイベント(キー入力など)のタイミングにより、一部の予測不可能性が発生しますが、組み込みデバイスには実際のユーザーがいないことがよくあります。カメラセンサーやマイクなどの一部のデバイスは、少なくとも適切な環境条件が与えられると、ノイズからエントロピーを生成するのに熟練していますが、適切なセンサーがないデバイスはあまりありません。

エントロピーを生成できないデバイスにエントロピーを提供する別の方法は、製造プロセスにエントロピーを注入することです。アセンブリラインでHRNGを実行し、ランダムデータを含む他のファイルを各デバイスに注入します。その後、デバイスが起動するたびにこのランダムデータを更新する必要があります。このランダムデータは、あなたが要求したランダムシードです。

すべてのLinuxシステムには通常、任意のシードがあります。これは、他のエントロピーソースがないデバイスでは絶対に必要であり、他のエントロピーソースがあるデバイスでも問題ありません。

ランダムシードは他のデバイスと共有してはならず、デバイスの再起動時に繰り返さないでください。動作方法は、シードが製造中に注入されるか、デバイスのインストール中にエントロピーで生成され、次にデバイスが起動するたびに新しいシードを計算して保存することです。

デバイスがエントロピーなしでインストールされている場合はどうすればよいですか?

Linuxシステムへのコマンドラインアクセス権がある場合は、以下を作成してアクセスできます/dev/urandom。たとえば、PCからデバイスへのSSH接続がある場合:

head -c 99 /dev/urandom | ssh mydevice 'cat >/dev/urandom'

起動に問題があります。デバイスにエントロピーがないと、SSHホストキーを安全に生成できず、ネットワーク攻撃者の再生攻撃にも脆弱です。したがって、デバイスが信頼できない接続にさらされる前にこれを行う必要があります。低いエントロピーで生成されたキーがある場合は、十分なエントロピーが利用可能になったら再生成してください。

追加のエントロピーを作成したら、リポジトリのランダムシードを更新する必要があります。私考えるサービスを再起動すると、systemd-random-seedこれを行うことができますがわかりません。systemdのドキュメントは不明です。

デバイスに永続的なランダムシードがない場合はどうすればよいですか?

デバイスにHRNGがある場合は問題ありません。それ以外の場合は問題が発生します。

デバイスに非専用周辺機器からエントロピーを収集する適切な方法がある場合は、おそらく大丈夫でしょう。問題は測定が難しいことです。

/var/lib/systemd/random-seed継続的に保存する必要があります。それ以外の場合、目的は失われます。 tmpfsにランダムシードを「保存」することは意味がありません。

多くの組み込みデバイスには少量のNVRAMがあります。最大書き込み回数が許可されている場合は、起動するたびにランダムシードを保存することがこのNVRAMをうまく利用することです。このためにsystemdを設定する方法がわかりません。

デバイスが物理的に安全な環境の有線ネットワークに接続されている場合は、オプションで同じ物理的な場所にある信頼できるコンピュータでエントロピーを検索できます。

デバイスに一意であるが起動するたびに書き換えられない秘密がある場合は、この秘密を起動時に時間と組み合わせることができます。しかし、参考にしてくださいこれが最後の手段です

{ date +%s; cat /path/to/static/seed; } | sha256sum >/dev/urandom

これにより許容可能な種子が生産される。日付が繰り返されない限り。ただし、デバイスの電源が切れて時間が追跡できない場合、つまり2000年1月1日00:00:00と考えて「12時フラッシュ」を再起動すると、同じエラーが発生し続けます。これにより、デバイスをWebベースのネットワークに開放できます。デバイスのパフォーマンスによっては攻撃がやや簡単になることがあります。

1免責事項:雇用主はこれらのデバイスを製造していませんが、より多くの組み込みデバイスにHRNGを取り付けると間接的に利益になります。しかし、私の雇用主の主な事業が人々の攻撃の回復を支援してお金を稼ぐコンサルティング会社なら、個人的にはまだHRNGをお勧めします。

おすすめ記事