【入門編】CSPのobject-srcとbase-uriによるプラグイン・リダイレクト攻撃防御 – アプリケーションセキュリティ & 安全な開発防御ガイド

玄関の鍵を閉めても「勝手口」が開いていたら?:CSPで防ぐXSSの盲点

こんにちは。現場の最前線でセキュリティと向き合っていると、「ログイン画面に強力なパスワードをかけているから大丈夫」という言葉をよく耳にします。でも、本当のセキュリティは、そんな「正面玄関」以外の小さな隙間をいかに塞ぐかにかかっています。

今日は、Webサイトのセキュリティにおける「見落とされがちな勝手口」、つまりXSS(クロスサイトスクリプティング)の発展系攻撃と、それを防ぐ最強の盾であるCSP(コンテンツセキュリティポリシー)についてお話ししましょう。

—

1. そもそもXSSって何だっけ?(泥棒の侵入経路)

XSSを「泥棒の侵入」に例えるなら、Webサイトは「家」です。

  • 反射型XSS: 玄関先で「こんにちは、これ荷物です」と偽の小包(悪意あるスクリプト)を渡し、相手が受け取った瞬間に泥棒が家の中へ飛び込むパターン。
  • 格納型XSS: 家の掲示板に「今日の特売情報!」と嘘のチラシを貼り付け、それを見た住人全員が罠にかかるパターン。
  • DOM型XSS: 家の「特定の部屋の鍵」を、住人自身の行動(URLの操作など)で勝手に開けさせてしまうパターン。

これらは有名ですが、実は攻撃者はもっと狡猾です。彼らは「プラグイン」や「ベースタグ」という、セキュリティ担当者がつい見逃しやすい「勝手口」を狙ってくるのです。

—

2. なぜ「object-src」と「base-uri」を塞ぐ必要があるのか?

最近のWebブラウザは賢いので、昔のような「Flash」や「Javaアプレット」はあまり動きません。しかし、攻撃者はあの手この手で「外部から何かを読み込ませる」方法を探しています。

object-src:プラグインという「地下室の隠し通路」

objectタグやembedタグは、かつてFlashを動かすために使われていました。もし攻撃者がここに悪意のあるファイルを読み込ませると、ブラウザの外側でコードが実行されるリスクがあります。
現代のWebサイトでプラグインを使う必要はほとんどありません。だからこそ、「ここには何も読み込ませない(none)」と宣言して、通路を物理的に封鎖する必要があります。

base-uri:地図を書き換える「道案内詐欺」

HTMLにはタグというものがあります。「このページの画像やリンクは、すべてここ(指定したドメイン)から探してね」という地図のようなものです。
もし攻撃者がこのタグを悪意を持って書き換えたらどうなるでしょう? ブラウザは「正しいサイト」だと思って、攻撃者が用意した偽物のスクリプトを読みに行ってしまいます。これが「リダイレクト攻撃」です。

—

3. 実践!CSPで「鉄壁の守り」を作る

では、実際にどう設定すればいいのでしょうか? 難しいコードを覚える必要はありません。サーバーからの応答ヘッダーに、以下の魔法の言葉を添えるだけです。

推奨されるCSP設定例

Content-Security-Policy: default-src ‘self’; object-src ‘none’; base-uri ‘self’;

この設定が意味するのは以下の通りです。

  • default-src 'self': 「基本的に自分のドメイン以外からは何も読み込まないよ」という基本ルール。
  • object-src 'none': 「プラグイン? そんなものは許可しない。完全にシャットアウトだ!」(これでFlash等の脆弱性を無効化します)。
  • base-uri 'self': 「地図の書き換え(baseタグによる外部指定)は自分のサイト内だけで行え。外部への案内は許さない!」(これでリダイレクト攻撃を防ぎます)。

—

4. 現場からのアドバイス:まずは「報告」から始めよう

いきなり上記の設定を本番環境に入れると、正しく動いている機能までブロックされて画面が真っ白…なんて事故が起きるかもしれません。そんな時は、Content-Security-Policy-Report-Only というヘッダーを使ってみてください。

これは、「もしこのポリシーを適用したら、どこがブロックされるか報告してね」というシミュレーションモードです。

実際にブロックはしないが、ブラウザが怪しい動きを検知して報告してくれる設定
Content-Security-Policy-Report-Only: default-src ‘self’; object-src ‘none’; base-uri ‘self’; report-uri /csp-violation-report-endpoint;

こうしてログを確認しながら、少しずつ許可リストを調整していくのが、プロの現場での進め方です。

—

まとめ:セキュリティは「積み重ね」です

「自分のサイトは大丈夫」と思いたいところですが、攻撃者は常に「まだ誰も見ていない裏口」を探しています。

1. object-src 'none' でプラグインという古い通路を塞ぐ。
2. base-uri 'self' で偽の地図を読ませない。

この2つを徹底するだけで、あなたのWebサイトの堅牢性は格段に上がります。セキュリティは、一気にすべてを完璧にする必要はありません。今日この設定を入れること、それがあなたのサイトを守る大きな一歩になります。

一歩ずつ、着実に。一緒に安全なWebの世界を作っていきましょう!

コメント

タイトルとURLをコピーしました