
Outil automatisé de vérification de défauts pour 6 CVEs de dnsmasq (CVE-2026-2291, 4890, 4891, 4892, 4893, 5172)
Outil automatisé en boîte noire pour vérifier 6 vulnérabilités de dnsmasq (mai 2026). Envoie des paquets d'attaque à un DUT en direct et rapporte RÉUSSI / ÉCHEC — aucun accès au code source nécessaire.
# Configurer le DNS du DUT sur l'IP WAN de votre laptop via l'interface graphique d'abord, puis :
sudo python3 dnsmasq_cve_verify.py --laptop <VOTRE_IP_WAN> --dut <IP_LAN_DUT> --dut-pass <MOT_DE_PASSE_SSH>
# Exemple :
sudo python3 dnsmasq_cve_verify.py --laptop 10.0.0.211 --dut 192.168.1.1 --dut-pass '12345Asdf@'
| CVE | CVSS | Type | Vecteur d'attaque | Fonctionnalité affectée |
|---|---|---|---|---|
| CVE-2026-2291 | 9.2 | Débordement de tas (heap) | À distance | extract_name() — toujours active |
| CVE-2026-5172 | 7.5 | Lecture hors limites / plantage | À distance | extract_addresses() — toujours active |
| CVE-2026-4890 | 7.5 | Boucle infinie DoS | À distance | Analyse bitmap NSEC (--dnssec) |
| CVE-2026-4891 | 5.3 | Lecture hors limites du tas | À distance | Validation RRSIG (--dnssec) |
| CVE-2026-4892 | 8.4 | Débordement de tas → root | Local/Adjacent | CLID DHCPv6 (--dhcp-script + DHCPv6) |
| CVE-2026-4893 | 5.3 | Contournement de validation | À distance | Vérification source ECS (--add-subnet) |
Cause racine : union bigname déclare char name[MAXDNAME] mais les caractères échappés peuvent étendre un nom à 2*MAXDNAME+1 octets, provoquant un débordement de tas.
Méthode de test : Envoie des requêtes DNS contenant des noms de domaine avec des caractères à bit haut (0x80+) qui sont échappés en \DDD en interne (4 octets par octet d'entrée). Si dnsmasq plante ou cesse de répondre, il est vulnérable.
Comportement corrigé : Rejette les noms surdimensionnés correctement (FORMERR/REFUSED) ou utilise un tampon agrandi.
Cause racine : Le champ rdlen falsifié permet à extract_name() d'avancer le pointeur au-delà de la fin de l'enregistrement. Un sous-dépassement des octets restants produit une valeur énorme → lecture hors limites massive → plantage.
Méthode de test : Envoie des réponses DNS avec des enregistrements CNAME où rdlen est plus petit que le nom encodé réel. Si dnsmasq plante, il est vulnérable.
Comportement corrigé : Valide que le pointeur reste dans la limite déclarée de rdlen après extract_name().
Cause racine : L'analyse du bitmap de type NSEC avance de p[1] au lieu de p[1]+2 (taille d'en-tête de fenêtre manquante). Avec bitmap_length=0, le pointeur n'avance jamais → boucle infinie.
Méthode de test : Envoie un enregistrement NSEC forgé avec window=0, bitmap_length=0. Si dnsmasq cesse de répondre à TOUTES les requêtes (bloque, ne plante pas), il est vulnérable. Exploitable AVANT la validation RRSIG.
Comportement corrigé : Avance de p[1]+2 et ignore les bitmaps de longueur nulle.
Cause racine : rdlen dans RRSIG n'est pas validé par rapport à la taille minimale (18 + nom du signataire). La longueur calculée de la signature sous-dépasse en négatif → traitée comme énorme → lecture hors limites.
Méthode de test : Envoie des enregistrements RRSIG avec rdlen=10 (bien en dessous du minimum de 31+ octets). Plantage = vulnérable.
Comportement corrigé : Valide rdlen >= fixed_fields + signer_name_length avant de calculer la longueur de la signature.
Cause racine : Les CLID DHCPv6 (jusqu'à 65535 octets) sont encodés en hexadécimal via sprintf("%.2x") dans daemon->packet (5131 octets). CLID de 3000 octets → chaîne hexa de 6000 octets → débordement. Le processus auxiliaire s'exécute en tant que root.
Méthode de test : Envoie SOLICIT DHCPv6 avec un identifiant client de 3000 octets. Nécessite une adjacence IPv6 et --dhcp-script configuré. Plantage du processus auxiliaire = vulnérable.
Comportement corrigé : Tronque ou valide la longueur du CLID avant l'encodage hexadécimal.
Remarque : Certaines compilations utilisent -DNO_DHCP6 et ne sont PAS affectées par cette CVE.
Cause racine : process_reply() passe la longueur de l'enregistrement OPT (~23 octets) au lieu de la longueur totale du paquet à check_source(). Toutes les vérifications de limites échouent → la fonction retourne toujours 1 (valide).
Méthode de test : Envoie des requêtes DNS avec l'option EDNS Client Subnet contenant des préfixes source usurpés. Si dnsmasq renvoie ECS sans validation, il est vulnérable.
Comportement corrigé : Passe la longueur totale du paquet à check_source(), permettant des vérifications de limites appropriées conformément à la RFC 7871 Section 9.2.
Mettez à niveau vers dnsmasq 2.92rel2 (recommandé)
dnsmasq_cve_verify.py)L'outil QA principal. S'exécute sur le laptop de test, envoie des paquets d'attaque au DUT, et rapporte clairement RÉUSSI/ÉCHEC pour chaque CVE. Aucune modification du DUT n'est nécessaire au-delà d'un accès SSH en lecture seule pour l'inspection de l'état.
┌─────────────────────────────────────────────────────────────────────┐
│ Laptop de test │
│ │
│ Interface LAN Interface WAN │
│ <IP_LAN_LAPTOP> <IP_WAN_LAPTOP> │
│ │ │ │
│ │ ┌────┴──────────────┐ │
│ │ │ Serveur DNS │ │
│ │ │ malveillant │ │
│ │ │ (port 53) │ │
│ │ └────┬──────────────┘ │
│ │ │ │
└────────┼───────────────────────────────┼────────────────────────────┘
│ Sous-réseau LAN │ Sous-réseau WAN
│ │
┌────────┼───────────────────────────────┼────────────────────────────┐
│ │ │ │
│ LAN : <IP_LAN_DUT> WAN : <IP_WAN_DUT> │
│ (passerelle LAN) (liaison montante WAN) │
│ │
│ DUT (Routeur Linksys) │
│ dnsmasq (toute version < 2.92rel2) │
│ │
│ resolv-file=/etc/resolv.conf │
│ → nameserver <IP_WAN_LAPTOP> ← défini via GUI, nous transfère │
│ │
└─────────────────────────────────────────────────────────────────────┘