Skip to content
KitploitKITPLOIT
HerramientasBlog
Log in
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
6hace 2 mesesAún no revisado

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

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

.
├── 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)
Descargar herramienta