Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
drupal-openai-provider-ssrf-cve-2026-13233 — CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF de response-URL / lectura de archivos locales. Upstream no confiable, no el prompt. Reproductor seguro + detecciones. Corregido en 1.1.1/1.2.2. | Kitploit
Herramientas/GitHubGitHub/kuninogu/drupal-openai-provider-ssrf-cve-2026-13233
Análisis de VulnerabilidadesSeguridad WebAprendizaje y Educación
GitHubkuninogu/drupal-openai-provider-ssrf-cve-2026-13233

drupal-openai-provider-ssrf-cve-2026-13233

CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF de response-URL / lectura de archivos locales. Upstream no confiable, no el prompt. Reproductor seguro + detecciones. Corregido en 1.1.1/1.2.2.

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
hace 1 mesAún no revisado

Drupal OpenAI Provider — SSRF / lectura de archivos locales mediante la URL de la respuesta (CVE-2026-13233)

Upstream no confiable: el proveedor que descargó la URL que su propia respuesta le indicaba. Drupal OpenAI Provider (ai_provider_openai) · SSRF (CWE-918) · CVE-2026-13233 · SA-CONTRIB-2026-053

Estado: Divulgación coordinada completa (2026-07-10). Notificado de forma privada al equipo de seguridad de Drupal, corregido y publicado como CVE-2026-13233 / aviso SA-CONTRIB-2026-053 (calificado como Moderadamente crítico). El autor figura como descubridor y desarrollador de la corrección.

Un estudio de un defecto clásico de autorización / validación de entrada en un "punto de conexión" de IA: un proveedor de generación de imágenes por IA descargaba la URL contenida en la respuesta de la API upstream mediante una función de propósito general sin lista blanca de esquemas. En despliegues donde el upstream configurado no es el predeterminado de confianza (trae-tu-propio-endpoint / proxy / gateway auto-alojado / relay comprometido), la respuesta podía apuntar el servidor a file:// o a una dirección interna.

La entrada no confiable que llega al sumidero (sink) es la URL de la respuesta del upstream — no el prompt del usuario.

  • Clase (publicada): SSRF (CWE-918). El SSRF incluía una lectura de archivos locales vía file://; el análisis interno del autor también lo asignó a CWE-73 / CWE-441.
  • Gravedad: Drupal Moderadamente crítico (SA-CONTRIB-2026-053) — una banda media en la escala de Drupal ≈ CVSS Medium; no CVSS Critical/High. Autoevaluación del autor antes de la divulgación: mínimo 3.1 / condicional 5.3 (Medium); los anteriores 6.5 / 7.4 retractados, y la calificación media lo confirmó.
  • Afectado: Drupal OpenAI Provider (ai_provider_openai) < 1.1.1 y 1.2.0–1.2.1 (auditado 1.2.1) en Drupal core 11.2
  • Corregido en: 1.1.1 / 1.2.2 · CVE: CVE-2026-13233 · Aviso: https://www.drupal.org/sa-contrib-2026-053

Lo que se demostró (confirmado) vs. lo que no (no verificado)

Toda la verificación se ejecutó en un sandbox propio, aislado de la red, contra un upstream simulado (mock). La API real de OpenAI nunca se llamó. Los oráculos de fuga eran solo sintéticos.

Confirmado (demostrado dinámicamente):

  • Disparador no administrador → lectura en el servidor de un archivo local elegido por el upstream (ruta arbitraria probada con un marcador único por ejecución; el cuerpo servido es byte a byte igual al marcador; el marcador está presente solo en el contenedor de la aplicación, ausente en el mock — lo que descarta que "el mock devolviera su propio archivo").
  • Lectura de settings.php confirmada por coincidencia de bytes sha256 (35,182 B) — el contenido nunca se imprimió; por lo tanto, las credenciales de la base de datos están dentro del alcance.
  • SSRF HTTP interno: recuperación de la respuesta de un servicio sin puerto público (coincidencia de bytes sin procesar del token interno).
  • Límite de autorización: la misma cuenta recibe 403 en la ruta de configuración de administración (contraste 200-vs-403).
  • Alcance legítimo por HTTP a través de un flujo realista de widget de campo "Generate" configurado por el administrador, por parte de un editor sin permisos de IA.

No verificado (explícitamente no reclamado):

  • Robo de credenciales de metadatos de la nube (IMDS) — mecánicamente plausible desde el mismo sumidero, no intentado.
  • Alcance dinámico del gemelo de la clase base — anulado en este proveedor (código muerto para este objetivo); registrado como una variante de la misma causa raíz para portar la corrección, no como una reclamación separada.
  • Disparo del automatizador pasivo "solo-guardado" — probado, negativo. "Simplemente guardar" no lo dispara.
  • XSS almacenado (confusión de tipo de contenido) y condición de carrera de concurrencia en voz-a-texto — líneas de investigación separadas, no probadas.

