ESET/サイバーセキュリティ情報局

Windows版WPS Officeで発見された危険な脆弱性 - 攻撃の詳細と対策方法

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はキヤノンマーケティングジャパンが提供する「ESETブログ」に掲載された「Windows版WPS Officeに影響を与える2つの任意コード実行の脆弱性を発見を再編集したものです。

ESET社の研究者は、Windows版WPS Officeにコード実行の脆弱性(CVE-2024-7262)を発見し、韓国とつながりのあるサイバースパイグループ「APT-C-60」がこの脆弱性を攻撃していることを特定しました。根本原因を分析したところ、欠陥のあるコード(CVE-2924-7263)を悪用できる別の方法も見つかりました。本ブログでは、技術的な詳細について解説します。

本ブログの要点:

・APT-C-60は、Windows版WPS Officeのコード実行の脆弱性(CVE-2024-7262)を武器化して、東アジア諸国を標的に攻撃していました。

・この脆弱性の根本原因を分析した結果と武器化の方法を併せて説明します。

・ESET社の研究者は、このエクスプロイトを調査していく中で、この脆弱性(CVE-2024-7263)を悪用する別の方法も特定しました。

概要

ESET社は、APT-C-60の活動を調査する中で、このグループが使用している多くのダウンローダーコンポーネントの1つを参照する不審なスプレッドシートドキュメントを発見しました。このスプレッドシートを分析したところ、APT-C-60によって東アジア諸国を標的としてWindows版WPS Officeにあるコード実行の脆弱性が実環境で悪用されていることを特定しました。最終的なペイロードはカスタムバックドアであり、ESET社はこのバックドアをSpyGlaceと命名しました。SpyGlaceは、ThreatBookではTaskControler.dllとして公開されています。

WPSのWebサイトによると、このソフトウェアを現在利用しているユーザーは全世界で5億人を超えています。ESET社は協調的な脆弱性開示プロセスに従っていましたが、DBAPPSecurityは武器化された脆弱性の分析を独自に公表し、APT-C-60が中国のユーザーにマルウェアを配信するために脆弱性を悪用していることを確認しています。

悪意のある文書(SHA-1:7509B4C506C01627C1A4C396161D07277F044AC6)は、一般的に使用されているXLSスプレッドシート形式のファイルをMHTML形式でエクスポートしたものです。しかし、WPS Spreadsheetsアプリケーションを使用してこのエクスポートファイルをクリックすると、特別に細工されたハイパーリンクが隠されており、任意のライブラリが実行されるように設計されています。このMHTMLファイルは通常とは異なる形式になっており、ドキュメントを開くとすぐにファイルがダウンロードされます。この手法を利用して脆弱性を攻撃すると、リモートからコードが実行されます。図1は、WPS Spreadsheetsでドキュメントがどのように表示されるかを示しています。行と列にCoremailメールソリューションと書かれた画像があり、この画像がおとりとして使用されています。この画像には悪意のあるハイパーリンクが隠されています。

図1. 攻撃用のドキュメントには、悪意のあるハイパーリンクが隠された画像が埋め込まれている

ESET社が協調的な脆弱性開示ポリシーに従っている間に、武器化されたドキュメントがVirusTotalにアップロードされてから本ブログ記事が8月28日に公開されるまでのタイムラインを以下に示します。

・2024年2月29日:CVE-2024-7262を攻撃するドキュメントがVirusTotalにアップロードされた。

・2024年3月某日:Kingsoft社は、CVE-2024-7672の脆弱性を秘密裏に修正するアップデート(サイレントパッチ)をリリースし、2024年2月29日に見つかったエクスプロイトが機能しないようにした。2024年3月から2024年4月の間に利用可能なすべてのWPS Officeリリースが分析され、この修正が遡及的に行われた。Kingsoft社は、この脆弱性を修復するときに行った対策の正確な詳細は積極的に提供していなかった。

・2024年4月30日:ESET社はVirusTotalにアップロードされた悪意のあるドキュメントを分析し、このドキュメントが、最初に悪用された時点ではゼロデイ脆弱性であったCVE-2024-7262を悪用していることを発見した。また、Kingsoft社のサイレントパッチは欠陥のあるコードの一部分にしか解決しておらず、残りの欠陥のあるコードは依然として悪用可能であることも判明した。

