Magento公式サイト上で、セキュリティパッチが3月24日付けで公開されました。(パッチ公開は3月7日ですが、記事公開は24日です)
このセキュリティパッチは昨年10月にリリースされた2.3.3及び2.2.10で修正された「CVE-2019-8118」に関連するものです。

CVE-2019-8118の概要

JVN iPediaによると、CVE-2019-8118は「重要な情報の平文保存」とされています。
2.3.3および2.2.10の公開と同時に修正された問題ですので、全く新しい問題というわけではありません。

この脆弱性の概要としては以下のとおりです。

  • データベースの「wishlist_item_option」および「quote_item_option」テーブルにある、「value」列に保存される値に暗号化せずに保存してはいけないものが含まれている
  • 問題になるデータは「ログインID」「パスワード」である

昨今のアプリケーションでは、ログインIDはともかくとして、パスワードは復元不可能な形で保存することが一般的となっています。
にもかかわらず、CVE-2019-8118ではパスワードがデータベースに暗号化しないまま保存されてしまうケースがありえます。

実際に保存されているデータとは

CVE-2019-8118の修正が未適用なサイトのデータベースを調べると、以下のようなデータが保存されていることがあります。

{
〜略〜
"login":{
"username":"Magentoのログインに使用するID,
"password":"Magentoのログインに使用するパスワード"
},
〜略〜
}

本来であれば「login」に続く値については保存されるべきではありません。
しかしながら、CVE-2019-8118が未修正な環境では、この値が以下の2つのテーブル上に記録されてしまいます。

  • wishlist_item_option
  • quote_item_option

もし他の脆弱性によって、このデータが第三者に閲覧できてしまうと、これは重大な事故に発展してしまいます。

対応の手順

既に、Magento公式サイトでは対応手順が公開されています。

Remove failed login attempts from the database

この記事によると、対応手順は2つの作業から構成されます。

  1. 脆弱性の原因となっているプログラムを修正する
  2. 脆弱性によって作成されてしまったデータを修正する

脆弱性の修正作業

この作業は、Magento2.3.3および2.2.10以降のバージョンについては不要です。(データの修正だけで構いません)
それ以前のバージョンについては、以下で解説する修正作業が必要です(2.3.2-p2も含みます)。

最初に、Magento公式サイトで配布されているパッチをダウンロードします。
このファイルをテキストエディタで開くと、以下のような内容が記されています。

--- a/vendor/magento/module-wishlist/Controller/Index/Plugin.php
+++ b/vendor/magento/module-wishlist/Controller/Index/Plugin.php
@@ -75,7 +75,9 @@ class Plugin
             if (!$this->customerSession->getBeforeWishlistUrl()) {
                 $this->customerSession->setBeforeWishlistUrl($this->redirector->getRefererUrl());
             }
-            $this->customerSession->setBeforeWishlistRequest($request->getParams());
+            $data = $request->getParams();
+            unset($data['login']);
+            $this->customerSession->setBeforeWishlistRequest($data);
             $this->customerSession->setBeforeRequestParams($this->customerSession->getBeforeWishlistRequest());

先頭の2行はさておき、途中の「-」と「+」がついている行が修正対象です。
Magento2.3.2にはこのパッチがそのまま適用できますが、うまく適用できない場合や、パッチの適用方法がわからない場合は、以下の手順で修正を行ってください。

  1. <Magentoインストールディレクトリ>/vendor/magento/module-wishlist/Controller/Index/Plugin.php をテキストエディタで開く
  2. パッチの「-」がついている箇所と同じ記述がある行を探す
  3. 該当行を消すかコメントにする
  4. パッチの「+」がついている3行をコピーし、1の行があったところにペーストする(行頭の「+」は消してください)
  5. ファイルを保存する
  6. apacheやphp-fpmを再起動する

プログラムの修正が適用できれば、とりあえずこれ以上の拡大を防ぐことができます。
次は対象データの修正に取り掛かりましょう。

データの修正作業

対象データを修正するためには、専用のツールを使用します。2.3.3および2.2.10以降のバージョンも作業対象です。

このツールは「wishlist_item_option」テーブル上の対象データを探し出して修正するものです。
残念ながらMagento公式サイトで配布されているものは「quote_item_option」テーブルのデータを修正してくれません。

「quote_item_option」テーブルのデータも修正したい場合は、Github上でPeter Jaap氏が公開しているツールを使用すると良いでしょう。
Magentoの設定が適切に行われている場合、Quoteつまりは「カート情報」は一定日数で消えていきます。
Wishlistつまり「ほしい物リスト」ほどは長期間データベース上に残ることはありません。
ですが、設定が適切でない環境の場合はかなり長期間Quoteデータがデータベース上に残る可能性があります。
念の為に「quote_item_option」テーブルも修正しておくことに越したことはないでしょう。

ツールのダウンロードとサーバーへの配置

先ほど紹介したツールをダウンロードしたら、Magentoが動いているサーバーの「Magentoのルートディレクトリ」にアップロードしてください。
このツールはMagentoのコードを利用して書かれているため、Magentoがない環境では動作しません。

ツールをサーバーに配置したら、Magentoのルートディレクトリで

php ツールのファイル名

を実行します。
ツールが自動的に対象テーブルのデータを確認し、修正を行います。
念の為ツール実行前にデータベースのバックアップを取っておくと良いでしょう。

ツールの実行が終われば、CVE-2019-8118の対応は完了です。