
2026/01/01 23:52
エリプティックライブラリに対しWycheproofスイートでテストした結果、暗号学的欠陥を発見しました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
JavaScript elliptic ライブラリは、約3 000のプロジェクトで使用されており、週に1,000万回以上ダウンロードされています。このライブラリには、署名の偽造や有効な署名を拒否する二つの重大なセキュリティ脆弱性が存在します。
- EdDSA 署名の可変性(CVE‑2024‑48949) は、スカラー
に対する境界外チェックが欠落しているために発生し、攻撃者が署名を偽造できるようになっています。この脆弱性は 2024 年 7 月 16 日に公開されましたが、10 月に閉じた 90 日間の開示期間後もパッチは適用されていません。s - ECDSA 検証エラー(CVE‑2024‑48948) は、
が先頭ゼロを取り除きハッシュを曲線順序に切り捨てることで発生し、高い先頭ゼロを含む有効な署名が拒否されます。このバグは 2024 年 7 月 17 日の開示後に内部的に修正されましたが、公開 CVE は 10 月 15 日までにリリースされませんでした。new BN(msg,16)
合計で五つの脆弱性が特定されました:三つはパーシング問題の小規模 CVE が公共プルリクエスト経由で提出され、二つは GitHub アドバイザリを通じて処理された重大な CVE です。すべてに MITRE によって 2024 年 10 月 10 日に CVE 番号が付与されました。
Wycheproof テストベクトルは、これらのバグ発見に重要な役割を果たしました。著者は elliptic 用のハーネスを構築し、Wycheproof の使用方法に関するガイドを公開しました。Daniel Bleichenbacher は 2024 年 10 月 13 日頃に関連する問題(#321)を独自に特定し、elliptic 実装の継続的な監査が必要であることを示しています。
開発者は依存関係を迅速に更新し、CI/CD パイプラインに継続的な Wycheproof テストを統合して、署名偽造、監査失敗、および JavaScript エコシステム全体での評判への損害を防ぐよう促されます。
本文
Trail of Bits は、毎週 1,000 万回以上ダウンロードされる人気の JavaScript ライブラリ elliptic(楕円曲線暗号用)に関する 2 件の脆弱性を公開しました。
このライブラリは約 3,000 のプロジェクトで利用されています。
発見されたバグは、モジュラー減算が欠如している点と長さチェックが抜けている点に起因します。これらにより、攻撃者は署名を偽造したり、有効な署名を却下させることが可能になります。
1 つの脆弱性(CVE‑2024‑48949)は、10 月に終了した 90 日間の開示期間後も未修正のままとなっています。
バグの発見経緯
- Wycheproof – 暗号アルゴリズム用のテストベクトル集を使用して elliptic を過負荷テスト。
- Trail of Bits の Testing Handbook に記載されたカスタムハーネスが Wycheproof ベクトルをライブラリに対して実行。
- 失敗したテストケースを検証し、偽陽性か本当の発見か分類。その後、各脆弱性の概念実証コードを書き上げる。
- 発見内容は GitHub のアドバイザリ経由で elliptic のメンテナに報告・調整。
発見結果
| CVE | 問題点 | 影響 |
|---|---|---|
| CVE‑2024‑48949 | EdDSA 署名の改変性 – スカラー の境界チェックが欠如。 | 攻撃者は既知の に対して新しい有効署名を偽造できる。 |
| CVE‑2024‑48948 | 先頭ゼロハッシュでの ECDSA 検証エラー – ハッシュ値の切り捨てが誤っている。 | メッセージハッシュに十分な先頭ゼロ(確率 2⁻³²)が含まれると、有効署名が拒否される。 |
CVE‑2024‑48949: EdDSA 署名改変性
NIST FIPS 186‑5 §7.8.2 は
0 ≤ s < n を検証することを要求しています。elliptic ではこのチェックが省略されているため、攻撃者は次のように新しいスカラー
s' を作成できる:
s' mod n == s
以下の guard を追加すれば偽造を防げます。
if (sig.S().gte(sig.eddsa.curve.n)) { return false; }
CVE‑2024‑48948: ECDSA 検証エラー
ECDSA の検証ではハッシュ
H を曲線のオーダー n に合わせて切り捨てる必要があります:
log2(n) ≥ hashlen なら E = H そうでなければ E は H の左端 log2(n) ビットを取ったもの
ライブラリの
_truncateToN 関数は、hex 文字列を BN オブジェクトに変換した後でバイト長を測定するため、先頭ゼロが失われます。結果として
delta が小さく計算され(32 ビットではなく 64 ビット)、ハッシュの切り捨てが正しく行われず、有効署名が失敗します。
修正例:
EC.prototype.verify = function verify(msg, signature, key, enc, msgSize) { msg = this._truncateToN(new BN(msg, 16), undefined, msgSize); }; EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, msgSize) { var size = (typeof msgSize === 'undefined') ? (msg.byteLength() * 8) : msgSize; var delta = size - this.n.bitLength(); ... };
継続的テストの重要性
これらの脆弱性は、暗号ライブラリが常に最新のテストベクトルで検証される必要があることを示しています。
Wycheproof などのスイートを CI/CD パイプラインに組み込むことで、パーサー・算術演算・プロトコル準拠のいずれかで回帰が発生した際にリリース前に検出できます。
開示タイムライン
| 日付 | 事象 |
|---|---|
| 2024‑07‑09 | Wycheproof ベクトル失敗を検知。 |
| 2024‑07‑10 | ECDSA と EdDSA の問題を確認し、PoC と修正を書作成。 |
| 2024‑07‑16 | CVE‑2024‑48949 を非公開で報告;PR 合流、新リリースを非公開で実施。 |
| 2024‑10‑10 | MITRE へ CVE ID 要求。 |
| 2024‑10‑15 | 90 日間の開示期間終了 → 公開。 |
| 2024‑07‑17 | CVE‑2024‑48948 を非公開で報告;PR 提出。 |
| 2024‑07‑23 – 2024‑08‑14 | GitHub アドバイザリに共同作業者を追加しようと試みるが応答なし。 |
| 2024‑10‑13 | Wycheproof 開発者 Daniel Bleichenbacher が関連問題 (#321) を独自に発見。 |
参考文献
- Trail of Bits Wycheproof ガイド
- NIST FIPS 186‑5 規格
- elliptic ライブラリのリポジトリ & GitHub アドバイザリ