WordPressの人気プラグイン31個にバックドア混入 ― EssentialPlugin乗っ取り事件の全貌と、いますぐできる確認・対処法

ある日、WordPressの管理画面にこんな警告が表示されていました。

Important Notice from the WordPress.org Plugins Team.
We would like to inform you that several plugins from the author “essentialplugin” have been reported by the community as not compliant with the guidelines. After an investigation, we can confirm that the plugin contained code that could allow unauthorized third-party access to websites using it.
In response, we have taken immediate steps to close the plugin in the WordPress.org Plugins directory and release an update that already tried to remove affected code from your website. Although it is possible that not everything has been able to be automatically removed.
Specifically, this plugin downloaded code from analytics.essentialplugin.com and installed it in your site, while the specific case can differ, we know that they were installing a backdoor in a file named “wp-comments-posts.php” that looks closely to the core file “wp-comments-post.php”. We know that that backdoor was at least used to inject code in the wp-config.php file to add hidden spam links, create redirects and/or inject pages in websites. Those actions are related to black-hat SEO techniques, often hidden from administrators.
While our update attempted to remove the backdoor automatically, it cannot confirm that it was fully eliminated. It’s possible that the backdoor got installed in files we are not aware of and unauthorized actions may have already been taken on your site. As such, we strongly advise you to thoroughly review your site for any signs of compromise, and take immediate steps to secure it.

(日本語訳)
WordPress.org プラグインチームからの重要なお知らせ
お使いのプラグインに、第三者による不正アクセスを許す可能性のあるコードが含まれていることが確認されました。当該プラグインはディレクトリから閉鎖し、影響範囲を自動的に除去するアップデートを配布しましたが、すべてを取り除けたとは限りません。サイトに不審な点がないか、至急ご確認ください。

ログインしたら突然こんな通知が出ていたら、誰でも肝が冷えます。これは2026年4月に発覚した、WordPress界隈でも「ここ数年で最も計画的」と評されるサプライチェーン攻撃の入り口でした。長年信頼されてきた31本ものプラグインが、所有者の交代をきっかけに、まとめてバックドア入りに作り変えられていたのです。

厄介なのは、これらが怪しげな無名プラグインではなく、何年もの実績とインストール数を持つ「ちゃんとした」プラグインだったこと。つまり、きちんと運用していた真面目なサイトほど巻き込まれた可能性があります。当ブログの運営元でも対象プラグインを使っているサイトがあり、まさにこの通知をきっかけに調査しました。その経験も踏まえて、何が起きたのか・自分のサイトは大丈夫なのか・どう対処すべきかを整理します。

何が起きたのか ― 時系列で見る経緯

ことの発端は、プラグインビジネスの「売却」でした。

  • 〜2024年後半:問題のプラグイン群は、インド拠点のチームが2015年頃から「WP Online Support」として開発・運営してきたもの(後に「Essential Plugin」へリブランド)。30本超の無料プラグインを抱える老舗でした。売上が落ち込み、創業者がビジネスごとマーケットプレイス「Flippa」に出品します。
  • 2025年前半:「Kris」と名乗る人物が、このポートフォリオを6桁ドル(数千万円規模)で買収。Krisはもともとマーケティングのバックグラウンドを持つ人物とされています。
  • 2025年5月:新しいアカウントが、31本すべての更新権限(WordPress.orgのコミット権)を引き継ぎます。
  • 2025年8月8日:バージョン2.6.7をリリース。変更履歴には「WordPress 6.8.2との互換性確認」とだけ書かれていましたが、実際にはこのアップデートでバックドアのコードが追加されていました。新オーナーの最初のコミットが、いきなりバックドアだったわけです。
  • 〜2026年4月:コードは約8か月間、何の不審な動きも見せずに休眠。その間も多くのサイトが普通にインストール・更新を続け、「信頼」が積み上がっていきました。
  • 2026年4月5〜6日:バックドアが起動。攻撃者のサーバーから各サイトへ悪意あるコードの配信が始まります。
  • 2026年4月7日:WordPress.orgのプラグインチームが攻撃を確認し、31本すべてを同日中に永久閉鎖
  • 2026年4月8日:バックドアの通信機能を無効化する**強制アップデート(2.6.9.1)**を全サイトへ配布。

