HTTP用のページにHTTPSでアクセスする

同一ホスト上にHTTPとHTTPSのページが同居しているサイトをしばしばみます。

そんなサイトでは、本来はHTTPのページに、HTTPSでもアクセスできるようになっていることがあります。そういう場合、HTMLの中身によってはセキュリティ上の問題が出ますよという話です。

問題があるページ

http://www.example.jp/index.html というURLのページがあるとします。

問題となるのは、そのページの中身に以下のようなHTMLがベタ書きされている場合です。

<script src="http://www2.example.jp/foo.js"></script>

このページ(index.html)はHTTPでのアクセスを想定して作られているため、JSファイルをHTTPで読み込んでいます。

ここで、このページが実はHTTPSでもアクセス可能だとします。もしHTTPSでアクセスすると、JSファイル(foo.js)だけがHTTPで取得されることになります。そのため、JSファイルは通信系路上の攻撃者に中身を盗聴・改竄されるおそれがあります。

仮にJSファイルを改竄されてCookieを盗むJavaScriptコードが仕込まれた場合、JSファイルを読み込んでいる親ページ(index.html)はHTTPSで取得されているために、secureフラグが付いたCookieが盗まれてしまいます。

本来、ブラウザはHTTPの通信が侵害されても、同一ホストのHTTPSのコンテンツには被害がエスカレートしないように両者を分離します。Cookieで言うならば、HTTPの通信をいくら盗聴・改竄してもsecureフラグが付いたCookieは盗めないように作られています。

しかし、HTTPSのページからHTTPのJSファイルを呼び出すようなおかしなことをすると、その分離がきかなくなります。

ブラウザの対処

IEは、不完全なHTTPSのページ(HTTPSページにHTTPが混ざっているページ)に出くわした場合、セキュリティ警告ダイアログを表示して、ユーザに対してHTTPのファイルの読込みを拒否する選択肢を与えてくれます。しかし、Operaのように警告ダイアログを出さないブラウザや、Firefoxのように事後にダイアログを出す(この種の攻撃に対しては効果が無い)ブラウザもあります。

またIEFirefoxOperaとも、不完全なHTTPSのページであることを何らかの形でユーザに伝えます。具体的には、壊れた鍵マークを表示する、鍵マークを表示しない、アドレスバーの色をHTTPのページと同じにするなどの方法がとられています。

しかし、ブラウザ(IEOperaFirefoxとも)は、内部的には不完全なHTTPSのページを通常のHTTPSのページと同じように扱います。つまり、secureフラグが付いたCookieの読み取りや、同一ドメインの他のHTTPSページの読み取りなどを許しています。

この辺、もう少しブラウザ側でなんとかならないかなとも思うわけですが、そもそもの話としてHTTPSページにHTTPを混ぜるというおかしなことをしているのはWebサイト側なわけで、このような問題は基本的にWebサイト側で対処するべきと捉えた方がよいと思います。

まとめ

HTTPSに関しては、しばしば以下のような「原則」が言われます。

  1. HTTPSのページにはHTTPの要素(画像、frame、JS、CSSなど)を含めない
  2. HTTPSのページにはHTTPでアクセスできないようにする

多くのWebサイトは、上記の原則を意識して作成されているのではないかと思います。しかしそのようなサイトであっても、HTTP用のページがHTTPSでもアクセス可能になっており、結果として1の原則に反する状態になっているところもみられます。

サイトを作成する際には、事前にHTTPのみのページ、HTTPSのみのページ、HTTP・HTTPSの両方のアクセスを許容するページを定義して、それに応じたサーバ設定やHTMLのコーディングをする必要があると思います。

なお、上記ではJSファイルの改竄を取り上げて説明していますが、CSS内ではJavaScriptを実行可能なため、CSSファイルがHTTPで読み込まれている場合にもJSファイルの場合と同じ被害が発生しえます。また、攻撃の被害はsecureフラグ付きのCookieを盗られる以外にも考えられます。