Resumen

Se han identificado múltiples vulnerabilidades de seguridad en el servidor Docker API de Crawl4AI que afectan a los endpoints de crawling, extracción markdown/IA, capturas de pantalla, PDFs, webhooks, monitorización, ejecución de JavaScript y configuración.

Vulnerabilidades

1. Escritura arbitraria de archivos mediante /screenshot y /pdf (CWE-22, CVSS 9.1)

El parámetro output_path acepta rutas arbitrarias del sistema de archivos sin ningún tipo de validación. Un atacante puede sobreescribir archivos del servidor (DoS) o escribir en cualquier ubicación con permisos de escritura para el usuario appuser.

Corrección aplicada: Se añadió la función validate_output_path() que restringe las escrituras al directorio CRAWL4AI_OUTPUT_DIR (por defecto /tmp/crawl4ai-outputs). Se incorporó un validador de campo Pydantic (field_validator) que rechaza secuencias de traversal ...

2. SSRF mediante URL de webhook (CWE-918, CVSS 8.6)

Las URLs de webhook en los endpoints /crawl/job y /llm/job aceptan IPs internas o privadas sin validación alguna, lo que permite realizar ataques de Server-Side Request Forgery contra endpoints de metadatos cloud (169.254.169.254), servicios internos y redes Docker.

Corrección aplicada: Se añadió la función validate_webhook_url() con una lista de bloqueo para rangos RFC 1918, loopback, link-local, IPs y nombres de host de metadatos cloud. La validación se aplica tanto en el momento de envío del trabajo como en el momento del envío de la petición. Se configuró explícitamente follow_redirects=False.

3. Bypass de autenticación en endpoints de monitorización (CWE-306, CVSS 6.5)

El router de monitorización fue montado sin la dependencia token_dep, lo que dejaba todos los endpoints de monitorización (incluidos los destructivos como /monitor/actions/cleanup) accesibles sin autenticación.

Corrección aplicada: Se añadió dependencies=[Depends(token_dep)] al router de monitorización. Se incorporó una verificación explícita de token en el endpoint WebSocket /monitor/ws.

4. XSS almacenado en el panel de monitorización (CWE-79, CVSS 6.1)

Las URLs y mensajes de error renderizados en el panel de monitorización se inyectaban mediante innerHTML sin escapado previo, lo que permitía XSS almacenado a través de URLs de crawling manipuladas.

Corrección aplicada: Se aplicó html.escape() en el lado del servidor para el almacenamiento de URLs y errores. Se añadió la función escapeHtml() en el lado del cliente para todas las inyecciones de plantilla mediante innerHTML.

5. Ejecución arbitraria de JavaScript mediante /execute_js (CWE-94, CVSS 8.1)

El endpoint /execute_js acepta y ejecuta JavaScript arbitrario en el navegador del servidor con la opción --disable-web-security habilitada, combinando ejecución arbitraria de código con capacidad de SSRF.

Corrección aplicada: El endpoint queda deshabilitado por defecto mediante la variable de entorno CRAWL4AI_EXECUTE_JS_ENABLED. Se añadió la lista de bloqueo SSRF sobre la URL de destino. Se eliminó --disable-web-security de los argumentos por defecto del navegador.

6. Clave secreta JWT hardcodeada (CWE-798, CVSS 9.8)

La clave de firma JWT tiene como valor por defecto "mysecret" en el código fuente público, lo que permite a cualquier persona forjar tokens de autenticación válidos.

Corrección aplicada: Se eliminó el valor por defecto. Se añadió validación en el arranque que rechaza secretos débiles o demasiado cortos. Se genera automáticamente una clave efímera cuando JWT está habilitado pero no se ha configurado ninguna clave.

7. SSRF en endpoints de crawling directo /crawl, /md, /llm (CWE-918, CVSS 8.6)

Los puntos de entrada principales de crawling (/crawl, /crawl/stream, /md, /llm) recuperan URLs arbitrarias proporcionadas por el usuario sin validación del destino, lo que permite SSRF contra servicios internos, redes Docker y endpoints de metadatos cloud (169.254.169.254).

Además, una lista de bloqueo que solo inspeccionaba el nombre de host literal era bypassable mediante direcciones IPv4 mapeadas a IPv6 (por ejemplo, [::ffff:169.254.169.254] o [::ffff:10.0.0.1]), que resuelven a rangos privados o de metadatos bloqueados pero evaden una comprobación de cadena ingenua.

Corrección aplicada: Se añadió validación del destino URL en todos los puntos de entrada de crawling, markdown y IA, reutilizando la lista de bloqueo SSRF (RFC 1918, loopback, link-local, IPs y nombres de host de metadatos cloud). Las direcciones IPv4 mapeadas a IPv6 se normalizan a su forma IPv4 antes de la comprobación, cerrando el bypass por mapeo. Las URLs con esquema raw:// se omiten. La validación se aplica en la entrada de la petición, no únicamente en el momento de la recuperación.

Mitigaciones y soluciones alternativas

  1. Actualizar a la versión parcheada (recomendado).
  2. Configurar CRAWL4AI_API_TOKEN para habilitar la autenticación.
  3. Establecer un valor fuerte para SECRET_KEY (mínimo 32 caracteres) si se utiliza JWT.
  4. Restringir el acceso de red al Docker API.

Créditos

Las vulnerabilidades fueron reportadas por los siguientes investigadores:

  • Jeongbean Jeon: escritura de archivos, SSRF, bypass de autenticación en monitor, XSS almacenado.
  • wulonchia: escritura de archivos mediante output_path (reporte independiente).
  • by111 (August829): JWT hardcodeado, eval en /config/dump, /execute_js, escape del sandbox de hooks.
  • secsys_codex: SSRF en endpoints /md, /crawl, /llm y bypass mediante IPv4 mapeado a IPv6 (validación de destino URL).
  • Velayutham Selvaraj: SSRF por ausencia de validación de host en validate_url_scheme (reporte independiente).
  • IcySun y Yashon: SSRF, escritura arbitraria de archivos, ausencia de autenticación por defecto, bypass del sandbox de hooks mediante asyncio (reporte independiente).