
pfSense CE 2.9.0-DEVELOPMENT - Élevé - À distance - RCE - limiteur numéro dnctl
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-limiter-number
Classe : RCE Portée : Distante
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Les Traffic Shaper Limiters émettent un champ number caché lors de l'édition. La création écrase ce numéro avec dnpipe_find_nextnumber(). L'édition ne le fait pas. validate_input ne vérifie jamais number. GetNumber() est concaténé sans guillemets dans dnctl pipe|sched|queue delete. Le mwexec de PHP est /bin/sh -c. Le privilège est page-firewall-trafficshaper-limiter, et non Diagnostics: Command.
| ID | pas encore de CVE |
| Classe | RCE |
| Portée | Distante (WebGUI authentifié) |
| CWE | CWE-78 |
| CVSS | Élevé : 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produit | pfSense CE |
| Affecté | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) limiter number |
| Auth | Session WebGUI avec page-firewall-trafficshaper-limiter |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
J'ai épinglé le master public 9363ac5. Le lab est un gadget PHP composé des ReadConfig / SetNumber / delete_queue épinglés. Loopback 127.0.0.1:18840.
| Méthode | Sink | Privilège |
|---|---|---|
Créer un limiter, POST save avec un number contrôlé par l'attaquant, puis supprimer ce limiter | mwexec("/sbin/dnctl pipe delete " . $this->GetNumber()) (shaper.inc:3820) | Intégrité (prouvé en lab) : shell root. Lab : edit-delete a écrit le témoin (edit-delete-exec=yes). L'écrasement à la création et le chemin apply-file n'ont rien écrit. |
| Même shell root | système de fichiers de l'hôte | Recon (inféré) : config.xml, clés. |
Shell root ou dnctl de numéros contrôlés par l'attaquant | dummynet | Disponibilité (inféré) : perturbation du limiter / dummynet. |
Prouvé en lab vs inféré : l'écrasement à la création (pas de témoin), le chemin apply-file (dnctl d'un fichier, pas de témoin) et l'exécution edit-delete (témoin) sont prouvés en lab. La reconnaissance du système de fichiers est inférée à partir du PHP-FPM root.
Nécessite : une session WebGUI avec page-firewall-trafficshaper-limiter. CSRF sur le POST save. La suppression est un GET action=delete.
| Surface | Lab |
|---|---|
| Chemin de création | dnpipe_find_nextnumber() écrase, create-overwrites=yes |
| Chemin d'application | dnctl de /tmp/rules.limiter, nom de fichier non contrôlé par l'utilisateur, apply-file=yes |
| Jeu de caractères du nom de limiter | ^[a-zA-Z0-9_-]+$ |
| Non authentifié | fermé |
| Diagnostics: Command | reste fermé sauf si également accordé |
Les paramètres AQM injectés dans /tmp/rules.limiter relèvent du langage dummynet supplémentaire, et non de ce reliquat.
cd lab
./run.sh
Loopback 127.0.0.1:18840. Projet Compose pfsense-limiter-number. Tag d'image pfsense-limiter-number:2.9.0-dev. Témoin PFSENSE-LIMITER-NUMBER-WITNESS. Dernière ligne :
SUCCESS PFSENSE-LIMITER-NUMBER create-overwrites=yes apply-file=yes edit-delete-exec=yes PFSENSE-LIMITER-NUMBER-WITNESS
Caster en int GetNumber() avant chaque dnctl. Ignorer le number du POST lors de l'édition, ou le valider par plage contre l'id dummynet actif. La création écrase déjà ; faire de même pour l'édition.
9363ac5b8651a1c7a333180425ce7719070f95f9shaper.inc delete_queue / GetNumberfirewall_shaper_vinterface.php