
Informe detallado de la vulnerabilidad CVE-2026-39938 para Cacti ≤1.2.30, que demuestra un LFI no autenticado encadenado a una inyección de comandos del sistema operativo con RCE, incluyendo PoC, análisis de la causa raíz y orientación de remediación.
| Campo | Valor |
|---|
| Producto | Cacti — La solución completa de gráficos basada en RRDtool |
| Versión(es) afectada(s) | ≤ 1.2.30 |
| Clase de Vulnerabilidad | CWE-22: Path Traversal (LFI) → CWE-78: Inyección de Comandos del SO |
| Vector de Ataque | Red |
| Autenticación | Ninguna requerida (omisión de cuenta de invitado) |
| Interacción del Usuario | Ninguna |
| Puntuación CVSSv3.1 | 9.8 — CRÍTICA |
| Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
Cacti ≤ 1.2.30 es vulnerable a la Inclusión Local de Archivos (LFI) no autenticada a través del parámetro graph_theme en graph_image.php, encadenada a la Ejecución Remota de Código (RCE) mediante inyección de comandos del sistema operativo a través de cacti_escapeshellarg() en Windows.
HTTP Request
│
▼
graph_image.php
│
├── $guest_account = true → Auth bypass (no login needed)
│
├── graph_theme param → LFI (CWE-22)
│ └── Path traversal via basename() bypass
│
└── Other params (graph_height, etc.)
└── cacti_escapeshellarg() → OS injection (CWE-78)
└── proc_open() → RCE
graph_themeEl parámetro graph_theme no se sanitiza lo suficiente. La corrección intentó usar basename(), pero este método se puede omitir trivialmente: una ruta como themes/../../etc/passwd pasa la validación de basename() y aun así atraviesa directorios.
Ruta de código vulnerable en graph_image.php:
$theme = basename($_GET['graph_theme']); // basename() is NOT sufficient
include_once("./include/theme_" . $theme . ".php"); // LFI
La corrección en 1.2.31 reemplaza basename() por cacti_validate_theme(), que utiliza una lista blanca del sistema de archivos.
| Condición | Probabilidad | Notas |
|---|---|---|
| Cacti se ejecuta en Windows | Común en empresas | El fallo de escape de cmd.exe permite RCE |
| Cuenta de invitado habilitada | Común — a menudo por defecto | El usuario invitado permite la visualización pública de gráficos |
| Existe al menos un gráfico | Casi universal | local_graph_id=1 presente tras la instalación |
| RRDtool instalado | Requerido por Cacti | Siempre presente |
GET /cacti/graph_image.php?local_graph_id=1&graph_theme=../../../../etc/passwd
GET /cacti/graph_image.php?local_graph_id=1&graph_height=100" & whoami & "&action=view
La inyección de comandos del sistema operativo ya proporciona Ejecución Remota de Código (RCE) directa, por lo que LFI no es necesaria para comprometer el sistema.
Sin embargo, desde la perspectiva de un investigador, si se consideran ambos problemas juntos:
Esto demuestra que combinar múltiples vulnerabilidades aumenta el impacto general y hace que la explotación sea más fácil y fiable.
| Pilar | Calificación | Descripción |
|---|---|---|
| Confidencialidad | ALTO | Acceso de lectura completo al sistema de archivos del servidor web (config, credenciales de BD) |
| Integridad | ALTO | Ejecución arbitraria de comandos, despliegue de web shells |
| Disponibilidad | ALTO | Terminación de procesos, corrupción de archivos, DoS |
| Métrica | Valor |
|---|---|
| Vector de Ataque | Red |
| Complejidad de Ataque | Baja |
| Privilegios Requeridos | Ninguno |
| Interacción del Usuario | Ninguna |
| Alcance | Sin cambios |
| Confidencialidad | Alta |
| Integridad | Alta |
| Disponibilidad | Alta |
Puntuación: 9.8 — CRÍTICA
| Prioridad | Acción |
|---|---|
| Inmediata | Actualizar a Cacti 1.2.31 o posterior |
MENG HOKSENG
Investigador de Seguridad Independiente
Referencias: