
pfSense CE 2.9.0-DEVELOPMENT - High - Remote - RCE - QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
Classe: RCE Portata: Remota
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La modifica QinQ memorizza un nome di interfaccia parent senza alcun controllo does_interface_exist. La modifica VLAN rifiuta già un parent che non è un iface attivo. Form_Select non rivalida il POST. Le write_config di creazione avvengono anche quando interface_qinq_configure ritorna anticipatamente. L'aggiunta/rimozione di un membro interpola poi il vlanif memorizzato in un ifconfig non escapato. Il PHP exec è /bin/sh -c. Il PHP-FPM del WebGUI è root. Il privilegio è page-interfaces-qinq-edit, non Diagnostics: Command.
| ID | nessuna CVE al momento |
| Classe | RCE |
| Portata | Remota (WebGUI autenticato) |
| CWE | CWE-78 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | pfSense CE |
| Affetto | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) modifica QinQ |
| Auth | Sessione WebGUI con page-interfaces-qinq-edit |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Ho fissato il master pubblico 9363ac5. Il lab è un gadget PHP delle righe fissate vlan_interface / interface_qinq_configure / exec del membro, HTTP in loopback su 127.0.0.1:18810.
| Metodo | Sink | Privilegio |
|---|---|---|
| POST di creazione QinQ con un parent che non è un iface attivo, poi POST di modifica aggiungendo un membro | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | Integrità (dimostrata nel lab): shell root tramite /bin/sh -c. Lab: l'aggiunta del membro qinq2 ha scritto il witness (member-sink=yes). |
Stesso vlanif memorizzato, POST di modifica rimuovendo un membro | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | Integrità (dimostrata nel lab): stesso exec root. La destroy non ha alcun limite IF_NAMESIZE. |
| Stessa shell root | filesystem dell'host | Ricognizione (inferita): config.xml, chiavi, altri tenant. Questa pagina non stampa l'output di exec. |
Shell root o ifconfig compromesso | dispositivi vlan | Disponibilità (inferita): creare/distruggere dispositivi vlan; il data plane è in gioco. |
Dimostrato nel lab vs inferito: il rifiuto VLAN, la creazione senza exec, il blocco IF_NAMESIZE a lunghezza 16 e il witness dell'aggiunta del membro qinq2 sono dimostrati nel lab. La ricognizione del filesystem e la compromissione del data plane sono inferite dal PHP-FPM root.
Richiede: una sessione WebGUI con page-interfaces-qinq-edit. Token CSRF. Due POST (creazione, poi modifica del membro). L'admin predefinito ha la pagina. A un utente limitato può essere concessa solo questa pagina.
| Superficie | Lab |
|---|---|
| Controllo di esistenza del parent VLAN | vlan-rejected=yes |
| QinQ solo creazione (parent mancante) | memorizza la config, create-no-exec=yes |
| Lunghezza nome qinq2 16 | if-namesize-block=yes prima dell'exec |
| Non autenticato / CSRF senza token | guiconfig + CSRF-magic |
Regex nome GIF/GRE, membri LAGG does_interface_exist + escapeshellarg | altre pagine |
| Eliminazione dalla lista QinQ di un parent mai creato | does_interface_exist($vlanif) |
| Diagnostics: Command | resta chiuso a meno che non sia anch'esso concesso |
Nessun Diagnostics: Command. Nessun accesso non autenticato. La classe storica è CVE-2023-42326 GIF/GRE, pagina diversa.
cd lab
./run.sh
Loopback 127.0.0.1:18810. Progetto Compose pfsense-qinq-parent-if. Tag immagine pfsense-qinq-parent-if:2.9.0-dev. Witness PFSENSE-QINQ-PARENT-IF-WITNESS. Ultima riga:
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
Modifica QinQ: rifiutare un parent che non è un'interfaccia attiva, come nella modifica VLAN. I controlli interi sui tag dei membri esistono già; ciononostante applicare escapeshellarg al vlanif memorizzato prima di ogni ifconfig. Limitare la destroy dell'eliminazione dei membri allo stesso modo in cui interface_qinq2_configure limita IF_NAMESIZE.
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php