
pfSense CE 2.9.0-DEVELOPMENT - Alta - Remota - RCE - CARP VHID residual
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Análisis: https://abraxaslabs.tech/research/pfsense-carp-vhid
Clase: RCE Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La edición de IP virtual almacena el VHID de CARP desde el POST sin ninguna comprobación de 1-255. Las opciones de Form_Select son solo HTML. La aplicación de CARP aplica escapeshellarg al VHID. La aplicación de IP Alias apilada interpola vhid {$carpvip['vhid']} fuera de escapeshellarg. El estado de CARP interpola el mismo VHID almacenado en una tubería grep entre comillas dobles; el punto y coma permanece entre comillas, la sustitución de comandos aún se ejecuta bajo /bin/sh -c. El privilegio es edición de VIP + aplicar, no Diagnostics: Command.
| ID | aún sin CVE |
| Clase | RCE |
| Alcance | Remoto (WebGUI autenticada) |
| 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 |
| Producto | pfSense CE |
| Afectado | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) CARP VHID |
| Autenticación | Sesión WebGUI con edición de VIP + aplicar (el estado/widget es un disparador posterior) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Fijé el master público 9363ac5. El laboratorio es un gadget PHP del interface_carp_configure fijado, el mwexec de ipalias apilado y el exec de estado. Loopback 127.0.0.1:18830.
| Método | Sumidero | Privilegio |
|---|---|---|
POST de VIP carp con un VHID no entero, luego aplicar un IP Alias apilado sobre ese padre _vip{uniqid} | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | Integridad (probado en laboratorio): shell root. Laboratorio: ipalias-unescaped escribió el testigo. La aplicación de CARP del mismo VHID no escribió ninguno (carp-escaped=yes). |
Mismo VHID almacenado, luego GET status_carp.php o renderizar carp_status.widget.php | tubería grep de exec (pfsense-utils.inc:794) | Integridad (probado en laboratorio): la sustitución de comandos dentro de las comillas dobles se ejecutó y escribió el testigo (status-sink=yes, status-subst=yes). El punto y coma permaneció entre comillas. El disparador del widget puede ser otra sesión GUI. |
| Mismo shell root | sistema de archivos del host | Reconocimiento (inferido): config.xml, claves. |
Shell root o ifconfig roto | dispositivos CARP / alias | Disponibilidad (inferido): interrupción de interfaz / CARP / filtro. |
Probado en laboratorio vs inferido: carp-escaped, el testigo de ipalias-unescaped y el testigo de sustitución de comandos de estado están probados en laboratorio. El reconocimiento del sistema de archivos y la interrupción del filtro se infieren de PHP-FPM como root.
Requiere: page-firewall-virtualipaddress-edit (guardar) y page-firewall-virtualipaddresses (aplicar). Sumidero de estado: page-status-carp o cualquier panel con el widget CARP. CSRF en el POST.
| Superficie | Laboratorio |
|---|---|
| La propia aplicación de CARP | escapeshellarg sobre el VHID, carp-escaped=yes |
| Contraseña de CARP / advbase / advskew / subred | is_ipaddr / escapado |
| Sin autenticación | cerrado |
| Aplicación xmlrpc de los mismos objetos sin credenciales HA | lista de omisión SA-26_22 |
| Diagnostics: Command | permanece cerrado a menos que también se conceda |
cd lab
./run.sh
Loopback 127.0.0.1:18830. Proyecto de Compose pfsense-carp-vhid. Etiqueta de imagen pfsense-carp-vhid:2.9.0-dev. Testigo PFSENSE-CARP-VHID-WITNESS. Última línea:
SUCCESS PFSENSE-CARP-VHID carp-escaped=yes ipalias-unescaped=yes status-sink=yes PFSENSE-CARP-VHID-WITNESS
Restringir el rango entero del VHID a 1-255 al guardar. Aplicar escapeshellarg al VHID en la aplicación de IP Alias apiladas y en el grep de estado, de la misma manera que ya lo hace la aplicación de CARP.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc mwexec de ipalias apiladaspfsense-utils.inc grep de estado de CARP