AESについて(★)

タイトルはAESについてですが、内容はCCMPに関する暗号方式に関するものです(世の中一般的には、AESと呼ばれることが多いためです)。TKIPではRC4の暗号強度が弱いということで、AESを搭載したCCMPを使うようになりました。

データパケットの暗号化

CCMPでのデータパケットの暗号化の処理は下図のようになります。
CCMPでは、テンポラリー鍵(以下PTK)とPacketNumber(以下PN。48bit)とMACアドレスを種に、AESのアルゴリズムを動かしています。そのAESのアルゴリズムから暗号系列が出てきますので、それと平文データのXORを取って、暗号化されたデータとしています。
ここで、PTKとMACアドレスはセッション中は固定ですので、PNによってAES暗号系列が決まります。PNは、パケット毎に1ずつ増加させていきます。PNは48bitありますので、1msに1packetを投げたとしても、9000年近くかかります。普通の人には関係ない時間ですので、MAXまで行って、戻った時の心配はしなくてもよいです。絶対に同じ値にならないように設計されていました(後述のKRACKにてそうはなってないことがわかった)。

最終的なCCMPのデータパケットは下記のようになります。

CCMP Header
(PacketNumber:48bit, KeyID等:8bit)
暗号化されたデータ
(Nbyte:含むMIC64bit)

MIC(Message Integrity Check)の計算もCCMPを使って行われます。このMICにより、Packet Numberを偽造したReplay Attackをできなくしています。

認証について

WPA,WPA2の認証方式について、CCMPが選択できるようになっています。乱数(ANonce, SNonce)を使ったChallenge Response方式により、認証を行っています。認証と同時にテンポラリー鍵(PTK)の交換も行なっています。なお、PTKは、Challenge Response方式に用いた乱数(ANonce,SNonce)とおおもとの共有鍵(Pairwise Master Key)を使って生成しています。そのため、乱数は無線区間で見えていても、他者に知られることはありません。
下記にWPA2のシーケンスを示します(説明はTKIPの項を参照ください)。

最初のEAPOL-KEYから順にMessage1, Message2, Message3, Message4と呼んでいます。パケットが4つあるので4 way handshakeとも呼んでいます。

WPA2認証の脆弱性について(KRACK)

WPA2にも脆弱性があることが発表されました(WPAでも同じです)。ここではその脆弱性について説明します。

上記の「データパケットの暗号化」で説明したように、CCMPでは、PTKとMACアドレスはセッション中は固定ですので、PNによってAES暗号系列が決まってしまいます。PNは、パケット毎に1ずつ増加させていきます。PNは48bitありますので、1msに1packetを投げたとしても、9000年近くかかります。絶対に同じ値にならないように設計されていました。
しかし、IEEE802.11仕様書には、「4 way handshakeのMessage3が来た場合に暗号鍵をインストールしてください」と書かれてます。また、「新しい暗号鍵をインストールしたら、PNを1にしてください。」と書かれてもあります。
そういう仕様に基づいて、下記のようなシーケンスが発生するとします。

シーケンスを説明すると、

  1. APはMessage3をSTAに送り、STAはPTKをインストールします。それと同時にPN=1とします。
  2. STAが送ったMessage4が妨害者によりAPに届くのを妨害されます。
  3. STAは、4way handshakeが成功したと思っていますので、ユーザーデータ(例えば、TCP/IP, HTTPのデータ)を送り始めます。
  4. しかし、ここでも妨害者によりAPに届くのを妨害されます。
  5. APはしばらく経ってもMessage4が届かないので、Message3を再送します。
  6. STAは、PTKを再度インストールします。それと同時にPN=1とします。しかし、IP層など上位のレイヤとWPAのレイヤは独立で動作しているため、PTKがインストールされたことなど、上位のレイヤにはわかりません。
  7. STAは、続くユーザーデータをどんどん送信します。ところが、これらのユーザーデータのPNは、以前に送ったPNと同じになってしまっています。

最初に説明しましたように、PNが同じであると作られるAES系列が同じになってしまいます。
つまり、下記のような2つの暗号文があった時、AES系列1 = AES系列2になってしまいます。

  • 暗号文1=平文1 XOR AES系列1
  • 暗号文2=平文2 XOR AES系列2

上記の2式をXORを取ると、下記の式が成り立ってしまいます。

  • 暗号文1 XOR 暗号文2 = 平文1 XOR 平文2

今、暗号文1, 暗号文2は、無線で送信されてわかっていますので、平文1がわかってしまうと、平文2もわかってしまうということです。これだけでは、平文1がわからなければ、平文2はわからないので安全に思えますが、そうでもありません。
一般的には、通信の一番最初のパケットはARPやDHCPなど決まったパケットです。パケット長からもその内容を予想できてしまいます。そうなると、もう一方の平文2も解読ができてしまいます。
接続後の最初のシーケンスだけでは大した情報は得られないですが、KRACKの論文の中では、Deauthentication(切断)メッセージを偽造して送ると、その度に4 way handshakeを繰り返すので、いくらでも情報が盗めると書いてあります。
ここでなんでDeauthenticationメッセージを偽造できるんだという疑問が浮かびますが、なんとIEEE802.11の仕様では最近までDeauthentionフレームを含むマネージメントフレームには暗号化がかかっておらず、暗号化をかける方法もありませんでした。いくらでも中間者攻撃ができてしまいました。なお、最近のIEEE802.11ac対応のデバイスでは、PMF(Protected Management Frame)というマネージメントフレームを暗号化する仕様をサポートしてますので、この攻撃はできなくなっています。

KRACKの対処方法は、いろいろできますが、単純にSTA側で2回目のMessage3は捨てればいいだけです(相手のPNがヘッダーに入っているので1回目かはわかります)。