CVE-2021-41117
安全でない乱数生成
- 公開済み
- 2021/10/11
- 更新済み
- 2024/08/04
- CNA の割り当て
- GitHub_M
- 観察された証拠
- 2026/08/08
プライマリ CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N低 · 今後 30 日間
- パーセンタイル
- 87.1%
- モデルの日付
- 2026/09/21
EPSS は統計的な推定値であり、確実性や影響の尺度ではありません。 CVSS、KEV ステータス、暴露、環境と組み合わせます。
概要
keypair は、javascript で書かれた RSA PEM 鍵生成器です。keypair は、多くの暗号プリミティブを独自に実装するか、可能な限り node-forge を含む他のライブラリから借用して実装しています。このライブラリが、SSH で使用される同一の RSA 鍵を生成しているという問題が発見されました。これは、ライブラリが同一の P、Q(したがって N)の値を生成していることを意味し、実際上 RSA-2048 鍵では不可能なことです。同一の値を繰り返し生成することは、通常、乱数生成の質が低いか、CSPRNG 出力の取り扱いが不適切であることを示しています。 問題 1: 不十分な乱数生成 (`GHSL-2021-1012`)。このライブラリは、プラットフォームが提供する CSPRNG に完全には依存せず、独自のカウンタベースの CMAC 方式を使用しています。問題が発生するのは、関数 `defaultSeedFile` 内で CMAC 実装に「真の」ランダムデータをシードするときです。AES-CMAC ジェネレータをシードするために、ライブラリは JavaScript の実行環境に応じて 2 つの異なる方法を取ります。ブラウザでは、ライブラリは [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971) を使用します。しかし、nodeJS 実行環境では `window` オブジェクトが定義されていないため、はるかに安全性の低い解決策にフォールバックし、そこにもバグがあります。このライブラリは、可能な場合に node の CSPRNG を使用しようとしているように見えますが、残念ながら、同じ名前の変数が宣言され `null` に設定されているため、`crypto` オブジェクトが null になっているようです。そのため、node CSPRNG のパスは決して実行されません。一方、`window.crypto.getRandomValues()` が利用できない場合は、Lehmer LCG 乱数生成器が CMAC カウンタをシードするために使用され、その LCG は `Math.random` でシードされます。これは質が低く、それ自体がセキュリティバグになり得ますが、重複した鍵が発生する異常な頻度を説明するものではありません。 主な欠陥: Lehmer LCG の出力が誤ってエンコードされています。欠陥のある特定の [行][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008] は次のとおりです: `b.putByte(String.fromCharCode(next & 0xFF))` `putByte` の[定義](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352)は `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};` です。簡略化すると、これは `String.fromCharCode(String.fromCharCode(next & 0xFF))` です。二重の `String.fromCharCode` はほぼ間違いなく意図的ではなく、弱いシードの原因です。残念ながら、これはエラーにはなりません。むしろ、バッファの大部分がゼロを含むことになります。0xFF でマスクしているため、LCG の出力の 97% がゼロに変換されると判断できます。意味のある値になるのは、出力の 48 から 57 まで(両端を含む)だけです。影響は、RNG シードの各バイトが、誤った変換により 97% の確率で 0 になることです。0 でない場合でも、バイトは 0 から 9 の範囲です。 まとめると、直ちに対処すべき問題が 3 つあります。1. このライブラリには、安全でない乱数フォールバックパスがあります。理想的には、LCG と `Math.random` を使用しようとするのではなく、強力な CSPRNG を要求すべきです。2. このライブラリは、NodeJS で実行した場合、強力な CSPRNG が利用可能であるにもかかわらず、それを正しく使用していません。3. フォールバックパスの実装には、シードデータの大部分が実質的にゼロになるという問題があります。乱数生成が不十分なため、keypair は比較的推測が容易な RSA 鍵を生成します。これにより、攻撃者は機密メッセージを復号化したり、被害者に属するアカウントへの不正アクセスを取得したりできる可能性があります。
ソース
1責任ある使用
脆弱性情報は、自分が所有しているシステム、またはテストを許可されているシステムでのみ使用してください。 Kitploit は公開研究メタデータにリンクしており、エクスプロイト コードや悪意のあるペイロードは保存しません。