Content Security Policy周りの挙動がAdobe Commerce / Magento Open Source 2.4.6-p6 / 2.4.5-p8 / 2.4.4-p9で変更されています

セキュリティアップデートが行われたばかりですが、Adobe Commerce / Magento Open Source 2.4.7系以外の最新バージョンではContent Security Policyに関する挙動が変わっています。
どのような変更が行われたのか、詳しく解説していきたいと思います。

Content Security Policyとは

Content Security Policy(以下、CSP)は以下の目的のためにブラウザ側に実装されている機能です。(MDNより引用

コンテンツセキュリティポリシー (CSP) は、クロスサイトスクリプティング (Cross-site_scripting) やデータインジェクション攻撃などのような、特定の種類の攻撃を検知し、影響を軽減するために追加できるセキュリティレイヤーです。 これらの攻撃はデータの窃取からサイトの改ざん、マルウェアの拡散に至るまで、様々な目的に用いられます。

CSPを定義することによって、クロス・サイト・スクリプティング(以下、XSS)や、パケット盗聴が起きるリスクを軽減することができるとされています。

Adobe Commerce / Magento Open SourceにおけるCSP

Adobe Commerce / Magento Open Sourceにおいては、バージョン2.3の頃からCSPに対応が始まっています。
当初は「Report Only」つまりは警告がブラウザの開発者向けコンソールに表示されるだけでしたが、将来的に許可していないURIはすべて許可されなくなることが暗示されていました。
今回の変更は2.4.7では既に実施されている内容なのですが、セキュリティアップデートに伴って2.4.6以前のバージョンにも適用されています。

CSP設定の基本

Adobe Commerce / Magento Open SourceでCSPを調整する場合、以下の2つの設定が用いられてきました。

  • csp_whitelist.xml
  • システム設定値(config.xml, env.php, config.php, core_config_dataテーブル)

csp_whitelist.xml

このXMLファイルは、CSPで許可するリソースを定義するために用います。
エクステンション単位で定義が可能ですが、このXMLファイルに記載のない外部リソースは拒否されます。(Report Onlyモードの場合は警告のみ)

  • JavaScriptファイル
  • CSSファイル
  • 画像やフォントなどのメディアファイル
  • インライン画像
  • iframeで読み込む外部URL

といったものはすべてこのファイル上で宣言が必要です。

システム設定値

システム設定値は大きく分けて、以下のものがあります。

  • CSPの動作モード
  • CSPのポリシー

まず、前者については「Report Only」かそうでないかを管理しています。

  • csp/mode/storefront/report_only
  • csp/mode/admin/report_only

の2つの設定値で管理されており、デフォルト値は1です。(つまりReport Onlyモード)

後者のポリシーについては、フロントエンドと管理画面それぞれにポリシーが定義されています。
ポリシーの種類については、MDNのContent-Security-Policyヘッダーに関する説明がわかり良いと思います。
ここで定義されている内容が概ね網羅されています。

Adobe Commerce / Magento Open Source 2.4.6-p6 / 2.4.5-p8 / 2.4.4-p9での変更点

ここまでは、今回のアップデートが行われるまでの仕様です。
2.4.6-p6 / 2.4.5-p8 / 2.4.4-p9 以降では、少々状況が変わってきています。
2.4.7-p1は変更ありません。

変更点の概要

アップデートに伴って加えられた変更点は大きく分けると以下の2つです。

  • システム設定画面への設定項目追加
  • 設定パラメータの詳細化

システム設定画面への設定項目追加

ストア>設定>セキュリティ

のタブを開くと、CSPに関する設定が出るようになっています。
現時点ではレポート先URIの指定ができます。

CSPレポート設定

設定パラメータの詳細化

今回のアップデートが行われるまでは、CSPの動作設定は前述の通り

  • CSPの動作モード
  • CSPのポリシー

のみでした。
今回のアップデートではこれらの設定がより詳細に行えるようになっています。

CSPの動作モード

CSPの動作モード設定は

  • フロントエンド
  • 管理画面

の2種類から、

  • フロントエンド全体
  • 管理画面全体
  • フロントエンド+フルアクション名
  • 管理画面+フルアクション名

の4種類になりました。
設定の優先順位としては、

  • フロントエンド+フルアクション名 > フロントエンド
  • 管理画面+フルアクション名 > 管理画面

となっているので、フルアクション名を指定した設定を行った場合はその設定が優先されます。
注意点としては、以下のアクションについては標準で設定が行われているところです。

  • storefront_checkout_index_index(フロントエンドの購入画面)
  • admin_sales_order_create_index(管理画面の注文作成画面)

いずれもCSPの動作モードはReport Onlyがオフである点に注意しましょう。これらの画面では許可していないリソースはすべて拒否されます。

CSPのポリシー

ポリシー設定も同様に、全体設定に加えてフルアクション名での指定が可能になり、より細かい設定ができるようになっています。
優先度についても動作設定と同じ動きをするため、セットで理解しておくとよいでしょう。

管理画面から設定できないCSPパラメータを調整するには

今回追加になったパラメータについては、レポート先URI以外は管理画面で設定ができません。
そのため、定義変更を行いたい場合は以下のいずれかの方法を取る必要があります。

  1. config.xmlで定義
  2. magentoコマンドで設定
  3. core_config_dataテーブルにデータ追加

1はエクステンションを実装できる人にとってはさほど難しくはないでしょう。ただし、設定の反映のためにはデプロイが必要になる可能性があります。
2はシェルから操作できる方であれば可能です。
3はデータベースを直接操作することになりますが、SQLがわかる方にとっては容易です。ただし、config:dumpしている環境の場合は設定値の不整合が起きるので注意が必要です。必ず設定値の変更後はconfig:dump / importを実施してください。

まとめ

今回のまとめです。

  1. Adobe Commerce / Magento Open Source 2.4.6-p6 / 2.4.5-p8 / 2.4.4-p9 では2.4.7で実装されたCSP関係の機能がバックポートされた
  2. バックポートの結果、CSP関係の設定が詳細に行えるようになった
  3. フロントエンド購入画面と管理画面の注文作成画面では未定義の外部リソースは読み込まれなくなっている
  4. 設定値の変更は可能だが、所定の手続きで行う必要がある

ということになります。
アップデートの際は十分注意が必要ですね。

追記

Githubでは早速Issueが上がっています
リリースノートに書かれていない変更なので、一見不具合と思われても仕方のない変更ですが、チケットクローズ前のコメントに興味深い内容が書かれています。

Unfortunately we can not change the default to be disabled because the CSP requirements are not coming from within Adobe. This is driven by PCI compliance and is required to be on. Be aware that your auditors will be closely looking for this as it goes into effect March of 2025.

今回のCSPに関する仕様変更は、PCI(クレジットカード決済に関するセキュリティ要件を決めている団体)の要望であるようです。
PCI-DSS 4.0の要件6.4.3に以下のように定義されています。

6.4.3 消費者のブラウザに読み込まれ実行されるすべての決済ページスクリプトは、以下のように管理される。

  • 各スクリプトが認可されていることを確認するための方法が実装されている。
  • 各スクリプトの整合性を保証するための方法が実装されている。
  • すべてのスクリプトのインベントリが、それぞれのスクリプトが必要な理由を説明した文書とともに維持される。

Adobe側の都合でこの変更が行われたのではなく、PCI-DSS 4.0対応のために行ったということなので、致し方ないようです。
ただ、Issueのコメントにもありますが、リリースノートには明記がほしいところです。