この事件を最初に公にしたのは、ホスティング事業者Anchor HostのAustin Ginder氏。クライアントサイトの管理画面に出ていた警告通知をきっかけにフォレンジック調査を行い、全容を突き止めました。

攻撃の仕組み

バックドアは、プラグインに昔から組み込まれていた正規の「アクセス解析オプトイン機能(wpos-analytics モジュール)」の中に仕込まれていました。長年まともに動いていた機能の中に紛れ込ませることで、検知を逃れていたわけです。

起動後の流れはおおむね次の通りです。

  1. プラグインが攻撃者のサーバー analytics.essentialplugin.com に通信し、コードを受け取る(file_get_contents() で取得し、PHPの unserialize() に通す、いわゆるデシリアライズ攻撃)。
  2. WordPressのコアファイル wp-comments-post.php によく似せた偽ファイル wp-comments-posts.php(末尾に「s」が一つ多い)をサイトに設置。
  3. これを使って wp-config.php にPHPコードを注入。
  4. 注入されたコードは、Googlebot(検索エンジンのクローラー)が来たときだけスパムリンクや偽ページ、リダイレクトを表示する。サイト所有者が自分でブラウザで見ても何も変わって見えないため、Googleからペナルティを受けて初めて気づく、という設計でした。

さらに巧妙なのが、攻撃者の指令サーバー(C2)の住所をイーサリアムのスマートコントラクト経由で解決していた点。これにより、たとえドメインが停止されても、攻撃者は新しいサーバーに即座に切り替えられる仕組みになっていました。通常のドメイン閉鎖だけでは止めきれない、というわけです。

対象となった31本のプラグイン

発見者が確認・公開した全リストです。スライダー、ギャラリー、ポップアップ、カウントダウン、FAQ、証言(テスティモニアル)など、汎用的で使われやすいものばかりが並んでいます。括弧内はWordPress.orgのスラッグ(フォルダ名)です。

  • Accordion and Accordion Slider(accordion-and-accordion-slider)
  • Album and Image Gallery Plus Lightbox(album-and-image-gallery-plus-lightbox)
  • Audio Player with Playlist Ultimate(audio-player-with-playlist-ultimate)
  • Blog Designer for Post and Widget(blog-designer-for-post-and-widget)
  • Countdown Timer Ultimate(countdown-timer-ultimate)
  • Featured Post Creative(featured-post-creative)
  • Footer Mega Grid Columns(footer-mega-grid-columns)
  • Hero Banner Ultimate(hero-banner-ultimate)
  • HTML5 VideoGallery Plus Player(html5-videogallery-plus-player)
  • Meta Slider and Carousel with Lightbox(meta-slider-and-carousel-with-lightbox)
  • Popup Anything on Click(popup-anything-on-click)
  • Portfolio and Projects(portfolio-and-projects)
  • Post Category Image with Grid and Slider(post-category-image-with-grid-and-slider)
  • Post Grid and Filter Ultimate(post-grid-and-filter-ultimate)
  • Preloader for Website(preloader-for-website)
  • Product Categories Designs for WooCommerce(product-categories-designs-for-woocommerce)
  • Responsive WP FAQ with Category(sp-faq)
  • SlidersPack – All in One Image Sliders(sliderspack-all-in-one-image-sliders)
  • SP News And Widget(sp-news-and-widget)
  • Styles for WP PageNavi – Addon(styles-for-wp-pagenavi-addon)
  • Ticker Ultimate(ticker-ultimate)
  • Timeline and History Slider(timeline-and-history-slider)
  • Woo Product Slider and Carousel with Category(woo-product-slider-and-carousel-with-category)
  • WP Blog and Widgets(wp-blog-and-widgets)
  • WP Featured Content and Slider(wp-featured-content-and-slider)
  • WP Logo Showcase Responsive Slider and Carousel(wp-logo-showcase-responsive-slider-slider)
  • WP Responsive Recent Post Slider(wp-responsive-recent-post-slider)
  • WP Slick Slider and Image Carousel(wp-slick-slider-and-image-carousel)
  • WP Team Showcase and Slider(wp-team-showcase-and-slider)
  • WP Testimonial with Widget(wp-testimonial-with-widget)
  • WP Trending Post Slider and Widget(wp-trending-post-slider-and-widget)

