これはWordPress史上最悪のハックなのか?

BBetter Stack
AI/미래기술경제 뉴스컴퓨터/소프트웨어

Transcript

00:00:00WordPressで一連の脆弱性が相次ぎ発見されましたが、最新のものは非常に深刻で
00:00:04ハッカーが管理パネルを完全に制御できてしまいます。SQLインジェクションや
00:00:09シェルコマンド実行など、かなり危険です。自分には関係ないと思うかもしれませんが、全ウェブサイトの44%以上で
00:00:14WordPressが使われています。日頃利用しデータを渡しているサイトの多くが
00:00:19この脆弱なバージョンのWordPressで動いている可能性があります。仕組みはこんな感じです。
00:00:25ローカルに標準のWordPressをインストールしてあります。まず最初の
00:00:29スクリプトを実行して脆弱性があるか確認すると、レスポンスとして
00:00:34HTTP 207が返り、確かに脆弱であることが分かります。つまり、2つ目のチェックである
00:00:41インタラクティブシェルの起動が可能です。サイトにSQLインジェクションを実行して新しい管理者を作成し
00:00:47悪意のあるプラグインをアップロードすることで、このサイト上の任意のファイルにアクセスできるようになります。
00:00:52では、問題の詳細とその仕組みを詳しく見ていきましょう。
00:00:58こちらのレポジトリでは、脆弱性のあるWordPressサイトにSQLインジェクションを実行する方法が解説されています。
00:01:06対象は6.90〜6.94、または7.00〜7.01です。攻撃は認証不要の
00:01:14エンドポイント「batch v1」の呼び出しから始まります。本来は検証と権限チェックが必要なリクエストをまとめて送る場所です。
00:01:20バッチハンドラには、同期しているはずの「validation」と「matches」という2つの並列配列があります。
00:01:26しかしバグにより、無効なパスが原因で関数 `wp_pass_url_files` が失敗した際、「validation」のみが更新されました。
00:01:33その結果、両方の配列参照に使われる同じインデックスで不整合が生じます。POC(実証コード)はこれを利用しています。
00:01:411つのリクエスト(「v2 post」エンドポイントへのPOST)だけを含むバッチを送信し、それ自体にリクエストボディを持たせます。
00:01:48親リクエストはPOSTとして正常に検証されているため、ボディ内のリクエストはメソッド許可リストをバイパスでき
00:01:56GETリクエストを送信可能になります。内部バッチには存在しない投稿へのGETが含まれており、これが
00:02:02先ほどの非同期状態を引き起こします。WordPressは同じリクエストを `get_items` 関数経由で処理し
00:02:10そこで「author_exclude」フィールドが「author__not_in」にマップされ、脆弱なビルドが文字列としてSQLに埋め込みます。
00:02:18要するに、これら全てが実行される過程でSQLのエスケープが行われません。POCは一連のリクエストを使用し、最終的に「v2 users」へのPOSTで
00:02:25新しい管理者アカウントを作成します。レポジトリではこれら全ステップを詳細に解説しています。最初の5つは事前認証でバグを利用しますが、ステップ6は
00:02:35認証済みユーザーに対する標準的なWordPressの動作(悪意のあるパッケージのアップロード)です。冒頭で述べた通り、これは標準のWordPressです。悪意のあるプラグインを経由して発生する脆弱性ではありません。
00:02:46標準のWordPressをインストールするだけで発生します。まず、このチェック用スクリプトを実行して
00:02:52脆弱性が利用可能か検証します。次に、この `read` コマンドを実行すれば
00:02:57データベースのユーザー名やDB名などの情報を確認できます。また、サイトに対してSQLを実行できるようになるため
00:03:03実際に動作しているデータベースのバージョンなども判明します。しかし、これらはまだ序の口です。本当に最悪なのは
00:03:07悪意のあるプラグインをアップロードできる権限を持った管理者アカウントを実際に作成してしまうことです。今回は
00:03:15「web shell」と呼ばれるプラグインです。これによりサイトのシェルにアクセス可能になり、結果として
00:03:22このウェブサイト上のあらゆるファイルにアクセスできるようになります。この攻撃は動画の前半で解説した手順で行われます。
00:03:27管理者が作成された後、プラグインがアップロードされ、最終的にそのユーザーは削除されます。
00:03:34プラグインの存在や何が起きたのかを隠蔽するためです。被害の深刻さを示すために、別のスクリプトを作成しました。
00:03:38管理者を作成し、そのままシステムに残すスクリプトです。
00:03:40ここにユーザー名とパスワードがあります。ウェブサイトに戻り、`wp-login` のルートにアクセスして、それらの
00:03:47ユーザー名とパスワードを入力してログインすると、管理パネルへの完全なアクセス権が得られます。もし難しく感じても心配いりません。
00:03:54私も理解するのに長い時間がかかりました。今回の一連のエクスプロイトチェーンは恐ろしいほど
00:04:00複雑であり、人間のセキュリティ研究者が単独で発見し組み立てるには数週間、あるいは数ヶ月かかったと言われています。
00:04:05セキュリティ研究者が自力でこのエクスプロイトチェーンを10時間で見つけ出すことは
00:04:10AIなしでは不可能だったでしょう。これは非常に恐ろしいことです。悪意ある攻撃者がボットを使って
00:04:17レポジトリの巡回やURLチェックを行い、脆弱性の出現を待ってAIで記録的な速さで悪用できるからです。
00:04:23Redditのあるユーザーは、発覚からわずか2日後に自分のサイトが侵入されたと語っています。
00:04:27週末にしか更新作業を行わないため、攻撃者はその隙に新しい管理者を作成してログインできてしまいました。
00:04:33このエクスプロイトはバージョン7.0.2で修正されたのでアップデート可能ですが、本当に凄まじい事例です。
00:04:40POC実行に使用したレポジトリと記事はコメント欄に掲載しています。ついでに
00:04:46Better Stackをチャンネル登録して最新の技術ニュースをチェックしてください。楽しんでいただけたなら幸いです。
00:04:50それでは、いつものようにまた次回の動画でお会いしましょう。

