
CVE-2026-85097 の検出・検証・インシデント対応ツールキット: リモート Bricksforge 評価、ログ IOC ハンティング、ファイルシステムインプラント監査、さらに Sigma および WAF ルールを提供。
Bricksforge WordPress プラグインにおける未認証の任意ファイルアップロード → RCE
CVE-2026-85097 の検出、検証、インシデント対応ツールキットです。これは WordPress 用の Bricksforge プラグインに存在する CVSS 10.0 の未認証任意ファイルアップロード脆弱性であり、実際に野外で悪用されています。
1つのスクリプト、3つのモード: 対象のリモート評価、悪用の痕跡を求めた過去ログの調査、そして設置されたインプラントを求めた Web ルートの監査。
____ _ _ _ __ ___ _ _
| __ ) _ __(_) | _| | __/ _| ___ _ __ __ _ / _ \ ___| | _| | ___ _ __
| _ \| '__| | |/ / |/ / |_ / _ \| '__/ _` | | | / __| |/ / |/ _ \| '_ \
| |_) | | | | <| <| _| (_) | | | (_| | |_| \__ \ <| | (_) | | | |
|____/|_| |_|_|\_\_|\_\_| \___/|_| \__, |\___/|___/_|\_\_|\___/|_| |_|
|___/
CVE-2026-85097 | Unauthenticated Arbitrary File Upload -> RCE
CVSS 10.0 CRITICAL | Bricksforge <= 3.1.8.9 | Fixed 3.1.8.10
| 項目 | 値 |
|---|---|
| CVE | CVE-2026-85097 |
| 製品 | Bricksforge(WordPress プラグイン、Bricks Builder 用アドオン) |
| 種類 | 未認証の任意ファイルアップロード → リモートコード実行 |
| CWE | CWE-434: 危険な種類のファイルの無制限アップロード |
| CVSS | 10.0 クリティカル: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (ベクターは推定、制限事項を参照) |
| 認証 | 不要 |
| 影響を受けるバージョン | <= 3.1.8.9 |
| 修正済み | 3.1.8.10(報道で言及されたベンダーのリリース系列: 4.0.1) |
| 悪用状況 | 実際の攻撃で活発に悪用中 |
| 初回観測 | 2026-10-07 21:47:17 UTC |
| インストール数 | 約6,000 |
| 観測された送信元 IP | 63 個のユニーク IP(上位 6 件でリクエストの約 46%) |
| 主要エンドポイント | POST /wp-json/bricksforge/v1/form_submit |
| フォールバックエンドポイント | POST /wp-admin/admin-ajax.php(action=bricksforge_form_submit) |
| インプラントの命名 | login_admin_*.php |
[!CAUTION] 許可された用途に限ります。 本ツールは、許可されたセキュリティ評価、防御的 検証、およびインシデント対応のためのものです。所有していない、または書面による 許可を得ていないシステムに対して能動的なテストを実行することは、ほとんどの法域で 違法です。 SAFETY-AND-LEGAL.md を参照してください。
Bricksforge は Bricks Builder に高度なフォーム、
アニメーション、動的データを追加します。その Pro Forms 機能はファイルアップロードを
受け付けます。このプラグインは、ファイルが最初にアップロードされた時点では
MIME タイプを正しく検証しますが、フォームが後で送信された時点では、クライアントが
送信するファイルメタデータを信頼し、temporaryFileUploads パラメータ内の url
フィールドを一切検証しません。
この単一の検証漏れが、無害な画像アップロードを未認証のリモートコード実行に
変えてしまいます。攻撃者にはアカウントも、自身で生成できない CSRF トークンも、
ユーザーの操作も必要ありません。Patchstack は、2026-10-07 21:47:17 UTC から
データセンター、クラウド、VPN、住宅回線のインフラにまたがる 63 個のユニークな
送信元 IP からの悪用を観測しました。
file(MIME チェックが行われたサーバー側のパス)と url(プラグインが書き込み先と
する宛先)が分離されています。プラグインは送信時にクライアントが提供した url
を再読み込みし、ステージングされたバイト列をそこへ書き込みます。
{
"temporaryFileUploads": [
{
"field": "form-field-file",
"file": {
"file": "/var/www/example.com/wp-content/uploads/bricksforge/tmp/img_example.gif",
"url": "https://example.com/wp-content/uploads/bricksforge/tmp/img_example.php",
"type": "image/gif"
}
}
]
}
シグネチャは不一致である: サーバー側のパスは .gif であり、宛先URLは .php である。キャプチャされたリクエストの95%で、サーバー側のパスは .gif または .png で終わっていた。
| ファイル | 役割 |
|---|---|
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/init.php | インジェクションポイント: クライアントから供給されたメタデータ(url を含む)が検証なしでフォームアクションのコンテキストにマージされる。 |
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/base.php | シンク: 信頼されたメタデータが最終的なファイル書き込みを制御するため、攻撃者がディスク上の宛先ファイル名と拡張子を制御できる。 |
| # | ステップ | 観測可能な事象 |
|---|---|---|
| 1 | 未認証のnonceを取得: action=bricksforge_regenerate_nonce を指定して POST /wp-admin/admin-ajax.php を送信。認証は不要で、有効なnonceが返される。 | action=bricksforge_regenerate_nonce を含む admin-ajax.php リクエスト |
| 2 | GIF/PHPポリグロットをアップロード: PHPコードも含む有効な画像。ここではMIME検証が実施されるため、検証を通過して wp-content/uploads/bricksforge/tmp/ に配置される。 | /wp-content/uploads/bricksforge/tmp/ に書き込むマルチパートアップロード |
| 3 | 不一致なメタデータでフォームを送信: file は検証済みの .gif を指し、url は .php で終わる。 | temporaryFileUploads を含む form_submit リクエスト |
| 4 | プラグインが内容をPHPの場所に書き込む → RCE。 そのURLをリクエストすると埋め込まれたコードが実行される: Webシェル、コンテンツ改ざん、データ窃取、永続化。 | アップロードディレクトリ配下に新規作成された .php ファイルへのHTTP GET |
攻撃者は拡張子フィルタを回避する方法を積極的に探っている。4つの系統がある:
| 系統 | サンプル | 意図 |
|---|---|---|
| 代替PHP拡張子 | .php .php5 .php7 .php8 .phtml .pht .phtm .phps | フィルタがブロックしない名前でPHPハンドラに到達する |
| 大文字小文字の操作 | .PHP .Php .pHp .PHTML | 大文字小文字を区別するブラックリストを回避する。Windowsや一部のApache設定では大文字小文字を区別せずに解決される |
| エンコードされた拡張子 | %2ephp .%70hp .%2570%2568%2570 | URLデコード前に検査するフィルタをすり抜けて拡張子を密輸する |
| 改変されたメタデータ | path、name、originalFilename、url の改変または欠落 | プラグインが実際に検証するフィールドを特定する |
このツールは最初の3系統の全18バリエーションを検出する(検証結果を参照)。
Python 3.9+ が必要。依存関係は2つだけで、いずれも一般的なものである。
git clone https://github.com/Masriyan/CVE-2026-85097.git
cd CVE-2026-85097
python3 -m venv .venv && source .venv/bin/activate # optional but recommended
pip install -r requirements.txt
chmod +x bricksforge_checker.py
./bricksforge_checker.py --version
rich はオプションであり、これがなくてもツールはプレーンな ANSI 出力にフォールバックし、ベアホスト上でも動作します。
実行を信頼する前に、検出プリミティブを検証してください:
./bricksforge_checker.py --self-test # 60/60 offline checks
# 1. Read the full intelligence briefing (no network, no target needed)
./bricksforge_checker.py --info
# 2. Passive remote assessment -- Tier 1 + Tier 2, no state change on the target
./bricksforge_checker.py -u https://example.com
# 3. Hunt historical logs for exploitation
./bricksforge_checker.py --mode hunt --logs /var/log/apache2/access.log*
# 4. Audit a web root for dropped implants
./bricksforge_checker.py --mode audit --path /var/www/html --deep-webshell
# 5. Ship detection content to your SIEM / WAF
./bricksforge_checker.py --sigma
./bricksforge_checker.py --waf
scan(リモート評価)段階的にエスカレートする3つのティア。ティア1とティア2は読み取り専用です。ティア2は
temporaryFileUploads パラメータを一切送信しません。
| チェック | 取得元 |
|---|---|
| WordPressコアの検出 | wp-content / wp-includes / generator メタ |
| プラグインバージョン | readme.txt の Stable tag:、bricksforge.php の Version: ヘッダー、changelog.txt、CHANGELOG.md |
| アセットバージョン | ホームページ + 3つの内部ページからスクレイピングした wp-content/plugins/bricksforge/* アセットの ?ver= |
| 有効プラグインの確認 | /wp-json/ ルートインデックス内の bricksforge/v1 名前空間 |
| 依存関係 | Bricks Builderテーマの style.css |
[!IMPORTANT] バージョン比較はセグメントごとの整数タプルで行われ、辞書順では決して行われません。 文字列として比較すると
"3.1.8.10" < "3.1.8.9"はTrueとなり、素朴な実装では パッチ適用済みのすべてのインストールを脆弱と報告してしまいます。これは--self-testでカバーされています。
| プローブ | 解釈 |
|---|---|
空のボディで POST /wp-json/bricksforge/v1/form_submit | 404 = ルート未登録。それ以外 = ハンドラーが存在 |
POST admin-ajax.php action=bricksforge_form_submit | ハンドラーがフックされていない場合、WordPressは素の 0 を返します。-1/JSON/HTML = ハンドラーが実行された |
POST admin-ajax.php action=bricksforge_regenerate_nonce | nonceを返す → 攻撃チェーンのステップ1を確認 |
GET /wp-content/uploads/bricksforge/tmp/ | 200 + リスティング = ステージングディレクトリが公開で列挙可能 |