期待のネット新技術

全Wi-Fi機器に影響、脆弱性「FragAttack」悪用した攻撃手法とは?

【利便性を向上するWi-Fi規格】特別編(2)

 【光Ethernetの歴史と発展】編も、そろそろ終盤に差し掛かったところではあるが、既報の通り、ニューヨーク大学アブダビ校のMathy Vanhoef氏が発見した、Wi-Fiのプロトコルそのものに起因する脆弱性の仕組みや対処法について、解説していきたい。

 ちなみに、今回の脆弱性は、2017年に11月に「WPA2/WPA」の脆弱性を発見して公表したMathy Vanhoef氏が、オープンソースのWi-Fiスタックを分析し、IEEE 802.11の規格を体系的に調査していく中で新たに発見したものだそうだ。

「利便性を向上するWi-Fi規格」記事一覧

送出パケットを分割する「Frame Fragmentation」の2つの欠陥

 前回の「Frame Aggregation」に続いて、今回は「Frame Fragmentation」について。

 こちらには2つの欠陥があり、それを悪用しての攻撃が可能だ。このうち1つ目は仕様上の欠陥である。IEEE 802.11では、1つのパケットが複数のFrameへFragmentされる際に、その全てのFrameが同一の鍵で復号化できることを要求していない。つまり、異なる鍵で暗号化されたFrameが混在していても、それを受信側は受け入れてしまう。これが1つ目の欠陥だ。

 2つ目は、暗号化されたFragmentがいつ機器のメモリ(Fragment Cache)から削除されるかに関する規定がないことだ。その結果、例えば暗号化のキーが途中で変更された場合でも、Fragment Cacheの中身がそのまま残るという問題がある。

 例えば、Fragment Cacheに不正なFragmentを外部から注入することで、被害者は(自身では意図せずに)不正なFragmentを注入されたパケットを生成したり、あるいは逆に復元したFragmentを流出させてしまうわけだ。

 2番目については、筋で言えば実装上の問題という話でもあるが、広義にはやはり仕様上の欠陥としていいかと思う。そして、この2つの欠陥は、それぞれ独立して攻撃の対象となり得る。

11axではFragment Frameが送出される機会が増加

 1つ目の欠陥について話す上での前提として、WEP、CCMP(Counter mode with CBC-MAC Protocol)、GCMP(Galois/Counter Mode Protocol)のそれぞれに対して有効な混合鍵攻撃を考えてみよう。CCMPはWPA2、GCMPはWPA3でそれぞれ追加された暗号プロトコルだ。

 この攻撃では、ネットワーク内の1つ以上のデバイスがFragment Frameを送信する必要がある。そもそもFragment Frameが生成されるのは、データサイズがMTUを超えてしまう場合だから(このためFragmentの閾値はMTUと通常は一致している)、干渉などのない環境では実はそう頻度が多くない。

 ただ、干渉やノイズが多い環境ではFragmentの利用が推奨され、さらにIEEE 802.11axではDynamic Fragmentationが採用されている。

 その理由に、従来のFragmentation(Static Fragmentation)では、最後のFragmentを除く全てのFragmentが一定のサイズとなる仕組みだったことがある。例えば、データのサイズが100Bytes、Fragmentの閾値が30であれば、Fragmentのサイズは30/30/30/10となる。ところが、Dynamic Fragmentの場合、30Bytes溜まるまで待たなくても送信できる機会があれば、積極的に送信してしまうことが可能となっている。

 その結果、例えば25/30/20/25といった送り方が許されるようになったわけだ。仕様では、これをサポートによって、オーバーヘッドを削減できるとしていた。こうなると、従来と比べてFragment Frameが送出される機会は非常に多くなる。山奥の一軒家などであればともかく、通常の住宅地やオフィス街などであれば、Fragment Frameが利用される機会はかなり多いと考えざるを得ない。

Frameの断片をつなぎ合わせてパケットを偽造

 さて、混合鍵攻撃を行うためには、機器のSession Keyを定期的に更新し、被害者をだまして悪意を持った(攻撃者が管理している)サーバーへパケットを送信する必要がある。昨今では、デフォルトのSession Keyを定期的に更新する環境はあまりないが、Mathy Vanhoef氏とFrank Piessens氏が2017年に公開した"Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2"という論文において、WPA2環境でSession Keyを頻繁に更新させる手法が議論されており、これが利用できるとしている。

 実際の攻撃手法の骨子は、異なるキーで暗号化されたFrameの断片をつなぎ合わせてパケットを偽造することである。Fragmentでは本来、パケット番号が連続しているはずだ。ただし、Vanhoef氏によれば、この番号が連続しているかを実際に確認している実装はそれほど多くなかったらしい。ただ、一応パケット番号が連続するかたちで偽造を行うようにした(ので、仕様に完全に沿った実装でも今回の脆弱性は内包している)とのことだ。

 その攻撃の手順が以下となる。ここでは、脆弱性を持つアクセスポイントを利用し、Clientから送信されたデータを流出させるという流れだ。

