暗号学において、フルーラー、マンティン、シャミア攻撃は、広く用いられているRC4ストリーム暗号に対する攻撃である。この攻撃により、攻撃者はRC4で暗号化されたストリーム内の多数のメッセージから鍵を復元することができる。
Fluhrer、Mantin、Shamir の攻撃は特定の鍵導出方法に適用されますが、一般的には RC4 ベースのSSL (TLS)には適用されません。これは、SSL が RC4 に使用する暗号化キーをハッシュ化によって生成するため、異なる SSL セッションは関連性のないキーを持つことになるからです。[ 1 ]ただし、同じ研究に基づいて 2015 年に明らかにされた密接に関連するbar mitzvah 攻撃は、 SSL 鍵生成プロセスによって弱いキーが生成されるケースを悪用します。
Fluhrer 、Mantin、Shamir (FMS) 攻撃は、2001 年に発表された論文「RC4 の鍵スケジューリングアルゴリズムの脆弱性」[ 2 ]で明らかにされたもので、RC4鍵スケジューリングアルゴリズムの脆弱性を利用して暗号化されたメッセージから鍵を復元します。FMS 攻撃は、 AirSnort、weplab、aircrackなどのネットワーク攻撃ツールで広く使われるようになり、これらのツールはWEPで保護された無線ネットワークで使用される鍵を復元するためにこの攻撃を利用しています。
この議論では、以下のRC4鍵スケジューリングアルゴリズム(KSA)を使用します。
begin ksa(with int keylength, with byte key[keylength]) i が 0 から 255 まで S[i] := i endfor j := 0 i が 0 から 255 まで j := (j + S[i] + key[i mod keylength]) mod 256 swap(S[i],S[j]) endfor 終わり
以下の擬似乱数生成アルゴリズム(PRGA)も使用されます。
begin prga(with byte S[256]) i := 0 j := 0 出力生成中: i := (i + 1) mod 256 j := (j + S[i]) mod 256 swap(S[i],S[j]) 出力 S[(S[i] + S[j]) mod 256] endwhile 終わり
FMS攻撃の根幹は、RC4で使用される脆弱な初期化ベクトル(IV)にあります。RC4はprga()から出力されるキーストリームを使用して一度に1バイトずつ暗号化します。RC4はキーを使用してksa()を介してステートマシンを初期化し、その後、状態を継続的に変更して新しい状態からキーストリームの新しいバイトを生成します。理論的には、擬似乱数生成器が各ステップで出力を制御するため、キーストリームはランダムなワンタイムパッドとして機能します。
特定の IV を使用すると、キーストリームの最初のバイトとキーの最初のmバイトを知っている攻撃者は、KSA の脆弱性により、キーの( m + 1) 番目のバイトを導出できます。平文の最初のバイトは WEP SNAPヘッダーから取得されるため、攻撃者はキーストリームの最初のバイトをB ⊕ 0x AA (SNAP ヘッダーはほぼ常に 0xAA です)から導出できると想定できます。そこから、キー インデックス a が 0、要素値空間 n が 256 (8 ビットで 1 バイトになるため)、および任意の x に対して、( a + 3、n − 1、x )の形式のIVのみが必要です。まず、攻撃者は (3、255 、x ) の IV が必要です。WEP は 24 ビットの IV を使用するため、各値は 1 バイト長になります。
まず、攻撃者は IV を K[ ] の最初の 3 つの要素として使用します。既知のK[ ] から S ボックスを初期化する際に RC4 が行うように、 S ボックス S[ ] を 0 からnまでの連続した値で埋めます。次に、ksa() の最初の 3 回の実行を実行して、S ボックスの初期化を開始します。
3 番目のステップの後、攻撃者は、キーストリーム出力Oを使用して(O − j − S [ i ]) mod n = K [ i ] を計算することにより、キーの 4 番目のバイトを導出できる可能性がありますが、確実ではありません。このステップでは、値i = 3 です。
この時点では、攻撃者はまだ鍵の4バイト目を入手していません。このアルゴリズムは鍵の次のバイトを再生成するのではなく、鍵の可能性のある値を生成します。複数のメッセージ(例えばWEPパケット)を収集し、これらの手順を繰り返すことで、攻撃者はさまざまな可能性のある値を生成します。正しい値は他の値よりもはるかに高い頻度で出現するため、攻撃者はこの値を認識して次のバイトとして選択することで、鍵の値を特定できます。この時点で、攻撃者は鍵の5バイト目に対して攻撃を再開できます。
攻撃者は鍵の単語を順番通りに攻撃することはできませんが、前の単語がわかれば、後の単語を順番に攻撃するためにメッセージを保存することができます。ここでも、攻撃者は弱いIVを持つメッセージだけを必要とし、それ以外のメッセージは破棄できます。このプロセスを通じて、攻撃者は鍵全体を攻撃するためのメッセージを大量に収集できます。実際には、攻撃者はメッセージの冒頭のごく一部だけを保存すればよく、IVが攻撃を許可する鍵の単語まで攻撃を実行できるだけの十分な情報だけを保存すればよいのです。