「TRUST#GRAFT」は、WordPressの認証を一切破らない、JavaScriptからWordPressへの攻撃チェーンです。
この攻撃は、すでにログイン済みの管理者のブラウザに向けられた信頼を悪用します。そのセッションを使って、永続的なPHPバックドアをインストールします。
多くの管理者は、日常のブラウジングと同じプロファイルでwp-adminにサインインしたままにしています。こうした習慣が、攻撃者に足がかりを与えています。
ローダーはパスワードを推測しません。同一オリジンのCookieと、WordPressがページに発行したnonceを再利用します。
この攻撃は認証済みのブラウザを通じて実行されます。そのため、多要素認証(MFA)による防御効果は限定的です。
ローダーはまず、本来のページを隠します。Cloudflareを模した「Just a moment」画面を表示する全画面のiframeを挿入します。このiframeにはクリップボード書き込み権限が付与されています。
この偽画面で時間を稼ぐ間に、スクリプトは訪問者のフィンガープリントを収集します。自動化の痕跡、WebGLレンダラーの詳細、canvasのハッシュ、タイムゾーン、言語情報などです。
続いて、小規模なプルーフ・オブ・ワーク(PoW)の課題を解き、フィンガープリントとキャンペーンのパラメータをコントローラーに送信します。動的なコンテンツが表示されるのは、この後です。このゲート処理により、攻撃者は通常のブラウザと解析ツールを見分けやすくなるとみられます。
ユーザーがおとりの画面を操作すると、スクリプトは攻撃者が用意したテキストをクリップボードにコピーしようとします。ClickFix型の手口と共通するパターンです。
ローダーはさらに、localStorageとsessionStorageから、token、jwt、auth、api、secret、session、bearer、csrfといった名前のキーを探します。一致した値と、document.cookieの先頭最大1,500文字を、レポート用のエンドポイントに送信します。
HttpOnly属性付きのCookieはこの方法では読み取れません。ただし、ページからアクセス可能なストレージに保存されたトークンは、すべて漏えいするおそれがあります。
最初の侵入経路を確定するには、スクリプトを埋め込んでいたページ、HTTPリファラー、リダイレクトチェーンの証拠、Webサーバーのログ、DNSおよびプロキシのテレメトリが必要です。スクリプトタグがいつ現れたかを示すコンテンツ管理の記録も欠かせません。

Securonixの脅威リサーチチームがTRUST#GRAFTを分析しました。それによると、このチェーンは従来型のサーバーサイドの脆弱性悪用ではありません。ブラウザを介してマルウェアを展開する仕組みと捉えるのが適切です。決定的な条件は、認証済みのWordPress管理者のブラウザが存在することです。
TRUST#GRAFT攻撃の流れ
最も重要な挙動は次のとおりです。訪問者が認証済みの管理者セッションを持っている場合、スクリプトはプラグインのアップロードページを要求し、WordPressのnonceを抽出します。続いて、wm.zipという名前のZIPファイルをダウンロードし、update.php?action=upload-plugin に送信します。
iframeには最小限の「Just a moment」ページが表示され、親ページのホスト名を示そうとします。見慣れた検証画面風のおとりを見せている間に、残りの処理がバックグラウンドで進みます。
その後、プラグインページを取得し、有効化を実行します。すべてのリクエストは、管理者の権限のもとで、WordPress本来の機能を使って行われます。

したがって、このチェーンは単独の認証バイパスを示すものではありません。信頼されたセッションと、プラグインをインストールできる権限を悪用する攻撃です。
ペイロードはPHPプラグインで、名前は「Web Media Optimizer」(バージョン2.1)です。名称とは裏腹に、実体はバックドアです。
このプラグインは、wp_headを通じて公開ページにリモートのJavaScriptを注入します。コントローラーのソースを取得する際にはTLS検証を無効にします。さらに、プラグイン一覧、アクションリンク、更新通知から自らを隠します。
ハードコードされたトークンで保護された2つのルートがあります。1つは最初の管理者アカウントの認証Cookieを設定し、もう1つはリモートスクリプトの取得元を差し替えます。

最も警戒すべきは永続化の仕組みです。有効化されると、プラグインは自身を wp-content/mu-plugins/wmedia-recovery.php にコピーします。
WordPressは必須プラグイン(must-use plugin)を自動的に読み込みます。これらは通常のプラグイン画面には表示されません。そのため、表示されているプラグインのディレクトリを削除しただけでは、バックドアは動作し続けます。
防御側は、1つの管理者セッションが短時間のうちにアップロードページへのアクセス、ZIPのアップロード、プラグインの有効化を連続して行っていないか、相関分析する必要があります。
監査ログで、予期しないアップロードや有効化がないかを確認してください。プラグインのディレクトリは、管理画面ではなくサーバー上で直接調べることが重要です。wp-content/mu-plugins に wmedia-recovery.php がないかも確認してください。
管理者は、特権セッションを日常的なブラウジングに使うのを避けてください。ブラウザが侵害された疑いがある場合は、再認証を行うことも推奨されます。
最初の配布経路は、いまも確認されていません。ローダーの候補は gerlace[.]com、vtevens[.]icu、caapman[.]me で特定されました。/p/wm.zip というパスは、複数のドメインで繰り返し見つかっています。
これらの痕跡からは、スクリプトがどのように被害者に届いたのかはわかりません。解明には、リファラーのデータ、サーバーログ、ページのソース、DNSやプロキシのテレメトリが必要です。ホスティング情報だけで攻撃者を特定すべきではありません。
WordPressのnonceは、クロスサイトリクエストフォージェリ(CSRF)を防ぐための仕組みです。アクセス制御の仕組みではありません。
WordPressの開発者向けドキュメントは、nonceを認証・認可・アクセス制御に頼ってはならないと明記しています。機密性の高い操作は current_user_can() で保護すべきだとも述べています。TRUST#GRAFTは、この区別がなぜ重要かを示す事例です。
IOC(侵害指標)
| ファイル名 | 関連するSHA256 |
|---|---|
| wmedia-recovery.php | 86d775c2d5cb459541cd2b0b967fac65ce20c60e483c71c9f7e108d5ad0bd564 |
| ads.php | 2dfa9e708fdb92e5d36080065f978e33a692c0fe813a75be9c7cdff03be51b6e |
| wm.zip | 9215d17e5138cee498bb529e69b1cc7267305136535025e9b49fe173cf648720 |
注: IPアドレスとドメインは、誤って名前解決されたりハイパーリンク化されたりするのを防ぐため、意図的に無害化([.] など)しています。無害化を元に戻す場合は、MISP、VirusTotal、自社のSIEMなど、管理された脅威インテリジェンス基盤の中だけで行ってください。
MTTRを21分短縮し、被害が出る前にサイバー脅威を阻止。ANYRUNのサンドボックスをSOCに導入
監査セキュリティ
翻訳元: https://gbhackers.com/trustgraft-attack/