
pfSense CE 2.9.0-DEVELOPMENT - Élevé - À distance - RCE - QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
Classe : RCE Portée : Distante
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
L'édition QinQ stocke un nom d'interface parente sans vérification does_interface_exist. L'édition VLAN rejette déjà un parent qui n'est pas une interface active. Form_Select ne revalide pas le POST. Les write_config de création s'exécutent même lorsque interface_qinq_configure retourne prématurément. L'ajout/suppression de membre interpole ensuite le vlanif stocké dans un ifconfig non échappé. Le exec PHP est /bin/sh -c. Le PHP-FPM du WebGUI est root. Le privilège est page-interfaces-qinq-edit, pas 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) édition QinQ |
| Auth | Session WebGUI avec page-interfaces-qinq-edit |
| 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 des lignes épinglées vlan_interface / interface_qinq_configure / membre exec, HTTP en loopback sur 127.0.0.1:18810.
| Méthode | Sink | Privilège |
|---|---|---|
| POST de création QinQ avec un parent qui n'est pas une interface active, puis POST d'édition ajoutant un membre | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | Intégrité (prouvé en lab) : shell root via /bin/sh -c. Lab : l'ajout de membre qinq2 a écrit le témoin (member-sink=yes). |
Même vlanif stocké, POST d'édition supprimant un membre | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | Intégrité (prouvé en lab) : même exec root. Destroy n'a pas de limite IF_NAMESIZE. |
| Même shell root | système de fichiers de l'hôte | Recon (inféré) : config.xml, clés, autres tenants. Cette page n'affiche pas la sortie de exec. |
Shell root ou ifconfig cassé | périphériques vlan | Disponibilité (inféré) : créer/détruire des périphériques vlan ; le plan de données est en jeu. |
Prouvé en lab vs inféré : le rejet VLAN, la création seule sans exec, le blocage IF_NAMESIZE à la longueur 16, et le témoin d'ajout de membre qinq2 sont prouvés en lab. La reconnaissance du système de fichiers et la perturbation du plan de données sont inférées à partir du PHP-FPM root.
Nécessite : une session WebGUI avec page-interfaces-qinq-edit. Un jeton CSRF. Deux POST (création, puis édition de membre). L'admin par défaut possède la page. Un utilisateur limité peut se voir accorder uniquement cette page.
| Surface | Lab |
|---|---|
| Vérification d'existence du parent VLAN | vlan-rejected=yes |
| QinQ création seule (parent manquant) | stocke la config, create-no-exec=yes |
| Longueur du nom qinq2 16 | if-namesize-block=yes avant exec |
| Non authentifié / CSRF sans jeton | guiconfig + CSRF-magic |
Regex de nom GIF/GRE, membres LAGG does_interface_exist + escapeshellarg | autres pages |
| Suppression dans la liste QinQ d'un parent jamais créé | does_interface_exist($vlanif) |
| Diagnostics: Command | reste fermé sauf si également accordé |
Pas de Diagnostics: Command. Pas de non authentifié. La classe historique est CVE-2023-42326 GIF/GRE, page différente.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Projet Compose pfsense-qinq-parent-if. Tag d'image pfsense-qinq-parent-if:2.9.0-dev. Témoin PFSENSE-QINQ-PARENT-IF-WITNESS. Dernière ligne :
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
Édition QinQ : rejeter un parent qui n'est pas une interface active, comme pour l'édition VLAN. La vérification entière des tags de membre existe déjà ; il faut tout de même escapeshellarg le vlanif stocké avant chaque ifconfig. Limiter le destroy de suppression de membre de la même manière que interface_qinq2_configure limite IF_NAMESIZE.
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php