・2024年5月25日:ESET社はKingsoft社に連絡を取り、調査結果を報告した。最初の脆弱性にはすでにパッチが適用されていたが、CVE-2022-24934の対応と同じように、CVEに登録し脆弱性を公開するように求めた。

・2024年5月30日:Kingsoft社はこれらの脆弱性を認め、常に最新情報を提供するとESET社に伝えた。

・2024年6月17日:ESET社は最新情報を提供するように求めた。

・2024年6月22日:Kingsoft社は、開発チームは現在もこの問題に取り組んでおり、次のバージョンで修正することを目指していると伝えてきた。

・2024年7月31日:その後テストを行ったところ、CVE-2024-7263にはサイレントパッチが適用されていた。ESET社は、CVE-2024-7262とCVE-2024-7263を予約しており、公開する準備を行っていることをKingsoft社に通知した。

・2024年8月11日:DBAPPSecurityチームは独自に調査結果を発表した。

・2024年8月15日:CVE-2024-7262CVE-2024-7263が公開された。

・2024年8月16日:ESET社は、Kingsoft社に最新情報を伝えるように再度要求した。

・2024年8月22日:Kingsoft社は5月末までにCVE-2024-7263を修正したことを認めたが、これは2024年6月22日に同社の開発チームが「まだこの問題の修正の取り組んでいる」と主張していたことと矛盾している。

・2024年8月28日:Kingsoft社は両方の脆弱性について認め、パッチを適用したことを明らかにした。しかし、同社はCVE-2024-7262が実環境で悪用されていることを公表することに関心を示していないことから、本ブログを公開し、Kingsoft社の顧客に対して、CVE-2024-7262の脆弱性とエクスプロイトが実環境で悪用されていることと、第三者によって脆弱性が公開されていることにより、今後さらに悪用される可能性が高まっているため、WPS Officeを緊急にアップデートするよう警告した。

CVE-2024-7262の脆弱性は、攻撃者が指定するファイルパスが適切にサニタイズされておらず、読み込まれるプラグインも検証されていないことに起因していました。Kingsoft社が公開したパッチを分析した結果、さらにロジックのバグを利用してこの脆弱性を悪用する別の方法も見つかりました。

CVE-2024-7262

このセクションでは、APT-C-60によって悪用されたバグについて説明します。このバグでは、WPS Officeプラグインコンポーネントpromecefpluginhost.exeの制御フローを乗っ取り、任意のコードを実行します。また、この脆弱性が攻撃で利用され、偽装されたスプレッドシートドキュメントという形で武器化された方法についても説明します。

根本原因分析

Windows版WPS Officeをインストールすると、このソフトウェアは、ユーザーがURIスキームksoqing://で始まるURLをクリックするときに毎回、外部アプリケーションの実行を許可するksoqingと呼ばれる独自のプロトコルハンドラを登録します。Windowsオペレーティングシステムでは、独自のプロトコルハンドラの登録は、レジストリで行われます。このケースでは、HKCR\ksoqing\shell\open\commandキーにあるデフォルト値によって、WindowsはC:\Users\\AppData\Local\Kingsoft\WPS Office\\office6\wps.exeを引数/qingbangong "%1"を使用して実行するように指示されます。%1は完全なURLに置換されます。このプロセスを説明するために、WPS Spreadsheetsアプリケーション(et.exe)の独自のプロトコルksoqingを使用して、ユーザーがハイパーリンクをクリックしたときの処理を図2に示します。

図2. WPS Spreadsheetsアプリケーションは、独自のプロトコルksoqingを処理するためにwps.exeを起動する

図3に、CVE-2024-7262に対するエクスプロイトの制御フローの概要を示します。

図3. CVE-2024-7262のエクスプロイトの制御フローの概要

wps.exeが起動されると、qingbangong.dllが読み込まれます。これは、ハイパーリンクの特定のパラメータを解析および検証するコンポーネントです。ESET社が発見したエクスプロイトファイルにある悪意のあるリンクの形式は、ksoqing://type=ksolaunch&cmd=&token=&launchname=promecefpluginhost.exeとなっています。ESET社の分析とテストによると、このリンクによって、攻撃者が指定したbase64エンコードされたコマンドラインで、システムにすでに存在するアプリケーション(この場合、promecefpluginhost.exe)が実行されます。

tokenパラメータは、cmdパラメータのエンコードされた値と、文字列_qingLaunchKey_にlaunchnameパラメータをエンコードした値が付けられたものを連結したMD5ハッシュです。最後の1つは、C:\Users\\AppData\Local\Kingsoft\WPS Office\\office6\の下にあり、Kingsoft社の有効な証明書で署名された実行ファイルでなければなりません。

