本仓库记录并安全地演示了 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 中危 |
| 权限 | 已认证且具备 FileManager 使用权限的账户 |
| 用户交互 | 认证后无需用户交互 |
| 公开披露 | 存在上游 issue 和公开的漏洞利用信息 |
| 已修补版本 | 所引用的公告快照中未确认 |
当前状态可能会变化。在做出生产决策之前,请重新核对 docs/references.md 中的主要来源。
Croogo 配置了一个受限的可编辑根目录,例如 WWW_ROOT/assets。受影响的 Helper 通过 Configure::check() 而非 Configure::read() 获取 FileManager.editablePaths。check() 仅回答键是否存在,并不返回配置的路径列表。随后,路径包含检查使用了该布尔值,从而破坏了预期的授权边界。
文件管理器的创建和编辑操作信任该检查。在上游报告所述的条件下,当 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 相同的虚拟机或容器内创建固定的标记目录:
sudo install -d -o www-data -g www-data -m 0750 \
/tmp/croogo-cve-2026-16219
在一次性实验室中,将 www-data 替换为 PHP-FPM 或 Web 服务器账户。
从你自己实验室中的一次合法文件管理器请求中获取完整的 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 虚拟机或容器内部验证标记文件:
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
测试用于确认 shell 语法正确、拒绝非回环和 URL 混淆输入、确保验证过程中不打印机密信息,并验证独立模型的预期结果。
Configure::read() 来正确获取配置。patches/illustrative-hardening.patch 中的实用补丁和 patches/create-file-hardening-example.md 中的控制器指引是审查辅助材料,并非官方供应商修复。请针对实际部署的分支对其进行测试。
请仅在自己拥有或已获得明确书面授权测试的系统上使用本仓库。不要将 PoC 改造用于公共目标、可执行载荷、持久化、凭据访问或破坏性行为。参见 SECURITY.md 和 DISCLAIMER.md。
MIT。参见 LICENSE。