Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Gitlab-CVE-2026-19478 — Laboratorio de exploit dockerizado y script para CVE-2026-19478, una inyección de código GraphQL crítica no autenticada en GitLab que permite llamadas arbitrarias a métodos Ruby, eliminación de proyectos y exfiltración de datos. | Kitploit
Herramientas/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de Seguridad de APIsPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHub
punitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

Laboratorio de exploit dockerizado y script para CVE-2026-19478, una inyección de código GraphQL crítica no autenticada en GitLab que permite llamadas arbitrarias a métodos Ruby, eliminación de proyectos y exfiltración de datos.

Ver Repositorio
41hace 1 mesAú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

CVE-2026-19478 — Inyección de directiva @gl_introduced en GraphQL de GitLab

Inyección remota de código sin autenticación mediante directiva GraphQL en GitLab CE/EE — Eliminar cualquier proyecto público con una sola petición HTTP

Un laboratorio práctico de pruebas de penetración que reproduce CVE-2026-19478, una vulnerabilidad crítica (CVSS 9.4) en la API GraphQL de GitLab. La directiva @gl_introduced permite a atacantes no autenticados ejecutar métodos Ruby arbitrarios sobre objetos del lado del servidor — incluyendo la eliminación de proyectos, la exfiltración de datos y la transferencia de propiedad — sin necesidad de autenticación.

Este laboratorio ejecuta una instancia real y vulnerable de GitLab CE 19.2.0 en Docker para practicar la explotación de forma realista.

Tabla de contenido

  • Resumen de la vulnerabilidad
  • Cómo funciona el exploit
  • Diagrama de flujo del ataque
  • Configuración del laboratorio
  • Guía de explotación
  • Uso del script de exploit
  • Detección e indicadores de compromiso
  • Remediación
  • Referencias
  • Aviso legal
  • Conéctate con nosotros

Resumen de la vulnerabilidad

CampoValor
ID de CVECVE-2026-19478
Puntuación CVSS9.4 (Crítico)
ProductoGitLab Community Edition (CE) / Enterprise Edition (EE)
Tipo de vulnerabilidadInyección de código / Ejecución arbitraria de métodos (CWE-94)
Vector de ataqueRed (Remoto)
AutenticaciónNo requiere autenticación
Interacción del usuarioNinguna
Complejidad del ataqueBaja
Versiones afectadas18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
Versiones parcheadas18.11.11, 19.0.8, 19.1.6, 19.2.4
Descubierto porhiimguardian (vía HackerOne)
Fecha del parche17 de agosto de 2026

Impacto

Un atacante remoto no autenticado puede:

  • Eliminar permanentemente cualquier proyecto público
  • Exfiltrar datos internos, tokens de administrador y secretos
  • Modificar la visibilidad, la propiedad y los ajustes del proyecto
  • Ejecutar métodos Ruby arbitrarios en el modelo Project del servidor
  • Archivar o transferir proyectos sin autorización

Cómo funciona el exploit

La directiva @gl_introduced

GitLab utiliza una directiva GraphQL personalizada @gl_introduced(version: "X.Y") para soportar despliegues continuos. Cuando una versión más reciente de GitLab añade un campo a la API GraphQL, las instancias más antiguas gestionan las consultas que hacen referencia a esos campos nuevos de forma elegante, devolviendo null en lugar de un error.

La ruta de código vulnerable

Archivo: lib/gitlab/graphql/version_filter/future_field_fallback.rb (Líneas 14-36)

Desglose paso a paso:

  1. FutureFieldFilter escanea las consultas GraphQL entrantes. Cuando un campo tiene @gl_introduced(version) con una versión más reciente que la del servidor actual, elimina el campo y establece context[:contain_future_fields] = true.

  2. IntroducedTracer restaura el documento de consulta original en el momento de la ejecución, volviendo a colocar los campos eliminados en el AST.

  3. FutureFieldFallback#get_field intercepta todas las búsquedas de campos durante la ejecución. Comprueba tres condiciones:

    • ¿Está establecido el indicador contain_future_fields? ✅
    • ¿Está el campo ausente del esquema? ✅
    • ¿El nombre NO comienza por __? ✅
    • ¿Es seguro el nombre del campo? ❌ ¡No existe ninguna comprobación!
  4. Cuando las tres comprobaciones se cumplen, sintetiza un nuevo GraphQL::Schema::Field sin clase de resolver.

  5. En graphql-ruby, un campo sin resolver se resuelve llamando a object.public_send(field_name) sobre el objeto Ruby subyacente, convirtiendo el nombre de campo del atacante en una llamada a un método arbitrario en el modelo Project de ActiveRecord.

El parche (19.2.4+)

El parche de GitLab reemplaza el envío implícito de métodos por un NilResolver explícito que devuelve nil incondicionalmente, preservando la compatibilidad con los despliegues continuos y eliminando la ejecución arbitraria de métodos:

# BEFORE (vulnerable) — no resolver → method dispatch
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type)
# → object.public_send(field_name) ← ARBITRARY METHOD CALL

# AFTER (patched) — explicit NilResolver
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type,
  resolver_class: NilResolver)  # ← always returns nil

Diagrama de flujo del ataque

                    ATTACKER (unauthenticated)
                              │
                              │  POST /api/graphql
                              │  { project(fullPath: "victim/repo") {
                              │      name
                              │      destroy @gl_introduced(version: "99.0")
                              │  }}
                              │
                              ▼
               ┌──────────────────────────────┐
               │     GitLab GraphQL API        │
               │     (no auth required)        │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   1. FutureFieldFilter        │
               │   "destroy" has @gl_introduced│
               │   version 99.0 > 19.2.0      │
               │   → Strip field              │
               │   → Set contain_future_fields │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   2. IntroducedTracer         │
               │   → Restore original query   │
               │   "destroy" is back in AST   │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   3. FutureFieldFallback      │
               │   "destroy" not in schema? ✓  │
               │   Flag set? ✓                 │
               │   Not __introspection? ✓      │
               │   → Synthesize field          │
               │   → NO RESOLVER attached      │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   4. graphql-ruby resolution  │
               │   No resolver found →         │
               │   object.public_send(:destroy)│
               │                               │
               │   Project.find("victim/repo") │
               │          .destroy()           │
               │                               │
               │   ██ PROJECT DELETED ██        │
               └──────────────────────────────┘

Configuración del laboratorio

Requisitos previos

  • Docker y Docker Compose instalados
  • Mínimo 4 GB de RAM disponibles para Docker (GitLab consume muchos recursos)
  • Python 3 (para el script de exploit)
  • Navegador web o curl / httpie para probar la API

Inicio rápido — GitLab CE 19.2.0 real (vulnerable)

# Clone or navigate to the lab directory
cd CVE-2026-19478

# Pull and start the vulnerable GitLab instance
docker compose up -d

# Wait for GitLab to fully start (3-5 minutes on first boot)
# Monitor startup progress:
docker logs -f gitlab-vulnerable

# Once you see "gitlab Reconfigured!" in logs, set up test projects:
bash setup-lab.sh

Puntos de acceso

Descargar herramienta