Vanhoef氏が発見した、Wi-Fiのプロトコルそのものに起因する脆弱性の仕組みや対処法について、解説していきたい。802.11の規格を体系的に調査していく中で新たに発見したものだそうだ。Fragmentation」について。こちらには2つの欠陥があり、それを悪用しての攻撃が可能だ。このうち1つ目は仕様上の欠陥である。802.11では、1つのパケットが複数のFrameへFragmentされる際に、その全てのFrameが同一の鍵で復号化できることを要求していない。異なる鍵で暗号化されたFrameが混在していても、それを受信側は受け入れてしまう。これが1つ目の欠陥だ。Cache)から削除されるかに関する規定がないことだ。Cacheの中身がそのまま残るという問題がある。Cacheに不正なFragmentを外部から注入することで、被害者は(自身では意図せずに)不正なFragmentを注入されたパケットを生成したり、あるいは逆に復元したFragmentを流出させてしまうわけだ。2番目については、筋で言えば実装上の問題という話でもあるが、広義にはやはり仕様上の欠陥としていいかと思う。この2つの欠陥は、それぞれ独立して攻撃の対象となり得る。Protocol)のそれぞれに対して有効な混合鍵攻撃を考えてみよう。CCMPはWPA2、GCMPはWPA3でそれぞれ追加された暗号プロトコルだ。Frameを送信する必要がある。Frameが生成されるのは、データサイズがMTUを超えてしまう場合だから(このためFragmentの閾値はMTUと通常は一致している)、干渉などのない環境では実はそう頻度が多くない。Fragmentationが採用されている。Fragmentation)では、最後のFragmentを除く全てのFragmentが一定のサイズとなる仕組みだったことがある。データのサイズが100Bytes、Fragmentの閾値が30であれば、Fragmentのサイズは30/30/30/10となる。Fragmentの場合、30Bytes溜まるまで待たなくても送信できる機会があれば、積極的に送信してしまうことが可能となっている。その結果、例えば25/30/20/25といった送り方が許されるようになったわけだ。仕様では、これをサポートによって、オーバーヘッドを削減できるとしていた。Frameが送出される機会は非常に多くなる。Frameが利用される機会はかなり多いと考えざるを得ない。Keyを定期的に更新し、被害者をだまして悪意を持った(攻撃者が管理している)サーバーへパケットを送信する必要がある。Keyを頻繁に更新させる手法が議論されており、これが利用できるとしている。実際の攻撃手法の骨子は、異なるキーで暗号化されたFrameの断片をつなぎ合わせてパケットを偽造することである。Fragmentでは本来、パケット番号が連続しているはずだ。Vanhoef氏によれば、この番号が連続しているかを実際に確認している実装はそれほど多くなかったらしい。一応パケット番号が連続するかたちで偽造を行うようにした(ので、仕様に完全に沿った実装でも今回の脆弱性は内包している)とのことだ。その攻撃の手順が以下となる。ここでは、脆弱性を持つアクセスポイントを利用し、Clientから送信されたデータを流出させるという流れだ。ある意味、気の長い攻撃ではあるが、通信の頻度を考えると、実際の時間としてはそれほど長くはかからずに成立しそうだ。1では、まず何らかの方法で攻撃者(図のAttacker)の準備するウェブサーバーへアクセスさせる。直接ウェブサーバーを開かせなくとも、例えば広告などを利用してもいいわけだ。このアクセスそのものでは、別に悪いことをする必要はなく、無害なコンテンツをダウンロードさせる程度でいい。この際にそのURLを、Fragmentを起こすのに十分な長さにすることが重要となる。Frameを送信することになる。上の図で言えば「Frag0」と「Frag1」がそれにあたり、このどちらもがEncで暗号化される。ここでのsはシーケンス番号、nはパケット番号だ。この状況でAttackerは「MitM(Man-in-the-Middle)」、つまり中間者のポジションを取る。AttackerはClientからの全てのパケットを傍受し、Frame内のFragment全てを受信して収集する。その後、Attackerは先頭のFragment(図の「Frag0」)のみをアクセスポイントへ転送する。Cache)へと格納する。1は以上で終了である。2、つまり実際の攻撃が行われるまでの間、AttackerはClientから送られてきた全てのFrameをアクセスポイントへ転送する。ここで注意が必要なのは、ここで転送されるFrameは全て「s」以外のシーケンス番号を取ることだ。Keyの更新(Re-Key)を行うタイミングだ。Packetのパケット番号が0に戻ることで検出できる。2では「L」へと切り替わるタイミングとなる。このRe-Keyが発生したら、AttackerはClientからのパケットを再び傍受する。1が送られるのを待つ。0/1は、先に送られたものとは当然中身が異なる(ので内部は「s'」になっている)わけだが、これを検知したAttackerは、最初の「Frag0(s')」を破棄。次の「Frag1(s')」のシーケンス番号を「s」へ書き換えてアクセスポイントに送る。Cacheに格納されていた「Frag0」と、今送られてきた別の内容を持つ「Frag1」を(やはり復号後に)組み合わせ、それを目的のサイトへ送り出すという動きをすることとなる。この「Frag1」の方には、暗号化されたユーザーデータ(の断片)が格納されているので、あとは適切なサイトへ誘導し、そのデータを取得すればいい、というわけだ。一部のアクセスポイントではパケット番号が連続していることが必要となるが、これは例えばClient側で悪意をもったJavaScriptを動かし、バックグラウンドでのトラフィック送信を行わせることで、上手く数字を合わせられる(先の図で言えば「n+1」になる)確率が高まる。同様の攻撃を繰り返してIDとパスワードを入手これが上手く行った場合の例が以下だ。1つ目のパケットは、例えば3.5.1.1に対して「image.png」を取得するという単純な(これだけ見ると害のない)もので、2つ目のパケットはSecureなログインを行うものとなる。このように上手くFragmentされるかどうか運次第という面はある。Attackによって混ぜることで、3.5.1.1という(Attackerが用意した、悪意のある)ウェブサーバーは、ユーザー名とパスワードを無事入手することができる。この例だと、本来ログインすべきウェブサーバーのアドレスである39.15.69.7は分からないが、この1つのパケットだけで全ての情報を引き出す必要はなく、同じような攻撃を繰り返すことで、大量のSecureな情報がAttackerのウェブサーバーへ蓄積されていくわけだ。雄介フリーのテクニカルライター。CPUやメモリ、チップセットから通信関係、OS、データベース、医療関係まで得意分野は多岐に渡る。全Wi-Fi機器に影響する脆弱性「FragAttacks」発見される。