Content Security Policy Pinning (csp-pinning)とは

CSP Pinningという仕様がW3Cで検討されている。
https://w3c.github.io/webappsec/specs/csp-pinning/


CSPの設定をユーザエージェントに記憶させ、毎回CSPヘッダを送信しなくても良くする仕様である。

CSP

そもそもCSPとは、JavsScriptや各リソースの読み込み先を制限したり(同一ドメインのみ)、JavaScriptでのevalの実行を制限したり、Websocketの接続先を制限したりする仕組みである。これにより、XSSや各種攻撃を緩和することが出来る。


このCSPはHTTPレスポンスヘッダで以下のように指定する。

Content-Security-Policy: default-src 'self' trustedscripts.foo.com

このようにすれば、自身のオリジンとしていたURLからのみリソースを読み込むことが出来る。


詳しくは仕様やドキュメントを読んでいただけると良いかと思います。
http://www.w3.org/TR/CSP2/
https://developer.mozilla.org/ja/docs/Security/CSP/CSP_policy_directives

CSP Pinning

Content-Security-Policy-Pin

CSPは各ページでContent-Security-Policyヘッダを出す必要があります。Webアプリケーションのエラーページや複雑なアプリケーションでは、各ページで適切なContent-Security-Policyヘッダを出すのが難しい場合もあるかとおもいます。そういった場合にCSP Pinningが使用できるのかと思います。

Content-Security-Policy-Pinヘッダをレスポンスヘッダで指定することで、CSP-Pinningが指定できます。https://example.com/application1/にアクセスした際の、HTTPレスポンスヘッダとして以下の様なヘッダが帰ってきたとします。

Content-Security-Policy-Pin: max-age: 10886400;
                             includeSubDomains;
                             default-src https:;
                             form-action 'none';
                             frame-ancestors 'none';
                             referrer no-referrer;
                             report-uri /csp-endpoint/pinned
Content-Security-Policy: script-src https://application1.cdn.com;
                         style-src https://application1.cdn.com;
                         connect-src 'self';
                         form-action 'self'

Content-Security-Policy-Pinで指定できるのは、max-ageとincludeSubDomainsとCSPで定義されているディレクティブになります。

  • max-ageは、このPolicyを適応する時間が秒で指定されます。
  • includeSubDomainsは、これが指定されている場合はサブドメインでもこのポリシーが適応されます。


上記の例では、https://example.com/application1/にアクセスした際のレスポンスヘッダでしたが、includeSubDomainsが指定されていますので、https://forgotten-partnership.example.com/にアクセスした際にもContent-Security-Policy-Pinヘッダで指定したポリシーが適応されます。


また、Content-Security-Policy-PinヘッダとContent-Security-Policyヘッダが同時に存在している場合はContent-Security-Policyヘッダで指定されてないディレクティブのみContent-Security-Policy-Pinヘッダで指定されたディレクティブが適応されます。


このContent-Security-Policy-Pinヘッダはhttpsで使用される必要があります。

Content-Security-Policy-Report-Only-Pin

ポリシーを強制はしないが、違反があった場合のみ指定したURIにレポートを送信するように指示するContent-Security-Policy-Report-Onlyヘッダがある。これも同様にContent-Security-Policy-Report-Only-Pinヘッダでpinningすることが出来る。