このcmdパラメータをデコードした結果、コマンドライン/qingbangong -CefParentID=1 -JSCefServicePath=がpromecefpluginhost.exeに渡されていることがわかりました。いくつかの初期化処理を行った後で、ksojscore.dllライブラリがロードされ、JSCefServicePathパラメータがデコードされます。これにより、QtのQLibrary::loadメソッドへのパラメータとして渡される文字列が指定されます。このファイルパスは攻撃者が定義できるため、任意のDLLをロードしてコードを実行することが可能です。図4は、攻撃者が制御するJSCefServicePathパラメータがksojscore.dllによって処理される方法を示しています。

図4. パラメータJSCefServicePathがデコードされ(左)、QLibrary::loadメソッドの引数として使用される(右)

つまり、ksoqingスキームプロトコルを悪用すると、クリックされたときに指定されたリモートファイルパスからライブラリをロードするハイパーリンクを作成することが可能です。APT-C-60はこの脆弱性を武器化して、トロイの木馬のダウンローダーコンポーネント(SHA-1:08906644B0EF1EE6478C45A6E0DD28533A9EFC29)を配信して、攻撃の第一段階として使用します。

脆弱性の攻撃

この脆弱性を攻撃するためには、攻撃者は標的のコンピューターがアクセス可能な場所、つまりシステムまたはリモートの共有フォルダに悪意のあるライブラリを保存し、そのファイルパスを事前に把握しておく必要があります。この脆弱性のエクスプロイトを開発した攻撃者は、これを実現するためのいくつかの手法を理解していました。

MHTML形式を利用したリモートファイルのダウンロード

このエクスプロイトを作成した攻撃者は、サポートされているMHTMLファイル形式の特定の機能を利用して、悪意のあるコンポーネントをダウンロードさせ、システムの予測可能な場所に保存させています。この形式のファイルは、ユーザーがブラウザーでドキュメントを表示できるようにするために、Microsoft WordやExcelアプリケーションで提供されているエクスポート形式です。これは、ドキュメントを簡単に表示できるようにするHTML、CSS、JavaScriptファイルが含まれる複数のパートから構成されるアーカイブです。これらのHTMLファイルの1つにimgタグを挿入すると、ドキュメントがロードされる時にWPS Spreadsheetsアプリケーションにリモートファイルをダウンロードさせることができます。imgタグとsrc要素によってローカルに保存されたライブラリを指定するテストファイルの1つを図5に例として示します。

図5. imgタグの挿入

WPS Spreadsheets(et.exe)アプリケーションでスプレッドシートドキュメントを開くと、リモートライブラリが自動的にダウンロードされ、ディスクに保存されます。ProcMonで観察されたこの結果を図6に示します。

図6. ESET社のライブラリをダウンロードし、システムに保存するWPS Spreadsheetアプリケーション

予測できるファイルパスの特定

ファイルパスを予測できなければ攻撃を実行できませんが、ダウンロードされたファイルは%localappdata%Temp\wpsINetCacheの下に保存され、ファイル名はUTF 16LEでエンコードされたURLのMD5ハッシュであることがわかりました。例えば、ESET社のライブラリのURLはhttp://localhost/Dll1.dllで、MD5ハッシュは914CBE6372D5B7C93ADDC4FEB5E964CDになります。しかし、JSCefServicePath変数をそのようなファイルパスを指定するように設定すると、%localappdata%KingsoftWPS Office<VERSION>office6の下にあるWPS Officeアプリケーションのルートディレクトリと連結されます。ファイルが見つからない場合、promecefpluginhost.exeは、図7に示すように、ほかのパスからライブラリを取得しようとします。

図7. JSCefServicePathで指定されるファイルパスが、WPS Officeのルートディレクトリに追加される

ただし、..\..\..\..\Temp\wps\INetCache\914cbe6372d5b7c93addc4feb5e964cdのように、WPS Officeアプリケーションのルートディレクトリからの相対パスを使用することができます。

ファイル拡張子の問題

