2011-07-08

Pyrit による解析から無線LANネットワークを守るには

Pyrit などによる総当たり攻撃から、個人用無線LANネットワークを守る方法についての記事です。

GIGAZINE さんの記事 無線LANの WPA / WPA2-PSK を GPU で超高速解析してパスワードを見つけるフリーのオープンソースソフト「Pyrit」 では対策の指針が示されていないので補足してみます。

簡単な対策法
暗号化方式として、WPA2-PSK (AES) を選択し、事前共有鍵 (PSK) として 63文字の鍵を設定します。鍵は安全な場所で管理してください。記憶する必要はありません。

詳細
SSID ステルス機能や、MAC アドレス限定接続機能、プライバシーセパレータなど子機間通信を制限する機能は、対策したような気分以外において全く意味がないので無視してよいです。WPA2-PSK において、攻撃者に対する唯一にして最大の抵抗策は、十分な強度の事前共有鍵 (PSK: Pre Shared Key) を設定することのみによってなされます。

そのような鍵の作り方は、手ごろな所で、OpenSSL 付属の openssl コマンドを rand オプションを付けて実行すれば、OS の乱数生成機由来の暗号学的に安全な乱数で作った文字列を取得できます。

$ openssl rand -base64 100
PyPTFpJyRrj94+AzhVKqs4ipUbZXJ7/RCefcAbk9mEiPr8H78tsVjUaLDOvT1OmP
QYkZGqdGfc2Ng0UmCZFFE4FgYuphU9uTb5hXzV5FM6vmbfi8cMmKC6aoCzDx7h01
KuFi9g==

出力はデフォルトではバイナリ列なので、-base64 オプションを追加して Base64 でエンコードしてみました。これを事前共有鍵の ASCII 指定での最大長63文字つかえば、6bit * 63 = 378bit となるので、最終的な 256bit の鍵を作るにあたっては十分な強度になっています。

OpenSSL を信用しない方は以下のようにしても良いです

$ head --bytes 100 < /dev/urandom | base64
w/I2+XY9Vymu8feYIbWn9T/L7yZk0ilfYObwoJDaRS3/FJ/0r5HSawyObGAG50aAcmr+Qqwh0D2x
SEIvwR/VM5bJRvpawoc0k9Fp6JV2igLhgFRqdSFXmMKxGSqNR5V7Sdtjpg==

Windows の方は PowerShell を使って以下のようにすると良いです

PS> $byteArray = New-Object Byte[] 100
$rngProvider = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$rngProvider.GetBytes($byteArray)
[System.Convert]::ToBase64String($byteArray)
/PppxyEFLAMlbr0WaIMSwFQ15RdtCIbZ3+csAYkVRuWwqX7nydT8/Rv6Trvan1O0p+HnPLJbF4k4SIEyjB3eMbiUie2aPNu0iT72bLbfZOoMgGTDkAJbmEj
86byd24vqXo9k6w==

64文字の16進数文字列で 256bit の鍵を直接指定する方法もありますが、アクセスポイント側の実装が怪しい場合があるようです。

注意
C言語のの rand() 関数などで作れる疑似乱数には、乱数種 (長く見積もって 64bit) 以上の乱雑さがないので、これに由来する鍵は使ってはいけません。参考: 擬似乱数

結論
辞書もしくは組み合わせ生成による総当たりで割られるような弱い鍵を使ってはいけません。暗号鍵の運用上の問題で、暗号そのものの持つ機能が発揮されないと、設計よりずっと弱い保護しかなされず、攻撃に敗れます。無線LANルーターはWPA2の次の仕様では、事前共有鍵として、20文字以下の短い鍵の使用を拒否するべきです。

毎秒数十万回?
毎秒100万回 (1e+6/s) は、毎年 3.15e+13 回で、鍵全体が 2^256 (PSK を ASCII で指定した場合、関数 PBKDF2 によって、256bit の鍵になります) = 1.16e+77 個分をこの速さで全体を調べるには 3.68e+63 年となり全然歯が立ちません。しかし、鍵が弱いことが分かっている場合 (小文字で8文字と分かっているなど) は、全範囲を調べる必要がなくなるので、現実的な時間で破られる場合があります。

アルファベット小文字で 8文字の鍵を全部調べるのにかかる時間を計算してみると 26^8 / 1e+6 / (3600*24) = 2.4日となり、全部調べる必要がある場合は最悪の場合で、半分調べれば鍵を見つける可能性が 50% になるので、平均 1.2日で破ることができます。

参考
The twilight of Wi-Fi Protected Access « Pyrit Pyrit作者の記事
WPA key calculation - From passphrase to hexadecimal key

2011/7/9 追記
GIGAZINE さんで記事が追加され、この記事が紹介されました。ありがとうございます。
無線LANのWPA/WPA2-PSKを総当たりで突破する「Pyrit」の実際の解析速度と自衛手段について

2012/3/16 追記
鍵の作り方について長らくめんどくさい方法を推薦していましたが、正直なところ、ごちゃごちゃっとキーボードを叩いて 63文字分の鍵を作ってもおそらく十分な強度があります。作った後適当に大文字にして数字や記号も散りばめておきましょう。

2012/12/14 追記
Pyrit のやっていることは結局のところ GPU Accelerated PBKDF2 ということになるので、ASCII で強い鍵が設定されていることが分かっているときは PBKDF2 のことは忘れて 256bit AES をそのまま破る方に尽力した方が速く破れると思います。