
Script di rilevamento per Pi-hole FTLDNS RCE (CVE-2026-35517) tramite iniezione di newline, inclusi scanner Python e script Nmap NSE per la valutazione della vulnerabilità basata sulla versione.
Una vulnerabilità di Remote Code Execution nel motore FTLDNS di Pi-hole (versioni dalla 6.0 alla 6.5) consente a un attaccante autenticato di iniettare direttive di configurazione dnsmasq arbitrarie incorporando caratteri di nuova riga (\n) nel parametro API dns.upstreams. Poiché dnsmasq supporta direttive che eseguono comandi shell, questa iniezione di nuova riga si traduce direttamente in esecuzione completa di comandi sul sistema host.
Non si tratta di un singolo bug, ma di una classe di iniezioni che colpisce cinque diversi parametri di configurazione, tutti corretti insieme in FTL v6.6.
| Campo | Dettaglio |
|---|---|
| ID CVE | CVE-2026-35517 |
| Venditore | Pi-hole Project |
| Prodotto | FTLDNS (pihole-FTL) |
| Versioni interessate | 6.0 a < 6.6 |
| CVSS v3.1 | 8.8 (Alto) |
| CWE | CWE-93 — Neutralizzazione impropria delle sequenze CRLF |
| Vettore di attacco | Rete |
| Autenticazione | Richiesta (accesso admin/API Pi-hole) |
| Interazione utente | Nessuna |
| Pubblicata | 7 aprile 2026 |
| Corretta in | FTL v6.6 (rilasciata il 3 aprile 2026) |
| Scoperta da | T0X1Cx |
| Avvisi correlati | GHSA-23w8-7333-p9fj, GHSA-wxhv-w77q-6qwp, GHSA-28g5-gg88-wh5m, GHSA-fqv2-qhfh-ghcj, GHSA-vfmq-jrx3-wv3c |
Pi-hole è uno dei sinkhole DNS più ampiamente distribuiti al mondo. Si posiziona sulla tua rete, gestisce le query DNS e blocca pubblicità e tracker a livello DNS prima che raggiungano il tuo browser. Viene utilizzato ovunque, dalle singole configurazioni Raspberry Pi in appartamenti alle distribuzioni aziendali che proteggono migliaia di dispositivi.
FTLDNS (Faster Than Light DNS) è il motore principale di Pi-hole. È un fork/wrapper personalizzato attorno a dnsmasq, il noto server DNS e DHCP. FTLDNS gestisce:
Ecco il dettaglio chiave: FTLDNS genera file di configurazione dnsmasq a partire dalle impostazioni fornite dall'utente tramite la sua API. Se cambi il server DNS upstream nel pannello di amministrazione di Pi-hole, FTLDNS scrive quel valore in un file di configurazione dnsmasq e riavvia il servizio. È in quel percorso di scrittura che risiede la vulnerabilità.
+------------------+ +------------------+ +------------------+
| Pannello di | API/Web | Motore FTLDNS | Scrittura cfg | dnsmasq |
| amministrazione| ---------> | (pihole-FTL) | ------------> | (DNS/DHCP) |
| (Web UI) | | | | |
+------------------+ +------------------+ +------------------+
| |
Legge le impostazioni, Legge la config,
scrive i file di config serve DNS/DHCP
su disco alla rete
Quando un amministratore modifica i server DNS upstream tramite la web UI o l'API di Pi-hole, il flusso è:
Il parametro dns.upstreams è pensato per accettare indirizzi di server DNS come 8.8.8.8 o 1.1.1.1. FTLDNS li scrive nella configurazione dnsmasq come direttive server=:
# Input normale: "8.8.8.8"
# Genera:
server=8.8.8.8
Il problema: FTLDNS non sanifica i caratteri di nuova riga nell'input. Un attaccante può iniettare \n per uscire dalla direttiva server= prevista e iniettare linee di configurazione completamente nuove:
# Input malevolo: "8.8.8.8\ndhcp-option=6,evil.dns.server"
# Genera:
server=8.8.8.8
dhcp-option=6,evil.dns.server
Già questo sarebbe preoccupante (dirottamento DNS tramite iniezione di opzioni DHCP). Ma peggiora.
dnsmasq supporta una direttiva di configurazione chiamata dhcp-option che può fare riferimento a script esterni e, cosa più critica, supporta diverse direttive che possono eseguire comandi in scenari specifici. La catena di sfruttamento è la seguente:
Passo 1: L'attaccante si autentica su Pi-hole
(credenziali predefinite, password debole, CSRF, sessione compromessa)
Passo 2: L'attaccante invia una richiesta API per aggiornare dns.upstreams:
POST /api/dns/upstream
{
"upstreams": ["8.8.8.8\n<direttiva dnsmasq malevola>"]
}
Passo 3: FTLDNS scrive il valore nel file di configurazione dnsmasq
senza sanificare la nuova riga
Passo 4: La direttiva dnsmasq iniettata viene interpretata come
opzione di configurazione legittima
Passo 5: A seconda della direttiva iniettata, l'attaccante ottiene:
- Dirottamento DNS (reindirizza tutte le query DNS)
- Avvelenamento DHCP (spinge configurazioni malevole ai client)
- Esecuzione di comandi tramite le capacità di scripting di dnsmasq
- Scrittura di file in percorsi arbitrari
Il punto chiave è che non si tratta di sfruttare una vulnerabilità di dnsmasq: dnsmasq funziona come previsto. La vulnerabilità è che FTLDNS lascia che input non attendibili finiscano nel file di configurazione, trasformando un'API di gestione della configurazione in un punto di iniezione di configurazione arbitraria.
Il ricercatore (T0X1Cx) ha scoperto che lo stesso schema di iniezione di nuova riga colpisce cinque diversi parametri di configurazione FTLDNS. Questo è un problema sistemico: il codice mancava di sanificazione dell'input a tutto campo:
| Avviso | Parametro | Cosa controlla |
|---|---|---|
| GHSA-23w8-7333-p9fj | dns.upstreams | Server DNS upstream |
| GHSA-wxhv-w77q-6qwp | dns.hostRecord | Record host DNS personalizzati |
| GHSA-28g5-gg88-wh5m | dns.cnameRecords | Mappature record CNAME |
| GHSA-fqv2-qhfh-ghcj | dhcp.leaseTime | Durata lease DHCP |
| GHSA-vfmq-jrx3-wv3c | dhcp.hosts | Assegnazioni host DHCP statiche |
Ognuno di questi parametri scrive in file di configurazione dnsmasq e ognuno non riusciva a sanificare i caratteri di nuova riga. La correzione in FTL v6.6 ha aggiunto una validazione dell'input adeguata che rifiuta i caratteri di nuova riga (e altri caratteri di controllo) su tutti i parametri di configurazione.
Sull'host Pi-hole:
Sulla rete (impatto a valle):
Fattori di amplificazione del rischio:
| Versione | Stato |
|---|---|
| FTLDNS 6.6+ | Corretta |
| FTLDNS 6.0 – 6.5 | Vulnerabile |
| FTLDNS 5.x e precedenti | Non interessata (architettura API diversa) |
Per verificare la tua versione:
pihole -v
# oppure
pihole-FTL --version
Rischio alto:
Rischio moderato:
Rischio più basso (ma correggi comunque):
Lo script Python rileva le istanze Pi-hole vulnerabili tramite analisi basata sulla versione.
Come funziona:
Non vengono inviati payload di iniezione. Il test è interamente in sola lettura e sicuro.
Utilizzo:
# Installa le dipendenze
pip install -r requirements.txt
# Singolo target (HTTP, porta predefinita 80)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1
# Porta personalizzata
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t pi.hole -p 8080
# Modalità HTTPS (passa automaticamente alla porta 443)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 10.0.0.1 --https
# Scansione di massa da file
python CVE-2026-35517_PiHole_FTLDNS_detector.py -f targets.txt
# Output JSON salvato su file
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --json -o results.json
# Timeout aumentato
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --timeout 20
Opzioni:
| Flag | Descrizione | Predefinito |
|---|---|---|
-t, --target | IP o hostname del target | — |
-f, --file | File con i target, uno per riga (commenti # supportati) | — |
-p, --port | Porta del target | 80 |
--https | Usa HTTPS (passa automaticamente alla porta 443 se la porta è 80) | Off |
--timeout | Timeout di connessione in secondi | 10 |
--json | Output in formato JSON | Off |
-o, --output | Salva i risultati su un file | — |
Esempio di output:
╔══════════════════════════════════════════════════════════════╗
║ CVE-2026-35517 - Pi-hole FTLDNS RCE Detector ║
║ Newline Injection in dns.upstreams → Command Execution ║
║ CVSS: 8.8 (High) | Affects: FTLDNS 6.0 - 6.5 ║
╚══════════════════════════════════════════════════════════════╝
[*] Scanning 192.168.1.1:80...
Target: 192.168.1.1:80
============================================================
[*] Pi-hole detected
Admin interface: Accessible
API accessible: Yes
FTL version: v6.4
Core version: v6.3
Web version: v6.4
CVE-2026-35517 Assessment:
[VULNERABLE] FTLDNS 6.4 is within the vulnerable range (6.0 - 6.5).
Upgrade to FTL v6.6 or later immediately.
Related Vulnerabilities (also patched in FTL v6.6):
[-] GHSA-wxhv-w77q-6qwp: RCE via dns.hostRecord Newline Injection
[-] GHSA-28g5-gg88-wh5m: RCE via dns.cnameRecords Newline Injection
[-] GHSA-fqv2-qhfh-ghcj: RCE via dhcp.leaseTime Newline Injection
[-] GHSA-vfmq-jrx3-wv3c: RCE via dhcp.hosts Newline Injection
Remediation:
1. Upgrade Pi-hole FTL to version 6.6 or later
2. Run: pihole -up
3. Verify with: pihole -v
4. Review API access controls and authentication settings
5. Check logs for signs of exploitation (unusual DNS config changes)
# Installa lo script NSE
sudo cp CVE-2026-35517_PiHole_FTLDNS.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
# Scansione di base
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS <target>
# Scansiona le porte comuni di Pi-hole
nmap -p 80,443,8080,4711 --script CVE-2026-35517_PiHole_FTLDNS <target>
# Scansione sottorete — trova tutte le istanze Pi-hole su una rete
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS 192.168.1.0/24
# Combinato con rilevamento versione
nmap -sV -p 80,443 --script CVE-2026-35517_PiHole_FTLDNS <target>
# Scansiona i target da un file
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS -iL targets.txt
Esempio di output Nmap:
PORT STATE SERVICE
80/tcp open http
| CVE-2026-35517_PiHole_FTLDNS:
| VULNERABLE:
| Pi-hole FTLDNS RCE via Upstream DNS Configuration
| State: VULNERABLE
| IDs: CVE:CVE-2026-35517
| Risk factor: High (CVSS: 8.8)
| Disclosure date: 2026-04-07
| Extra information:
| FTL Version: v6.4
| Core Version: v6.3
| Web Version: v6.4
| Related advisories also fixed in FTL v6.6:
| GHSA-wxhv-w77q-6qwp (dns.hostRecord injection)
| GHSA-28g5-gg88-wh5m (dns.cnameRecords injection)
| GHSA-fqv2-qhfh-ghcj (dhcp.leaseTime injection)
| GHSA-vfmq-jrx3-wv3c (dhcp.hosts injection)
| Remediation: Upgrade to Pi-hole FTL v6.6+ (pihole -up)
| References:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-35517
|_ https://github.com/pi-hole/FTL/security/advisories/GHSA-23w8-7333-p9fj
Se hai accesso SSH all'host Pi-hole:
# Controlla la versione FTL
pihole-FTL --version
# Oppure tramite la CLI di Pi-hole
pihole -v
# Controlla tramite API (v6)
curl -s http://pi.hole/api/info/version | python3 -m json.tool
# Controlla tramite API (v5)
curl -s http://pi.hole/admin/api.php?versions | python3 -m json.tool
Se la versione FTL è compresa tra 6.0 e 6.5 (inclusi), sei vulnerabile.
Cosa cercare:
/etc/dnsmasq.d/ e /etc/pihole/ per direttive inaspettateComandi per indagare:
# Controlla le config dnsmasq per linee iniettate
grep -r "dhcp-option\|addn-hosts\|conf-file\|log-facility" /etc/dnsmasq.d/
# Controlla le modifiche recenti alla configurazione
find /etc/pihole /etc/dnsmasq.d -mtime -7 -ls
# Esamina il log di debug di Pi-hole
pihole -d
# Controlla i processi in esecuzione per anomalie
ps aux | grep -E "dnsmasq|pihole"
# Esamina il crontab per la persistenza
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
Azione immediata — aggiorna subito:
# Aggiorna Pi-hole (include FTL, Web e Core)
pihole -up
# Verifica l'aggiornamento
pihole -v
# La versione FTL dovrebbe essere >= 6.6
Se non puoi aggiornare immediatamente:
pihole -a -pAzioni post-patch:
Kerem Oruç - Ingegnere della cybersecurity