
CVE-2026-6330 (NEON) および CVE-2026-10097 (AVX2)。wolfSSL 5.9.2 で修正されました。
ML-KEM (Kyber, FIPS 203) は、復号化内の1つのチェックにより選択暗号文攻撃に耐性があります。受信者は復号したばかりのメッセージを再暗号化し、結果が入力暗号文と完全に一致した場合にのみ実際の共有秘密を返します。不一致があると暗黙的な拒否がトリガーされ、代わりに疑似ランダム値が返されます。そのチェックがFujisaki-Okamoto変換であり、IND-CCA2スキームとその下の展性のあるIND-CPAスキームを分ける唯一の門です。
wolfSSLはその比較を手書きのSIMDアセンブリで実装し、2つのバックエンドでは暗号文の一部のみを比較していました。ARM64 NEONでは約半分を比較し、それをNicholas Carlini (Wikipedia) が発見して報告しました (CVE-2026-6330)。x86-64 AVX2では、ML-KEM-1024の1568バイトのうち1536バイトを比較していました (CVE-2026-10097)。
どちらのバックエンドでも、改ざんされた暗号文が本物として受理され、これはIND-CCA2セキュリティの弱体化として報告されました。この文書は、脆弱性が両方のバックエンドでさらに深刻であることを示します。チェックがスキップするバイトは、復号化の復号ノイズを漏らし、そのノイズは秘密鍵の線形関数であるため、最小二乗回帰によって鍵を回復できます。これは格子問題ではなく、古典的な鍵不一致攻撃でもありません。AVX2バックエンドでは脆弱性が u のすべてを検証するため、それらの攻撃に必要な選択u暗号文は拒否されます。代わりに、復号ノイズ回帰はチェックされていない v 係数から鍵を回復します。完全なML-KEM-1024秘密鍵は、AVX2およびNEONバックエンドの両方で、脆弱なバイナリに対してエンドツーエンドで回復されます。
この攻撃には再利用されたML-KEM鍵が必要です:HPKE受信者、KEMTLS、または固定および埋め込み鍵。エフェメラルハイブリッドTLS 1.3鍵共有はハンドシェイクごとに新しい鍵を使用し、この方法では鍵回復できません。そこでは脆弱性は識別可能な破損のみです。両方の脆弱性は修正され公開されており、これは開示後の文書です。
「ライブ」は実際のバイナリ上で示された結果です。NEONは係数あたりの測定がはるかにノイズが多い(約4倍)ため、より多くの暗号文(600対350)を必要とします。「モデル」はノイズのないチェックであり、回帰が完全な鍵(全2048係数、100%)を回復します。その暗号文数はノイズではなく各暗号文が生成する方程式の数によって決まるため、ライブの数値とは比較できず、攻撃の難易度を反映していません。
両方の脆弱性は同じwolfSSLリリース期間中に独立して発見され、5.9.2で一緒に修正されました(両方のCVEエントリについてはwolfSSL セキュリティ脆弱性ページを参照)。CarliniのNEONバグはIND-CCA2の弱体化として文書化され、AVX2バグは鍵回復としてCVE登録されました。このリポジトリの復号ノイズ回帰攻撃は両方で鍵を回復します。バックエンド固有の詳細はneon-cve-2026-6330/およびavx2-cve-2026-10097/にあります。
wolfSSLのML-KEM暗黙的拒否チェックにおける不完全な比較であり、2つのSIMDアセンブリバックエンドに存在します。暗号文の全バイトよりも少ないバイトを比較したため、正しい実装では拒否される暗号文を復号化が受理します。チェックされていないバイトにより、復号化が復号ノイズのオラクルとなり、鍵が再利用される場合に秘密鍵を回復するのに十分です。
影響を受けるのは、脆弱なSIMDアセンブリ(AVX2 (x86-64) の5.7.0~5.9.1、またはARM64 NEONの5.7.4~5.9.1)を含むビルドでwolfSSLをML-KEMと共に使用した場合です。鍵回復攻撃にはさらに、HPKE受信者、KEMTLS、または固定/埋め込み鍵のように、ML-KEM秘密鍵が復号化間で再利用される必要があります。エフェメラルハイブリッドTLS 1.3鍵共有はハンドシェイクごとに新しい鍵を使用し、鍵回復はできません。そこでは脆弱性は識別可能な破損のみです。修正はwolfSSL 5.9.2に含まれています。
細工された復号化クエリを送信し、それぞれに対して実際の秘密値または拒否値のどちらが返ってくるかを観察することで、どちらのバックエンドでもML-KEM-1024秘密鍵全体を回復できます。ライブバイナリに対しては、約10^5から10^6の復号化クエリで鍵を回復しました。
1つの暗号文係数をチェックされていない領域から取り出します。その平文ビットは丸めによって決定されます。m'_j = Compress_1(v_j - (s^T u)_j)。これらのバイトは比較されないため、v_jの圧縮値を掃引し、変化する唯一の復号化出力を監視することで丸め境界を見つけ、境界位置は復号ノイズδ_jを約±q/64の精度で測定します。攻撃者が選択した秘密(s, e)と暗号化ランダム性の観点から:
δ_j = ( e^T y - s^T(e1 + c_u) + e2 + c_v )_j (verified exact; small; never wraps mod q)
これは2048係数の秘密(s, e)に関する線形方程式であり、係数は攻撃者が知っています。各暗号文は、チェックされていない係数ごとに1つのそのような方程式を与えます。十分な暗号文を積み重ねて正規方程式を解くと鍵全体が回復され、最後のいくつかの係数は公開鍵関係e = t - A·s ∈ CBD(η)によって固定されます。これは通常の最小二乗法であり、格子問題ではありません。
2つのバックエンドは漏洩量が異なります。NEONは暗号文の約50%をチェックせずに残します(3つのバンドで125係数)、AVX2は約2%です(1つのバンドで51係数)。それでもNEONはより多くの暗号文を必要とします。チェックされていないバイトが非連続であり、係数あたりの測定がよりノイズが多いため、ここではより多くの漏洩が回復を容易にすることはありません。
平文チェック攻撃や鍵不一致攻撃(Ravi et al. 2020, Qin et al. 2021, Băetu et al. 2019)は、攻撃者が選択したスパースなuを持つ暗号文を送信してクエリごとに1つの秘密係数を分離することで、数千クエリで鍵を回復します。AVX2の脆弱性はそれらすべてを拒否します。vの32バイトのみをスキップし、u全体を検証するため、ライブバイナリではスパースu暗号文は拒否され、単一のuビットを反転させたものは30回中30回拒否されます。NEONの脆弱性はより広範で、uの約半分もチェックされないまま残すため、その議論はAVX2固有です。しかし、この攻撃はそれに依存しません。復号ノイズ回帰は、両方のバックエンドでチェックされていないv係数から鍵を回復し、各バグが無傷のまま残すチェックの部分を生き残ります。
両方のバックエンドの忠実なリファレンスモデル(kyber-py)において、上記の恒等式は正確であることが検証され、回帰はすべての2048の秘密係数を回復します。修正前のwolfSSLバイナリに対して、再利用されたエクスポート鍵を攻撃する際、各ハーネスは数値を報告する前にオラクルがエクスポートした正解鍵との自己チェックを実行します。
(s, e)の98.0%に到達。秘密s単独では350 ctで1005/1024 = 98.1%(CVEに記録された値)。(s, e)の2018/2048 = 98.5%に到達。ソルバー誤差は単調に正確に収束。回復された鍵は、オラクルがエクスポートするwolfSSL生成の鍵ペアであり、攻撃はそのモデルではなく出荷時のSIMDアセンブリに対して実行されます。完全なトランスクリプト:
avx2-cve-2026-10097/live_recover_avx2.out、
neon-cve-2026-6330/live_recover_neon.out。
wolfSSL 5.9.2以降にアップグレードしてください(AVX2用PR #10430、NEON用PR #10192)。
深刻ですが、壊滅的ではありません。再利用された鍵、受理/拒否オラクル、および大規模だが実用的な数のクエリが必要です。サイドチャネルではありません。タイミングや電力測定はなく、比較の論理バグのみです。正しい実装やML-KEM標準自体には影響しません。比較として、liboqsのML-KEM復号化におけるコンパイラ誘発のタイミングリーク(CVE-2024-36405)は、KyberSlashと並ぶ2024年のML-KEMタイミングリークの波における関連する完全秘密鍵回復問題であり、NISTによってCVSS 7.5と評価されました。
バックエンドごとの攻撃コード、分析、再現手順はavx2-cve-2026-10097/およびneon-cve-2026-6330/にあります。
このリポジトリは、同じwolfSSLリリース期間からの2つの兄弟発見と、両方を突破する1つの攻撃を文書化しています。
両方の問題は、この文書の前に非公開で報告され、修正され、CVEが割り当てられました。wolfSSL 5.9.2で修正されました。
| NEON (CVE-2026-6330) | AVX2 (CVE-2026-10097) |
|---|
| バックエンド | ARM64 NEON | x86-64 AVX2 |
| 脆弱性 | 暗号文の約半分を比較 | 1568バイト中1536バイトを比較 |
| 報告者 | Nicholas Carlini (Anthropic) | 007bsd |
| CVE深刻度 | 中 (CVSS 4.0 6.3, CWE-327) | 高 (CVSS 4.0 8.3, CWE-697) |
| 鍵回復(モデル) | 完全(約500 ct) | 完全(約1300 ct) |
| 鍵回復(ライブバイナリ) | 98.5%(600 ct、QEMUエミュレーション) | 98.1%(350 ct、ネイティブ) |
| 修正 | PR #10192 | PR #10430 |