
Joomla 6.1.3 - 高 - リモート - 上書き - メディアマネージャーが残存ファイルを上書き
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-media-override
クラス: 権限の取り残し 到達範囲: リモート
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
CVE-2026-48947 により、webservice の media API は override が設定されている場合に core.edit を要求するようになった。サイトの JSON API は依然として要求していない。デフォルトの Author は com_media に対して core.create を持ち、core.edit は持たない。サイトのディスパッチャは core.create を十分とみなし、管理者用の ApiController をロードする。その後 postFiles() は override をそのまま createFile() に渡す。
標準の Author が、すでにディスク上に存在するファイルを置き換えることができる。訪問者は同じ公開 URL にアクセスし続け、新しいバイト列を受け取る。
| ID | CVE 未採番 |
| クラス | 権限の取り残し / 完全性 |
| 到達範囲 | リモート (デフォルト Author、API トークン不要) |
| CWE | CWE-863, CWE-639 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 製品 | Joomla CMS |
| 影響を受けるバージョン | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2)、サイト com_media JSON API |
| 認証 | デフォルトの Author (グループ 3)。API トークン不要。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
標準の Author としてログインし、すでにサイト上に存在するファイルを置き換える。これは保存されたメディアの改ざん / すり替えであり、サイトの乗っ取りではない。拡張子の拒否リストは変更されていないため、これは .php のアップロードではない。
| 権限 | メソッド / パス | 種類 | ラボで実証済みか推測か |
|---|---|---|---|
| 既存のメディアファイル (ロゴ、記事画像) を上書き | サイト POST /index.php?option=com_media&task=api.files&format=json&path=local-images:/ に JSON override: true | 完全性 | ラボで実証済み。HTTP 200、ディスクの SHA が変化、公開 GET /images/joomla_black.png が JOOMLA-MEDIA-OVERRIDE-WITNESS を含む新しい PNG を配信 |
| その URL を参照し続けているものを改ざん | 同じ公開パス、キャッシュバストなし | 完全性 | 公開バイト列が反転したことはラボで実証済み。images/ 配下の他のアダプタについては推測 |
| 許可された新しいファイルを作成 | override なしの同じ POST | 意図された動作 | Author は com_media に対して core.create を持つ |
| PUT による編集 | 同じタスクへの PUT、パスにファイル名を含む | n/a | ラボで クローズ を実証済み。HTTP 403。putFiles() はすでに core.edit を要求している |
| 名前が存在する状態で override なしで作成 | POST override: false (デフォルト) | n/a | ラボで クローズ を実証済み。HTTP 409、override の POST まで元の SHA は不変 |
.php その他の拒否された種類をアップロード | createFile / isMediaFile の拒否リスト | n/a | クローズと推測。このラボは PNG のみを送信する |
| override 付きで webservice media API を呼び出す | /api/index.php/v1/media/files | n/a | クローズと推測。MediaController::allowAdd は override が設定されている場合に core.edit をチェックする (CVE-2026-48947) |
| Super User / RCE | n/a | n/a | クローズ。Author は Author のまま |
2026-07/08 の JSST の波の後、6.1.3 にピン留めした。Groups API はすでに core.admin を要求している。webservice の media は override 時にすでに core.edit を要求している。内部コントローラは依然として要求していない。
デフォルトの Author は com_media に対して core.create を持ち、core.edit には何も持たない:
{"core.admin":{"7":1},"core.manage":{"6":1},"core.create":{"3":1},"core.delete":{"5":1}}
サイトの Dispatcher は core.create を通過させ、管理者用の ApiController をロードする。その後 postFiles() は:
if (!$this->app->getIdentity()->authorise('core.create', 'com_media')) {
throw new \Exception(Text::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED'), 403);
}
$override = $content->get('override', false);
if ($mediaContent) {
$name = $this->getModel()->createFile($adapter, $name, $path, $mediaContent, $override);
修正済みの webservice (api/.../MediaController.php):
if ($this->input->json->get('override', false)) {
return $user->authorise('core.edit', 'com_media');
}
すでに記録済みの誤った道: PUT を残存権限とみなすこと (PUT はすでに 403)。webservice パスを依然として開いているとみなすこと (CVE-2026-48947 が閉じた)。override なしの 409 を失敗と読むこと (それは意図された存在しない場合の作成パスである)。見せかけ: リバースシェル。オラクルは POST override 200 に加えて PUT 403、そして witness PNG の公開 GET である。
同じピン留めの残存権限: levels API、menu items API、articles catid。
python3 joomla-media-override-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:19540 のみ。イメージは joomla:6.1.3-php8.3-apache と mariadb:11.4。
SUCCESS joomla-media-override post-http=200 override=yes bytes-changed=yes put-http=403 no-edit=yes conflict-http=409 JOOMLA-MEDIA-OVERRIDE-WITNESS
ApiController::postFiles() 内の createFile() の前に、MediaController::allowAdd と同じ override -> core.edit チェックを入れる。PUT は core.edit のままにする。
0f2d4de4729eb951e0878fec98c7990da07915b2)ApiController.php postFilesGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。