コンテンツセキュリティポリシー(CSP)について

この記事について

本記事は、2022年9月に実施した社内勉強会資料の内容をもとに、社外向けに再編集したものです。
記載の情報は執筆当時のものであり、最新の仕様やベストプラクティスとは異なる可能性があります。
実装にあたっては、必ず最新の公式ドキュメントをご確認ください。

概要

プロジェクトでセキュリティ対応をした際に、CSPについて調査した内容をまとめました。

CSP の第一の目的は XSS 攻撃の軽減と報告です。 XSS 攻撃とは、サーバーから取得したコンテンツをブラウザーが信頼する性質を悪用した攻撃です。ブラウザーはコンテンツの送信元を信頼するため、たとえ実際の送信元が見かけ上とは異なっていたとしても、悪意あるスクリプトが被害者のブラウザー上で実行されてしまいます。

引用:MDN – コンテンツセキュリティポリシー (CSP):HTTP
https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/CSP

ウェブアプリケーションの中には、検索のキーワードの表示画面や個人情報登録時の確認画面、掲示板、ウェブのログ統計画面等、利用者からの入力内容やHTTPヘッダの情報を処理し、ウェブページとして出力するものがあります。ここで、ウェブページへの出力処理に問題がある場合、そのウェブページにスクリプト等を埋め込まれてしまいます。この問題を「クロスサイト・スクリプティングの脆弱性」と呼び、この問題を悪用した攻撃手法を、「クロスサイト・スクリプティング攻撃」と呼びます。クロスサイト・スクリプティング攻撃の影響は、ウェブサイト自体に対してではなく、そのウェブサイトのページを閲覧している利用者に及びます。

引用:IPA 独立行政法人 情報処理推進機構 – 安全なウェブサイトの作り方 – 1.5 クロスサイト・スクリプティング
https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html
目次

代表的な設定項目と設定値

mdn web docsから抜粋

出典:mdn web docs
https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Content-Security-Policy

設定項目

  • default-src
    設定が明示されてない場合に使用される
  • font-src
    @font-faceで読み込まれるフォントに適用される
  • img-src
    読み込まれる画像について適用される
    例)imgタグ、cssの画像読み込み
  • object-src
    object、embedタグに適用される(PDFの埋め込みなど)
  • script-src
    scriptタグやonclick属性などに適用される
  • style-src
    stylesheetに適用される(style属性なども含む)
  • form-action
    formのaction属性に適用される
  • frame-ancestors
    frame、iframe、object、embedタグに適用される

設定値

  • ‘none’
    全てのリソースを拒否する
  • ‘self’
    同一オリジンのリソースのみ許可する
    *オリジンはスキーム+ホスト+ポート番号(http://www.example.com:8080)
  • <host-source>
    指定したホストのリソースを許可する(ワイルドカードを使用できる)
  • <scheme-source>
    指定したスキーマのリソースを許可する
    例)http:やhttps:
  • ‘unsafe-inline’
    <script>タグなどのインラインのスクリプトを許可する
  • ‘nonce-<base64-value>’
    タグに`nonce=”<base64-value>”が付与されているインラインのスクリプトやスタイルを許可する

    例:
script-src 'nonce-aaa';

<script>alert('実行されない')</script>
<script nonce='aaa'>alert('実行される')</script>

CSPのレポート機能

CSPはその性質上、いきなり有効化するとWebアプリケーションが動作しなくなる可能性があります。
そのため、検証用として「実際のブロックは行わず、制約に抵触した場合のみコンソールにエラーを表示する」モードが用意されています。
(このレポートは、Report URIのようなWebサービスを利用することで、解析や管理をより容易に行うことができます)

Content-Security-Policyの代わりにContent-Security-Policy-Report-Onlyでヘッダーを定義すると有効にすることができます。

OWASP ZAPでCSP: Wildcard Directiveが発生した場合

対応中に少し躓いた点を備忘録としてまとめます。

設定の中でワイルドカードを使うと発生するのですが、一見該当しなさそうに見えても、実際には以下の条件に当てはまると検出されます。
もし意図して記述しているわけでなければ、そのような記述は避けた方がよいでしょう。

  • http:https: のみを指定
    → スキーマが一致していれば全URLを受け入れる扱いになっていると考えられる
  • www.example.com のみを指定
    → http/https 両方を受け入れるため、https://www.example.com のように明示する必要あり
  • form-actionframe-ancestorsを指定していない
    →基本的には指定のない設定項目にはdefault-src が自動的に適用される(=フォールバックという)が、そうでないものもあるため、明示的に設定する必要あり

まとめ

  • CSPは XSS攻撃の軽減と検知 に有効
  • Content-Security-Policy-Report-Only モードで検証を行いながら導入すると安全
  • 設定項目・値を正しく理解し、不要なワイルドカード指定を避ける
  • Rails標準の対策に加えて、CSPやセキュリティヘッダーを組み合わせることで堅牢性が向上する

 

役に立ったらシェアしていただけると嬉しいです
  • URLをコピーしました!
  • URLをコピーしました!
目次