
Scripts de detección para Pi-hole FTLDNS RCE (CVE-2026-35517) mediante inyección de nueva línea, incluyendo un escáner en Python y un script Nmap NSE para la evaluación de vulnerabilidades basada en versiones.
Una vulnerabilidad de Ejecución Remota de Código en el motor FTLDNS de Pi-hole (versiones 6.0 a 6.5) permite a un atacante autenticado inyectar directivas de configuración arbitrarias de dnsmasq mediante la inserción de caracteres de nueva línea (\n) en el parámetro de API dns.upstreams. Dado que dnsmasq admite directivas que ejecutan comandos de shell, esta inyección de nueva línea se traduce directamente en ejecución completa de comandos en el sistema host.
Esto no es solo un error aislado, es una clase de inyección que afecta a , todos parcheados juntos en FTL v6.6.
| Campo | Detalle |
|---|---|
| ID CVE | CVE-2026-35517 |
| Proveedor | Proyecto Pi-hole |
| Producto | FTLDNS (pihole-FTL) |
| Versiones Afectadas | 6.0 a < 6.6 |
| CVSS v3.1 | 8.8 (Alta) |
| CWE | CWE-93 — Neutralización Incorrecta de Secuencias CRLF |
| Vector de Ataque | Red |
| Autenticación | Requerida (acceso admin/API de Pi-hole) |
| Interacción del Usuario | Ninguna |
| Publicado | 7 de abril de 2026 |
| Parcheado En | FTL v6.6 (publicado el 3 de abril de 2026) |
| Descubierto Por | T0X1Cx |
| Avisos Relacionados | GHSA-23w8-7333-p9fj, GHSA-wxhv-w77q-6qwp, GHSA-28g5-gg88-wh5m, GHSA-fqv2-qhfh-ghcj, GHSA-vfmq-jrx3-wv3c |
Pi-hole es uno de los sumideros DNS más ampliamente desplegados del mundo. Se sitúa en tu red, gestiona consultas DNS y bloquea anuncios y rastreadores a nivel DNS antes de que lleguen a tu navegador. Se utiliza en todas partes, desde configuraciones individuales con Raspberry Pi en apartamentos hasta despliegues empresariales que protegen miles de dispositivos.
FTLDNS (Faster Than Light DNS) es el motor principal de Pi-hole. Es un fork/envoltorio personalizado alrededor de dnsmasq, el conocido servidor DNS y DHCP. FTLDNS gestiona:
Aquí está el detalle clave: FTLDNS genera archivos de configuración de dnsmasq a partir de ajustes proporcionados por el usuario a través de su API. Si cambias el servidor DNS upstream en el panel de administración de Pi-hole, FTLDNS escribe ese valor en un archivo de configuración de dnsmasq y reinicia el servicio. Esa ruta de escritura es donde reside la vulnerabilidad.
+------------------+ +------------------+ +------------------+
| Panel Admin | API/Web | Motor FTLDNS | Escritura de | dnsmasq |
| (Web UI) | ---------> | (pihole-FTL) | Configuración | (DNS/DHCP) |
+------------------+ +------------------+ ------------> +------------------+
| |
Lee ajustes, Lee configuración,
escribe archivos sirve DNS/DHCP
de configuración a la red
Cuando un administrador cambia los servidores DNS upstream a través de la interfaz web o la API de Pi-hole, el flujo es:
El parámetro dns.upstreams está diseñado para aceptar direcciones de servidores DNS como 8.8.8.8 o 1.1.1.1. FTLDNS las escribe en la configuración de dnsmasq como directivas server=:
# Entrada normal: "8.8.8.8"
# Genera:
server=8.8.8.8
El problema: FTLDNS no sanea los caracteres de nueva línea en la entrada. Un atacante puede inyectar \n para salir de la directiva server= prevista e inyectar líneas de configuración completamente nuevas:
# Entrada maliciosa: "8.8.8.8\ndhcp-option=6,evil.dns.server"
# Genera:
server=8.8.8.8
dhcp-option=6,evil.dns.server
Esto por sí solo ya sería preocupante (secuestro de DNS mediante inyección de opciones DHCP). Pero empeora.
dnsmasq admite una directiva de configuración llamada dhcp-option que puede hacer referencia a scripts externos y, lo que es más crítico, admite varias directivas que pueden ejecutar comandos en escenarios específicos. La cadena de explotación se ve así:
Paso 1: El atacante se autentica en Pi-hole
(credenciales por defecto, contraseña débil, CSRF, sesión comprometida)
Paso 2: El atacante envía una solicitud API para actualizar dns.upstreams:
POST /api/dns/upstream
{
"upstreams": ["8.8.8.8\n<directiva maliciosa de dnsmasq>"]
}
Paso 3: FTLDNS escribe el valor en el archivo de configuración de dnsmasq
sin sanear la nueva línea
Paso 4: La directiva inyectada de dnsmasq se analiza como una
opción de configuración legítima
Paso 5: Dependiendo de la directiva inyectada, el atacante logra:
- Secuestro de DNS (redirigir todas las consultas DNS)
- Envenenamiento DHCP (enviar configuraciones maliciosas a los clientes)
- Ejecución de comandos mediante las capacidades de scripting de dnsmasq
- Escritura de archivos en rutas arbitrarias
La idea clave es que esto no se trata de explotar una vulnerabilidad de dnsmasq; dnsmasq funciona como está diseñado. La vulnerabilidad es que FTLDNS permite que entrada no confiable se filtre al archivo de configuración, convirtiendo una API de gestión de configuración en un punto de inyección de configuración arbitraria.
El investigador (T0X1Cx) descubrió que el mismo patrón de inyección de nueva línea afecta a cinco parámetros de configuración diferentes de FTLDNS. Esto es un problema sistémico: el código carecía de saneamiento de entrada en todos los ámbitos:
| Aviso | Parámetro | Qué Controla |
|---|---|---|
| GHSA-23w8-7333-p9fj | dns.upstreams | Servidores DNS upstream |
| GHSA-wxhv-w77q-6qwp | dns.hostRecord | Registros de host DNS personalizados |
| GHSA-28g5-gg88-wh5m | dns.cnameRecords | Mapeos de registros CNAME |
| GHSA-fqv2-qhfh-ghcj | dhcp.leaseTime | Duración de concesión DHCP |
| GHSA-vfmq-jrx3-wv3c | dhcp.hosts | Asignaciones estáticas de hosts DHCP |
Cada uno de estos parámetros escribe en archivos de configuración de dnsmasq, y cada uno falló en sanear los caracteres de nueva línea. La corrección en FTL v6.6 añadió una validación de entrada adecuada que rechaza caracteres de nueva línea (y otros caracteres de control) en todos los parámetros de configuración.
En el host de Pi-hole:
En la red (impacto descendente):
Factores de amplificación de riesgo:
| Versión | Estado |
|---|---|
| FTLDNS 6.6+ | Parcheado |
| FTLDNS 6.0 – 6.5 | Vulnerable |
| FTLDNS 5.x y anteriores | No afectado (arquitectura de API diferente) |
Para verificar tu versión:
pihole -v
# o
pihole-FTL --version
Riesgo alto:
Riesgo moderado:
Riesgo menor (pero aún así parchear):
El script de Python detecta instancias vulnerables de Pi-hole mediante análisis basado en versión.
Cómo funciona:
No se envían payloads de inyección. La prueba es completamente de solo lectura y segura.
Uso:
# Instalar dependencias
pip install -r requirements.txt
# Objetivo único (HTTP, puerto por defecto 80)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1
# Puerto personalizado
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t pi.hole -p 8080
# Modo HTTPS (cambia automáticamente al puerto 443)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 10.0.0.1 --https
# Escaneo masivo desde archivo
python CVE-2026-35517_PiHole_FTLDNS_detector.py -f targets.txt
# Salida JSON guardada en archivo
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --json -o results.json
# Timeout aumentado
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --timeout 20
Opciones:
| Flag | Descripción | Por defecto |
|---|---|---|
-t, --target | IP u hostname del objetivo | — |
-f, --file | Archivo con objetivos, uno por línea (se admiten comentarios #) | — |
-p, --port | Puerto del objetivo | 80 |
--https | Usar HTTPS (cambia automáticamente el puerto a 443 si el puerto es 80) | Desactivado |
--timeout | Timeout de conexión en segundos | 10 |
--json | Salida en formato JSON | Desactivado |
-o, --output | Guardar resultados en un archivo | — |
Ejemplo de salida:
╔══════════════════════════════════════════════════════════════╗
║ CVE-2026-35517 - Detector RCE de Pi-hole FTLDNS ║
║ Inyección de Nueva Línea en dns.upstreams → Ejecución de ║
║ Comandos ║
║ CVSS: 8.8 (Alta) | Afecta: FTLDNS 6.0 - 6.5 ║
╚══════════════════════════════════════════════════════════════╝
[*] Escaneando 192.168.1.1:80...
Objetivo: 192.168.1.1:80
============================================================
[*] Pi-hole detectado
Interfaz de administración: Accesible
API accesible: Sí
Versión FTL: v6.4
Versión Core: v6.3
Versión Web: v6.4
Evaluación CVE-2026-35517:
[VULNERABLE] FTLDNS 6.4 está dentro del rango vulnerable (6.0 - 6.5).
Actualiza a FTL v6.6 o posterior inmediatamente.
Vulnerabilidades relacionadas (también parcheadas en FTL v6.6):
[-] GHSA-wxhv-w77q-6qwp: RCE mediante inyección de nueva línea en dns.hostRecord
[-] GHSA-28g5-gg88-wh5m: RCE mediante inyección de nueva línea en dns.cnameRecords
[-] GHSA-fqv2-qhfh-ghcj: RCE mediante inyección de nueva línea en dhcp.leaseTime
[-] GHSA-vfmq-jrx3-wv3c: RCE mediante inyección de nueva línea en dhcp.hosts
Remediación:
1. Actualiza Pi-hole FTL a la versión 6.6 o posterior
2. Ejecuta: pihole -up
3. Verifica con: pihole -v
4. Revisa los controles de acceso a la API y la configuración de autenticación
5. Revisa los registros en busca de señales de explotación (cambios inusuales en la configuración DNS)
# Instalar el script NSE
sudo cp CVE-2026-35517_PiHole_FTLDNS.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
# Escaneo básico
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS <objetivo>
# Escanear puertos comunes de Pi-hole
nmap -p 80,443,8080,4711 --script CVE-2026-35517_PiHole_FTLDNS <objetivo>
# Escaneo de subred — encontrar todas las instancias de Pi-hole en una red
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS 192.168.1.0/24
# Combinado con detección de versión
nmap -sV -p 80,443 --script CVE-2026-35517_PiHole_FTLDNS <objetivo>
# Escanear objetivos desde un archivo
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS -iL targets.txt
Ejemplo de salida de Nmap:
PORT STATE SERVICE
80/tcp open http
| CVE-2026-35517_PiHole_FTLDNS:
| VULNERABLE:
| RCE en Pi-hole FTLDNS mediante configuración de DNS upstream
| Estado: VULNERABLE
| IDs: CVE:CVE-2026-35517
| Factor de riesgo: Alto (CVSS: 8.8)
| Fecha de divulgación: 2026-04-07
| Información adicional:
| Versión FTL: v6.4
| Versión Core: v6.3
| Versión Web: v6.4
| Avisos relacionados también corregidos en FTL v6.6:
| GHSA-wxhv-w77q-6qwp (inyección en dns.hostRecord)
| GHSA-28g5-gg88-wh5m (inyección en dns.cnameRecords)
| GHSA-fqv2-qhfh-ghcj (inyección en dhcp.leaseTime)
| GHSA-vfmq-jrx3-wv3c (inyección en dhcp.hosts)
| Remediación: Actualizar a Pi-hole FTL v6.6+ (pihole -up)
| Referencias:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-35517
|_ https://github.com/pi-hole/FTL/security/advisories/GHSA-23w8-7333-p9fj
Si tienes acceso SSH al host de Pi-hole:
# Verificar versión de FTL
pihole-FTL --version
# O mediante la CLI de Pi-hole
pihole -v
# Verificar mediante API (v6)
curl -s http://pi.hole/api/info/version | python3 -m json.tool
# Verificar mediante API (v5)
curl -s http://pi.hole/admin/api.php?versions | python3 -m json.tool
Si la versión de FTL está entre 6.0 y 6.5 (inclusive), eres vulnerable.
Qué buscar:
/etc/dnsmasq.d/ y /etc/pihole/ en busca de directivas inesperadasComandos para investigar:
# Revisar configuraciones de dnsmasq en busca de líneas inyectadas
grep -r "dhcp-option\|addn-hosts\|conf-file\|log-facility" /etc/dnsmasq.d/
# Buscar modificaciones recientes de configuración
find /etc/pihole /etc/dnsmasq.d -mtime -7 -ls
# Revisar el registro de depuración de Pi-hole
pihole -d
# Verificar procesos en ejecución en busca de anomalías
ps aux | grep -E "dnsmasq|pihole"
# Revisar crontab en busca de persistencia
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
Acción inmediata — actualiza ahora:
# Actualizar Pi-hole (incluye FTL, Web y Core)
pihole -up
# Verificar la actualización
pihole -v
# La versión de FTL debe ser >= 6.6
Si no puedes actualizar inmediatamente:
pihole -a -pAcciones posteriores al parche:
Kerem Oruç - Ingeniero de Ciberseguridad