WPA3は「SAE」採用で鍵の推測が不可能に、KRACKsで悪用の穴ふさぐ、2018年末から登場?
さて、そのSAEが何かというと、実はこれ、IEEE 802.11のSection 12.4.1に規定されている方法で、「Dragonfly(RFC7664)」の派生形という説明まである。
そのSAEの概略をまとめたのが以下の図だ。SAEでは、楕円曲線暗号を利用して鍵の交換を行う。まず最初に、楕円そのもののパラメータ(IEEE 802.11の場合、」y^2=x^3+ax+b mod p」となるような楕円を考え、この際のaとbに相当する)を相互に交換しておく。アクセスポイントとクライアントは、どちらも接続するSSID(ESSID)を選ぶ際にパスワードを入力するが、これを元に“ジェネレータ”と呼ばれる関数を使い、楕円上の位置を生成(Point R)。それとは別に、それぞれu/vという2つの乱数を生成しておく。
そして認証においては、まずクライアントからuとu2.R、アクセスポイントからvとv2.Rをそれぞれ送り出すかたちになる。これを互いに受け取り合い、それぞれが自身で鍵を生成するかたちとなるわけだ。ここで重要になるのが、計算で必要になる楕円上の位置Rが、通信の中に一度も出てこないことだ。理屈で言えば、Rの値がu2.Rあるいはv2.Rというかたちで含まれてはいるのだが、u2とv2はどちらも乱数なので、ここからRを推測することはできない。
そして、鍵のハッシュを互いに送り合って正しく鍵を生成できたかを検証し、鍵そのものは送らないため、ここでも鍵を推測することはできないというわけだ。
かくして、共通のパスワードを知ってさえいれば、互いに共通の鍵を持つことが可能で、しかもこれを外部からは推測できないことになる。ここで生成された鍵がPMKとなるわけで、あとはここからTPKなりGTKを生成して、それぞれ使えばいいわけだ。
ちなみにこの方式が、辞書などを使ったパスワードへの推測攻撃に強いというのは、仮にこのプロトコルを傍受されても、u/vという乱数を加味して送信されているのでRの値を推測できない。さらに、アクセスポイントとクライアントの間では、認証の成功/失敗ではなくハッシュを送り合っているだけなので、ここからパスワードが一致したか否かを判断できない。
このため、仮に攻撃を行うとしたら、仮のパスワードを利用した通信をしばらく試みようとして、「うまく行かないからこのパスワードは間違っている」という判断を繰り返さざるを得ない。つまり辞書攻撃を実行するにしても、猛烈に時間が掛かることになるわけだ。
また、先の記事にあった「ユーザーの指定したパスワードが推奨される強度に適していなくても保護」というのは、パスワードをそのまま鍵に使うのではなく、楕円上の位置を定めることに使われるため、パスワードそのものが短かろうと長かろうと、変換後の強度は同じ(何しろただの座標である)になるから、相対的に安全という話である。もちろんこれは、Wi-Fiで盗聴される分には、という話でしかない。
ちなみに、先の記事で説明された「Wi-Fi CERTIFIED Enhanced Open」については、正確にはまだ不明だが、おそらく「RFC8110」で規定された「Opportunistic Wireless Encryption」になるのではないかとみられている。
こちらもやはり、楕円暗号をベースとしたものだが、オープンネットワークなので、パスワードはない。このため、あらかじめ楕円上の位置Gが決め打ちとなっている。ただ、アクセスポイントとクライアントが互いに乱数を生成し、これをGと合わせているため、盗聴してもGが推測できないのはSAEと同じであり、これで少なくとも通信の秘匿性がカバーできると考えられている。
一度鍵の交換に成功した後は、オープンネットワークでしばしば要求されるログイン手順のために、EAPOLの4-way Handshakeなどを利用することになる。ただ、ここは既に鍵を交換済なので暗号化することが可能(実際の手法はWi-Fi CERTIFIED Enhanced Openの仕様が明確になっていないため不明だが、普通に考えれば生成したPMKを元にGTKを生成してこれで暗号化すると思われる)となっている。KRACKsは、4-way Handshakeが平文で行われていたからこそ可能だったわけだが、こうした攻撃にも対応できるというわけだ。