
pfSense CE 2.9.0-DEVELOPMENT - Alta - Remota - RCE - CARP VHID remanescente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Write-up: https://abraxaslabs.tech/research/pfsense-carp-vhid
Classe: RCE Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
A edição de Virtual IP armazena o VHID do CARP a partir do POST sem verificação de 1-255. As opções de Form_Select são apenas HTML. A aplicação do CARP aplica escapeshellarg no VHID. A aplicação de IP Alias empilhado interpola vhid {$carpvip['vhid']} fora de escapeshellarg. O status do CARP interpola o mesmo VHID armazenado em um pipeline grep com aspas duplas; o ponto e vírgula permanece entre aspas, a substituição de comando ainda é executada sob /bin/sh -c. O privilégio é edição + aplicação de VIP, não Diagnostics: Command.
| ID | sem CVE ainda |
| Classe | RCE |
| Alcance | Remoto (WebGUI autenticado) |
| 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 |
| Produto | pfSense CE |
| Afetado | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) CARP VHID |
| Autenticação | Sessão WebGUI com edição + aplicação de VIP (status/widget é um gatilho posterior) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Fixe o master público 9363ac5. O lab é um gadget PHP do interface_carp_configure fixado, do mwexec de ipalias empilhado e do exec de status. Loopback 127.0.0.1:18830.
| Método | Sink | Privilégio |
|---|---|---|
POST de VIP carp com um VHID não inteiro, depois aplicar um IP Alias empilhado nesse pai _vip{uniqid} | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | Integridade (comprovado em lab): shell root. Lab: ipalias-unescaped escreveu o witness. A aplicação do CARP do mesmo VHID não escreveu nada (carp-escaped=yes). |
Mesmo VHID armazenado, depois GET status_carp.php ou renderizar carp_status.widget.php | pipeline grep do exec (pfsense-utils.inc:794) | Integridade (comprovado em lab): a substituição de comando dentro das aspas duplas foi executada e escreveu o witness (status-sink=yes, status-subst=yes). O ponto e vírgula permaneceu entre aspas. O gatilho do widget pode ser outra sessão GUI. |
| Mesmo shell root | sistema de arquivos do host | Recon (inferido): config.xml, chaves. |
Shell root ou ifconfig quebrado | dispositivos CARP / alias | Disponibilidade (inferido): interrupção de interface / CARP / filtro. |
Comprovado em lab vs inferido: carp-escaped, witness de ipalias-unescaped e witness de substituição de comando de status são comprovados em lab. Recon de sistema de arquivos e interrupção de filtro são inferidos a partir do PHP-FPM root.
Requer: page-firewall-virtualipaddress-edit (salvar) e page-firewall-virtualipaddresses (aplicar). Sink de status: page-status-carp ou qualquer dashboard com o widget CARP. CSRF no POST.
| Superfície | Lab |
|---|---|
| A própria aplicação do CARP | escapeshellarg no VHID, carp-escaped=yes |
| Senha do CARP / advbase / advskew / subnet | is_ipaddr / escapado |
| Não autenticado | fechado |
| aplicação xmlrpc dos mesmos objetos sem credenciais HA | lista de exclusão SA-26_22 |
| Diagnostics: Command | permanece fechado a menos que também concedido |
cd lab
./run.sh
Loopback 127.0.0.1:18830. Projeto Compose pfsense-carp-vhid. Tag de imagem pfsense-carp-vhid:2.9.0-dev. Testemunha PFSENSE-CARP-VHID-WITNESS. Última linha:
SUCCESS PFSENSE-CARP-VHID carp-escaped=yes ipalias-unescaped=yes status-sink=yes PFSENSE-CARP-VHID-WITNESS
Restringir o VHID ao intervalo inteiro de 1 a 255 ao salvar. Aplicar escapeshellarg ao VHID na aplicação de IP Alias empilhado e na verificação de status via grep, da mesma forma que a aplicação de CARP já faz.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc mwexec de ipalias empilhadopfsense-utils.inc verificação de status via grep do CARP