CVE-2026-6330(NEON)および CVE-2026-10097(AVX2)。wolfSSL 5.9.2で修正済み。
完全な技術解説は
Cryptology ePrint Archive, Paper 2026/1682として公開されています
(ローカルコピーはpaper/)。下記の引用を参照してください。
ML-KEM(Kyber、FIPS 203)は、 復号化内部の1つのチェックにより 選択暗号文攻撃に耐性を持ちます。 受信者は復号したばかりのメッセージを再暗号化し、その結果が入力された暗号文と完全に一致する場合のみ実際の共有秘密を返します。 不一致があれば暗黙的拒否が発生し、代わりに擬似ランダム値が返されます。そのチェックこそが Fujisaki-Okamoto変換であり、 IND-CCA2スキームを その下にある改変可能なIND-CPAスキームから分離する唯一の門です。
wolfSSLはその比較を手書きの SIMDアセンブリで実装しており、 2つのバックエンドでは暗号文の一部のみを比較していました。ARM64 NEONでは約半分を比較しており、 これはNicholas Carlini (Wikipedia)が発見・報告しました ()。x86-64 では、ML-KEM-1024の1568バイトのうち1536バイトを比較していました ()。
どちらのバックエンドでも、改ざんされた暗号文が正規のものとして受け入れられ、これはIND-CCA2セキュリティの弱体化として報告されました。本解説では、この欠陥が両バックエンドでさらに深刻であることを示します。チェックがスキップするバイトは復号化の復号ノイズを漏洩させ、そのノイズは秘密鍵の線形関数であるため、
最小二乗回帰によって鍵を回復できます。これは格子問題ではなく、古典的な鍵不一致攻撃でもありません。AVX2バックエンドでは、この欠陥がuのすべてを検証するため、それらの攻撃に必要な選択u暗号文は拒否されます。代わりに、復号ノイズ回帰はチェックされないv係数から鍵を回復します。完全なML-KEM-1024秘密鍵は、AVX2とNEONの両バックエンドで、実行中の脆弱なバイナリに対してエンドツーエンドで回復されます。
この攻撃には再利用されたML-KEM鍵が必要です:HPKE受信者、KEMTLS、または固定・埋め込み鍵です。一時的なハイブリッド TLS 1.3鍵共有はハンドシェイクごとに新しい鍵を使用し、この方法では鍵回復できません。そこではこの欠陥は識別攻撃の破れにすぎません。両方の欠陥は修正済みかつ公開済みであり、これは開示後の解説です。
| 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 |
「実バイナリ」は実際のバイナリに対する実証結果です:NEONは係数あたりの測定ノイズがはるかに大きい(約4倍)ため、より多くの暗号文(350ではなく600)が必要です。「モデル」は回帰が完全な鍵(全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アセンブリを含むビルドでwolfSSLをML-KEMとともに使用していた場合、影響を受けます:5.7.0-5.9.1のAVX2(x86-64)、または5.7.4-5.9.1のARM64 NEON。鍵回復攻撃にはさらに、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 (正確に検証済み。小さく、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係数から鍵を回復し、各バグが無傷で残すチェックの部分を生き延びます。
したがって、関連する前例はそれらの鍵不一致攻撃ではなく、復号失敗攻撃(D'Anvers et al. 2019、参考文献6)です。それらは同じ復号ノイズ項(秘密の線形関数)を利用しますが、その項が復号境界を越えて復号失敗を引き起こす稀な事象を通じてのみ利用するため、そこでの回復は統計的であり、はるかに多くの暗号文を必要とします。不完全な比較は代わりにその同じ項を約±q/64で直接測定可能にし、失敗は不要で、攻撃は上記の通常の最小二乗回帰に帰着します。
両バックエンドの忠実な参照モデル(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。
壊滅的ではありませんが、深刻です。再利用された鍵、受理/拒否オラクル、および大規模だが現実的な数のクエリが必要です。これは サイドチャネルではありません:タイミングや電力測定はなく、比較における論理バグのみです。正しい実装や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で修正済み。
完全な解説は
Cryptology ePrint Archive, Paper 2026/1682として公開されています
(ローカルコピー:paper/)。
@misc{cryptoeprint:2026/1682,
author = {Bhabani Sankar Das},
title = {Incomplete Ciphertext Comparison in {ML}-{KEM}: From an {IND}-{CCA2} Break to Key Recovery},
howpublished = {Cryptology {ePrint} Archive, Paper 2026/1682},
year = {2026},
url = {https://eprint.iacr.org/2026/1682}
}