攻撃を成功させるための最後の難関があります。勘のいい読者の方は、.dllという拡張子が、promecefpluginhost.exeプロセスがライブラリをロードするときに、ファイル名に追加されていることに気が付かれたのではないでしょうか。図6に示しているように、ダウンロードされるファイルを作成するときにはこの拡張子は追加されません。このエクスプロイトを作成した攻撃者は、このケースでも、Windows APIの知識を悪用してこの制限を回避しています。前に説明したように、QLibrary::Loadメソッドは、LoadLibraryWを呼び出すライブラリをロードします。この関数に渡されるlpLibFileNameパラメータのドキュメントには、末尾のドット文字(.)を追加すると、この関数が.dll拡張子を追加できなくなると記載されています。つまり、この相対パスにこの文字を追加すれば、ライブラリをロードできます。

エクスプロイトの再現

ここまで説明してきた攻撃フローをまとめて、このエクスプロイトを再現するために、以下の操作を実行しました。

・Webサーバーに独自のライブラリをホストする

・URLのMD5ハッシュを計算する

・このハッシュと一致するハイパーリンクを構築する

・スプレッドシートドキュメントを作成し、ハイパーリンクを挿入し、MHTMLファイルとしてエクスポートする

・エクスポートしたファイルにimgタグを挿入し、このURLを指定する

図8に、ハイパーリンクの作成方法を示します。

図8. ハイパーリンクの作成

ドキュメントを開くと、ハイパーリンクを一度クリックしただけで脆弱性が攻撃され、ESET社が準備したカスタムライブラリがロードされました。このプロセスを図9に示します。図10にはさらに詳細なプロセスを示しています。

図9. 独自のライブラリがディスクに書き込まれ、ロードされる

図10. ロードされるライブラリのコールスタックの詳細

ESET社のライブラリがロードされると、PID、管理者権限の有無、ホストプロセスのファイルパスがログファイルに書き込まれます。図11に示すように、Windows版WPS Officeのいくつかのバージョンでこのエクスプロイトを再現しました。

図11. 脆弱なWPS Officeバージョンを表示するログファイル

この脆弱性は1回クリックするだけで攻撃できるため、エクスプロイトの開発者は、ユーザーを欺き、ドキュメントが通常のスプレッドシートであると信じ込ませるために、スプレッドシートの行と列の画像をスプレッドシートに埋め込んでいました。悪意のあるハイパーリンクは画像にリンクされており、図12で再現しているように、画像のセルをクリックするとエクスプロイトが実行される仕組みになっていました。

図12. 通常の行と列の画像を埋め込んでおり、ユーザーを騙すために作成されたスプレッドシート

この脆弱性でもう1つの注意しなければならないのは、Windowsエクスプローラーのプレビュー画面で一度クリックするだけでも、この脆弱性が攻撃されることです。

影響を受けるバージョン

影響を受けるWindows版WPS Officeバージョンは、2023年8月頃にリリースされた12.2.0.13110から、2024年3月にパッチがリリースされたバージョン12.1.0.16412までです。武器化されたドキュメントは2月に初めてVirusTotalにアップロードされました。PEのタイムスタンプから、いくつかの悪意のあるコンポーネントは2月に作成されたことがわかります。

CVE-2024-7263

このセクションでは、CVE-2024-7262に対するパッチの分析と、分析の結果発見された、同じWPS Officeのプラグインコンポーネント(promecefpluginhost.exe)の制御フローを乗っ取ることで可能になる別のコード実行の脆弱性について説明します。

根本原因分析

最初の脆弱性の影響を受けるバージョンを特定する過程で、CVE-2024-7262の問題を修正するためにバージョン12.1.0.16412(2024年3月頃にリリース)で導入されたサイレントパッチを分析しました。基本的に、攻撃者が制御していたJSCefServicePath変数を検証するために、promecefpluginhost.exeとksojscore.dllコンポーネントの内部でチェック機能が追加されていました。しかし、パッチCefPluginPathU8では、同じような変数への対応が行われていませんでした。

最初のチェックは、promecefpluginhost.exeが異なるコマンドライン引数を使用して繰り返し実行するときに行われます。パラメータが前に説明した変数の1つと同じ名前である場合(大文字小文字が区別され比較されます)、図13に示すようにパラメータは破棄されます。

図13. コードチェックと渡されたパラメータの破棄

その後、jscefservice.dllが保存されているJSCefServicePathのファイルパスを検索します。実際のパスは、図14に示すように、%LOCALAPPDATA%\Kingsoft\WPS Office\\office6\addons\kcef\でなければなりません。同じ処理がCefPluginPathU8に対して行われます。その実際のパスは%LOCALAPPDATA%\Kingsoft\WPS Office\\office6\addons\cef\を指定していなければなりません。