Key Takeaway

WordPress 6.90〜6.94および7.00〜7.01に存在するバッチ処理の不整合を突くことで、未認証の第三者がSQLインジェクション経由で管理者権限を取得しサイトを完全制御できるため、バージョン7.0.2への即時更新が必要である。

Highlights

  • WordPressのバージョン6.90〜6.94および7.00〜7.01には、未認証のまま管理者権限を取得できる深刻な脆弱性が存在する。

  • バッチ処理における配列処理の不整合を利用してSQLインジェクションを実行し、新しい管理者アカウントを作成することが可能である。

  • 攻撃者は悪意のあるウェブシェルプラグインをアップロードすることで、サーバー上の全ファイルへアクセスし制御できる。

  • 複雑なエクスプロイトチェーンの発見にはAIが活用されており、従来数週間以上かかっていた解析が短時間で行われた。

  • この脆弱性はバージョン7.0.2へのアップデートによって修正されている。

Timeline

WordPressにおける管理者権限奪取脆弱性の概要

  • 全ウェブサイトの44%以上を占めるWordPressにおいて、管理パネルを完全に制御される脆弱性が発見された。
  • 特定のエンドポイントに対して検証スクリプトを実行すると、HTTP 207レスポンスが返り攻撃可能状態が確認される。
  • 攻撃はプラグイン依存ではなく、WordPress本体の標準機能のみで発生する。

WordPress標準機能に潜む脆弱性により、認証を経ていない外部攻撃者であってもインタラクティブシェルを起動できる。SQLインジェクションを介して管理者アカウントが生成された後、悪意のあるプラグインがアップロードされることで、サーバー内の全ファイルへアクセス可能な状態に陥る。

バッチハンドラにおける配列同期バグとSQLインジェクションの仕組み

  • 攻撃対象はWordPressのバージョン6.90〜6.94および7.00〜7.01である。
  • 未認証エンドポイント「batch v1」の処理中、配列の不整合によってメソッド許可リストがバイパスされる。
  • 「author_exclude」フィールド処理時にSQLのエスケープが行われないため、任意の処理が実行される。

バッチハンドラ内部にある「validation」と「matches」の並列配列において、無効なパス指定時に `wp_pass_url_files` 関数が失敗することで一方の配列のみが更新される。この参照インデックスのズレを利用し、内部POSTリクエストでGETメソッドの検証を回避する。さらに存在しない投稿へのリクエストを通じて `get_items` 関数へ到達し、エスケープされない文字列が直接SQLへ埋め込まれることで、「v2 users」エンドポイントから新しい管理者アカウントが作成される。

ウェブシェルプラグインを用いたサーバー侵入と痕跡消去

  • 作成された管理者アカウントを利用して「web shell」プラグインがアップロードされる。
  • 攻撃者はプラグイン導入後に自身の作成した管理者アカウントを削除し、痕跡を隠蔽する。
  • 生成されたユーザー情報を用いて `/wp-login` からログインすることで、管理パネルへの完全アクセスが成立する。

検証用スクリプトによりデータベース名や実行バージョンなどの情報を直接取得できる。管理者の作成後はウェブシェルプラグインを通じてサーバー上のファイル構造全体へアクセスが拡大する。攻撃チェーンの最後にはアカウント自体の削除処理が組み込まれており、管理者が侵入に気づきにくい仕組みになっている。

AIツールによる攻撃発見の高速化とバージョン7.0.2での修正

  • 研究者が数ヶ月を要する高度なエクスプロイトチェーンの構築が、AIの支援により約10時間で達成された。
  • 公開からわずか2日後に自動ボットによる攻撃を受け、被害に遭った事例が報告されている。
  • 脆弱性は修正済みのバージョン7.0.2へ更新することで解消される。

今回の攻撃手法は極めて複雑であり、人間の研究者単独では長期間の解析を必要とする。AIを活用した自動化ボットにより、リポジトリの巡回から脆弱性の特定、攻撃コードの適用までが超高速化している。週末のメンテナンス遅れを狙った実害も発生しているため、迅速な修正パッチ適用が防衛において決定的な要素となる。

Community Posts

View all posts