
This repository documents and safely demonstrates the path-authorization flaw tracked as CVE-2026-16219 in Croogo CMS. It is intended for defenders, maintainers, students, and researchers testing systems they own or are explicitly authorized to assess.
Safety boundary: The included HTTP proof of concept accepts only the literal loopback address
127.0.0.1, writes only a generated.txtmarker to the fixed non-web destination/tmp/croogo-cve-2026-16219/, does not follow redirects, and refuses to run without an explicit lab acknowledgement. It contains no executable payload and no remote-target mode.
Snapshot date: 2026-07-20.
| Field | Value |
|---|---|
| Product | Croogo CMS, Admin File Manager |
| NVD affected versions | 4.0.0 through 4.0.7 |
| Weakness | CWE-22, path traversal / improper path restriction |
| NVD CNA CVSS v3.1 | 6.3 Medium |
| Privileges | Authenticated FileManager-capable account |
| User interaction | None after authentication |
| Public disclosure | Upstream issue and public exploit information exist |
| Patched version | Not identified in the cited advisory snapshot |
Current status can change. Re-check the primary sources in docs/references.md before making production decisions.
Croogo configures a narrow editable root such as WWW_ROOT/assets. The affected helper obtains FileManager.editablePaths with Configure::check() rather than Configure::read(). check() answers whether the key exists; it does not return the configured path list. The resulting Boolean is then used by the path-containment check, undermining the intended authorization boundary.
The File Manager create and edit operations trust that check. Under the conditions described by the upstream report, an authenticated FileManager user can write outside the configured editable root when the PHP service account can write to the selected location.
See docs/technical-analysis.md for the data flow and docs/remediation.md for hardening guidance.
.
|-- 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
The standalone model explains the bug without running a vulnerable CMS or sending any network request:
php demo/path_authorization_demo.php
Expected result:
Buggy modeled check for outside path: ALLOWED
Safe boundary check for outside path: DENIED
The demo creates temporary files under the operating system temp directory and removes them before exiting.
Follow docs/lab-setup.md. Bind the application to 127.0.0.1 only and create the fixed marker directory inside the same VM or container as Croogo:
sudo install -d -o www-data -g www-data -m 0750 \
/tmp/croogo-cve-2026-16219
Replace www-data with the PHP-FPM or web-server account in the disposable lab.
Obtain the complete Cookie header and CakePHP CSRF token from a legitimate File Manager request in your own lab. Never commit them.
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
The script prints the generated filename and HTTP status. An HTTP redirect or success response is not proof by itself; verify the marker from inside the Croogo VM or container:
sudo ./poc/verify_marker.sh
A marker outside WWW_ROOT/assets demonstrates the authorization failure. The marker is plain text and is not web-executable.
sudo LAB_ACK='I_OWN_THIS_LAB' ./poc/cleanup_marker.sh
unset COOKIE CSRF_TOKEN LAB_ACK BASE
make test
Tests confirm shell syntax, reject non-loopback and URL-confusion inputs, ensure secrets are not printed during validation, and verify the standalone model's expected result.
Configure::read().The utility patch in patches/illustrative-hardening.patch and the controller guidance in patches/create-file-hardening-example.md are review aids, not official vendor fixes. Test them against the exact deployed branch.
Use this repository only on systems you own or have explicit written authorization to test. Do not adapt the PoC for public targets, executable payloads, persistence, credential access, or destructive actions. See SECURITY.md and DISCLAIMER.md.
MIT. See LICENSE.