
Scripts de détection pour la RCE Pi-hole FTLDNS (CVE-2026-35517) via injection de saut de ligne, incluant un scanner Python et un script Nmap NSE pour l'évaluation de la vulnérabilité basée sur la version.
Une vulnérabilité d'exécution de code à distance dans le moteur FTLDNS de Pi-hole (versions 6.0 à 6.5) permet à un attaquant authentifié d'injecter des directives de configuration dnsmasq arbitraires en intégrant des caractères de saut de ligne (\n) dans le paramètre API dns.upstreams. Étant donné que dnsmasq prend en charge des directives qui exécutent des commandes shell, cette injection de saut de ligne se traduit directement par une exécution complète de commandes sur le système hôte.
Il ne s'agit pas d'un simple bug isolé, mais d'une classe d'injection qui affecte , tous corrigés ensemble dans FTL v6.6.
| Champ | Détail |
|---|---|
| ID CVE | CVE-2026-35517 |
| Fournisseur | Projet Pi-hole |
| Produit | FTLDNS (pihole-FTL) |
| Versions affectées | 6.0 à < 6.6 |
| CVSS v3.1 | 8.8 (Élevé) |
| CWE | CWE-93 — Neutralisation incorrecte des séquences CRLF |
| Vecteur d'attaque | Réseau |
| Authentification | Requise (accès admin/API Pi-hole) |
| Interaction utilisateur | Aucune |
| Publié | 7 avril 2026 |
| Corrigé dans | FTL v6.6 (publié le 3 avril 2026) |
| Découvert par | T0X1Cx |
| Avis associés | GHSA-23w8-7333-p9fj, GHSA-wxhv-w77q-6qwp, GHSA-28g5-gg88-wh5m, GHSA-fqv2-qhfh-ghcj, GHSA-vfmq-jrx3-wv3c |
Pi-hole est l'un des puits DNS (DNS sinkholes) les plus déployés au monde. Il se place sur votre réseau, gère les requêtes DNS et bloque les publicités et les traqueurs au niveau DNS avant même qu'ils n'atteignent votre navigateur. Il est utilisé partout, des simples configurations Raspberry Pi dans les appartements aux déploiements d'entreprise protégeant des milliers d'appareils.
FTLDNS (Faster Than Light DNS) est le moteur principal de Pi-hole. C'est un fork/enveloppe personnalisé autour de dnsmasq, le serveur DNS et DHCP bien connu. FTLDNS gère :
Voici le détail clé : FTLDNS génère les fichiers de configuration dnsmasq à partir des paramètres fournis par l'utilisateur via son API. Si vous modifiez le serveur DNS amont dans le panneau d'administration Pi-hole, FTLDNS écrit cette valeur dans un fichier de configuration dnsmasq et redémarre le service. C'est dans ce chemin d'écriture que se trouve la vulnérabilité.
+------------------+ +------------------+ +------------------+
| Panneau admin | API/Web | Moteur FTLDNS | Écriture config| dnsmasq |
| (Interface) | ---------> | (pihole-FTL) | ------------> | (DNS/DHCP) |
+------------------+ +------------------+ +------------------+
| |
Lit les paramètres, Lit la config,
écrit dans les fichiers sert DNS/DHCP
de configuration sur disque au réseau
Lorsqu'un administrateur modifie les serveurs DNS amont via l'interface web ou l'API Pi-hole, le flux est le suivant :
Le paramètre dns.upstreams est destiné à accepter des adresses de serveurs DNS comme 8.8.8.8 ou 1.1.1.1. FTLDNS les écrit dans la configuration dnsmasq sous forme de directives server= :
# Entrée normale : "8.8.8.8"
# Génère :
server=8.8.8.8
Le problème : FTLDNS ne neutralise pas les caractères de saut de ligne dans l'entrée. Un attaquant peut injecter \n pour sortir de la directive server= prévue et injecter des lignes de configuration entièrement nouvelles :
# Entrée malveillante : "8.8.8.8\ndhcp-option=6,evil.dns.server"
# Génère :
server=8.8.8.8
dhcp-option=6,evil.dns.server
Cela seul serait déjà préoccupant (détournement DNS via injection d'options DHCP). Mais cela devient pire.
dnsmasq prend en charge une directive de configuration appelée dhcp-option qui peut référencer des scripts externes, et plus crucialement, il prend en charge plusieurs directives qui peuvent exécuter des commandes dans des scénarios spécifiques. La chaîne d'exploitation ressemble à ceci :
Étape 1 : L'attaquant s'authentifie sur Pi-hole
(identifiants par défaut, mot de passe faible, CSRF, session compromise)
Étape 2 : L'attaquant envoie une requête API pour mettre à jour dns.upstreams :
POST /api/dns/upstream
{
"upstreams": ["8.8.8.8\n<directive dnsmasq malveillante>"]
}
Étape 3 : FTLDNS écrit la valeur dans le fichier de configuration dnsmasq
sans neutraliser le saut de ligne
Étape 4 : La directive dnsmasq injectée est analysée comme une
option de configuration légitime
Étape 5 : Selon la directive injectée, l'attaquant obtient :
- Détournement DNS (redirection de toutes les requêtes DNS)
- Empoisonnement DHCP (envoi de configurations malveillantes aux clients)
- Exécution de commandes via les capacités de script de dnsmasq
- Écriture de fichiers vers des chemins arbitraires
Le point clé est qu'il ne s'agit pas d'exploiter une vulnérabilité de dnsmasq — dnsmasq fonctionne comme prévu. La vulnérabilité réside dans le fait que FTLDNS laisse des entrées non fiables s'infiltrer dans le fichier de configuration, transformant une API de gestion de configuration en point d'injection de configuration arbitraire.
Le chercheur (T0X1Cx) a découvert que le même modèle d'injection de saut de ligne affecte cinq paramètres de configuration FTLDNS différents. Il s'agit d'un problème systémique — le code manquait de neutralisation des entrées dans l'ensemble :
| Avis | Paramètre | Ce qu'il contrôle |
|---|---|---|
| GHSA-23w8-7333-p9fj | dns.upstreams | Serveurs DNS amont |
| GHSA-wxhv-w77q-6qwp | dns.hostRecord | Enregistrements DNS hôtes personnalisés |
| GHSA-28g5-gg88-wh5m | dns.cnameRecords | Mappages d'enregistrements CNAME |
| GHSA-fqv2-qhfh-ghcj | dhcp.leaseTime | Durée des baux DHCP |
| GHSA-vfmq-jrx3-wv3c | dhcp.hosts | Attributions DHCP statiques d'hôtes |
Chacun de ces paramètres écrit dans les fichiers de configuration dnsmasq, et chacun n'a pas neutralisé les caractères de saut de ligne. Le correctif dans FTL v6.6 a ajouté une validation d'entrée appropriée qui rejette les caractères de saut de ligne (et autres caractères de contrôle) sur tous les paramètres de configuration.
Sur l'hôte Pi-hole :
Sur le réseau (impact en aval) :
Facteurs d'amplification du risque :
| Version | Statut |
|---|---|
| FTLDNS 6.6+ | Corrigé |
| FTLDNS 6.0 – 6.5 | Vulnérable |
| FTLDNS 5.x et antérieures | Non affecté (architecture API différente) |
Pour vérifier votre version :
pihole -v
# ou
pihole-FTL --version
Risque élevé :
Risque modéré :
Risque plus faible (mais à corriger quand même) :
Le script Python détecte les instances Pi-hole vulnérables via une analyse basée sur la version.
Comment cela fonctionne :
Aucune charge utile d'injection n'est envoyée. Le test est entièrement en lecture seule et sûr.
Utilisation :
# Installer les dépendances
pip install -r requirements.txt
# Cible unique (HTTP, port par défaut 80)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1
# Port personnalisé
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t pi.hole -p 8080
# Mode HTTPS (bascule automatique vers le port 443)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 10.0.0.1 --https
# Analyse groupée depuis un fichier
python CVE-2026-35517_PiHole_FTLDNS_detector.py -f targets.txt
# Sortie JSON enregistrée dans un fichier
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --json -o results.json
# Délai d'attente augmenté
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --timeout 20
Options :
| Option | Description | Défaut |
|---|---|---|
-t, --target | IP ou nom d'hôte cible | — |
-f, --file | Fichier avec les cibles, une par ligne (commentaires # pris en charge) | — |
-p, --port | Port cible | 80 |
--https | Utiliser HTTPS (bascule automatique du port vers 443 si le port est 80) | Désactivé |
--timeout | Délai d'attente de connexion en secondes | 10 |
--json | Sortie au format JSON | Désactivé |
-o, --output | Enregistrer les résultats dans un fichier | — |
Exemple de sortie :
╔══════════════════════════════════════════════════════════════╗
║ CVE-2026-35517 - Détecteur RCE Pi-hole FTLDNS ║
║ Injection de saut de ligne dans dns.upstreams → Exécution ║
║ de commandes ║
║ CVSS : 8.8 (Élevé) | Affecte : FTLDNS 6.0 - 6.5 ║
╚══════════════════════════════════════════════════════════════╝
[*] Analyse de 192.168.1.1:80...
Cible : 192.168.1.1:80
============================================================
[*] Pi-hole détecté
Interface d'administration : Accessible
API accessible : Oui
Version FTL : v6.4
Version Core : v6.3
Version Web : v6.4
Évaluation CVE-2026-35517 :
[VULNÉRABLE] FTLDNS 6.4 est dans la plage vulnérable (6.0 - 6.5).
Mettez à niveau vers FTL v6.6 ou ultérieur immédiatement.
Vulnérabilités associées (également corrigées dans FTL v6.6) :
[-] GHSA-wxhv-w77q-6qwp : RCE via injection de saut de ligne dns.hostRecord
[-] GHSA-28g5-gg88-wh5m : RCE via injection de saut de ligne dns.cnameRecords
[-] GHSA-fqv2-qhfh-ghcj : RCE via injection de saut de ligne dhcp.leaseTime
[-] GHSA-vfmq-jrx3-wv3c : RCE via injection de saut de ligne dhcp.hosts
Remédiation :
1. Mettez à niveau Pi-hole FTL vers la version 6.6 ou ultérieure
2. Exécutez : pihole -up
3. Vérifiez avec : pihole -v
4. Examinez les contrôles d'accès API et les paramètres d'authentification
5. Vérifiez les journaux pour détecter des signes d'exploitation (modifications DNS inhabituelles)
# Installer le script NSE
sudo cp CVE-2026-35517_PiHole_FTLDNS.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
# Analyse de base
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS <cible>
# Analyser les ports Pi-hole courants
nmap -p 80,443,8080,4711 --script CVE-2026-35517_PiHole_FTLDNS <cible>
# Analyse de sous-réseau — trouver toutes les instances Pi-hole sur un réseau
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS 192.168.1.0/24
# Combiné avec la détection de version
nmap -sV -p 80,443 --script CVE-2026-35517_PiHole_FTLDNS <cible>
# Analyser les cibles depuis un fichier
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS -iL targets.txt
Exemple de sortie Nmap :
PORT STATE SERVICE
80/tcp open http
| CVE-2026-35517_PiHole_FTLDNS:
| VULNÉRABLE :
| RCE Pi-hole FTLDNS via configuration DNS amont
| État : VULNÉRABLE
| ID : CVE:CVE-2026-35517
| Facteur de risque : Élevé (CVSS : 8.8)
| Date de divulgation : 2026-04-07
| Informations supplémentaires :
| Version FTL : v6.4
| Version Core : v6.3
| Version Web : v6.4
| Avis associés également corrigés dans FTL v6.6 :
| GHSA-wxhv-w77q-6qwp (injection dns.hostRecord)
| GHSA-28g5-gg88-wh5m (injection dns.cnameRecords)
| GHSA-fqv2-qhfh-ghcj (injection dhcp.leaseTime)
| GHSA-vfmq-jrx3-wv3c (injection dhcp.hosts)
| Remédiation : Mettez à niveau vers Pi-hole FTL v6.6+ (pihole -up)
| Références :
| 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 vous avez un accès SSH à l'hôte Pi-hole :
# Vérifier la version FTL
pihole-FTL --version
# Ou via l'interface CLI Pi-hole
pihole -v
# Vérifier via l'API (v6)
curl -s http://pi.hole/api/info/version | python3 -m json.tool
# Vérifier via l'API (v5)
curl -s http://pi.hole/admin/api.php?versions | python3 -m json.tool
Si la version FTL est comprise entre 6.0 et 6.5 (inclus), vous êtes vulnérable.
Ce qu'il faut rechercher :
/etc/dnsmasq.d/ et /etc/pihole/ pour des directives inattenduesCommandes pour enquêter :
# Vérifier les configurations dnsmasq pour des lignes injectées
grep -r "dhcp-option\|addn-hosts\|conf-file\|log-facility" /etc/dnsmasq.d/
# Vérifier les modifications récentes de configuration
find /etc/pihole /etc/dnsmasq.d -mtime -7 -ls
# Examiner le journal de débogage de Pi-hole
pihole -d
# Vérifier les processus en cours pour des anomalies
ps aux | grep -E "dnsmasq|pihole"
# Examiner le crontab pour la persistance
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
Action immédiate — mettez à niveau maintenant :
# Mettre à jour Pi-hole (inclut FTL, Web et Core)
pihole -up
# Vérifier la mise à jour
pihole -v
# La version FTL doit être >= 6.6
Si vous ne pouvez pas mettre à niveau immédiatement :
pihole -a -pActions post-correctif :
Kerem Oruç — Ingénieur en cybersécurité