https://community.qualys.com/blogs/securitylabs/2013/09/10/is-beast-still-a-threat
で、SSL CheckerからBEAST脆弱性の判定(TLS1.0以下でCBCモードを使っている)を外す、というのが有ったのでメモ。
BEASTは成功すると数分から数十秒程度でクライアントのセッションが解読されるため、非常に危険なものと考えられている(orた)。
TLSv1.0以前ののCBCモードでは、セッションを再利用してリクエストを送る際、最後に送信された暗号ブロックが、次のHTTPリクエストの最初のブロックのIVとして使われている。攻撃者が送信済みの最後の暗号ブロックを傍受した後で、リクエストの先頭ブロックにあたる平文、例えばクエリ文字列を変更できるなら、BEAST攻撃が成立する。
最初に考案された対策は、HTTPSリクエストの直前に0バイトのTLSレコードを送る方法。
TLSでは可変長データストリームを扱うために、任意のデータ長を一つのレコードとして暗号化し、レコード毎に署名して送信できる様になっている。少なくとも1つ暗号ブロックが送信されるので、次のリクエストのIVは予測できなくなる。
https://www.ipa.go.jp/security/rfc/RFC2246-06JA.html#621
だが、TLSv1.0では空のレコードを想定しておらず、解釈してくれないTLS実装があった。
(自分の知識はここまでで止まっていた……)
その後、全てのサーバーが対応できる方法として、リクエストの最初の1バイトでTLSレコードを分割してしまう、という方法が考えらた。
https://bugzilla.mozilla.org/show_bug.cgi?id=665814#c59
攻撃者が操作したかもしれない新しいリクエストをTLSで送る際に、最初の1バイトでTLSレコードを分割してしまえば、最初の暗号ブロックで攻撃者が変更できる情報はせいぜい1バイトになる(正確にはレコード長などもいじれそうだが)。そのうえにTLSフラグメントの構造上CBCブロックの残りはMACで埋まる。BEASTが成立するには攻撃者は最初の平文ブロック全体を(ある程度の確率で
制御する必要があるので、攻撃を無効化出来る。代償は、HTTPSリクエスト毎のMACの生成・検証コストが二倍になること。
この1/n-1 splitting手法は、多くのブラウザのTLSクライアント実装に2011年末〜2012年にかけて導入されているようだ。(iOS/Safari除く)
Qualys Security LabsのSSL Checkでは現在、BEASTはクライアント側で対応可能として、RC4や鍵交換をより重要視して評価するように変更されている。
ただ不安な点は、いまだ一定数いるだろう、1/n-1 splitting非対応のクライアントをサーバー側でチェックできていない点だ。(ハンドシェイク中に推測することはできるかもしれないが、opensslにそういったオプションが今のところない)
メーカーサポートが切れたスマートフォンのように、ブラウザがアップデートされなくなった環境では、クライアント側対策が行き渡っていない可能性が高い。日本のように2年毎の契約期間で端末のリプレースが抑えられていると、もうしばらくは2011年製の端末、Android2.3あたりが生き残りそうだ。
個人的には、今すぐセッションIDが解読されたら困るが、将来解読されても困ることが無いウェブアプリなら、まだRC4-SHAでいいように思う。RC4が解読される可能性よりも、XSS脆弱性が残っている可能性の方がずっと高いだろう。
逆にOAuthのように長期間変化しない認証用トークンを利用するなら、TLSv1.2(openssl-1.0.1以降)でサポートされる強い鍵交換と暗号モードを使うようにしたほうがよさそうだ。