【入門編】Service Workerのキャッシュ汚染とセキュリティリスク – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは!現場で泥臭くインシデントと戦い続けている、セキュリティの現場の語り部です。

今日は、Webサイトを「オフラインでも爆速で動かす」ための魔法の技術、Service Worker(サービスワーカー)に潜む、ちょっと怖い「裏の顔」についてお話しします。

「XSS(クロスサイトスクリプティング)」という言葉を聞いたことはありますか? 悪意のあるスクリプトをWebサイトに紛れ込ませる攻撃ですが、最近ではこれがService Workerを悪用して、「一度感染したら、ユーザーがサイトを訪れるたびに攻撃が発動する」という、非常にしつこいキャッシュ汚染に繋がることがあります。

初心者の方にもわかるように、身近な例えを交えて紐解いていきましょう。

—

1. Service Workerは「家の合鍵を預ける管理員さん」

まず、Service Workerの役割をイメージしてみてください。これは、あなたのWebサイトという「家」に常駐する「管理員さん」のような存在です。

  • 役割: ブラウザとサーバーの間に入り、コンテンツをキャッシュ(一時保存)して、ネットが切れてもページを表示できるようにしたり、読み込みを爆速にしたりしてくれます。
  • リスク: もし、この管理員さんが「ニセモノ」に入れ替わったり、悪意のある「指示書」を渡されたりしたらどうなるでしょうか?

2. 泥棒の新しい手口:キャッシュ・ポイズニング

もしサイトにXSSの脆弱性があると、攻撃者は「管理員さん(Service Worker)」のキャッシュエリアに、悪意のあるスクリプトを書き込もうとします。これをキャッシュ・ポイズニングと呼びます。

例えば、銀行のサイトのキャッシュを乗っ取られたら、ユーザーがログインするたびに本物の画面の上に「偽の入力フォーム」を重ねて表示させることができてしまいます。恐ろしいのは、ユーザーが正しいURLにアクセスしていても、中身がすり替わっていること。これがService Workerが狙われる最大の恐怖です。

3. どうやって防ぐのか?鍵をかける「ヘッダー」の力

「じゃあどうすればいいの?」と不安になりますよね。でも大丈夫、一歩ずつ対策を学んでいきましょう!

まずは、Webサーバーの設定でブラウザに「このファイルは絶対にキャッシュしちゃダメだよ!」と伝える強力な鍵をかけます。それがHTTPレスポンスヘッダーです。

対策用ヘッダーの例(.htaccessやNginx設定)

Service Workerのスクリプトファイルだけはキャッシュさせない設定

# キャッシュを一切させない(常に最新を取得)
Header set Cache-Control “no-store, no-cache, must-revalidate, proxy-revalidate”
Header set Pragma “no-cache”
Header set Expires “0”

  • no-store: これが重要です。「絶対にキャッシュを保存するな!」という強い命令です。
  • sw.jsを避ける: Service Workerの本体ファイルだけは、常にサーバーから最新版を読み込ませるようにすることで、古い(汚染された)キャッシュが居座るのを防ぎます。

4. 盲点!「スコープ」という名の防犯境界線

Service Workerには「スコープ」という概念があります。これは「管理員さんが掃除していいエリア」を決める境界線です。

// sw.jsを登録する時のコード
if (‘serviceWorker’ in navigator) {
navigator.serviceWorker.register(‘/js/sw.js’, {
scope: ‘/app/’ // ここが重要!アプリ専用のエリアに限定する
});
}

もし、あなたのサイトが掲示板などユーザーが自由に書き込める場所を持っているなら、Service Workerのスコープと、ユーザー投稿データが保存されるディレクトリを絶対に分けることが鉄則です。

万が一、投稿フォームから悪意のあるスクリプトが混入しても、Service Workerのスコープ外であれば、管理員さんはその泥棒に気づかず、あるいは関与せずに済みます。

5. まとめ:今日からできる小さな防犯活動

1. Service Workerのファイルには絶対にキャッシュ設定(no-store)を入れる:これが最大の防御です。
2. スコープを最小限にする:必要以上に広範囲を管理させない。
3. HTTPSは必須中の必須:Service Workerは通信が暗号化されていないと動きません。これが最低限の「家のドア」です。

セキュリティは、一度やって終わりではありません。日々のアップデートの中で、「この管理員(Service Worker)は今、何をキャッシュしようとしているかな?」と想像するだけで、あなたのサイトは格段に安全になります。

最初は難しく感じるかもしれませんが、こうした小さな積み重ねが、ユーザーの信頼を守る最強の盾になります。一緒に頑張っていきましょう!

—
著者:現場のセキュリティエンジニアより

コメント

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