このリポジトリは、Croogo CMS における CVE-2026-16219 として追跡されているパス認可の欠陥を文書化し、安全に実証するものです。これは、自分が所有するシステム、または明示的に評価を許可されたシステムをテストする、防御者、メンテナ、学生、研究者を対象としています。
安全境界: 同梱の HTTP 概念実証コードは、リテラルなループバックアドレス
127.0.0.1のみを受け付け、固定された非 Web 宛先/tmp/croogo-cve-2026-16219/に生成された.txtマーカーのみを書き込み、リダイレクトには従わず、明示的なラボの了承なしには実行を拒否します。実行可能なペイロードやリモートターゲットモードは含まれていません。
スナップショット日付: 2026-07-20。
| 項目 | 値 |
|---|---|
| 製品 | Croogo CMS、管理ファイルマネージャー |
| NVD 影響バージョン | 4.0.0~4.0.7 |
| 脆弱性 | CWE-22、パストラバーサル / 不適切なパス制限 |
| NVD CNA CVSS v3.1 | 6.3 Medium |
| 権限 | FileManager を使用できる認証済みアカウント |
| ユーザー操作 | 認証後は不要 |
| 公開情報 | 上流の課題と公開エクスプロイト情報が存在 |
| 修正済みバージョン | 引用したアドバイザリのスナップショットでは特定されていない |
現在のステータスは変更される可能性があります。本番環境での判断を行う前に、docs/references.md の一次情報源を再確認してください。
Croogo は WWW_ROOT/assets のような狭い編集可能ルートを設定します。影響を受けるヘルパーは、Configure::read() ではなく Configure::check() を使用して FileManager.editablePaths を取得します。check() はキーが存在するかどうかを返すだけで、設定されたパスリストは返しません。その結果得られたブール値がパス包含チェックに使用され、意図された認可境界が損なわれます。
File Manager の作成・編集操作はそのチェックを信頼しています。上流のレポートで説明されている条件下では、PHP サービスアカウントが選択した場所に書き込める場合、認証済みの FileManager ユーザーは設定された編集可能ルートの外に書き込むことができます。
データフローについては docs/technical-analysis.md を、堅牢化の指針については docs/remediation.md を参照してください。
.
|-- demo/ Standalone logic demonstration; no Croogo required
|-- docs/ Analysis, lab setup, detection, remediation, references
|-- patches/ Illustrative defense-in-depth patch
|-- poc/ Strictly loopback, text-marker HTTP PoC and cleanup tools
|-- tests/ Guardrail and demo tests
|-- .github/workflows/validate.yml
|-- DISCLAIMER.md
|-- GITHUB_UPLOAD.md
|-- LICENSE
|-- Makefile
|-- SECURITY.md
`-- VERSION
スタンドアロンモデルは、脆弱な CMS を実行したりネットワークリクエストを送信したりすることなく、このバグを説明します:
php demo/path_authorization_demo.php
期待される結果:
Buggy modeled check for outside path: ALLOWED
Safe boundary check for outside path: DENIED
このデモは、オペレーティングシステムの一時ディレクトリの下に一時ファイルを作成し、終了前に削除します。
docs/lab-setup.md に従ってください。アプリケーションを 127.0.0.1 のみにバインドし、Croogo と同じ VM またはコンテナ内に固定マーカーディレクトリを作成します:
sudo install -d -o www-data -g www-data -m 0750 \
/tmp/croogo-cve-2026-16219
使い捨てラボでは、www-data を PHP-FPM または Web サーバーのアカウントに置き換えてください。
自分のラボ内の正規の File Manager リクエストから、完全な Cookie ヘッダーと CakePHP CSRF トークンを取得してください。これらをコミットしないでください。
export BASE='http://127.0.0.1:8080'
export COOKIE='CAKEPHP=lab-session; csrfToken=lab-cookie-token'
export CSRF_TOKEN='lab-request-token'
export LAB_ACK='I_OWN_THIS_LAB'
POC_VALIDATE_ONLY=1 ./poc/croogo_local_poc.sh
./poc/croogo_local_poc.sh
スクリプトは生成されたファイル名と HTTP ステータスを出力します。HTTP リダイレクトや成功レスポンスはそれ自体では証明になりません。Croogo VM またはコンテナの内部からマーカーを検証してください:
sudo ./poc/verify_marker.sh
WWW_ROOT/assets の外にあるマーカーは、認可の失敗を示します。マーカーはプレーンテキストであり、Web 上で実行可能ではありません。
sudo LAB_ACK='I_OWN_THIS_LAB' ./poc/cleanup_marker.sh
unset COOKIE CSRF_TOKEN LAB_ACK BASE
make test
テストは、シェル構文の確認、非ループバック入力と URL 混乱入力の拒否、検証中にシークレットが出力されないことの保証、スタンドアロンモデルの期待される結果の検証を行います。
Configure::read() を使用して設定の取得を修正する。patches/illustrative-hardening.patch のユーティリティパッチと patches/create-file-hardening-example.md のコントローラガイダンスはレビュー支援用であり、公式のベンダー修正ではありません。実際にデプロイされているブランチに対してテストしてください。
このリポジトリは、自分が所有するシステム、またはテストする明示的な書面による許可を得たシステムでのみ使用してください。PoC を公開ターゲット、実行可能なペイロード、永続化、資格情報へのアクセス、破壊的な行為に適合させてはなりません。SECURITY.md と DISCLAIMER.md を参照してください。
MIT。 LICENSE を参照してください。