注目

インシデント / INCIDENT / SUPPLY CHAIN

WordPressプラグイン7種のサプライチェーン侵害 — 広告配信フィードの毒化で不正な管理者アカウントが作られる(Wordfence調査)

WordPress向けプラグインを提供するBdThemesのサプライチェーンが侵害された。プラグイン本体のファイルは改ざんされておらず、管理者画面に広告バナーを配るJSONフィードが書き換えられた。管理者がダッシュボードを開くたびに、不正な管理者アカウントの作成とWebシェルの設置が試みられる。Wordfenceが2026年8月7日に検知し、8月8日に分析を公開した。

WordPress向けプラグインを手がけるBdThemesのサプライチェーンが侵害された。セキュリティ企業Wordfenceの脅威情報チームは2026年8月7日にこの侵害の報告を受け、8月8日に分析を公開した。影響を受けたプラグインは7種。いずれもWordPress公式ディレクトリで配布されている人気の高いプラグインだ。

今回の特徴は、プラグインのソースコードが1行も改ざんされていないことにある。攻撃者は、管理者画面に広告バナーを表示するためにプラグインが外部から読み込むJSONフィード(データ配信ファイル)を書き換えた。その結果、管理者がダッシュボードを開くたびに、ブラウザ上で不正な管理者アカウントの作成Webシェル(サーバー操作の裏口)の設置が試みられる。ファイル改ざん検査では検知できない手口だ。

Wordfenceの報告時点で、影響を受けたプラグインはWordPress.org側で一時閉鎖され、調査が進められている。毒化されたフィードは8月8日までに正常な状態へ戻ったとされるが、侵害の痕跡(バックドア)はサイト側に残っている可能性がある。

まず基本:ファイルが無事でも、侵入は成立する

従来のサプライチェーン攻撃は、配布されるソフトウェアのファイルそのものを改ざんするケースが多かった。しかし今回の攻撃は、プラグインが実行時に外部サーバーから取得するデータを狙っている。

BdThemesのプラグインには「Biggopti」という内部コンポーネントが同梱されており、これがベンダーのAPIサーバーから広告バナー用のJSONを取得し、管理者画面に表示する。このAPIは動的なアプリケーションサーバーではなく、DigitalOcean Spacesのオブジェクトストレージに置かれた静的なJSONファイルで構成されていた。攻撃者はこのストレージへの書き込み権限を何らかの方法で得て、正規のJSONを細工したペイロードへ差し替えた。

つまり、WordPress本体もプラグインファイルも無傷のまま、**「正規のプラグインが正規のAPIから読み込んだ悪性データ」**によって侵害が成立する。Wordfenceはこれを「API駆動の攻撃」と表現し、ファイルベースの改ざん検査やWAF(Webアプリケーションファイアウォール)では捉えにくいと指摘する。

根本原因:BiggoptiのXSS(display_idのエスケープ漏れ)

Wordfenceによると、根本原因はBiggoptiのJSON解析コードにあった**クロスサイトスクリプティング(XSS)**だ。XSSとは、Webサイトが出力するデータに悪意のあるスクリプトを紛れ込ませ、閲覧者のブラウザ上で実行させる攻撃手法を指す。

プラグインは、JSONのdisplay_idというフィールドをHTMLのid属性にエスケープ(特殊文字の無害化)せずに連結していた。攻撃者はこのdisplay_idに、属性を抜け出す文字列と、CSSアニメーションの開始に反応して10ミリ秒以内に発火するイベントハンドラ(onanimationstart)を仕込んだ。管理者がダッシュボードを開くと、音もなくスクリプトが実行される。

このエスケープ漏れは、2026年3月1日にPrime Slider 4.1.9で導入され、その後ほかのプラグインにも適用されたとされる。Wordfenceの脆弱性情報では、CVSSスコア5.4(中程度)修正版はまだ提供されていない(Unpatched)とされている。実際に配信されていた悪性JSONは、次のような構造だった(一部抜粋・省略)。

{
  "biggopti_class": "class-01kvw52snnwd7r8ge9aj80xnsw",
  "display_id": "SAFE\" onanimationstart=eval(String.fromCharCode(...)) style=animation:wrapperSlideInTop .01s ease-out both",
  "type": "adminDashboard",
  "title": "Build more. Pay less. This Summer"
}

String.fromCharCode(...)の部分は文字コードの羅列になっており、これをデコードすると「api.sigmative.ioから次の段階のスクリプトを取得して実行する」コードになる。つまりこの1行で、「正規の広告」に見せかけた攻撃の第一段階が運ばれていた。

多段攻撃の流れ:2種類のペイロード

発火したスクリプトは、攻撃者のインフラの状況に応じて2種類のペイロード(攻撃本体)を取得する。Wordfenceの分析に基づき整理する。