ある意味、気の長い攻撃ではあるが、通信の頻度を考えると、実際の時間としてはそれほど長くはかからずに成立しそうだ。出典は"Fragment and Forge: Breaking Wi-Fi Through Frame Aggregation and Fragmentation"(PDF)

Fragmentを起こす長さのURLを持つウェブサーバーへアクセスさせる「Stage 1」

 このうちStage 1では、まず何らかの方法で攻撃者(図のAttacker)の準備するウェブサーバーへアクセスさせる。直接ウェブサーバーを開かせなくとも、例えば広告などを利用してもいいわけだ。このアクセスそのものでは、別に悪いことをする必要はなく、無害なコンテンツをダウンロードさせる程度でいい。

 ただ、この際にそのURLを、Fragmentを起こすのに十分な長さにすることが重要となる。これによってClientは、Fragment Frameを送信することになる。上の図で言えば「Frag0」と「Frag1」がそれにあたり、このどちらもがEncで暗号化される。なお、ここでのsはシーケンス番号、nはパケット番号だ。

 この状況でAttackerは「MitM(Man-in-the-Middle)」、つまり中間者のポジションを取る。AttackerはClientからの全てのパケットを傍受し、Frame内のFragment全てを受信して収集する。その後、Attackerは先頭のFragment(図の「Frag0」)のみをアクセスポイントへ転送する。すると何が起きるかというと、アクセスポイントはこの最初のFragmentのみを受信して復号化し、自身のメモリ(Fragment Cache)へと格納する。Stage 1は以上で終了である。

 次いでStage 2、つまり実際の攻撃が行われるまでの間、AttackerはClientから送られてきた全てのFrameをアクセスポイントへ転送する。ただ、ここで注意が必要なのは、ここで転送されるFrameは全て「s」以外のシーケンス番号を取ることだ。

キー更新タイミングの前後で傍受したパケットをつなぎ合わせる「Stage 2」

 さて、そのStage 2であるが、スタートはClientが4-wayハンドシェイクでPairwise Keyの更新(Re-Key)を行うタイミングだ。これは一定時間間隔で行われるほか、発生するとSecure Packetのパケット番号が0に戻ることで検出できる。これを先の図で言えば、Stage 1のキー「K」が、Stage 2では「L」へと切り替わるタイミングとなる。

 このRe-Keyが発生したら、AttackerはClientからのパケットを再び傍受する。そしてパケット番号「n」でFragment 0、「n+1」でFragment 1が送られるのを待つ。このFragment 0/1は、先に送られたものとは当然中身が異なる(ので内部は「s'」になっている)わけだが、これを検知したAttackerは、最初の「Frag0(s')」を破棄。そして次の「Frag1(s')」のシーケンス番号を「s」へ書き換えてアクセスポイントに送る。

 するとアクセスポイントは、Stage1で受信して復号後にFragment Cacheに格納されていた「Frag0」と、今送られてきた別の内容を持つ「Frag1」を(やはり復号後に)組み合わせ、それを目的のサイトへ送り出すという動きをすることとなる。この「Frag1」の方には、暗号化されたユーザーデータ(の断片)が格納されているので、あとは適切なサイトへ誘導し、そのデータを取得すればいい、というわけだ。

 一部のアクセスポイントではパケット番号が連続していることが必要となるが、これは例えばClient側で悪意をもったJavaScriptを動かし、バックグラウンドでのトラフィック送信を行わせることで、上手く数字を合わせられる(先の図で言えば「n+1」になる)確率が高まる。

同様の攻撃を繰り返してIDとパスワードを入手

 これが上手く行った場合の例が以下だ。1つ目のパケットは、例えば3.5.1.1に対して「image.png」を取得するという単純な(これだけ見ると害のない)もので、2つ目のパケットはSecureなログインを行うものとなる。

このように上手くFragmentされるかどうか運次第という面はある。出典は"Fragment and Forge: Breaking Wi-Fi Through Frame Aggregation and Fragmentation"(PDF)

 この2つを、Mixed Key Attackによって混ぜることで、3.5.1.1という(Attackerが用意した、悪意のある)ウェブサーバーは、ユーザー名とパスワードを無事入手することができる。

 もちろん、この例だと、本来ログインすべきウェブサーバーのアドレスである39.15.69.7は分からないが、この1つのパケットだけで全ての情報を引き出す必要はなく、同じような攻撃を繰り返すことで、大量のSecureな情報がAttackerのウェブサーバーへ蓄積されていくわけだ。

大原 雄介

フリーのテクニカルライター。CPUやメモリ、チップセットから通信関係、OS、データベース、医療関係まで得意分野は多岐に渡る。ホームページはhttp://www.yusuke-ohara.com/