HELLBOY3110/cve-2026-16219-croogo-lab

GitHub: HELLBOY3110/cve-2026-16219-croogo-lab

该仓库安全地演示并分析了 Croogo CMS FileManager 中因配置检查函数误用而导致的路径遍历漏洞(CVE-2026-16219),为防御者和研究人员提供漏洞复现、技术分析与修补参考。

Stars: 0 | Forks: 0

# CVE-2026-16219:Croogo FileManager 防御实验 [![安全:仅限环回](https://img.shields.io/badge/safety-loopback%20only-success)](SECURITY.md) [![PoC payload:纯文本](https://img.shields.io/badge/payload-text%20marker-success)](poc/croogo_local_poc.sh) 本仓库记录并安全地演示了在 Croogo CMS 中被追踪为 **CVE-2026-16219** 的路径授权漏洞。它面向防御者、维护者、学生和研究人员,仅供其在自己拥有或获得明确授权评估的系统中进行测试。 ## 状态快照 快照日期:**2026-07-20**。 | 字段 | 值 | |---|---| | 产品 | Croogo CMS,Admin File Manager | | NVD 受影响版本 | 4.0.0 至 4.0.7 | | 缺陷 | CWE-22,路径遍历 / 路径限制不当 | | NVD CNA CVSS v3.1 | 6.3 中危 | | 权限 | 具备 FileManager 权限的已认证账户 | | 用户交互 | 认证后无需交互 | | 公开披露 | 存在上游问题和公开的漏洞利用信息 | | 修复版本 | 在引用的公告快照中尚未确定 | 当前状态可能会发生变化。在做出生产决策之前,请重新查阅 [docs/references.md](docs/references.md) 中的主要来源。 ## 存在的问题 Croogo 配置了一个受限的可编辑根目录,例如 `WWW_ROOT/assets`。受影响的 helper 使用 `Configure::check()` 而不是 `Configure::read()` 来获取 `FileManager.editablePaths`。`check()` 仅返回该 key 是否存在(布尔值);它不会返回配置的路径列表。随后这个布尔值被用于路径包含检查,从而破坏了原本预期的授权边界。 File Manager 的创建和编辑操作信任了这个检查。在上游报告描述的条件下,当 PHP service account 对所选位置具有写权限时,经过身份验证的 FileManager 用户可以在配置的可编辑根目录之外进行写入。 有关数据流向,请参阅 [docs/technical-analysis.md](docs/technical-analysis.md);有关加固指南,请参阅 [docs/remediation.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 ``` ## 最快的安全演示 standalone 模型无需运行易受攻击的 CMS 或发送任何网络请求即可解释此漏洞: ``` php demo/path_authorization_demo.php ``` 预期结果: ``` Buggy modeled check for outside path: ALLOWED Safe boundary check for outside path: DENIED ``` 该演示会在操作系统的 temp 目录下创建临时文件,并在退出前将其删除。 ## 本地 Croogo 实验 PoC ### 1. 准备一个隔离的实验环境 请遵循 [docs/lab-setup.md](docs/lab-setup.md)。将应用程序仅绑定到 `127.0.0.1`,并在与 Croogo 相同的 VM 或 container 内创建固定的标记目录: ``` sudo install -d -o www-data -g www-data -m 0750 \ /tmp/croogo-cve-2026-16219 ``` 在一次性实验环境中,将 `www-data` 替换为 PHP-FPM 或 web-server 账户。 ### 2. 导出实验专用的认证值 从您自己实验室中合法的 File Manager 请求里获取完整的 Cookie 标头和 CakePHP CSRF token。切勿提交它们。 ``` 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' ``` ### 3. 在不发送请求的情况下验证防护措施 ``` POC_VALIDATE_ONLY=1 ./poc/croogo_local_poc.sh ``` ### 4. 发送文本标记请求 ``` ./poc/croogo_local_poc.sh ``` 该脚本会打印生成的文件名和 HTTP 状态。HTTP 重定向或成功响应本身并不能作为证明;请在 Croogo VM 或 container 内部验证标记: ``` sudo ./poc/verify_marker.sh ``` 位于 `WWW_ROOT/assets` 之外的标记证明了授权失效。该标记是纯文本的,无法被 Web 执行。 ### 5. 清理 ``` sudo LAB_ACK='I_OWN_THIS_LAB' ./poc/cleanup_marker.sh unset COOKIE CSRF_TOKEN LAB_ACK BASE ``` ## 测试仓库 ``` make test ``` 测试会确认 shell 语法,拒绝非环回地址和 URL 混淆输入,确保在验证期间不会打印机密信息,并验证 standalone 模型的预期结果。 ## 补救优先级 1. 在部署经过测试的修复程序之前,禁用 Admin File Manager 或将其限制为极少数受信任的管理员。 2. 通过使用 `Configure::read()` 来纠正配置获取方式。 3. 对允许的根目录和候选目录进行规范化(Canonicalize),然后执行具备分隔符感知能力的包含检查。 4. 拒绝提交文件名中的路径分隔符、NUL 字节和不安全的名称。 5. 防止 PHP 写入应用程序源代码和可执行的 webroot 位置。 6. 使用 [docs/detection.md](docs/detection.md) 审查日志和可写位置。 [patches/illustrative-hardening.patch](patches/illustrative-hardening.patch) 中的实用补丁以及 [patches/create-file-hardening-example.md](patches/create-file-hardening-example.md) 中的 controller 指南仅供审查参考,并非官方供应商修复。请在确切的部署分支上对它们进行测试。 ## 道德使用 仅在您拥有或获得明确书面授权测试的系统中使用此仓库。请勿将 PoC 改编用于公共目标、可执行 payload、持久化、凭据访问或破坏性操作。请参阅 [SECURITY.md](SECURITY.md) 和 [DISCLAIMER.md](DISCLAIMER.md)。 ## 许可证 MIT。请参阅 [LICENSE](LICENSE)。
标签:CVE, OpenVAS, PHP, 数字签名, 暴露主机扫描, 漏洞分析, 路径探测, 路径穿越