WordPressプラグイン30本がFlippa売却後にバックドア化

信頼されてきたWordPressプラグイン30本以上が、Flippa経由で新オーナーに売却された後にバックドアを仕込まれていた。潜伏期間は8か月。発覚したのは、被害が広がり始めてからだった。

WordPressプラグイン30本がFlippa売却後にバックドア化
WordPress

信頼されてきたWordPressプラグイン30本以上が、Flippa経由で新オーナーに売却された後にバックドアを仕込まれていた。潜伏期間は8か月。発覚したのは、被害が広がり始めてからだった。


発覚のきっかけは管理画面の一通の通知

ホスティング事業者Anchor Hostingの創業者オースティン・ギンダー(Austin Ginder)がブログで報告した事案だ。発端は顧客サイトのwp-adminに出ていた、WordPress.orgプラグインチーム名義の警告通知だった。対象は「Countdown Timer Ultimate」という、カウントダウンタイマーを埋め込むだけのごく平凡なプラグイン。2016年公開、長年動いてきた実績のある部品だ。

ギンダーが調査に入ると、マルウェアはプラグイン本体ではなく、もっと深い場所にいた。wp-config.phpだ。WordPressサイトの心臓部にあたる設定ファイルに、外部サーバーから取得した約6KBのPHPコードが追記されていた。

8か月間眠っていたバックドア

ここが今回の事案で最も薄気味悪い部分だ。問題のバージョン2.6.7は2025年8月8日にリリースされている。変更履歴には「WordPress 6.8.2との互換性チェック」とだけ書かれていた。実際に追加されたのは191行のコードと、PHPのデシリアライゼーションを悪用したリモートコード実行経路だった。

つまり、バックドアは8か月間、完全に沈黙したまま何万ものサイトに潜んでいた。検知されない期間としては異例に長い。攻撃者は焦っていなかったということだ。

fetch_ver_info()という無害そうな名前のメソッドが、攻撃者のサーバーからfile_get_contents()で任意データを取得し、@unserialize()に流し込む。さらに認証不要のREST APIエンドポイントが添えられており、呼び出されると遠隔から指定された関数を指定された引数で実行できる構造になっていた。

ギンダーはこれを「教科書通りの任意関数呼び出し」と切り捨てている。実装の粗さではなく、意図の明快さが際立つ。これは事故ではない。最初から遠隔操作を目的に書かれたコードだ。

起動は2026年4月6日、わずか6時間44分の注入ウィンドウ

バックドアが目覚めたのは2026年4月6日。ギンダーは日次バックアップに残っていた8時点のwp-config.phpのファイルサイズを二分探索の要領で比較し、注入が起きた時間帯を6時間44分の範囲まで絞り込んでいる。セキュリティ研究の現場でありがちな「いつ侵入されたか分からない」を、地道なスナップショット比較で叩き潰した手法だ。

注入されたコードの挙動もまた手が込んでいた。外部サーバーからスパムリンクやリダイレクト先、偽ページを引っ張ってきて、Googlebotに対してのみ配信する。サイト所有者がブラウザで見ても何も変わらない。変わっているのは検索エンジンから見たサイトの姿だけだ。


C2サーバーをイーサリアムのスマートコントラクトで解決する

最も異様なのはここだ。マルウェアはC2(コマンド&コントロール)ドメインの解決先を、イーサリアムのスマートコントラクトから読み出していた。パブリックなブロックチェーンRPCエンドポイントに問い合わせ、返ってきたアドレスに接続する設計になっていた。

従来のマルウェア対策では、C2ドメインをレジストラに通報して停止すれば作戦はそこで終わる。だが、スマートコントラクトの中身を書き換えられる権限を攻撃者が握っていれば、接続先はいつでも新しいドメインに差し替えられる。ブロックチェーンの「止められない」という特性を、防御側ではなく攻撃側が道具として使ってきたわけだ。

技術的には目新しい発想ではない。ただし、WordPressプラグインという極めて日常的な経路にこれが入り込んだ事実の意味は大きい。攻撃者は長期戦を想定している。