図14. 正しいライブラリを読み込むコード

新しいコマンドラインは、受け入れられたコマンドラインパラメータによって構築され、名前付き変数によって識別され取得されたファイルパスが続きます。promecefpluginhost.exeは次にksojscore.dllライブラリをロードし、そのエクスポートCefRenderEntryPointが再構築されたコマンドラインで呼び出されます。両方の名前付き変数がチェックされますが、ここでは大文字小文字は区別されません(図15の2行目を参照)。

図15. 初めて大文字と小文字が区別されずに変数が使用される

ここにロジックの最初の欠陥があります。名前付き変数の少なくとも1文字が大文字または小文字に変更されている場合、大文字と小文字を区別する最初のチェックでは攻撃者が指定したパラメータは拒否されず、コマンドラインは次のようになります。

-JSCEfServicePath= -JSCefServicePath=(最初の変数名の最初の文字Eが小文字から大文字に変化しています)。

このようなコマンドラインがksojscore.dllに渡されると、最初の変数だけが使用され、攻撃者が制御する変数が常に有効な変数の前に置かれます。

しかし、JSCefServicePathファイルパスで指定されるライブラリをロードする前に、2つ目のチェック機能が導入されました。krt::ksafe::KProcess::verifyZhuHaiKingsoftCertSigner関数は、図16に示すように、ライブラリの証明書をチェックし、Kingsoft社が所有するライブラリであることを確認するために呼び出されます。そのため、攻撃者は任意のライブラリをロードすることはできません。

図16. ロードされるライブラリのシグネチャのチェック

しかし、CefPluginPathU8変数は正しくチェックされません。ここに2つ目の欠陥があります。JSCefServicePathファイルパスを検証した後、ライブラリjscefservice.dllがロードされ、CefPluginPathU8によって提供されたファイルパスは、署名がチェックされずに、文字列liblibcef.dllと連結され、LoadLibraryExWが呼び出されます。

CefPluginPathU8変数の少なくとも1文字が変更されている場合、jscefservice.dllは、図17に示すように、変数で指定された攻撃者が制御するファイルパスに保存されたlibcef.dllライブラリをロードします。

図17. ライブラリjscefservice.dllは、署名をチェックせず、攻撃者が定義したパスにあるイブラリをロードする

脆弱性の攻撃

この脆弱性を攻撃するときの主な制限は、ファイルパスに追加される文字列libcef.dllです。このブログの執筆時点では、ファイルをダウンロードしてそのファイル名を選択する方法は見つかっていません。しかし、LoadLibraryExWはネットワークパスを指定できるため、ローカルネットワークの共有でライブラリをホストし、変数CefPluginPathU8によってそのライブラリを指定する方法があります。図18のスクリーンショットは、promecefpluginhost.exe(2024年4月下旬にリリースされたバージョン12.2.0.16909)の制御フローが、ネットワークパスを使用して乗っ取られた方法を示しています。

図18. 独自のライブラリがロードされることを示すProcmonのスタックビュー

影響を受けるバージョン

2023年8月頃にリリースされた12.2.0.13110から、2024年5月末にパッチがリリースされたバージョン12.2.0.17119までのWindows版WPS Officeバージョンがこれらの脆弱性の影響を受けます。

結論

WPS Officeは主にアジア各国で利用されているソフトウェアであり、今回明らかになった攻撃からAPT-C-60グループが、東アジア諸国を標的として侵害することに執着していることが実証されました。このグループがCVE-2024-7262のエクスプロイトを開発したのか購入したのかはわかりませんが、このエクスプロイトの開発にあたっては、WPS Officeアプリケーション内部の研究や、Windowsのロードプロセスの仕組みについての知識が必要です。このエクスプロイトは狡猾であり、ユーザーを騙して正規のスプレッドシートをクリックさせる巧妙な仕掛けを取り入れており、非常に効果的で攻撃が成功する可能性が高くなっています。攻撃者は、MHTMLファイル形式を選択することで、コード実行の脆弱性をリモートからのコード実行の脆弱性へと進化させています。

さらに、CVE-2024-7263はESET社によって発見されましたが、これはパッチを慎重に検証するプロセスと、中核的な問題が完全に解決されていることの確認が重要であることを示しています。Windows版WPS Officeをお使いの方は、ソフトウェアを最新リリースにアップデートすることを強くお勧めします。