No afectado: api.openai.com predeterminado sobre TLS. El ajuste host está controlado por el administrador / config-sync / despliegue — un atacante no administrador en tiempo de ejecución no puede cambiarlo.


Causa raíz y dirección de la corrección (resumen)

La URL de la respuesta se pasaba a una descarga de propósito general que respeta todos los wrappers de flujo de PHP registrados (file, php, http, data, phar, …). response_format tiene como valor predeterminado url, por lo que la rama vulnerable es la ruta predeterminada. file:// es el wrapper de sistema de archivos predeterminado de PHP y no está controlado por allow_url_fopen (una afirmación anterior de "requiere allow_url_fopen" era incorrecta y queda retractada).

Corrija la primitiva, no solo el punto de llamada:

  1. Deje de usar una descarga de propósito general para la recuperación remota; use el cliente inyectado solo-HTTP.
  2. Valide que el esquema sea http/https antes de la solicitud; deshabilite las redirecciones (un 30x puede rebotar a file://).
  3. Defensa en profundidad: rechace hosts resueltos privados / link-local / loopback, o restrinja a los hosts de CDN de imágenes configurados; valide tamaño / tipo de contenido / decodificación de imagen.
  4. Porte la misma corrección a la clase base para que los proveedores hermanos la hereden (de lo contrario, la corrección queda incompleta).
  5. Las pruebas de regresión son primero los casos de denegación: file://…, http://169.254.169.254/…, y una redirección 302→file:// deben ser rechazadas.

Dirección completa: docs/fix-direction.md.


Estructura del directorio

root@kitploit:~
.
├── README.md                          # this file (English, canonical)
├── README_ja.md                       # Japanese mirror
├── SECURITY.md                        # reporting policy + responsible-disclosure disclaimer
├── .gitignore                         # blocks secrets / primary evidence from being committed
├── docs/
│   └── fix-direction.md               # root-cause fix + variant hunt + minimal-diff sketch (EN)
├── reproducer/                        # SAFE reproducer only (sandbox, mock upstream, benign oracle)
│   ├── README.md                      # how to stand up the network-isolated sandbox
│   ├── verdict.md                     # what "success" means: raw-byte match + 200-vs-403 + exit codes
│   ├── mock-openai-server.py          # benign mock; default happy-path PNG, ssrf_demo → file:///etc/hostname only
│   └── docker-compose.yml             # TEMPLATE: isolated Drupal sandbox + mock (you add the vulnerable target)
├── detections/
│   ├── README.md
│   ├── sigma/web-egress-to-internal-after-imagegen.yml
│   ├── sigma/php-sensitive-file-open.yml
│   ├── sentinel/imagegen-egress-correlation.kql
│   └── splunk/imagegen-content-type-mismatch.spl
└── timeline.md                        # disclosure timeline (single source of truth)

La documentación está actualmente en japonés (.ja.md); las traducciones canónicas al inglés son un TODO. Retenido de este repositorio: payloads de armado y cualquier PoC de lectura de archivos llave en mano. El reproducer/ público demuestra el mecanismo del defecto contra un mock usando un único oráculo benigno (/etc/hostname) — sin lectura de ruta arbitraria, sin captura de settings.php, sin IMDS. No es un arma contra sitios en producción. Actualice a 1.1.1 / 1.2.2.


Reproductor seguro

Objetivo: permitir que un investigador confirme la clase del defecto sin proporcionar un exploit para objetivos en producción ni exponer secretos. Todo se ejecuta sin conexión.

  • Aislamiento: docker compose con la aplicación y un upstream mock en una red aislada (--network none para las comprobaciones de primitivas del lenguaje). No se montan credenciales. El mock nunca habla con la API real.
  • Modelo fiel de upstream no confiable: el mock representa "un host que apunta a un proxy/gateway auto-alojado no confiable". Se arma fuera de banda (no a través del prompt) para devolver una URL objetivo sintética — esto codifica el modelo de atacante corregido (el upstream elige la URL, el usuario solo dispara).
  • Solo oráculos benignos:
    • file:///etc/hostname y un marcador único por ejecución escrito solo dentro del contenedor de la aplicación → demuestra que la aplicación leyó una ruta elegida por el upstream (el marcador está ausente en el mock).
    • settings.php verificado por coincidencia de bytes sha256, el contenido nunca se emite → demuestra "credenciales de BD dentro del alcance" sin divulgarlas.
    • Un servicio HTTP interno sin puerto público → demuestra la recuperación de la respuesta SSRF interna con un token sintético.
  • El veredicto es de bytes sin procesar, no HTTP 200: éxito = el cuerpo servido coincide byte a byte con el valor sintético esperado, más un contraste de autorización 200-vs-403. Los códigos de salida son estrictos (0 explotable / 1 condición previa / no reproducido / fallo de limpieza / error). Ver .

Ver reproducer/README.md.


Cronología de la divulgación

Ver timeline.md. Resumen:


Guía de detección

Las detecciones para profesionales están en detections/; el fundamento en docs/detection-engineering.md. En resumen:

  • Correlacione quién disparó la generación de imágenes (auditoría de la aplicación) con egreso anómalo (proxy / EDR) hacia 169.254.169.254 / loopback / RFC1918 en una ventana de tiempo estrecha después de la llamada a la API. No alerte solo por el egreso.
  • Las lecturas file:// nunca tocan la red — detecte aperturas de archivos sensibles por procesos web mediante auditoría de host (auditd/EDR), con línea base para que solo se activen las lecturas fuera de patrón dentro de una solicitud de generación de imágenes.
  • Busque retrospectivamente bytes declarados como image/* cuyos bytes mágicos no son una imagen.
  • La mayoría de las integraciones de IA no registran qué usuario descargó qué URL — agregue un registro de auditoría de descargas {request_id, actor, target_url, scheme, resolved_ip, content_type}. Los registros estándar por sí solos no detectarán esto.

Referencias

  • OWASP Top 10 A10:2021 — Server-Side Request Forgery
  • CWE-918 SSRF · CWE-73 control externo del nombre/ruta de archivo · CWE-441 proxy/relay no intencionado · CWE-610 referencia controlada externamente
  • Wrappers de flujo de PHP (file:// es el wrapper de sistema de archivos predeterminado; no está controlado por allow_url_fopen)
  • Equipo de seguridad de Drupal — divulgación coordinada a través de "Report a security vulnerability" del proyecto
  • Aviso: Drupal SA-CONTRIB-2026-053 — https://www.drupal.org/sa-contrib-2026-053
  • CVE: CVE-2026-13233 (CNA: Drupal.org)

Aviso de seguridad

  • La divulgación está completa (CVE-2026-13233 / SA-CONTRIB-2026-053), por lo que los detalles de producto/versión/código son públicos. Actualice a 1.1.1 / 1.2.2 primero — aún existen sitios sin parchear.
  • El reproducer/ es solo para sandbox y usa oráculos sintéticos. No es un exploit para objetivos en producción y no contiene secretos. No lo ejecute contra sistemas que no posea y para los que no esté autorizado a probar.
  • No se incluyen aquí PoC funcionales de lectura de archivos ni evidencia primaria con secretos — deliberadamente, incluso después de la corrección, mientras existan despliegues sin parchear.

Aviso de divulgación responsable

Toda la investigación fue realizada por el autor en un sandbox propio, aislado de la red, contra un upstream mock — la API real del proveedor nunca fue contactada y ningún sistema de terceros fue probado. El hallazgo se notificó de forma privada primero al equipo de seguridad de Drupal y se publicó solo en sincronía con la corrección y el aviso (SA-CONTRIB-2026-053, CVE-2026-13233); la calificación del proveedor es Moderadamente crítico. Las cifras CVSS del autor son una autoevaluación provisional, no una puntuación oficial, y se mantuvieron deliberadamente conservadoras (sin CVSS Critical/High) — coherentes con la banda media del proveedor. Este material tiene fines defensivos y educativos. Ver SECURITY.md.

Descargar herramienta
2
3
99
reproducer/verdict.md
  • Nota de transparencia: cualquier normalización del entorno (p. ej., corregir el propietario del directorio de archivos del sandbox que una ejecución previa como root dejó sin permiso de escritura) está documentada y afecta solo a la rama guardar/servir, no al sumidero de lectura de archivos en sí. Esto se divulga para que los revisores no lo malinterpreten como una condición previa amañada.
  • FechaEvento
    2026-06-10La revisión estática localiza el sumidero; lectura de ruta fija file:// confirmada dinámicamente
    2026-06-11Lectura de ruta arbitraria + coincidencia sha256 de settings.php + SSRF HTTP interno confirmados
    2026-06-11Alcance en consumidores de producción (ruta interna del automatizador; exfiltración HTTP legítima de FWA)
    2026-06-11Revisión independiente por pares corrige afirmaciones exageradas (modelo de atacante, CVSS, allow_url_fopen); el envío se pone en HOLD
    2026-06/07Elementos de HOLD resueltos; notificado de forma privada al equipo de seguridad de Drupal; el gemelo de la clase base se señala a drupal/ai
    2026-07-10Versiones corregidas 1.1.1 / 1.2.2; aviso SA-CONTRIB-2026-053 y CVE-2026-13233 publicados; el autor figura como descubridor y desarrollador de la corrección