WPS Officeに影響する任意コード実行の2つの脆弱性を解析
本ブログでは、CVE-2024-7262とCVE-2024-7263を解析した技術的詳細についてお伝えします。
本ブログでは、CVE-2024-7262とCVE-2024-7263を解析した技術的詳細についてお伝えします。
ESETの研究者は、Windows版WPS Officeにコード実行の脆弱性(CVE-2024-7262)を発見し、韓国とつながりのあるサイバースパイグループ「APT-C-60」がこの脆弱性を攻撃していることを特定しました。根本原因を分析したところ、欠陥のあるコード(CVE-2924-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メールソリューションと書かれた画像があり、この画像がおとりとして使用されています。この画像には悪意のあるハイパーリンクが隠されています。
ESETが協調的な脆弱性開示ポリシーに従っている間に、武器化されたドキュメントがVirusTotalにアップロードされてから本ブログ記事が8月28日に公開されるまでのタイムラインを以下に示します。
CVE-2024-7262の脆弱性は、攻撃者が指定するファイルパスが適切にサニタイズされておらず、読み込まれるプラグインも検証されていないことに起因していました。Kingsoftが公開したパッチを分析した結果、さらにロジックのバグを利用してこの脆弱性を悪用する別の方法も見つかりました。
このセクションでは、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に示します。
図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によって処理される方法を示しています。
つまり、ksoqingスキームプロトコルを悪用すると、クリックされたときに指定されたリモートファイルパスからライブラリをロードするハイパーリンクを作成することが可能です。APT-C-60はこの脆弱性を武器化して、トロイの木馬のダウンローダーコンポーネント(SHA-1:08906644B0EF1EE6478C45A6E0DD28533A9EFC29)を配信して、攻撃の第一段階として使用します。
この脆弱性を攻撃するためには、攻撃者は標的のコンピュータがアクセス可能な場所、つまりシステムまたはリモートの共有フォルダに悪意のあるライブラリを保存し、そのファイルパスを事前に把握しておく必要があります。この脆弱性のエクスプロイトを開発した攻撃者は、これを実現するためのいくつかの手法を理解していました。
このエクスプロイトを作成した攻撃者は、サポートされているMHTMLファイル形式の特定の機能を利用して、悪意のあるコンポーネントをダウンロードさせ、システムの予測可能な場所に保存させています。この形式のファイルは、ユーザーがブラウザでドキュメントを表示できるようにするために、Microsoft WordやExcelアプリケーションで提供されているエクスポート形式です。これは、ドキュメントを簡単に表示できるようにするHTML、CSS、JavaScriptファイルが含まれる複数のパートから構成されるアーカイブです。これらのHTMLファイルの1つにimgタグを挿入すると、ドキュメントがロードされる時にWPS Spreadsheetsアプリケーションにリモートファイルをダウンロードさせることができます。imgタグとsrc要素によってローカルに保存されたライブラリを指定するテストファイルの1つをFigure 5に例として示します。
WPS Spreadsheets(et.exe)アプリケーションでスプレッドシートドキュメントを開くと、リモートライブラリが自動的にダウンロードされ、ディスクに保存されます。ProcMonで観察されたこの結果を図6に示します。
ファイルパスを予測できなければ攻撃を実行できませんが、ダウンロードされたファイルは%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に示すように、他のパスからライブラリを取得しようとします。
ただし、..\..\..\..\Temp\wps\INetCache\914cbe6372d5b7c93addc4feb5e964cdのように、WPS Officeアプリケーションのルートディレクトリからの相対パスを使用することができます。
攻撃を成功させるための最後の難関があります。勘のいい読者の方は、.dllという拡張子が、promecefpluginhost.exeプロセスがライブラリをロードするときに、ファイル名に追加されていることに気が付かれたのではないでしょうか。図6に示しているように、ダウンロードされるファイルを作成するときにはこの拡張子は追加されません。このエクスプロイトを作成した攻撃者は、このケースでも、Windows APIの知識を悪用してこの制限を回避しています。前に説明したように、QLibrary::Loadメソッドは、LoadLibraryWを呼び出すライブラリをロードします。この関数に渡されるlpLibFileNameパラメータのドキュメントには、末尾のドット文字(.)を追加すると、この関数が.dll拡張子を追加できなくなると記載されています。つまり、この相対パスにこの文字を追加すれば、ライブラリをロードできます。
ここまで説明してきた攻撃フローをまとめて、このエクスプロイトを再現するために、以下の操作を実行しました。
図8に、ハイパーリンクの作成方法を示します。
ドキュメントを開くと、ハイパーリンクを一度クリックしただけで脆弱性が攻撃され、ESETが準備したカスタムライブラリがロードされました。このプロセスを図9に示します。図10にはさらに詳細なプロセスを示しています。
ESETのライブラリがロードされると、PID、管理者権限の有無、ホストプロセスのファイルパスをログファイルに書き込まれます。図11に示すように、Windows版WPS Officeのいくつかのバージョンでこのエクスプロイトを再現しました。
この脆弱性は1回クリックするだけで攻撃できるため、エクスプロイトの開発者は、ユーザーを欺き、ドキュメントが通常のスプレッドシートであると信じ込ませるために、スプレッドシートの行と列の画像をスプレッドシートに埋め込んでいました。悪意のあるハイパーリンクは画像にリンクされており、図12で再現しているように、画像のセルをクリックするとエクスプロイトが実行される仕組みになっていました。
この脆弱性でもう一つの注意しなければならないのは、Windowsエクスプローラーのプレビュー画面で一度クリックするだけでも、この脆弱性が攻撃されることです。
影響を受けるWindows版WPS Officeバージョンは、2023年8月頃にリリースされた12.2.0.13110から、2024年3月にパッチがリリースされたバージョン12.1.0.16412までです。武器化されたドキュメントは2月に初めてVirusTotalにアップロードされました。PEのタイムスタンプから、いくつかの悪意のあるコンポーネントは2月に作成されたことが分かります。
このセクションでは、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に示すようにパラメータは破棄されます。
その後、jscefservice.dllが保存されているJSCefServicePathのファイルパスを検索します。実際のパスは、図14に示すように、%LOCALAPPDATA%\Kingsoft\WPS Office\\office6\addons\kcef\でなければなりません。同じ処理がCefPluginPathU8に対して行われます。その実際のパスは%LOCALAPPDATA%\Kingsoft\WPS Office\\office6\addons\cef\を指定していなければなりません。
新しいコマンドラインは、受け入れられたコマンドラインパラメータによって構築され、名前付き変数によって識別され取得されたファイルパスが続きます。promecefpluginhost.exeは次にksojscore.dllライブラリをロードし、そのエクスポートCefRenderEntryPointが再構築されたコマンドラインで呼び出されます。両方の名前付き変数がチェックされますが、ここでは大文字小文字は区別されません(図15の2行目を参照)。
ここにロジックの最初の欠陥があります。名前付き変数の少なくとも1文字が大文字または小文字に変更されている場合、大文字と小文字を区別する最初のチェックでは攻撃者が指定したパラメータは拒否されず、コマンドラインは次のようになります。
-JSCEfServicePath= -JSCefServicePath=(最初の変数名の最初文字Eが小文字から大文字に変化しています)。
このようなコマンドラインがksojscore.dllに渡されると、最初の変数だけが使用され、攻撃者が制御する変数が常に有効な変数の前に置かれます。
しかし、JSCefServicePathファイルパスで指定されるライブラリをロードする前に、2つ目のチェック機能が導入されました。krt::ksafe::KProcess::verifyZhuHaiKingsoftCertSigner関数は、図16に示すように、ライブラリの証明書をチェックし、Kingsoftが所有するライブラリであることを確認するために呼び出されます。そのため、攻撃者は任意のライブラリをロードすることはできません。
しかし、CefPluginPathU8変数は正しくチェックされません。ここに2つ目の欠陥があります。JSCefServicePathファイルパスを検証した後、ライブラリjscefservice.dllがロードされ、CefPluginPathU8によって提供されたファイルパスは、署名がチェックされずに、文字列liblibcef.dllと連結され、LoadLibraryExWが呼び出されます。
CefPluginPathU8変数の少なくとも1文字が変更されている場合、jscefservice.dllは、図17に示すように、変数で指定された攻撃者が制御するファイルパスに保存されたlibcef.dllライブラリをロードします。
この脆弱性を攻撃するときの主な制限は、ファイルパスに追加される文字列libcef.dllです。このブログの執筆時点では、ファイルをダウンロードしてそのファイル名を選択する方法は見つかっていません。しかし、LoadLibraryExWはネットワークパスを指定できるため、ローカルネットワークの共有でライブラリをホストし、変数CefPluginPathU8によってそのライブラリを指定する方法があります。図18のスクリーンショットは、promecefpluginhost.exe(2024年4月下旬にリリースされたバージョン12.2.0.16909)の制御フローが、ネットワークパスを使用して乗っ取られた方法を示しています。
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をお使いの方は、ソフトウェアを最新リリースにアップデートすることを強くお勧めします。
SHA-1 | ファイル名 | 検出 | 説明 |
---|---|---|---|
7509B4C506C01627C1A4C396161D07277F044AC6 | input.htm | HTML/Agent.HQ | MHTML形式のWPS Spreadsheetsのエクスプロイト - CVE 2024 7262。 |
08906644B0EF1EE6478C45A6E0DD28533A9EFC29 | WPS_TEST_DLL.dll | Win32/TrojanDownloader.Agent.HRP | ダウンローダーコンポーネント。 |
IP | ドメイン | ホスティングプロバイダー | 最初に確認された日付 | 詳細 |
---|---|---|---|---|
162.222.214[.]48 131.153.206[.]231 | rammenale[.]com | PhoenixNAP | 2024-03-08 | 次の段階をホスティングするC&Cサーバー。 |
この表は、MITRE ATT&CKフレームワークのバージョン15を使用して作成されています。
手法 | ID | 名前 | 説明 |
---|---|---|---|
リソース開発 | T1583.001 | ドメイン | APT-C-60はC&Cサーバーのドメイン名を取得しています。 |
T1583.004 | サーバー | APT-C-60はC&C用のサーバーを取得しています。 | |
T1608.001 | マルウェアのアップロード | APT-C-60の次の攻撃段階はC&Cサーバーにアップロードされています。 | |
T1587.004 | エクスプロイト | APT-C-60はCVE-2024-7262のエクスプロイトを開発または購入しています。 | |
実行 | T1203 | クライアントを実行するための攻撃 | APT-C-60はCVE-2024-7262を攻撃して、目的を達成しています。 |
T1204.001 | 悪意のあるリンク | APT-C-60が使用するエクスプロイトは、ハイパーリンクをユーザーにクリックさせます。 |