混在コンテンツ
ユーザが HTTPS を通じてページにアクセスすると、ユーザとウェブサーバとの接続は TLS で暗号化され、盗聴や中間者攻撃から保護されます。HTTPS のページの中に通常の平文の HTTP で送られてくるコンテンツが含まれている場合、混在コンテンツと呼ばれます。このようなページは部分的にしか暗号化されておらず、盗聴者や中間者攻撃者が暗号化されていないコンテンツにアクセスできてしまいます。つまり、ページは安全ではありません。
混在コンテンツの種類
混在コンテンツには 受動的な混在コンテンツ と 能動的な混在コンテンツ の 2 種類があります。この 2 つは、中間者攻撃によってコンテンツが改ざんされた場合に、最悪のケースとして脅威が影響を与える度合いで区別されます。受動的な混在コンテンツにおける脅威は低いものとなります (誤解を招くコンテンツが含まれているか、ユーザのクッキーが盗まれている可能性があります)。能動的な混在コンテンツの場合、その脅威としてフィッシングや機密情報の漏えい、悪意あるサイトへのリダイレクトなどが想定されます。
受動的な混在コンテンツ
受動的な混在コンテンツは、 HTTPS のウェブページの中で HTTP 経由で送信されるコンテンツです。しかし、そのウェブページの他の要素を混在コンテンツから変更することは出来ません。 例えば、HTTP で送信された画像に対して、攻撃者は別の不適切な画像やメッセージへと差し替えてユーザに表示させることが出来ます。 また、攻撃者はユーザへ送信される画像を盗聴することで、ユーザの行動に関する情報を推測することが可能です。 なぜなら、画像ファイルの置かれている場所がウェブサイト中のある特定のページに固定されていることがままあるからです。もし攻撃者が特定の画像に対する HTTP リクエストを覗き見れば、ユーザが閲覧しているウェブページを特定することが出来るでしょう。
受動的なコンテンツの一覧
受動的なコンテンツとされる HTTP リクエストは以下の通りです。
能動的な混在コンテンツ
能動的な混在コンテンツは、その HTTPS ページのすべて、ないしは DOM の一部にアクセスできるコンテンツです。このタイプの混在コンテンツは HTTPS ページの動作を変更することができ、ユーザから機密情報を窃取することも可能です。従って、先程説明した受動的な混在コンテンツによる脅威に加え、能動的な混在コンテンツには他の攻撃ベクタへ向けた脆弱性が存在します。
能動的な混在コンテンツの場合、中間者攻撃の攻撃者はまず HTTP のコンテンツへのリクエストを横取りすることが出来ます。 その後、攻撃者はレスポンスを改ざんして悪意ある JavaScript コードを含めることも可能です。悪意ある能動的なコンテンツは、ユーザーのログイン情報を窃取したり、ユーザーに関する機密情報を取得したり、ユーザのマシンにマルウェアのインストールを試みることが出来ます (例えば、ブラウザーやそのプラグインの脆弱性を利用することが考えられます)。
混在コンテンツに関係するリスクは、ユーザが閲覧しているウェブサイトの種類と、そのサイトにどれだけ機微な情報が含まれているかに依存します。そのウェブページには世界中に公開されているデータもあれば、認証された時のみアクセスできる機密情報もあるでしょう。 もしウェブページが公開されていて機微なデータは何もなかった場合でも、攻撃者は能動的な混在コンテンツを利用することにより、ユーザを他の HTTP ページへリダイレクトさせたり、 HTTP cookie をサイトから窃取したりできてしまうのです。
能動的な混在コンテンツの例
能動的なコンテンツとされる HTTP リクエストのうち、代表的なものは以下の通りです。
<script>
(src
属性)<link>
(href
属性) (CSS スタイルシートも含む)<iframe>
(src
属性)XMLHttpRequest
リクエストfetch()
リクエスト<url>
値を用いる CSS すべて (@font-face
/cursor
/background-image
など)<object>
(data
属性)Navigator.sendBeacon
(url
属性)
Chrome と同様に、ウェブフォントやワーカーのようなリソースタイプも能動的なコンテンツとみなされます。
ウェブコンソール内の警告
閲覧しているページに混在コンテンツが含まれていた場合、Firefox のウェブコンソールには警告が表示されます。 HTTP 経由で読み込まれた混在コンテンツのリソースは赤色で表示され、このページへのリンクである「混在コンテンツ」の文字列が併記されます。
これらの警告をウェブコンソールで見つけるのと同様に、 Content Security Policy (CSP) を使用して問題を報告することができます。 SSL-check や Missing Padlock のようなオンラインクローラーと使用すると、ウェブサイトを再帰的にチェックし、安全ではないコンテンツのリンクを探すことができます。
Firefox 23 以降より、能動的な混在コンテンツはデフォルトでブロックされるようになりました (受動的な混在コンテンツは設定によりブロック可能です)。ウェブ開発者が混在コンテンツのエラーに気付きやすくなるよう、ブロックされた混在コンテンツへのリクエストはウェブコンソールのセキュリティペインにすべて記録されます。
このエラーを修正するには、 HTTP コンテンツへのリクエストをすべて HTTPS コンテンツへのリクエストに差し替えてください。よくある混在コンテンツには JavaScript ファイルやスタイルシート、画像、動画、その他のメディアファイルなどがあります。
メモ:
Firefox 55 以降、 http://127.0.0.1/
で混在コンテンツの読み込みが許可されました (Firefox バグ 903966 を参照)。 Chrome は http://127.0.0.1/
及び http://localhost/
で混在コンテンツを許可しています。 Safari は混在コンテンツを許可しません。