Flippaで「6桁ドル」で売買されていた

ここまでの話だけなら単なる凝った攻撃だ。問題は、そもそもなぜ攻撃者が正規プラグインの内部に入り込めたのかという一点に尽きる。

答えは身も蓋もない。買ったからだ

プラグインはもともとインド拠点のチームが「WP Online Support」として2015年頃から開発し、のちに「Essential Plugin」にリブランドされた正統な事業だった。30本以上のフリープラグインとプレミアム版を抱え、公式サイトの記載では累計40万件以上のインストールと1万5000以上の顧客を持っていた。ところが2024年後半に売上が35〜45%落ち込み、創業者のミネシュ・シャーが事業全体をFlippaに出品した。

購入したのは「Kris」と名乗る人物。SEO、仮想通貨、オンラインギャンブル広告の経歴を持つ買い手だ。支払額は6桁ドル(数千万円規模)。Flippaは取引成立後、売却事例として7月に記事まで公開している

そして新オーナーが取得したSVNコミット権限で最初に行った作業が、バックドアの埋め込みだった。

前例はあった

2017年、「Daley Tias」を名乗る買い手が20万インストールを持つ「Display Widgets」プラグインを1万5000ドルで買い取り、ペイデイローン系のスパムを注入した。同じ手口で少なくとも9本のプラグインが次々と汚染されていた。

今回のEssential Pluginの件は、同じ脚本のスケールアップ版だ。2017年は9本、2026年は30本以上。買収金額は1万5000ドルから6桁ドルへと 一桁跳ね上がった。攻撃者にとってWordPressプラグインの「既存の信頼」は、年々値上がりしている商品なのかもしれない。

WordPress.orgのプラグインチームは事案を把握すると1日で31本すべてを恒久閉鎖した。対応は速い。だが、8か月という潜伏期間の間に何が起きていたかは、結局のところ各サイト運営者が自力で確認するしかない。


20,000サイトの「運営者にしか見えない宿題」

WordPress.orgのページ上で確認できる影響サイト数は 2万件以上 のアクティブインストールに及ぶ。しかもプラグインの強制アップデートで無効化されたのは「本体側から外部を呼び出す機構」だけであり、すでにwp-config.phpに注入された本体は手つかずで残っている。

つまりWordPress.orgが自動修復をかけても、感染済みサイトの掃除は運営者自身の宿題として残る構造だ。気づかないまま放置されれば、SEOスパムは静かに検索結果を侵食し続ける。ユーザーには何も見えない。Googlebotにだけ別の顔を見せる仕組みなのだから、当然だ。

要するにこうだ。プラグインは削除されても、wp-config.phpに書き込まれたコードは残る。強制アップデートは止血であって、治療ではない。汚染の掃除は各サイト運営者の手作業に委ねられている。

「プラグイン買収」という制度の穴

WordPress.orgには、プラグインの所有権移転に対する審査も、コミッター変更時の追加コードレビューも、ユーザーへの通知制度もない。売買は完全にプラグイン作者と買い手の私的取引で完結する。

ギンダーの指摘は冷たく正確だ。Flippaの出品情報は公開されていたし、買い手の経歴も公開されていた。それでも買収から8か月、誰もコードを覗かなかったWordPressエコシステムが「信頼される古参プラグイン」という資産に依存している一方で、その信頼の引き継ぎを監査する仕組みを持っていないことが、今回はっきりと露呈した格好だ。

20年近く積み上げてきたオープンソースCMSの重みが、そのまま攻撃面積になっている。善意の開発者が事業を畳むときに、次のオーナーが善意であるとは限らない。そして現状、誰もそれを確認しない。

自分のサイトでEssential Plugin由来のプラグインを入れているなら、まずは削除。そしてwp-config.phpを覗いて、require_once ABSPATH . 'wp-settings.php';の行が見慣れないコードで膨らんでいないか確認する。それが今週末の最低限の宿題だ。プラグインの信頼が買えるものになった世界では、ユーザーは常に少しだけ疑う必要がある。


参照元

関連記事