広く使用されている WordPress プラグインに脆弱性が確認され、それが修正された新しいバージョンがリリースされた。

https://news.mynavi.jp/techplus/article/20230508-2673509/

各サーバーベンダーのメルマガ等で配信される可能性があり、クライアントから連絡をいただくことがあるかと思う。
クライアントへの説明にも活用できるかと思いますので、その概要から対応方針における判断材料までをまとめたものをここで共有する。

脆弱性の内容

攻撃の対象となる Web サイト

  • Advanced Custom Fields および Advanced Custom Fields Pro プラグインのバージョン 6.1.6 より前のバージョンを使用している WordPress サイト

脆弱性の原因

  • 管理画面での当該プラグインの CSS 出力に XSS 脆弱性があり、body 要素のクラス属性の文字列をサニタイズせず出力され、不正な JavaScript プログラムが実行される可能性があるため

https://patchstack.com/articles/reflected-xss-in-advanced-custom-fields-plugins-affecting-2-million-sites/

攻撃の対象となるユーザー

  • サイト管理者など当該プラグインへのアクセス権限を持つユーザー

攻撃の起点となる事象

  • 攻撃の対象となるユーザーでサイトにログインしている状態で(プログラムが埋め込まれた)管理画面のURLにアクセスした場合
  • (プログラムが埋め込まれた)管理画面のURLにアクセスし、攻撃の対象となるユーザーでログインした場合

攻撃の起点となる事象の具体例

  • フィッシングメールに記載された URL にアクセス
  • ユーザーが自由に投稿できるコンテンツがあるサイト(たとえば掲示板システムなど)に XSS 脆弱性があり、そこに記載された URL にアクセス

攻撃により奪取される情報

  • Cookie など JavaScript で取得できる情報(不正アクセスの危険性あり)
  • ログインしているユーザーの権限でアクセスできるページ情報

脆弱性の修正のための対応方法

( A )Advanced Custom Fields および Advanced Custom Fields Pro プラグインのバージョンを最新の 6.1.6 にアップデート

( B )Advanced Custom Fields および Advanced Custom Fields Pro プラグインのソースコードを直接修正

脆弱性の修正に必要な条件

( A )の場合

  • WordPress 4.7 以降
  • PHP 5.6 以上

( B )の場合

  • 特になし

対応方針について

すべてのサイトで脆弱性を修正することは可能ですが、脆弱性の修正のための対応方法2種類それぞれにメリット・デメリットがあります。
対応方針を考慮する際は、以下をご確認いただければ。

( A )の場合

メリット

  • 当該プラグインの以前のバージョンでの細かなバグフィックスやセキュリティフィックスが行われる

デメリット

  • 当該プラグインのバージョンに大きな差がある場合、管理画面が表示されなくなるなどの不具合が発生しているとの報告が(当然ながら)多数ある
  • (テスト環境がなければ)個別でエラーが発生するかを事前に確認する場合、正確に確認するには個別に環境を合わせたテスト環境を構築する必要がある
  • 実際に不具合が発生した場合は、すべてのコードの精査が必要で場合によっては大きな工数を要する
  • (会社としてはメリットでもあるが)対応に必要な条件を満たさない場合、サーバー移転の提案を個別に行う必要があり、大掛かりな修正が発生する可能性あり

( B )の場合

メリット

  • 当該プラグインのソースコード中のワンポイントでの修正であるため、不具合が発生する確率は極めて低い

デメリット

  • 当該プラグインの以前のバージョンでの細かなバグフィックスやセキュリティフィックスが行われない

修正方法について

通知では当該プラグインのすべてのバージョンと記載されていたが、調べたところ 5.8.7 より低いバージョンには、admin_body_class メソッドが実装されていないので、実際には今回の修正は必要ない。
ただ、今回の脆弱性以前にに発表されている他の脆弱性が存在するため、アップデートを行ったほうがよいだろう。

また 6.1 以上のバージョンとそれより前のバージョンでは、ディレクトリ構成が違うため、別のファイルの修正が必要となる。

6.1 以上のバージョンの場合は、以下の箇所
https://plugins.trac.wordpress.org/changeset/2908095/advanced-custom-fields/tags/6.1.6/includes/admin/admin-internal-post-type-list.php?old=2892912&old_path=advanced-custom-fields%2Ftrunk%2Fincludes%2Fadmin%2Fadmin-internal-post-type-list.php

それより前のバージョンの場合は、/includes/admin/admin.php の admin_body_class メソッドの戻り値となる箇所にサニタイズ関数 esc_attr を挟めば良い。