0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tutor LMS(10万サイト)の未認証RCE CVE-2026-19092ほか3件──4.0.9更新と会員登録の確認

0
Posted at

WordPressでオンライン講座・会員制の学習サイトを「Tutor LMS」で運営している方向けの記事です。
2026年8月下旬〜9月に、このプラグインでリモートからのコード実行(RCE)につながる脆弱性が3件公表されました。うち1件はログイン不要でCVSS 9.8、もう1件は受講生アカウントがあれば到達し得るものです。
この記事では「自分のサイトが該当するか」「どう直すか」「すぐ更新できないときに何を止めるか」を、コピペで確認できるコマンド付きでまとめます。

何が起きたのか

Tutor LMS は wordpress.org 公称で 10万サイト以上が有効化している学習管理(LMS)プラグインです。NVD に登録された3件は次のとおりです。

CVE 概要 認証 影響バージョン 修正版 CVSS v3.1
CVE-2026-19092 テンプレート描画時にリクエストの値で内部変数が上書きされ、引数なしのPHP関数を呼び出され得る 不要 4.0.5 以前 4.0.6 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-16759 講座絞り込みのAJAX処理で認可チェックが欠落し、extract() 経由で同種の関数呼び出しが可能 不要 4.0.5 以前 4.0.6 6.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N)
CVE-2026-78175 出金(Withdraw)関連のAJAX処理で権限チェックが不十分で、保存された値が安全でない形で復元される(PHPオブジェクトインジェクション) 購読者以上 4.0.7 以前 4.0.8 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)

ポイントは3つです。

  1. 修正が2段階に分かれている。 4.0.6(2026-08-18)で未認証の2件が、4.0.8(2026-09-10)で CVE-2026-78175 が塞がれました。「8月に更新したから大丈夫」と 4.0.6 / 4.0.7 で止まっていると、1件が残ります。2026-09-17 公開の 4.0.9 が現在の最新で、changelog にもセキュリティ強化が記載されています。
  2. CVE-2026-78175 は「ログインが必要」でも実質的なハードルが低い。 必要なのは購読者(subscriber)権限ですが、LMS は受講生の新規登録を公開していることが多く、フォームから登録するだけで条件を満たせるサイトが少なくありません。報道では収益化(Monetization)機能が有効な構成が前提として挙げられています。
  3. 広範な悪用の報告は現時点で出ていません。 ただし公開済みの脆弱性で、修正差分も公開されているため、更新の遅れがそのままリスクになります。

攻撃の成立条件は上記までにとどめ、再現手順は扱いません。以下は「同じ被害を防ぐ」ための確認と対処です。

1. 自分のサイトが該当するか3分で確認する

バージョンを見る

WP-CLIが使える環境ならこれが最速です(プラグインのスラッグは tutor)。

# 現在のバージョン
wp plugin get tutor --field=version

# 更新可能なプラグイン一覧(まとめて棚卸しする場合)
wp plugin list --update=available --fields=name,version,update_version

判定は次のとおりです。

  • 4.0.5 以下 → 3件すべて該当。未認証RCEが残っているので最優先で対応
  • 4.0.6 / 4.0.7 → CVE-2026-78175 が残っている。会員登録を公開していれば早急に対応
  • 4.0.8 以上 → 3件とも対応済み(最新は 4.0.9)

Tutor LMS Pro などのアドオンを併用している場合は、本体と一緒に更新対象に含めてください。

会員登録が誰でもできる状態か見る

CVE-2026-78175 の「購読者以上」という条件が、実際にどれだけ低いハードルなのかを確認します。

# WordPress本体の「だれでもユーザー登録ができるようにする」(1 = 公開)
wp option get users_can_register

# 新規ユーザーの既定の権限グループ
wp option get default_role

Tutor LMS は独自の受講生・講師登録ページを持つため、WordPress本体の設定が 0 でも登録を受け付けている場合があります。管理画面の Tutor LMS の設定で、受講生登録・講師登録の受付状況と、収益化(Monetization)の有効/無効も併せて確認してください。

2. 対処:更新する

更新前に必ずバックアップを取ります。

# DBとファイルのバックアップ(保存先は公開ディレクトリの外へ)
wp db export ~/backup-db-$(date +%Y%m%d).sql
tar czf ~/backup-files-$(date +%Y%m%d).tar.gz wp-content

そのうえで更新し、バージョンを確認します。

# 最新へ更新
wp plugin update tutor

# 反映確認(4.0.8 以上、できれば 4.0.9 になっていること)
wp plugin get tutor --field=version

講座一覧・講座詳細・受講画面・ダッシュボードが崩れていないかを目視で確認してください。4.0.8 ではダッシュボードの表示オプションが追加されているため、テーマ側でテンプレートを上書きしている場合はステージング環境で先に当てるのが安全です。

3. すぐに更新できないときの一時的な緩和

検証待ちなどで即時更新できない場合の選択肢です。いずれも制限を強める方向の設定で、更新の代替にはなりません。

4.0.5 以下の場合は、未認証で到達できる経路が残っているため、更新できるまでプラグインを一時停止するのが確実です。

