この記事について
本記事は、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-action
とframe-ancestors
を指定していない
→基本的には指定のない設定項目にはdefault-src
が自動的に適用される(=フォールバックという)が、そうでないものもあるため、明示的に設定する必要あり
まとめ
- CSPは XSS攻撃の軽減と検知 に有効
Content-Security-Policy-Report-Only
モードで検証を行いながら導入すると安全- 設定項目・値を正しく理解し、不要なワイルドカード指定を避ける
- Rails標準の対策に加えて、CSPやセキュリティヘッダーを組み合わせることで堅牢性が向上する