**主ペイロード(w2.js)**は、次の手順を実行する。

  1. C2確認 — 攻撃者の管理サーバー(ia-cdn[.]com/fz/c)に被害サイトの情報を送り、「スキップ」か「完了」と返されれば中断する
  2. 不正な管理者アカウントの作成 — 管理者セッションのnonce(認証用トークン)を利用し、WordPress REST API経由で新しい管理者を作る
  3. Webシェルの設置 — 「wp-smart-thumbnails」など無害そうな名前の偽プラグインをダウンロードしてインストール。中にはemer-run.phpというWebシェルが含まれ、URL指定で直接呼び出せる
  4. mu-pluginsへのバックドア設置 — 2つの永続化モジュールを「必須プラグイン(mu-plugins)」ディレクトリに配置する。1つは?_wplogin=<トークン>のURLアクセスだけで管理者としてログインできる「マジックログイン」、もう1つはWordPressのDBクエリをフックして不正アカウントをユーザー一覧から隠す隠蔽モジュールだ(ファイルのタイムスタンプは2025年9月に偽装されていた)
  5. 結果の送信 — 実行結果をnavigator.sendBeaconでC2サーバーへ送る

代替ペイロード(x.js)は、被害サイトのホスト名から決定的に生成される認証情報を使って管理者を作る。次の関数がそれだ(Wordfenceの報告より)。

function makeCreds(){
  var host = siteKey();
  var hash = 0;
  for (var i = 0; i < host.length; i++) { hash = ((hash << 5) - hash + host.charCodeAt(i)) | 0; }
  var n = Math.abs(hash).toString(36).slice(0, 6);
  var user = 'bd_' + n;
  var pass = 'Bd@26!' + n + 'x';
  return { user: user, pass: pass };
}

ユーザー名はbd_+6文字の英数字、パスワードはBd@26!+同じ6文字+xという規則だ。メールアドレスには@wordpress.orgが使われる。この規則は公開されているため、管理者は自サイトのホスト名から攻撃者が作ったはずの認証情報を計算し、存在を確認できる。攻撃者側はサイトごとのリストを保存する必要がない。

影響を受けるプラグイン(7種)

Wordfenceが確認した影響を受けるプラグインは以下のとおり(スラッグは公式ディレクトリの識別子)。

プラグイン名 スラッグ
Element Pack Addons for Elementor bdthemes-element-pack-lite
Prime Slider Addons for Elementor bdthemes-prime-slider-lite
Pixel Gallery Addons for Elementor pixel-gallery
Ultimate Post Kit Addons for Elementor ultimate-post-kit
Ultimate Store Kit ultimate-store-kit
Live Copy Paste for Elementor live-copy-paste
Smart Admin Assistant smart-admin-assistant

WordPressのシェアを考えれば、日本国内にも影響を受けるサイトはあると考えられる。プラグインを導入しているだけで必ず侵害されたわけではない。危険なのは「毒化されたフィードが、ログイン中の管理者のブラウザに届いた」場合だ。Wordfenceは、攻撃キャンペーンの可能性がある期間を6月23日ごろからとしている。

侵害の兆候(IoC)

Wordfenceと関連分析が示す確認すべき兆候は次のとおり(ファイル名は変更される可能性がある)。

  • 管理者名が**bd_+6文字の英数字**で始まるアカウント、または@wordpress.org@developer.wordpress.orgのメールアドレスを持つ不審なアカウント
  • 偽プラグイン**wp-smart-thumbnails、Webシェルemer-run.php**
  • wp-content/mu-plugins/内の不審なファイル(class-wp-token-validate.phpclass-wp-query-*.phpwp-cache-optimizer.phpなど)
  • データベースのオプション名**fz_emer_login_tokensfz_emer_done_v1**
  • **ia-cdn[.]com/fz/**への通信

注意点として、WordPressの「ユーザー」一覧は信用できない。隠蔽モジュールがDBクエリをフックし、不正アカウントを一覧から消してユーザー数まで改ざんするためだ。確認は通常の管理画面ではなく、データベース(wp_userswp_usermetaテーブル)とサーバー上のファイルを直接見る必要がある。

今何をすべきか

  1. 対象プラグインの導入有無を確認する — 上記7種を1つも使っていなければ、今回の侵害には該当しない。通常のWordPress運用を続けてよい
  2. 管理画面の外から調査する — 対象プラグインを使っていたサイトは、ホスティングの管理画面やSSHから、wp_usersテーブルとmu-pluginsディレクトリを直接確認する。上記の兆候(bd_接頭辞の管理者、fz_emer_*のオプションなど)がないか調べる
  3. 兆候が見つかったら — サイトを隔離し、サーバー・DB・ログの現状を保存してから、不正なコードとアカウントを削除し、バックアップから復元する。WordPressのパスワード・saltに加え、ホスティング、SFTP/SSH、DB、CDN、SMTP、APIの認証情報をすべてローテーションする
  4. プラグインは無効化したまま — クリーンな修正版のリリースとベンダーの案内が出るまで、影響を受けたプラグインは有効化しない。フィードが復旧しても、すでに設置されたバックドアは残るため、「フィードが戻った=安全」ではない

ファイルが無傷でも、サイトは乗っ取られているかもしれない。「公式プラグインを公式ストアから入れたから安全」という前提は、実行時に外部データを取り込む仕組みの前では崩れる。管理画面の外から、自分で確認する習慣が今こそ必要だ。

出典: Wordfence — PSA: Supply Chain Compromise in BdThemes Ecosystem via Poisoned API Response

この記事は、公開情報と編集部の調査・知見をもとに構成しています。内容は公開時点の情報に基づく解説であり、個別の環境への診断・対応を保証するものではありません。重要な判断では、記事内の出典や各提供元の最新情報もご確認ください。