現在これらは著者ごとWordPress.orgから姿を消しており、C2ドメインも閉鎖済みです。ただしすでにインストール済みのサイトには残ったままなので、自分で確認・除去する必要があります。

まず確認 ― 自分のサイトは対象プラグインを使っているか

WP-CLIが使える環境なら、フリート(管理している全サイト)に対して一括でチェックできます。

wp plugin list --field=name | grep -iE "accordion-and-accordion-slider|countdown-timer-ultimate|popup-anything-on-click|sp-faq|sp-news-and-widget|wp-blog-and-widgets|wp-responsive-recent-post-slider|wp-team-showcase-and-slider|wp-testimonial-with-widget|timeline-and-history-slider|featured-post-creative|post-grid-and-filter-ultimate|hero-banner-ultimate|wp-logo-showcase|wp-slick-slider-and-image-carousel|wp-trending-post-slider"

管理画面しか使えない場合は、「プラグイン」→「インストール済みプラグイン」を開き、上のリストにある名前がないか確認してください。「このプラグインは現在WordPress.orgで公開されていません」といった警告が出ているものは、特に要注意です。

いちばん大事な確認 ― wp-config.php が汚染されていないか

ここが今回の事件の肝です。4月8日の強制アップデートは、プラグイン側の通信機能を止めただけで、すでに wp-config.php に注入されたコードは消してくれません。 つまり「自動更新されたから安心」ではなく、起動ウィンドウ(4月6日 UTC 04:22〜11:06のおよそ6時間44分)にコードを踏んでいたサイトは、いまも汚染が残っている可能性があります。

確認方法はシンプルです。wp-config.php を開き、末尾近くにある次の行を探します。

require_once ABSPATH . 'wp-settings.php';

正常なサイトでは、この行が ; できちんと閉じていて、その後ろには自分で書いた設定(define(...) など)しかないはずです。逆に、この行の直後や同じ行の末尾に、見慣れないPHPコード、特に次のような文字列が混ざっていたら汚染を疑ってください。

function_exists / wp_remote_retrieve_body / 295bae89192c32 / 667E54aF292 / HTTP_USER_AGENT

ひとつの目安として、wp-config.php のファイルサイズが想定より約6KB大きい場合は、注入が行われたサインです。

あわせて、偽コアファイルが残っていないかも確認します。

# Webルート直下に偽ファイルがないか(末尾の「s」に注目)
ls -la /path/to/webroot/wp-comments-posts.php

最後に、検索エンジンにだけスパムを見せる「クローキング」が実際に動いていないかのテストです。2つ目のコマンド(Googlebotを装ったアクセス)でだけ casino / crypto / viagra のような単語が出てきたら、クローキングが動いている証拠です。

curl -s -A "Mozilla/5.0" https://あなたのサイト/ | grep -iE "casino|crypto|viagra"
curl -s -A "Googlebot/2.1 (+http://www.google.com/bot.html)" https://あなたのサイト/ | grep -iE "casino|crypto|viagra"

対処法

確認の結果に応じて、対応は次のようになります。

対象プラグインが入っている場合:このプラグイン群は今後一切更新されないため、最終的には完全に削除し、代替プラグインへ移行するのが安全です。「無効化」だけではディスク上にファイルが残るので、必ず「削除」まで行ってください。代替の例として、スライダー系なら MetaSlider や Smart Slider 3、ポップアップ系なら Popup Maker などが定番です。

