コンテンツにスキップ

Insecure HTTP Header Setting: Content Security Policy (CSP)

安全でないHTTPヘッダー設定: Content Security Policy (CSP)

説明

Content Security Policy (CSP) は、信頼されたWebリソースのコンテキスト内で悪意のあるコンテンツを実行することに依存する、クロスサイトスクリプティング(XSS)、クリックジャッキング、およびその他のクライアント側攻撃に対する保護の追加レイヤーを提供するコンピュータセキュリティ基準です。

HTTPレスポンスヘッダーの適切なCSPディレクティブを使用することで、Webアプリケーションで許可されるデータソースを選択的に指定できます。この記事では、CSPヘッダーを使用して、XSS攻撃や同一生成元ポリシー(same-origin policy)をバイパスしようとするその他の試みからWebサイトを保護する方法を説明します。

CSPは、レスポンスヘッダーの Content-Security-Policy ディレクティブでブラウザに指示することで有効にできます:

 Content-Security-Policy: script-src 'self';

または、metaタグで指定します:

<meta http-equiv="Content-Security-Policy" content="script-src 'self';"> 

上記の例では、スクリプトの読み込みを同一ドメインのみに制限できます。また、要素属性およびイベントハンドラーでのインラインスクリプトの実行も制限します。

CSPを宣言する際に使用できるさまざまなディレクティブがあります:

  • script-src: スクリプトの読み込みリソースを宣言したものに制限します。デフォルトでは、unsafe-eval および unsafe-inline キーワードを使用して評価関数とインラインスクリプトを許可しない限り、インラインスクリプトの実行は無効になります。
  • base-uri: base要素は、相対URLを絶対URLに解決するために使用されます。このCSPディレクティブを使用することで、ドキュメントのbase-href属性に割り当てることができるすべての可能なURLを定義できます。
  • frame-ancestors: HTTPヘッダーの X-Frame-Options と非常によく似ています。ページがiframeで読み込まれることができるURLを定義します。
  • frame-src / child-src: frame-src は child-src の非推奨バージョンです。どちらも、ページ上のiframeによって読み込まれることができるソースを定義します。(frame-srcはCSP 3で復活したことに注意してください)
  • object-src : FlashファイルやJavaアプレットなどの埋め込みによって読み込むことができるリソースを定義します。
  • img-src: その名の通り、画像を読み込むことができるリソースを定義します。
  • connect-src: XMLHttpRequest および WebSocket オブジェクトのホワイトリスト化されたターゲットを定義します。
  • default-src: 主に -src 接尾辞で終わるディレクティブのフォールバックです。以下のディレクティブが定義されていない場合、代わりに default-src に設定された値が使用されます:
    • child-src
    • connect-src
    • font-src
    • img-src
    • manifest-src
    • media-src
    • object-src
    • script-src
    • style-src

CSPディレクティブを設定する際には、いくつかのCSPキーワードを使用することもできます:

  • none: どこからのリソースの読み込みも拒否します。
  • self : ドキュメントのURL(ドメイン+ポート)を指します。
  • unsafe-inline: インラインスクリプトの実行を許可します。
  • unsafe-eval: eval() などの評価関数の実行を許可します。

CSPキーワードに加えて、ポイントのホワイトリストURLを定義する際に、ワイルドカードやスキームのみを使用することができます。 ワイルドカードは、URLのサブドメインおよびポート部分に使用できます:

Content-Security-Policy: script-src https://*.ostorlab.com;
Content-Security-Policy: script-src https://ostorlab.com:*;
Content-Security-Policy: script-src https://ostorlab.com:*;

移行期間中にすぐに強制するのではなく、レポート専用 (Report-Only) モードでCSPを設定することも可能です。これにより、CSPへの移行中に、現在のWebサイトの状態でCSPポリシーの違反を確認できます:

Content-Security-Policy-Report-Only: script-src 'self'; report-uri: https://ostorlab.com;

ブラウザのCSPサポート

Content Security Policy は、主要なすべての最新ブラウザでサポートされており、長年にわたってサポートされてきました。Internet Explorerではサポートされていません。

Chrome:

  • Content-Security-Policy CSP Level 3 - Chrome 59+ ( 部分的サポート )
  • Content-Security-Policy CSP Level 2 - Chrome 40+ ( 2015年1月以降の完全サポート )
  • Content-Security-Policy CSP 1.0 - Chrome 25+
  • X-Webkit-CSP Deprecated - Chrome 14-24

Firefox:

  • Content-Security-Policy CSP Level 3 - Firefox 58+ ( 部分的サポート )
  • Content-Security-Policy CSP Level 2 - Firefox 31+ ( 2014年7月以降の部分的サポート )
  • Content-Security-Policy CSP 1.0 - Firefox 23+ ( 完全サポート )
  • X-Content-Security-Policy Deprecated - Firefox 4-22

Safari:

  • Content-Security-Policy CSP Level 3 - Safari 15.4+ ( 部分的サポート )
  • Content-Security-Policy CSP Level 2 - Safari 10+
  • Content-Security-Policy CSP 1.0 - Safari 7+
  • X-Webkit-CSP Deprecated Safari 6

Edge:

  • Content-Security-Policy CSP Level 3 - Edge 79+ ( 部分的サポート )
  • Content-Security-Policy CSP Level 2 - Edge 15+ ( 部分的サポート、76+ 完全サポート )
  • Content-Security-Policy CSP 1.0 - Edge 12+

Internet Explorer:

  • X-Content-Security-Policy Deprecated - IE 10-11 ( サンドボックスのみをサポート )

推奨事項

  • ブラウザに対して指定したポリシーの適用を指示する Content-Security-Policy を HTTP レスポンスヘッダーで送信することにより、Webサイトで CSP を有効にします。
  • ホワイトリストとポリシーを可能な限り厳格に適用します。
  • アプリケーションを再スキャンして、Ostorlab がポリシーの弱点を特定するかどうかを確認します。
  • frame-src を使用して、サイトでの iFrame の読み込みを防ぎます: Content-Security-Policy:frame-src 'none'
  • script-src を使用して、サイトでの JavaScript の読み込みを防ぎます: Content-Security Policy:script-src 'none'
  • img-src で画像以外のコンテンツを制限します: Content-Security-Policy: default-src 'self'; img-src *;
  • default-src を使用して、同一生成元、自社の Web サイト、およびそのサブドメインからのみコンテンツを読み込むことができるようにします: Content-Security-Policy: default-src 'self' *.sucuri.net;
  • 同一生成元からのメディアやその他の実行可能なスクリプトのみを許可します: Content-Security-Policy: default-src 'self'; img-src *; media-src sucuri.net; script-src sucuri.net;
  • 同一生成元からの画像、スクリプト、フォームアクション、および CSS のみを許可します: default-src 'none'; script-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'

リンク

基準

  • OWASP_ASVS_L3:
    • V2_2_5
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_6_4
    • REQ_11_3
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213