script-src でサポートされるハッシュを拡張

Carlos Joan Rafael Ibarra Lopez
Carlos Joan Rafael Ibarra Lopez
Mustafa Emre Acer
Mustafa Emre Acer

公開日: 2025 年 11 月 17 日

Chrome 141 以降では、オリジン トライアルに参加して、Chrome に導入される新しいコンテンツ セキュリティ ポリシー(CSP)機能をテストできます。これらの機能により、既知の JavaScript ソースをより適切に許可リストに登録することで、ウェブサイトが XSS から保護されます。既知の JavaScript を許可リストに登録し、他のすべてのソースをブロックすることは、XSS を防ぐ効果的な方法です。攻撃者が挿入した JavaScript は許可リストに登録されないため、ブロックされます。

これらの機能がないと、スクリプト ホストとサイトの間に nonce 通信メカニズムがない場合や、スクリプトの完全なハッシュを事前に把握していない場合に、すべての JavaScript ソースを許可リストに登録する「厳格な」CSP を設定することは困難です。スクリプトが頻繁に変更され、信頼できるが別のサードパーティによってホストされている場合、これらの方法のどちらもデプロイが困難になります。また、スクリプトで eval を使用する必要がある場合、CSP では現在、すべてのスクリプトで eval を許可リストに登録する必要があるため、CSP の効果が大幅に低下します。

このギャップを埋めるため、script-src でのスクリプトの URL ベースの許可リスト登録のメカニズムと、eval への呼び出しの許可リスト登録のメカニズムを強化しようとしています。script-src の既存のハッシュ メカニズムを使用して、特定のスクリプトの URL と、eval(およびその他の eval 類似の関数)に渡される JavaScript を許可リストに登録できます。URL ベースの許可リストは、完全性ベースの CSP ほど厳密ではありませんが、このメカニズムは既存のホスト名許可リストを大幅に改善するものです。

これにより、許可されていないインライン スクリプトと eval スクリプトをブロックすることで XSS を堅牢に軽減しながら、より簡単にデプロイできる CSP ポリシーが提供されると考えています。これらの新機能は、ユーザー エージェント スニッフィングを行うことなく、新機能をサポートするブラウザでより優れたセキュリティを提供するポリシーをサイトが設定できるように、慎重に設計、実装されています。これにより、新機能をサポートしないブラウザで破損やセキュリティの低下が発生することはありません。

ユースケース

script-src で使用する特定の URL を許可リストに登録する

script-src で使用する特定のスクリプトを許可リストに登録したいサイトには、現在 2 つの選択肢があります。サブソース完全性(SRI)を使用してスクリプトのコンテンツを許可リストに登録するか、host-source を使用してホスト名を許可リストに登録します。SRI は、頻繁に変更されるスクリプト(分析スクリプトなど)には実用的でないことがよくあります。strict-dynamic も設定されている場合、host-source の指定は無視されます。また、URL パラメータが含まれていないため、包括的な保護にはなりません。この変更により、(完全な)URL のハッシュを使用してスクリプトを許可リストに登録できるようになり、動的スクリプトと strict-dynamic を使用する構成の両方がサポートされます。

eval 関数または eval のような関数で使用する特定のスクリプトを許可リストに登録する

一部のサイトでは、eval または eval のような関数(setTimeoutsetIntervalsetImmediate でコードを文字列リテラルとして渡す)の使用が必要です。このようなサイトでは、利用可能な CSP オプションは unsafe-eval のみです。このオプションでは、eval へのすべての呼び出しが有効になります。特定の入力を eval の許可リストに登録するメカニズムを追加しています。この新しいメカニズムにより、過度に広範な unsafe-eval CSP を提供する必要がなくなり、スクリプトの内容を直接ハッシュ化することで、必要な特定のスクリプトを厳密に許可リストに登録できるようになります。

始める

スクリプトと eval のハッシュ化のサポートを試すには、Chrome 141 ~ 144 で実施される CSP script-src オリジン トライアルでの URL と eval のハッシュ化にご参加ください。

script-src にハッシュを追加

URL を許可リストに登録するには、url-<hash-algorithm>-<script-url-hash> の形式で script-src CSP ディレクティブに値を追加します。これにより、コンテンツに関係なく、その URL が提供するコンテンツの実行が許可されます。ハッシュには、その URL がリダイレクトする URL ではなく、最初の URL(ページに含まれている URL)のみを含める必要があります。絶対 URL と相対 URL の両方がサポートされています。

たとえば、次の CSP ヘッダーでは、https://example.com/example.js で提供されるスクリプトが許可リストに登録されます。

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

ここで、'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' は「https://example.com/example.js」の SHA256 ハッシュです。

eval または new Function を介して評価されたスクリプトは、スクリプトの src に eval-<hash-algorithm>-<script-contents-hash> を含めることで許可リストに登録できます。たとえば、次の CSP ヘッダーは、文字列 alert("hello world")eval() に渡すことを許可リストに登録します。

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

ここで、'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='alert("hello world") の sha256 ハッシュです。

導入を促進するため、サイトがオリジン トライアルにオプトインすると、URL と eval の両方のハッシュが DevTools コンソールに出力され、CSP レポートに含まれます。つまり、厳格な report-only ポリシーを使用して、許可リストに必要なすべてのハッシュを列挙できます。

下位互換性を維持する

すべてのブラウザでサポートが追加される前にこれらのポリシーのデプロイを許可するには、ホストベースの許可リストの後に URL ハッシュをリストできます。新しいハッシュタイプを理解するブラウザは、先行するホストベースの許可リストを無視します。一方、新しいハッシュタイプを理解しないブラウザは、引き続きホストベースの許可リストを適用します。これにより、サイトは両方を設定できます。次の例に示すように、新しいハッシュタイプをサポートするブラウザではより厳格なポリシーが使用され、サポートしないブラウザでは破損のリスクを回避できます。

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

また、URL ハッシュが設定されている場合にのみ適用される strict-dynamic の同等の機能として、strict-dynamic-url も導入しました。strict-dynamic を使用するとホストベースの許可リストが無視されるため、特定のハッシュを許可リストに登録し、strict-dynamic を適用したいサイトは、次のようなポリシーを使用できます。

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

この例では、ハッシュをまだサポートしていないブラウザは https: のみを適用します。同様に、eval ハッシュが存在する場合、unsafe-eval は対応するブラウザで無視されます。たとえば、次のポリシーは unsafe-eval と評価されます。これにより、まだ eval ハッシュをサポートしていないブラウザで eval() をすべて使用できるようになり、eval ハッシュをサポートしているブラウザでは alert("hello world")eval() のみが許可されます。

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

フィードバックを共有

script-src のこれらの拡張機能について、デベロッパーの皆様からのフィードバックをお待ちしております。コメントは、github の説明に関する問題として投稿してください。