wp-config.php に注入が見つかった場合require_once ABSPATH . 'wp-settings.php'; 以降の不審なコードを手作業で削除します。あわせて偽ファイル wp-comments-posts.php の削除、wpos-analytics ディレクトリの除去も行います。8か月間アクセスを許していた以上、念のため管理者パスワード・データベースパスワード・認証キー(AUTH_KEY等)の再発行や、不審な管理者アカウントが増えていないかの確認もしておくと安心です。

実害(クローキング)が確認された場合:Google Search Consoleの「セキュリティの問題」「手動による対策」を確認し、清掃後に再審査をリクエストしてください。順位の回復には数週間〜数か月かかることがあります。

仕上げ:無効化版が残した空振りの定期実行(cron)を掃除し、C2ドメインへの外向き通信をブロックしておくと万全です。

# 残骸のcronを削除
wp cron event delete wpos_monthly_cron_hook

# サーバーレベルでC2への通信を遮断(hostsの例)
echo "0.0.0.0 analytics.essentialplugin.com" >> /etc/hosts

なお、強制アップデート後のプラグインは通信機能こそ止まっていますが、解析モジュール自体はコードとして残ったままです。発見者のAustin Ginder氏は、この wpos-analytics モジュールを丸ごと除去した「パッチ版」も公開しています。機能をどうしても残したい事情がある場合は、wpos-analytics/ ディレクトリの削除+メインファイルのローダー関数(Plugin Wpos Analytics Data Starts で検索)の除去という定型作業で自前パッチも可能です。

この事件が突きつけたもの

今回いちばん怖いのは、攻撃の入口が「ユーザーの不注意」ではなかった点です。怪しいプラグインを入れたわけでも、更新をサボったわけでもない。むしろきちんと更新していた真面目なサイトほど、バックドア入りバージョンを受け取ってしまったのです。

背景には、WordPressのプラグイン所有権の「移転」を審査・通知する仕組みが存在しないという構造的な問題があります。買い手の身元も、最初のコミット内容も、レビューを通らずに公開されてしまう。同じ週には別の人気スライダープラグイン(Smart Slider 3 Pro)も更新インフラを乗っ取られており、「2週間で2件のサプライチェーン攻撃」として大きな話題になりました。

私たち制作者・運用者にできる現実的な備えとしては、(1) 使っているプラグインの「作者」と「更新元」を時々気にする、(2) 重要サイトは日次バックアップを取り、いざという時に差分を追えるようにしておく、(3) 検索エンジン向けの挙動も含めてサイトを定期的に外形監視する、あたりが効いてきます。今回のGinder氏も、日次バックアップの差分比較で注入時刻を6時間台まで特定していました。バックアップは「戻すため」だけでなく「調べるため」にも効く、という良い実例です。

まとめ

  • 2026年4月、長年信頼されてきたWordPressプラグイン31本が、所有権移転をきっかけにバックドア入りに改ざんされた。
  • WordPress.orgは31本を永久閉鎖し、通信機能を止める強制アップデートを配布したが、wp-config.php への注入は自動では消えない
  • まずは対象プラグインの有無を確認し、入っていれば削除・移行。wp-config.php の汚染チェックは必須。
  • きちんと運用していたサイトこそ巻き込まれ得る、典型的なサプライチェーン攻撃だった。

「うちのサイトは大丈夫かな?」と少しでも不安に思ったら、まずは上のリストとの照合と wp-config.php の確認から始めてみてください。判断に迷う場合は、お気軽にご相談ください。

出典

本記事は2026年6月時点の公開情報をもとに作成しています。最新の状況は各出典元もあわせてご確認ください。

石井秀幸@WEBデザイナー
WordPress公式『横浜 WordPress Meetup』主宰/株式会社ノクチ基地 取締役/モンゼンクリエイティブ合同会社 代表。WEB制作に関する技術や役立つ情報を発信していきます。10年にわたるWordPress歴を背景に、幅広いアイデアを形にするお手伝いをしています。