「WordPress」の脆弱性「CVE-2019-8942」と「CVE-2019-8943」について解説

「WordPress」は、今日ではWebサイトの約33%で利用されていると言われる、豊富な機能と使いやすさを備えたオープンソースのコンテンツ・マネジメント・システム(CMS)です。人気があるということは、同時にサイバー犯罪者に狙われやすいということも意味します。

セキュリティ企業「RIPS Technologies」のリサーチャSimon Scannell氏は、2019年2月19日、遠隔からのコード実行(Remote Code Execution、RCE)が可能になるWordPressの脆弱性に関する知見を公開しました。発見された脆弱性にはそれぞれ「CVE-2019-8942」および「CVE-2019-8943」という「共通脆弱性識別子(Common Vulnerabilities and Exposures、CVE)」が割り当てられています。これらの脆弱性を利用すると、「author(投稿者)」以上の権限を持った攻撃者は任意のPHPコードを実行しシステムを完全に管理することが可能になります。影響を受けるWordPressのバージョンは5.0.1より前の5.Xおよび4.9.9より前のバージョンです。Scannell氏はこれらの脆弱性に関する情報をWordPressのセキュリティチームに情報公開していました。

本記事では、想定される攻撃の流れと脆弱性を利用するためのパラメータについて詳細に解説します。

■脆弱性の解析および想定される攻撃の流れ

概要

author以上の権限を持つ攻撃者は、WordPressで作成されたWebサイトにPHPコードを埋め込んだ画像ファイルをアップロードすることで任意のコードを実行することが可能です。

「CVE-2019-8942」を利用してメタデータを変更

WordPressにアップロードされたファイルは「wp-content/uploads」フォルダに保存され、ファイルに紐づくメタデータがkey-value形式でデータベースの「wp_postmeta」テーブルに保存されます。WordPressはこのメタデータを使用してファイルを特定します。

「wp_postmeta」テーブルに保存されたメタデータ

図1:「wp_postmeta」テーブルに保存されたメタデータ

攻撃者は、細工した編集リクエストを送信することによって「CVE-2019-8942」を利用し、「meta_key」カラムが「_wp_attached_file」のレコードの値を任意の値に変更することが可能です。具体的には、正常な編集リクエストには含まれない「file」パラメータにファイル名を指定し、「_wp_attached_file」の値を変更します。図2と図3を見比べると、図2で指定した値がデータベースに入っていることが確認できます。

fileパラメータにPHPファイルを含めた編集リクエスト

図2:fileパラメータにPHPファイルを含めた編集リクエスト

細工された値に更新されたメタデータ

図3:細工された値に更新されたメタデータ

5.0.1より前の5.Xと4.9.9より前のWordPressには、編集リクエストを通して更新されるメタデータフィールドをチェックする機能が存在しません。そのため攻撃者は「_wp_attached_file」の値を任意の値に変更することができます。

バージョン5.0.1では、編集リクエストにパラメータ「file」、「meta_input」、「guid」が含まれている場合、更新する前にそれらを取り除く新しい関数「_wp_get_allowed_postdata()」が「admin/includes/post.php」に追加されました。

「CVE-2019-8943」を利用して任意のディレクトリにファイルをアップロードし実行

「CVE-2019-8942」を突くことにより、もう1つの脆弱性「CVE-2019-8943」の利用が可能になります。攻撃者は、ファイル名に「evil1.jpg?<パストラバーサル用の文字列>evil1.jpg」のような値を指定することで、システムが本来想定していないディレクトリにアクセスする「パストラバーサル」攻撃を実行し、任意のディレクトリにPHPコードを埋め込んだファイルをアップロードします。

パストラバーサルには、画像ファイルを指定したサイズや解像度に編集する「wp-admin/includes/image.php」の「wp_crop_image」関数が利用されます。この関数は、ファイルを保存する際に保存先のファイルパスを検証しません。

「wp_crop_image」関数

図4:「wp_crop_image」関数
保存先のファイルパスは検証されない


「wp_crop_image」関数は「get_attached_file」関数を利用してファイルにアクセス

図5:「wp_crop_image」関数は「get_attached_file」関数を利用してファイルにアクセス

ここで、「_wp_attached_file」は任意の値に変更できることに留意してください。メタデータのファイル名が「evil1.jpg?<パストラバーサル用の文字列>evil1.jpg」のように変更されていた場合、当該ファイルはこのディレクトリには存在しないでしょう。そのため、処理は「wp_crop_image」関数内の次のif節に進み、URLによってファイルにアクセスしようとします。これはファイルを複製するプラグインを想定した機能です。この時、ファイルにアクセスするURLは以下のようなものになりますが、WordPressは画像を読み込む際に「?」以降のパスを無視するため、画像の読み込みに成功します。



図6:ファイルにアクセスするURLの例

編集した画像を保存する関数は指定されたパスを検証しないため、攻撃者はパストラバーサルによって任意のディレクトリにファイルを保存することができます。このファイルをWordPressに読み込ませることで、ファイルに埋め込んだコードを実行させることが可能になります。

■被害に遭わないためには

上述した攻撃シナリオでは「CVE-2019-8942」が重要な役割を果たします。そのため、この脆弱性を修正することにより「CVE-2019-8943」の利用を防ぐことが可能です。なぜなら後者を利用するためには、前者を利用して「_wp_attached_file」の値を変更する必要があるためです。

さらに重要なことは、開発者が設計段階からセキュリティを考慮した実装を行うことです。また、Webサイトの管理者は、攻撃経路を減らすために以下のようなセキュリティ衛生を実践してください。

  • 定期的に更新プログラムを適用し、更新プログラムが利用できない場合は仮想パッチを利用する
  • 利用可能な脆弱性が無いか、Webサイトおよびインフラストラクチャを常に点検する
  • ユーザのアカウントには最小権限の原則を適用する
  • 古いバージョンの脆弱なプラグインは無効化または削除する

■トレンドマイクロの対策

総合サーバセキュリティ製品「Trend Micro Deep Security™」をご利用のお客様は、以下の DPIルールによってこの「CVE-2019-8942」および「CVE-2019-8943」を利用する脅威から保護されています。

  • 1005933 – Identified Directory Traversal Sequence In Uri Query
  • 1009544 – WordPress Image Remote Code Execution Vulnerability (CVE-2019-8942)

ネットワーク脅威防御ソリューション「TippingPoint」では、以下のMainlineDV filterにより問題の脆弱性を利用する脅威をブロックします。

  • 34573: HTTP: WordPress Image Remote Code Execution Vulnerability

参考記事:

翻訳: 澤山 高士(Core Technology Marketing, TrendLabs)