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-40179-PoC — PoC mínimo en Python para CVE-2026-40179: inyecta un nombre de métrica malicioso a través de remote_write de Prometheus sin autenticación para desencadenar XSS almacenado en la interfaz web. No se requieren stubs de protobuf. | Kitploit
Herramientas/GitHubGitHub/bsdrip/cve-2026-40179-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad de APIs
GitHubbsdrip/cve-2026-40179-poc

CVE-2026-40179-PoC

PoC mínimo en Python para CVE-2026-40179: inyecta un nombre de métrica malicioso a través de remote_write de Prometheus sin autenticación para desencadenar XSS almacenado en la interfaz web. No se requieren stubs de protobuf.

Ver Repositorio
6hace 10 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-40179 — XSS almacenado en Prometheus a través de remote_write

Una prueba de concepto mínima y con pocas dependencias para CVE-2026-40179 (GHSA-vffh-x6r8-xx99): cross-site scripting almacenado en la interfaz web de Prometheus, entregado a través de un endpoint remote_write sin autenticación.

La vulnerabilidad

Prometheus 3.x renderiza los nombres de métricas y los valores de etiquetas en la interfaz web mediante innerHTML sin escaparlos. Debido a que Prometheus v3 relajó la validación de etiquetas para permitir UTF-8 arbitrario — incluidos <, > y " — un nombre de métrica puede transportar una carga HTML que se ejecuta cuando alguien navega por la interfaz.

AfectadoPrometheus 3.0.0 – 3.5.1
Corregido en3.5.2
ImpactoXSS almacenado, se ejecuta en el navegador de cualquier usuario que visualice la métrica afectada
Superficies vulnerablesTooltips de la página Graph, Metrics Explorer

El XSS en sí necesita una vía para introducir una serie manipulada en el TSDB. Cualquiera de estas opciones sirve:

  • un endpoint remote_write abierto (lo que usa este PoC),
  • un objetivo de scrape comprometido o controlado por el atacante,
  • un receptor OTLP.

Un Prometheus expuesto a Internet o a la LAN sin autenticación por delante proporciona todo lo anterior sin esfuerzo adicional, que es lo que hace que esto sea explotable en la práctica y no meramente teórico.

Lo que hace este script

Envía un único POST /api/v1/write que contiene una serie temporal cuyo __name__ es:

root@kitploit:~
pentest_poc_cve_2026_40179

El WriteRequest de protobuf está codificado a mano en ~40 líneas, por lo que no hay dependencia de protobuf, prometheus_pb2 ni promtool — solo python-snappy para la compresión en el cable y requests para el POST. Eso facilita desplegarlo en un host de salto donde no se pueden compilar stubs protobuf generados.

Requisitos

root@kitploit:~
python3 -m pip install python-snappy requests

python-snappy necesita la librería C de Snappy:

root@kitploit:~
# Debian/Ubuntu
sudo apt install libsnappy-dev
# macOS
brew install snappy

Uso

root@kitploit:~
python3 cve-2026-40179-poc.py <target_ip>

El script asume HTTPS en el puerto 9090 con la verificación de certificados deshabilitada (típico en una instancia interna con un certificado autofirmado). Si tu objetivo usa HTTP plano u otro puerto, edita la línea url en main().

Una inyección exitosa devuelve HTTP 204:

root@kitploit:~
POST https://192.0.2.10:9090/api/v1/write -> 204

Confirmar que la escritura se registró

Consulta la serie en la interfaz o API de Prometheus — debería devolver resultados de inmediato:

root@kitploit:~
{__name__=~"pentest_poc.*"}

La vista de tabla realiza el escape correctamente y muestra la carga como texto plano. Eso es lo esperado y no es la superficie vulnerable.

Disparar la carga

Abre el Metrics Explorer (el navegador de métricas junto al cuadro de consulta), busca pentest_poc y pasa el cursor sobre la entrada listada.

En pruebas de campo contra 3.2.1, la ruta del Metrics Explorer se disparó de forma fiable mientras que el tooltip de la pestaña Graph no se reprodujo — la muestra inyectada (valor 1.0) no se renderizó visiblemente en el gráfico trazado, y pasar el cursor sobre la leyenda tampoco la disparó. Ambas superficies se mencionan en el aviso; si una no se dispara en tu versión objetivo, prueba la otra antes de concluir que no es vulnerable.

La carga predeterminada usa console.log() para no interrumpir a quien no la esté buscando. Para una demo visible — una captura de pantalla para un informe, por ejemplo — cambia METRIC_NAME para usar alert():

root@kitploit:~
METRIC_NAME = ('pentest_poc_cve_2026_40179'
               '')

Limpieza — lee esto antes de ejecutarlo

La serie inyectada es persistente. Una vez escrita, permanece en el TSDB hasta que la retención la expire. Eliminarla requiere la API de administración, que está deshabilitada por defecto:

root@kitploit:~
# Only works if Prometheus was started with --web.enable-admin-api
curl -X POST -g 'https://<target>:9090/api/v1/admin/tsdb/delete_series?match[]={__name__=~"pentest_poc.*"}'
curl -X POST 'https://<target>:9090/api/v1/admin/tsdb/clean_tombstones'

Si la API de administración está desactivada, no hay vía de limpieza remota. La única alternativa es promtool tsdb ejecutado localmente en el host, al que probablemente no tengas acceso.

Consecuencias prácticas:

  • Confirma que la limpieza es posible antes de inyectar en algo que te importe, o acepta que el artefacto persiste.
  • El nombre de la métrica es deliberadamente largo, inconfundible y autoexplicativo (job="pentest_poc"), de modo que sea fácil de encontrar y resulte obvio que es un artefacto de prueba.
  • En un compromiso autorizado, informa directamente al cliente sobre cualquier serie residual, para que no se confunda después con un compromiso real.

Pruebas seguras

Para reproducirlo contra una instancia desechable en lugar de algo en producción:

root@kitploit:~
docker run --rm -p 9090:9090 prom/prometheus:v3.2.1 \
  --config.file=/etc/prometheus/prometheus.yml \
  --web.enable-remote-write-receiver \
  --web.enable-admin-api

Luego apunta el script a 127.0.0.1 (cambia el esquema de la URL a http:// en main()). Iniciar con --web.enable-admin-api significa que realmente podrás eliminar la serie después.

Remediación

  1. Actualiza a Prometheus 3.5.2 o posterior. Esa es la corrección.
  2. Coloca autenticación y TLS delante de la interfaz y la API de Prometheus — un proxy inverso con autenticación, o --web.config.file con basic_auth_users.
  3. No habilites --web.enable-remote-write-receiver a menos que lo necesites, y nunca lo expongas sin autenticación.
  4. Restringe el acceso de red al puerto 9090 solo a los hosts que legítimamente lo necesiten.

Ten en cuenta que (1) por sí solo corrige el XSS, pero un Prometheus sin autenticación sigue siendo por sí mismo una superficie sustancial de divulgación de información: la lista completa de nombres de métricas, el inventario de objetivos de scrape y los nombres de host internos son legibles sin credenciales.

Solo uso autorizado

Esto se publica para defensores, investigadores y evaluadores que trabajan bajo autorización. La vulnerabilidad está divulgada públicamente y parcheada upstream.

Ejecutar esto contra un sistema escribe datos persistentes en él. No lo apuntes a infraestructura que no poseas o para la que no tengas permiso escrito explícito para realizar pruebas.

Licencia

MIT — consulta LICENSE.

Descargar herramienta