ゲヒルンでは2月25日にサポートセンターにて、『[RS2]セキュリティ強化によるファイアウォール機能の仕様変更について』というお知らせを掲載しました。
今回は、この仕様変更の理由について記事を書きます。

ポートの接続制限の強化

この仕様変更の内容は、ポートの接続制限の強化でした。Gehirn RS2 では、従来よりアカウントごとに3つのポートを割り当てて外部との通信を許可していましたが、これによりCookieが意図せず漏洩する脆弱性を作り出していました。
RS2では、ユーザがTCPソケットやWebSocketを利用するときのために外部との通信を許可していましたが、比較的簡単な手法で攻撃が成立するため安全性を優先して接続制限を行いました。
何人かのユーザはWebSocketやSocket Proxy、TCPソケットなどの通信を利用しており大変ご迷惑をお掛けしてしまいました。

「意図せずにCookieが漏洩する」

この「意図せずにCookieが漏洩する」ということについて説明します。

Webブラウザでは Same-Origin Policy というルールがあり、「スキーム、ホスト、ポート」の組み合わせをオリジンといいます。

  • XMLHttpRequest
  • Web Storage
  • Canvas

などが、このオリジンの制約を受けるものです。また、iframeやframeタグで外部のサイトを自サイト内に表示する場合にはX-Frame-Optionsもオリジンの制約を受けます。(設定をSAMEORIGINにした場合)
しかし、Cookieはこのオリジンの制約を受けず、通常はポート番号やスキームを意識しません。ホストはdomain指定、スキームはsecureフラグというのもあるのですが、ポート番号については指定することができません。実は、ポートも指定できる「Cookie2」というものがあるのですが全然普及していないので、Cookie2を使用することは今回の脆弱性を塞ぐ手立てにはなりませんでした。

その他の要因について

その他にも要因があって、共用サーバ特有の複数ユーザが同一IPアドレスを使用していること、他のユーザが任意のポートでHTTP通信が行えるという条件が揃うと今回の問題につながります。
具体的に言うと、
Aさんが www.example.com というサイトを運営しているときに、悪意のあるBが同一サーバ上の8080ポートでHTTPサーバを立てて通信できる状態にしていたとする。
悪意のあるBは www.example.com:8080 というサイトをターゲットに踏ませることで、 www.example.com のCookieが漏洩したり、任意のCookieをセットできてしまうという問題です。

通信は80番の正規のWebサーバではなく、悪意のあるBの8080番のWebサーバに繋がってしまいますが、ブラウザはスキームもポートも関係なく、ドメイン名が一致するCookieを引き渡してしまうということが発生します。
8080番につながった時点で正規のWebサーバがもつバーチャルホスト機能なども全く意味がなく、さらに8080番の悪意のあるサイトが80番そっくりなサイトになっていれば、そのままフィッシングも可能になります。
この攻撃について、Cookie2をはじめ、ドメインの所有確認があるため不正なSSL証明書を取得できないことからSSLを使うこと、Same-Origin Policy が適用される Web Storage を使用するなどの対応も検討しましたが、すべてのユーザがその勧告に従うことは無理であるため、一部のユーザには不便をお掛けすることも承知で、根本的に解決できるポートの制限に踏み切りました。

Cookieとブラウザの挙動で別ポートにCookieを送ってしまう問題

すこし内容は違うのですが、根本的なCookieとブラウザの挙動で別ポートにCookieを送ってしまう問題は2003年にIPAが示しています。
経路のセキュリティと同時にセキュアなセッション管理を: http://www.ipa.go.jp/security/ciadr/20030808cookie-secure.html
>> http や https に限らず、すべての TCP ポートを閉じる必要があることが判明しましたので、上記の例外的な対策は成立しないことが判明しました。
>> ポートを閉じる必要があるのは、攻撃者の罠に誘導されて、http://www.example.com:25/ や、http://www.example.com:443/ 等の URL にアクセスさせられると、クッキーを暗号化なしに HTTP リクエストとして送信してしまうからです。

Same-Origin Policy とは

また Same-Origin Policy について詳しく知りたい場合は、はせがわようすけさんの 「Same-Origin Policy とは何なのか」: http://d.hatena.ne.jp/hasegawayosuke/20130330/p1 が参考になります。

謝辞

最後にこの問題は、Gehirn RS2 ユーザが発見・報告をくださり解決することができました。この場で恐縮ですが感謝申し上げます。今後ともどうぞよろしくお願い致します。