Magentoのセキュリティは、サニタイズの脆弱性を修正するための追加パッチが必要です

本記事は2022年2月24日に@developersteveが公開した英語ブログ[Magento security requires additional patch to fix sanitization vulnerability](https://snyk.io/blog/magento-vulnerability-cve-2022-24087-sanitization/)を日本語化した内容です。

なお本ブログは、[CVE-2022-24086 Magento Ecommerce を使用しているウェブサイトに対する脆弱性警告](https://qiita.com/SnykSec/items/8fdecb03fe0f8fe275cf)で発表した内容から更新されている情報について記載しています。

[![logo-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/bc4c157c-64e2-ec7e-df18-147d2c279cb0.png)](https://snyk.io/jp)


私たちはしばしば、技術者として、デプロイされたコードの修正、インフラストラクチャーコンポーネントの更新、コードのパッチ適用などのプレッシャーにさらされることがあります。多くの場合、それはほとんど知らされることはなく、5分前に実行する必要があります。このような「ゼロターンアラウンド」は、テストやチェックに時間をかけることなく、今すぐ修正だけすることを急ぐという、ある種の賭けのようなものです。

[先日、多く利用されている電子商取引プラットフォーム「Magento」にセキュリティ研究者によって重大な問題が発見され](https://qiita.com/SnykSec/items/8fdecb03fe0f8fe275cf)、Magento Ecommerce、Magento Open Source、Adobe Commerceの各バージョンに重要なパッチがリリースされました。CVE-2022-24086で確認された脆弱性では、未認証のユーザーに対して、チェックアウト時に[SQLインジェクション](https://learn.snyk.io/lessons/sql-injection/javascript/)やPHPオブジェクトインジェクションの悪用を可能とする方法が確認されました

このため、Adobeのセキュリティ部門が初期パッチを展開し、迅速に修正プログラムを実行に移しました。数日後、研究者がこのパッチではコードの緩和が不十分であることを発見し、新たに[CVE-2022-24087](https://security.snyk.io/vuln/SNYK-PHP-MAGENTOCOMMUNITYEDITION-2407584)が起こり、2回目のパッチが生成されることになったのです。

新たに確認された脆弱性については、[Adobe社からの最新のセキュリティ警告](https://helpx.adobe.com/security/products/magento/apsb22-12.html)でパッチが提供されています。**この新しいパッチは、元のCVE-2022-24086のパッチに追加して適用する必要があります。**

私がアプリケーションセキュリティの領域で好きなことの1つは、デプロイメント、ライブラリ、およびプラットフォームのエンドユーザーに影響を与える可能性のあるあらゆるものに対するデューデリジェンスです。そこで、最新のパッチを調べて、何が変わったのかを見てみましょう。

# CVE-20220-24087 パッチ適用を熟読する

新しいパッチであるMDVA-43443に触れる前に、オリジナルのパッチであるMDVA-43395を再確認し、その内容を理解しましょう。

ここで重要なのは、どちらの脆弱性も Magento Open Source と Adobe Commerce の 2.3.4 以上 2.4.5-p1 または 2.3.7-p2 未満のバージョンにのみ影響するという点です。

オリジナルのパッチ（MDVA-43395）は、Magentoショップのアプリケーションロジックのチェックアウトフローにおいて、新たに安全なユーザー入力のサニタイズ処理を追加しています。```/Email/Model/Template/transDirective```と ```VarDirective.php```の両方に```preg_replace()```と```preg_match()```パターンが追加され、不要なユーザー入力の文字種をサニタイズするのに役立つようになりました。

![blog-magento2-pregreplace.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/5849507c-4674-8513-6645-6fda9961618f.jpeg)

パッチが配布された後にセキュリティ研究者が発見したのは、攻撃ベクトルを阻止するための緩和措置としては不十分であり、実際にはフレームワークにさらに深い脆弱性が現れる可能性があるということです。

新しいパッチ（MDVA-43443）は、```sanitizeValue()```という再利用可能なフレームワーク関数を追加するもので、 ```\MagentoFrameworkTemplate```の拡張として加えられ、```preg_replace```のサニタイズチェックとマッチングを行います。

![blog-magento2-returnvalue.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/840eace1-ed6a-5e71-4ca5-3597d46f995f.jpeg)

```sanitizeValue()```は、オリジナルのMDVA-43395パッチによって追加された```preg_match()```および ```preg_replace()```のサニタイズコードを置き換えるために使用されます。

![blog-magento2-sanitzevalue.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/ff108dc4-1744-22bf-8d58-6116036cb240.jpeg)

```sanitizeValue()```関数は、サニタイズされたconfigureやカスタム値タイプの読み込みなど、コードベース全体の多くの場所で使用されます。

![blog-magento2-valuetypes.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/608ec9d8-ed6f-75aa-56a9-e7b017317476.jpeg)

```blockDirective()```はサニタイズマジックで、文字のマッチングとサニタイズが追加され、 ```\Magento\Framework\FilterTemplate```コアの一部となります。


![blog-magento2-blockdirective.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/c2532759-4d6b-5731-e336-33010d9f4d26.jpeg)

```resolveBlockDirective```はpublic関数からprivate関数へ、```layoutDirective```は ```resolveLayoutDirective```へと移行しています。

なぜなら、private関数の宣言は、この関数をこの親クラスの中だけで使用できることを意味するからです。public関数は、アプリケーションのどこからでもアクセスすることができます。

![blog-magento2-layoutdirective.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/ca2bf23e-5370-a36f-9799-8884c030b442.jpeg)

どちらのパッチも[APSB22-12 Adobe Security Bulletin](https://helpx.adobe.com/security/products/magento/apsb22-12.html)から入手可能で、[PHP Composer](https://devdocs.magento.com/guides/v2.4/install-gde/composer.html)をインストールするか、フォークされたコードベースにマージすることで利用可能です。

両方のパッチを適用する前に安全なバックアップを取ることと、 配備する前にコードをテストすることを忘れないでください。

# Snykに登録して、新しい脆弱性アラートを受け取る

私が Magento のような大きなオープンソースプロジェクトでいつも行っていることは、Snyk Dashboard から公開リポジトリを監視することです。

**Add Project**をクリックして、パブリックのGitHub
リポジトリを監視します。

![blog-magento2-snykmonitor.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/a4b68ad5-ba2a-cc57-7064-404df18d0ebc.jpeg)

これは特にプロジェクトのさまざまな開発バージョンにおいて有効で、開発中に潜在的な問題を警告することができるからです。また、開発中に修正すべき問題を特定できるため、プロジェクトに貢献する際にも役立ちます。

Magentoのようなプラットフォームプロジェクトでは、監視プロセスでパッケージマニフェスト、コード、コンテナ、IA 設定をスキャンして、潜在的な問題をハイライトします。最も優れているのは、可能な修正を提案し、検出された問題を段階的に解決する手助けをしてくれることです。


:::note info
ブログを読んで、Snykを使ってみたい！と思われた方は、ぜひ[無料トライアル](https://snyk.co/qiita)をお試しください。トライアル中の技術的なご質問は、[サポート](https://support.snyk.io/hc/en-us)に**日本語で**お寄せください。
:::

:::note info
[Snyk](https://snyk.io/jp)では、セキュアなコーディングのための情報や脆弱性の最新情報などを発信しています。ぜひ[Twitter](https://twitter.com/snykjp)や[Facebook](https://www.facebook.com/snykJP/)や[ブログ](https://qiita.com/organizations/snyk)のフォローをお願いします。
:::