# 講座機能は止まるが、未認証の経路は閉じる
wp plugin deactivate tutor

4.0.6 / 4.0.7 の場合は、入口となる新規登録を一時的に閉じます。

# WordPress本体のユーザー登録を閉じる
wp option update users_can_register 0

# 既定の権限グループを最小に保つ(subscriber 以外になっていたら戻す)
wp option update default_role subscriber

Tutor LMS 側の受講生・講師登録も管理画面から一時停止してください。登録を閉じても、すでに存在する購読者アカウントからは到達し得る点には注意が必要です。見覚えのないアカウントが増えていないかは次の節で確認します。

4. すでに踏まれていないかを確認する

RCEの怖いところは、更新しても入られた後の痕跡は消えない点です。該当バージョンだった期間がある場合は、次を確認してください。

# コア・プラグインのファイル改ざん検査
wp core verify-checksums
wp plugin verify-checksums --all

wp plugin verify-checksums は wordpress.org 配布のプラグインのみ検査できます(有料アドオンは対象外)。

# uploads 配下のPHPファイル(本来存在しないはず)を更新日時付きで列挙
find wp-content/uploads -type f -name '*.php' -printf '%TY-%Tm-%Td %p\n'

# 直近に登録されたユーザー(登録日時の新しい順)
wp user list --fields=ID,user_login,user_email,roles,user_registered \
  --orderby=user_registered --order=DESC --number=30

# 身に覚えのない管理者アカウントが増えていないか
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

# 不審な常駐(mu-plugins / スケジュール実行)
ls -la wp-content/mu-plugins/
wp cron event list

CVE-2026-78175 は「ユーザー情報に保存された値」が入口になるため、ユーザーメタにPHPのシリアライズされたオブジェクトが入っていないかも見ておくと安心です。

# ユーザーメタに「O:数字:」形式(シリアライズされたオブジェクト)が含まれる行を列挙
wp db query "SELECT umeta_id, user_id, meta_key FROM $(wp db prefix)usermeta \
  WHERE meta_value REGEXP 'O:[0-9]+:\"' ORDER BY umeta_id DESC LIMIT 50;"

ヒットしても即座に侵害とは限りませんが、Tutor LMS の出金関連のキーや、最近登録されたユーザーに紐づく行があれば要精査です。

アクセスログ側では、admin-ajax.php へのPOSTの偏りを見ます。

# admin-ajax.php へのPOSTを送信元IPごとに集計(nginx)
grep -E '"POST /wp-admin/admin-ajax.php' /var/log/nginx/access.log \
  | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

LMS は正規の受講操作でも admin-ajax.php を多用するため、件数の多さだけで判断せず、未ログインのはずのIPや登録直後のアカウントからの集中を見てください。不審なものが見つかった場合は、その場でファイルを消すより先にバックアップからの復元を検討してください。侵入経路が塞がっていない状態での部分的な削除は、再設置されて終わります。

5. 同じ被害を繰り返さないために

今回のように「修正が2段階に分かれる」ケースは、手動更新の運用だと取りこぼしが起きます。

  • 会員機能を持つプラグインだけでも自動更新を有効にする。 LMS・フォーム・会員サイトなど、外部の人がアカウントを作れる機能は「ログインが必要」な脆弱性でも実質的に外から届きます。
wp plugin auto-updates enable tutor
wp plugin auto-updates status --all
  • 使っていない機能を止める。 収益化や講師登録を使っていないなら、設定で無効のままにしておくことが攻撃面の縮小になります。
  • 脆弱性情報を定点観測する。 IPA の重要なセキュリティ情報や JVN iPedia を週1で見るだけでも、緊急の見落としはかなり減ります。
  • 更新までの時間を埋める仕組みを持つ。 仮想パッチ(サイト固有の弱点に合わせた個別対応)とWAF(全サイト共通の攻撃を一律遮断)は役割が違います。今回のように特定のAJAX処理が入口と分かっている脆弱性では前者が、広く飛んでくる無差別スキャンには後者が効きます。
  • 戻せる状態を保つ。 改ざんの確認は「正常な状態のバックアップ」があって初めて意味を持ちます。

まとめ

  • Tutor LMS(10万サイト)に RCE につながる脆弱性が3件。4.0.7 以下は該当、最新は 4.0.9。
  • 修正は 4.0.6(未認証の2件)と 4.0.8(CVE-2026-78175)の2段階。4.0.6 / 4.0.7 で止まっていると1件残る。
  • CVE-2026-78175 は購読者権限が条件だが、受講生登録を公開していれば実質的に誰でも条件を満たせる。
  • 即時更新できないなら、4.0.5 以下はプラグインの一時停止、4.0.6 / 4.0.7 は新規登録の一時停止。
  • 更新後は wp core verify-checksums、uploads 配下のPHP、直近の登録ユーザーと管理者アカウントを確認する。

出典

関連記事

本記事のような更新の遅れや設定の抜けは、Webサイトを9つの守りでまるごと守るサイトドックでまとめて対策できます → https://sitedock.jp

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?