
| プラグイン名 | Learnify |
|---|---|
| 脆弱性の種類 | ローカルファイルインクルージョン |
| CVE番号 | CVE-2025-60085 |
| 緊急 | 高い |
| CVE公開日 | 2026-04-25 |
| ソースURL | CVE-2025-60085 |
Learnifyテーマにおける重大なローカルファイルインクルージョン(LFI)脆弱性(≤ 1.15.0) — WordPressサイトオーナーのための即時対応策
2026-04-25 | WP‑Firewallセキュリティチーム
まとめ
Learnify WordPressテーマにおいて、バージョンが≤ 1.15.0のものに影響を与える重大なローカルファイルインクルージョン(LFI)脆弱性が公開されました(CVE-2025-60085)。この問題により、認証されていない攻撃者がウェブサーバーからローカルファイルを含めて表示することが可能になります。報告された脆弱性は高い深刻度(CVSS 8.1)を持ち、大規模に悪用される可能性があり、攻撃者が wp-config.php, 、環境ファイル、または読み取り可能なサーバーサイドファイルなどの機密ファイルを漏洩させることができます。これにより、環境に応じて資格情報の漏洩、データベースの侵害、サイト全体の乗っ取りが発生する可能性があります。.
Learnifyまたはそれを使用しているサイトを運営している場合は、この投稿を注意深くお読みください。脆弱性が何を意味するのか、攻撃者がどのようにそれを悪用するのか、悪用の兆候を検出する方法、推奨する段階的な緩和およびインシデント対応プロセスを説明します。また、攻撃面を即座に減少させるための実用的なWAFルールとサーバーのハードニングガイダンスも示します。.
ローカルファイルインクルージョン(LFI)とは何ですか?
ローカルファイルインクルージョン(LFI)は、ユーザー制御の入力が適切な検証なしにサーバー上のファイルを選択して含めるために使用される場合に発生するウェブアプリケーションの脆弱性の一種です。たとえば、PHPベースのサイトでは、次のようになります:
include($_GET['template']);require_once($_REQUEST['page']);
攻撃者がどのファイルが含まれるかを決定する入力を制御できる場合、任意のローカルファイルを指し示し、サーバーにその内容を読み取って出力させることができます。一般的な結果:
- 秘密の漏洩(データベースの資格情報、APIキー)。.
- さらなる攻撃の準備のための情報収集。.
- 危険なラッパー(php://input、php://filter)を許可する環境や、リモートファイルインクルードが有効な環境では、リモートコード実行(RCE)が可能になる場合があります。.
LFIは、単純なトラバーサル文字列(../../../../)やラッパー技術(php://filter)を使用して、直接のインクルージョンではファイル内容が印刷されないコンテキストで安全にファイルを読み取ることができます。.
このLearnify LFIが危険な理由
このインシデントに関する重要な事実:
- Learnifyテーマのバージョンが≤ 1.15.0に影響を与えます。.
- CVE: CVE-2025-60085.
- 必要な特権:なし(認証されていない)。.
- CVSS: 8.1(高)。.
- 現在、公式のベンダーパッチは利用できません(サイトの所有者は緩和策を適用する必要があります)。.
この特定のLFIが高優先度の問題である理由:
- 認証なし:攻撃者は悪用を試みるために資格情報を必要としません。.
- 自動化が容易:LFIチェックは、数千のサイトにわたって自動スキャナーによって実行できます。.
- 敏感なターゲットファイル:WordPressはデータベースの資格情報とソルトを保存しており、
wp-config.php, このファイルは主要なターゲットとなります。. - チェイン可能性:LFIは他の誤設定(弱いファイル権限、書き込み可能なプラグイン/テーマディレクトリ、危険なPHPラッパー)と連携してRCEや永続的なバックドアのインストールにエスカレートできます。.
これらの要因により、脆弱なLearnifyバージョンを実行しているサイトは直ちに行動を起こすべきです。.
技術的詳細(攻撃者が通常LFIを悪用する方法)
正確な脆弱なパラメータ名はテーマのバージョンによって異なる場合がありますが、LFIの悪用パターンは一般的なステップに従います。以下に、攻撃者が使用する一般的な方法を説明します — それを認識し、防御するために。.
- エントリーポイントの特定
– 攻撃者は、呼び出すテーマファイルを探します含む,テンプレートやその他のリソースを読み込むために,ファイルの内容を取得する, 、またはGET/POST/cookie値に影響を受ける変数を持つ類似の関数。.
– リスキーなパターンの例:include( $theme_dir . '/' . $_GET['tpl'] ); - パストラバーサル
– 攻撃者はトラバーサルシーケンスを含むペイロードを送信します:
–../../../../etc/passwd
–../../../../wp-config.php
– 多くのサーバーは、バイナリファイルを含める際にエラーを返すことでファイルの読み取りを防ぎます。攻撃者はその後、ラッパーを使用します。. - ファイルを読み取るためのラッパーの使用(一般的な技術)
–php://filter/convert.base64-encode/resource=path/to/file— ファイルを含めるときにbase64エンコードするフィルターを適用し、レスポンスで印刷可能にします。.
– 例のペイロード:
–?tpl=php://filter/convert.base64-encode/resource=../../../../wp-config.php - ヌルバイトとエンコーディングトリック
– 古いPHPおよびサーバー設定では、攻撃者がヌルバイト(%00)切り捨てを使用してサフィックスチェックを回避することがあります。多くの最新バージョンはこれを軽減していますが、自動スキャンでは依然として一般的なペイロードです:
–?tpl=../../../../wp-config.php - ポストエクスプロイト手順
– wp-configの資格情報が見つかった場合、攻撃者はそれを使用してデータベースにアクセスしたり、管理者ユーザーを作成したり、バックドアをアップロードしたり、追加の秘密を抽出したりします。.
– ファイルアップロードがアクセス可能でサニタイズされていない場合、攻撃者はPHPシェルをアップロードしてRCEを取得する可能性があります。.
責任ある開示により、Learnifyテーマのインクルージョンロジックがユーザー提供のパスを適切にサニタイズできなかったことが指摘され、上記の技術が可能になりました。.
探すべき例の指標と悪意のあるリクエストパターン
これらのパターンを含むリクエストについて、ウェブサーバーログとWAFログを確認してください:
php://filter/convert.base64-encode/resource=....または../繰り返し(パストラバーサル)%00またはヌルバイトエンコードされた試行- 異常なクエリ文字列を持つテーマPHPファイルへのリクエスト
?tpl=...または?page=...(テンプレートを選択するように見えるパラメータを確認してください) - レスポンス内の長いbase64文字列(ファイル内容がエンコードされて返されることを示します)
サンプルの疑わしいリクエストライン:
GET /wp-content/themes/learnify/somefile.php?template=php://filter/convert.base64-encode/resource=../../../../wp-config.php HTTP/1.1
このパターンを見た場合は、高優先度として扱い — 直ちに隔離して調査してください。.
即時対応チェックリスト(最初の数時間に何をすべきか)
Learnify ≤1.15.0を使用しているサイトを運営している場合は、すぐに以下のアクションを実行してください:
- サイトをメンテナンスモードに切り替える(可能であれば)か、一時的なアクセス制御(IP許可リスト)を適用して露出を減らします。.
- クリーンなテーマ(WordPressのデフォルト)に切り替えるか、脆弱なテーマを公開ディレクトリから削除します。脆弱なテーマをアクティブのままにしないでください。.
- パッチが適用されたテーマのバージョンが公開された場合は、すぐに更新を適用してください。公式のパッチがまだ存在しない場合は、以下の緩和策を進めてください。.
- トラバーサルシーケンスやラッパーの使用を含むリクエストをブロックするためにWAFルールを設定します(「WAFルール」セクションの例のルールを参照)。.
- WordPressデータベースのパスワードと、保存されている可能性のあるサービス認証情報を変更します
wp-config.phpおよび他の設定ファイル — ただし、バックアップと整合性チェックを確認した後にのみ、侵害が持続する可能性があるため。. - 修復後に
wp-config.php秘密鍵とソルトをローテーションします。. - ウェブシェル、疑わしいファイル、変更されたタイムスタンプのためにサイトをスキャンします。.
- 侵害を検出した場合は、確認済みのクリーンバックアップから復元します。.
- 監視を強化します:ファイル整合性監視、監査ログ、およびアラートを有効にします。.
すべてのステップを実行する技術的能力がない場合は、ホスティングプロバイダーまたはセキュリティチームに連絡し、見つけたインジケーターを提供してください。.
サイトが悪用されたかどうかを検出する方法
脆弱性を閉じた場合でも、以前に悪用されたかどうかを確認する必要があります。.
確認事項:
- 新しいまたは変更されたファイルが
wp-content/アップロード,wp-コンテンツ/テーマ,wp-content/プラグイン, または他の予期しない場所。. - WordPressの新しい管理者ユーザー(確認してください)
wp_ユーザーテーブル)。. - 疑わしいスケジュールされたタスク(cronジョブ)やデータベース内の不正なcronエントリ。.
- サーバーから未知のIPへのアウトバウンド接続(ファイアウォール/ホストログを確認)。.
- 予期しない高いCPU/IO使用率やトラフィックの急増。.
- スロークエリログにおける異常なデータベースクエリや、以前に見たことのないアカウントを使用したクエリ。.
- 不明なPHPファイルや含まれているエンコードされたスクリプト。
評価,ベース64_デコード、 またはgzinflate.
推奨ツール:
- サーバーレベルのファイル整合性チェック(トリップワイヤー方式)。.
- WordPressセキュリティスキャナー(コードレベルのスキャンとヒューリスティックを提供するものを優先)。.
- ファイルとデータベースコンテンツの完全なマルウェアスキャン。.
- 重要なファイルの手動レビュー(wp-config、.htaccess、プラグイン/テーマフォルダ内のindex.php)。.
侵害の証拠を見つけた場合は、次のセクションのインシデント対応手順に従ってください。.
インシデントレスポンス:ステップバイステップのプレイブック
侵害を確認した場合は、次のように進めてください:
- コンテイン
– サイトをオフラインにするか、さらなる損害を防ぐためにトラフィックをブロックします。.
– 侵害された資格情報とAPIキーを取り消します。.
– 可能であれば、サーバーをネットワークから隔離します。. - 証拠を保存する
– ログ(ウェブサーバー、データベース、アプリケーションログ)とディスクイメージをバックアップします。.
– ログを上書きしないでください — 法医学的分析のためにタイムスタンプを保持します。. - 撲滅
– 発見されたすべてのバックドア、シェル、および悪意のあるスクリプトを削除します。.
– クリーンなソースからWordPressコア、プラグイン、およびテーマを再インストールします。.
– サーバーレベルの持続性が疑われる場合は、イメージからサーバーを再構築します。. - 回復する
– クリーンバックアップから復元する(侵害前に取得されたもの)。.
– 利用可能なすべてのセキュリティパッチと強化策を適用する。.
– すべてのパスワードを変更し、キーとソルトをローテーションする。. - 回復後
– 監視とログ記録を強化する。.
– 事後分析を行う:侵害はどのように発生したのか? どのコントロールが失敗したのか?
– チームを教育し、インシデント対応計画を更新する。. - 通知する
– 利害関係者、ホスティングプロバイダー、必要に応じてお客様や規制当局に通知する。.
LFIリスクを減少させるための強化推奨事項
即時の緩和策を講じた後でも、これらの長期的な防御策を採用する:
- 最小権限の原則
– ファイルとディレクトリの権限が最小限であることを確認する。ほとんどのWordPressファイルはウェブサーバーによって読み取り可能であるべきだが、書き込みはできない、ただしwp-content/アップロードアップロードのためにのみ書き込みアクセスが必要なものを除く。.
– WordPressによって使用されるデータベースアカウントは、必要な権限のみを持つべきである。. - PHP設定
– 無効にするallow_url_include.
– 可能であれば未使用のラッパーを無効にする。.
3. REST APIエンドポイントの場合:open_basedirPHPのディレクトリへのアクセスを制限するため。.
– 無効にするexec,shell_exec,passthru,systemremove_shortcode('su_box');. - 組み込みのプラグインとテーマエディタを無効にする
– 追加するwp-config.php:
'DISALLOW_FILE_EDIT' を true で定義します。
'DISALLOW_FILE_MODS' を true で定義します。// WP管理からのプラグイン/テーマのインストール/更新を制限する - 1. セキュアなアップロード
2. – サーバールールを追加してPHPファイルの直接実行を防ぐ(以下の例 .htaccess/nginx ブロックを参照)。wp-content/アップロード3. 強力でユニークなソルトとキーを使用する(修正時にローテーション)。. - 4. – キーを変更すると、アクティブな認証クッキーが無効になります — インシデント後に便利です。
5. – 定期的にオフサイトでバックアップを保持し、復元を定期的にテストします。. - 定期的なバックアップと復元テスト
6. ステージングアップグレードとコードレビューを使用する. - 7. – アクティブに開発中のテーマ/プラグインについては、サードパーティのコードをレビューするか、セキュリティポスチャーが確認されるまで使用を制限します。
8. 公式パッチがまだ利用できない場合、仮想パッチ(WAF)は時間を稼ぐことができます。以下は、一般的なWAFシステムで使用できる例のルールまたはウェブサーバーレベルの制御です。注意深く適応し、テストしてください — 不正確なルールは正当なトラフィックをブロックする可能性があります。.
実用的なWAFルールとサーバーレベルの緩和策
9. ブロックするための重要なパターン検出:.
10. 含まれる任意のパラメータ値
- 11. 複数のパラメータを含む任意のパラメータ
php://filter - 12. ヌルバイトの試行
../シーケンス - 13. 機密ファイル名を持つファイルを含めようとする試行(
%00 - 14. 例 ModSecurity/Core ルール言語(CRS)スタイルのルール:
wp-config.php,.env,/etc/passwd)
15. # 一般的なLFI攻撃シグネチャをブロック
SecRule REQUEST_URI|ARGS|ARGS_NAMES|REQUEST_HEADERS "@rx (?i)((\.\./)|(\.\.\\)|php://filter|phpfilter||/etc/passwd|wp-config.php)" \"
"id:1009001,phase:1,deny,status:403,log,msg:'潜在的なLFI試行がブロックされました',severity:2,tag:'LFI',tag:'OWASP_TOP_10_A03'"
16. php://filterまたはトラバーサル試行を拒否するためのNginxのロケーションベースのルール:
Apache .htaccess 17. if ($request_uri ~* "(php://filter||\.\./){1,}") {
return 403;
より微妙なアプローチ:疑わしいリクエストのみをブロックし、安全なものを許可します。運用環境に適用する前に、ステージングでルールをテストします。.
WP‑Firewallがどのように支援するか(管理されたファイアウォール + 緩和)
WP‑Firewallでは、テーマやプラグインに脆弱性が発見されるという前提で運営しています。最も迅速で、最も影響の少ない保護は、管理されたWAFを介した仮想パッチで、リアルタイムで攻撃の試みをブロックしながら、恒久的な修正を計画し適用します。.
我々が提供し推奨するコア保護:
- 新しい情報に応じて自動的に更新される管理されたWAFルール — 攻撃ペイロードをブロックします(php://filter、トラバーサルシーケンス、取得を試みる
wp-config.php)PHPに到達する前に。. - マルウェアスキャンとシグネチャ検出により、攻撃の試みの直後にウェブシェルや疑わしい変更を検出します。.
- 予期しないファイル変更を検出するためのファイル整合性監視と毎日のスキャン。.
- インシデントアラートとサポートにより、発見をトリアージし、緩和策を実施するのを支援します。.
- テーマに公式なパッチがない場合でも、リスクを軽減しながら運用を続けることができる仮想パッチ機能。.
即時の仮想パッチを上記のサーバー強化手順、資格情報のローテーション、および継続的な監視の実施と組み合わせることをお勧めします。.
サンプル検出正規表現とログ分析のヒント
ウェブサーバーログを監視し、これらのパターンに対してアラートを実装します:
おそらくLFIプローブを検出するための正規表現(大文字と小文字を区別しない):
(?i)(phpフィルター|php://filter|(\.\./){2,}|(\.\.\\){2,}||wp-config\.php|/etc/passwd)
アラートをトリガーするログエントリ:
- GET /wp-content/themes/learnify/… ?…=php://filter/convert.base64-encode/resource=../../../../wp-config.php
- 使用されるリクエスト
php://ラッパー - base64エンコードされた文字列で200を返すリクエスト — HTMLページ内のbase64は、ファイルコンテンツの読み出しの指標であることがよくあります。.
これらのパターンを日々スキャンする自動ジョブを設定し、管理者に通知します。.
脆弱性をチェックするための安全なテストの例(サイトの所有者のみ)
あなたがサイトの所有者であり、Learnifyのインストールが脆弱かどうかをテストする必要がある場合は、この安全な読み取り専用チェック手順に従ってください。他人のサイトを悪用しようとしないでください。.
- 非破壊的な
php://filterリクエストを使用して、認識されたファイルを単にbase64エンコードしようとします(例:,readme.htmlテーマディレクトリ内)。. - 次のようなリクエストを構築します:
GET /wp-content/themes/learnify/index.php?tpl=php://filter/convert.base64-encode/resource=inc/readme.html
- 応答にファイルコンテンツにデコードされるbase64文字列が含まれている場合、そのテーマの関数はインクルージョンパターンの誤用に対して脆弱です。テストを停止し、緩和策に進んでください。.
重要: あなたが所有または運営するサイトでのみテストしてください。他の人のサイトでテストを行わないでください。.
修正決定ツリー:更新 vs 一時的な緩和 vs 削除
- 公式のパッチが適用されたテーマが利用可能な場合:すぐに更新し、その後検証チェックリスト(ファイル整合性スキャン、パスワードのローテーション)に従ってください。.
- 公式のパッチが存在しない場合:
- テーマをアクティブな使用から削除します(デフォルトテーマに切り替えます)。.
- 悪用の試みをブロックするためにWAFルールとサーバー制限を適用します。.
- テーマベンダーとタイムラインについて協力するか、維持管理されている代替テーマに置き換えることを検討してください。.
- ビジネス上の理由でテーマを削除できない場合:
- 管理アクセスのためにサイトを厳格なアクセス制御(IPホワイトリスト)の背後に置きます。.
- 厳格なWAFルールを適用し、最小限の機能のみを許可します。.
- 専用の監視と頻繁な整合性スキャンをスケジュールします。.
修正後:検証と監視
修正を適用した後、環境を検証します:
- 自動スキャナーを再実行します。.
- 予期しない管理者アカウントやスケジュールされたタスクが存在しないことを確認します。.
- 予期しないネットワーク接続やDNSの変更を確認します。.
- バックアップを確認して、侵害の初期兆候を探します(バックアップがクリーンであることを確認してください)。.
- 修正後、少なくとも30日間は監視を強化し続けます。.
よくある質問(FAQ)
- Q: LFIはリモートコード実行につながる可能性がありますか?
- A: LFI自体はファイルインクルージョン/読み取りの脆弱性です。攻撃者が制御できるファイル(例:アップロードされたPHPファイル)を含めることができる場合や、LFIを他の誤設定(書き込み可能なディレクトリ、危険なラッパー、または悪意のあるプラグイン)と連鎖させることができれば、RCEが可能になるかもしれません。.
- Q: 私のサイトはLearnifyの子テーマを使用しています — 影響を受けますか?
- A: 可能性があります。子テーマは親テーマからコアコードを継承します。脆弱なロジックが親テーマのコードに存在し、親テーマがLearnify ≤1.15.0である場合、影響を受ける可能性が高いです。親テーマのバージョンを確認し、緩和策を適用してください。.
- Q: テーマをパッチしました — それでも資格情報をローテーションする必要がありますか?
- A: はい。サイトが露出した可能性がある場合は、サイトで使用されているキー、データベースパスワード、およびAPIトークンをローテーションしてください。パッチは将来の悪用を防ぎますが、以前に発生した侵害を取り除くものではありません。.
- Q: 将来、同様の脆弱性について通知を受けるにはどうすればよいですか?
- A: 信頼できるセキュリティフィードに登録し、WAFシグネチャとマルウェアスキャナーを最新の状態に保ってください。インストールされたテーマやプラグインの自動脆弱性監視を実装してください。.
今日からサイトを保護し始めましょう — 無料プランあり
上記の技術的修正手順を実行している間に、簡単で即時の保護層を望む場合、当社の管理された無料プランはWordPressサイトに必要な防御を提供します。無料プランには、仮想パッチを備えた管理されたファイアウォール、Webアプリケーションファイアウォール(WAF)、マルウェアスキャン、無制限の帯域幅保護、およびOWASPトップ10リスクの緩和が含まれています。サインアップは簡単で迅速で、数分以内に攻撃の試みをブロックし始めることができます。.
アップグレードオプション:自動マルウェア削除、IPのブラックリスト/ホワイトリスト、月次セキュリティレポート、および企業や代理店向けの高度な管理サービスを追加する手頃な有料プランも提供しています。複数のサイトを運営している場合や、積極的な修正サポートが必要な場合は、当社の上位プランが完全な管理されたセキュリティアプローチを提供します。.
WP‑Firewallセキュリティ専門家からの最終的な考え
このLearnify LFIの開示は、任意のテーマやプラグインが重大な脆弱性を引き起こす可能性があることを思い出させるものです。このようなインシデントに対応する際の最も重要な側面は、迅速さと完全性です:
- 緩和策を適用する速度(仮想パッチと一時的な削除)。.
- 調査の完全性(攻撃者は何かを取得したか?何がアクセスされたか?)。.
- 長期的な改善(強化、監視、最小特権)。.
仮想パッチを管理し、WordPressのフリートに対して継続的な検出と対応を提供できるパートナーが必要な場合、WP‑Firewallのマネージドサービスはまさにそれを実現するために設計されています — リアルタイムでトラフィックを保護し、ポストエクスプロイトインジケーターをスキャンし、最小限のビジネス中断で回復を支援します。.
複数のWordPressサイトを管理している場合は、今がテーマの在庫を見直し、バージョンを確認し、上記の手順を適用する時です。特定のインジケーターのトリアージに助けが必要な場合、詳細な修復ガイドを公開し、迅速な支援を必要とする顧客にサポートを提供しています。警戒を怠らず、LFIプローブを潜在的に深刻なものとして扱ってください — 攻撃者はこれらのチェックを自動化しており、悪用可能なサイトは実際にリスクにさらされています。.
付録A:クイックチェックリスト(コピー/ペースト)
- Learnify ≤ 1.15.0 がインストールされているか確認します。.
- 別のテーマに切り替えるか、Learnifyを無効にします。.
- php://filterおよびパストラバーサルの試行をブロックするWAFルールを適用します。.
- ウェブシェルと不正なファイル変更をスキャンします。.
- DB資格情報とWPソルトをローテーションします。.
- 妥協が検出された場合は、クリーンバックアップから復元します。.
- ファイル権限の強化を実施します。.
- ファイル整合性の監視とアラートを有効にします。.
- 修復後30日間ログを監視します。.
付録B:追加のリソースと参考文献
- CVE-2025-60085(公開アドバイザリ参照)
- PHP強化のベストプラクティス
- WordPressセキュリティハンドブック(サイト管理者ガイド)
- WAF調整とルールテストガイド
(特定のWAFルールの実装や、環境での安全な脆弱性スキャンの実行に関して支援が必要な場合、WP‑Firewallのセキュリティチームが支援できます。私たちは、すべてのサイズのサイトに合わせたセルフサービスとマネージドオプションの両方を提供しています。)
セキュリティを真剣に考えていただきありがとうございます。上記の手順について質問がある場合や、あなたのサイトに特有のガイダンスが必要な場合は、WP‑Firewallサポートに連絡するか、無料プランにサインアップして即時の管理された保護を受けてください: https://my.wp-firewall.com/buy/wp-firewall-free-plan/
