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 防御实验
[](SECURITY.md)
[](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, 数字签名, 暴露主机扫描, 漏洞分析, 路径探测, 路径穿越