脆弱性に関する情報がAdobe公式サイトに掲載されるようになり、他のAdobe製品と同様に日本のセキュリティ関係のニュースサイトでもMagentoの脆弱性がタイムリーに取り上げられるようになりました。
これはとても喜ばしいことで、これまでよりも広く・早く脆弱性に関する周知が行われるようになったと感じています。

さて、Magento2.3.3以降、Magento2系ではセキュリティ修正だけを行ったリリースが1つ前のバージョンに対して行われるようになりました。
今回の2.3.5のリリースでは、同時に2.3.4-p2がリリースされており、2.3.5で修正された脆弱性が2.3.4に対しても行われているとされています。

2.3.4-p2の変更ボリュームを調べてみよう

Magento2のアップデートは脆弱性対応だけでなく、機能改良や新機能が含まれています。
そのため変更になるコード量がかなり多く、全てを見通すのはかなり大変です。

反面、パッチリリースについては脆弱性対応ぶんだけに限定されているため、かなりコード量も少ない形になっています。
これなら変更内容をチェックできそうです。

変更を受けたのは30ファイルほど

Magento2.3.4の環境に対し、2.3.4-p2を適用した直後の変更内容の差分を取ってみました。
Magentoだけの部分だと、230ファイルが何らかの変更を受けたとなっています。

1つずつ調べていくと、変更内容は大きく分けて3つのパターンに分けられることがわかります。

  • composer.jsonだけが更新されている
  • テストケースが更新されている
  • テストケース以外のコードが更新されている

composer.jsonだけの更新は、composer経由でのアップデートに欠かせないのですが、脆弱性そのものとはあまり関係がないので無視します。
次にテストケースですが、これもあくまでテストなので、脇に避けておきます。
最後のテストケース以外のコード更新ですが、これを数えると30ファイル程度になりました。
思ったより多くないな、というのが率直な印象です。

変更内容を分類してみる

では、30ファイルを個別に確認し、どういう内容が含まれているかを検証していきましょう。
大きく分けると、以下のように分けることができます。

  • 値チェック処理などの強化・改良
  • エスケープ処理の追加
  • セッション処理の改良
  • 行の削除やコメントの更新

一番最後の行の削除やコメント更新は無視しても良いとして、最初の3つが脆弱性対応に絡んでいると見て良さそうです。

2.3.4-p2で何が行われているのか

では、実際の内容をもう少し掘り下げてみましょう。

値チェック処理などの強化・改良

この改修は、以下の箇所に行われています。

  • Magento\Framework\App\AreaList.php
  • Magento\Framework\Image\Gd2.phpとImageMagick.php
  • Magento\CardinalCommerce\Model\JweManagement.php
  • Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute\Save.php
  • Magento\Catalog\Controller\Adminhtml\Product\Save.php
  • Magento\Cms\Model\Template\Filter.php
  • Magento\Eav\Model\Entity\Attribute.php
  • Magento\Email\Model\Template\Filter.php

いずれも条件式の変更や、新たにチェック処理が追加されているものばかりです。
リモートコード実行系の脆弱性は、おそらくファイルアップロード処理に関連するものではないか、と思われます。

エスケープ処理の追加

この改修は、以下の箇所に行われています。

  • Magento\Framework\Escaper.php
  • Magento\Security\view\base\escaper.js
  • Magento\Theme\view\frontend\templates\messages.phtml
  • Magento\Theme\view\frontend\web\js\messages.js

主にURLやHTML出力時のエスケープ処理が強化されています。
予期しない外部リソースへのアクセスを防止する、などの目的があると思われます。

セッション処理の改良

この改修は、以下の箇所に行われています。

  • Magenot\Customer\Model\Session\SessionCleaner.php
  • Magenot\Customer\Model\AccountManagement.php
  • Magenot\Customer\Model\Visitor.php

内容的には存在しないセッションIDや、パスワード再設定時のセッション破棄と再作成処理に変更が加えられています。

2.3.4-p2で脆弱性は適切にカバーされているのか

MagentoはOpen Source版をベースにしてCommerce版が開発されています。Commerce固有の機能に対する修正はさておき、Open Source版の修正が今回の脆弱性をカバーしているかが気になります。
今回公表された脆弱性は、

  • コマンドインジェクション・・・4件
  • クロスサイトスクリプティング・・・3件
  • 認証の回避・・・5件
  • その他・・・1件

となっています。

コマンドインジェクションは任意コードの実行ができるとなっているので、おそらく画像ファイル関係でしょう。
クロスサイトスクリプティングはコマンドインジェクションが前提で、データベースに不正なデータを仕込まれることが原因だと思われます。
認証の回避とその他についてはセッション関係が主たる原因だと思われます。

つまり、2.3.4-p2では報告されている脆弱性について、一通りの対策は施されていると言って良いと思われます。
もちろん、これはMagento本体だけの話であって、サードパーティ製のエクステンションやサイト固有のカスタマイズについては対象外です。

2.3.5にアップデートするためには、新機能や改良箇所に対する既存コード・テーマの動作テストが必要になるため、それなりの手間がかかります。
とにかく対応を急がれる場合は、2.3.4-p2を適用しておくと良いでしょう。