
pfSense CE 2.9.0-DEVELOPMENT - Alta - Remota - RCE - CARP VHID remanescente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Classe: RCE Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
A edição de Virtual IP armazena o CARP VHID do POST sem verificação de 1-255. As opções de Form_Select são apenas HTML. A aplicação do CARP faz escapeshellarg no VHID. A aplicação de IP Alias empilhado interpola vhid {$carpvip['vhid']} fora do 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 de VIP + aplicar, 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 de VIP + aplicar (status/widget é um gatilho posterior) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Fixeio o master público 9363ac5. O lab é um gadget PHP do interface_carp_configure fixado, mwexec de ipalias empilhado e exec de status. Loopback 127.0.0.1:18830.
| Método | Sink | Privilégio |
|---|---|---|
POST carp VIP 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 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 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 de 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 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 da imagem pfsense-carp-vhid:2.9.0-dev. Witness 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-255 ao salvar. Aplicar escapeshellarg no VHID na aplicação de IP Alias empilhado e no grep de status, da mesma forma que a aplicação do CARP já faz.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc ipalias empilhado mwexecpfsense-utils.inc grep de status do CARP