
OPNsense 26.7.6 - Alta - Remoto - Injeção de linha de configuração - carregador de tunables
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-tunables-loader
Write-up: https://abraxaslabs.tech/research/opnsense-tunables-loader
Classe: Injeção de linha de configuração Alcance: Remoto
OPNsense core 26.7.6 (a842fe48) - opnsense.org
System: Advanced: Tunables ainda interpola nome/valor em /boot/loader.conf. Resquício irmão de GHSA-fq94. Tunables.xml tunable / value são TextField puros (newlines ativados). system_login_configure() grava {$param}="{$value}". A reconfiguração de Tunables também reinicia o login. O sysctl(8) em tempo real passa por shell_safe mais um filtro de OID, portanto esse salto não é injeção de shell. O resquício são diretivas extras do loader no próximo boot. O privilégio é page-system-advanced-sysctl, não page-all.
Este pacote do GitHub permanece privado até a divulgação coordenada.
| ID | ainda sem CVE |
| Classe | Injeção de linha de configuração |
| Alcance | Remoto (WebGUI / API autenticado) |
| CWE | CWE-93 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produto | OPNsense core |
| Afetado | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) System: Advanced: Tunables |
| Autenticação | Sessão WebGUI ou chave de API com page-system-advanced-sysctl |
| Licença | GNU Affero GPL v3.0 |
| Lab | compose exec gadget (hunt slot 18850) |
Fixe a tag 26.7.6 peel a842fe48. O lab é um gadget PHP da interpolação fixada de system_login_configure(). Projeto Compose opnsense-tunables-loader. Hunt slot 18850 na família de gadgets 18800-18860; este arquivo compose usa docker compose exec php, não um bind HTTP publicado.
| Método | Sink | Privilégio |
|---|---|---|
Valor de Tunables com CR/LF (hw.usb.no_boot_wait mais "\n# witness) | fixa linha extra de system_login_configure() em /boot/loader.conf | Integridade (comprovado em lab): # OPNSENSE-TUNABLES-LOADER-WITNESS extra em sua própria linha após uma atribuição fechada. Lab: newline-extra-line=yes. |
Valor limpo 1 | mesmo gravador | Negativo (comprovado em lab): linha de atribuição única, sem witness. Lab: clean-value-single-line=yes. |
| As mesmas linhas extras do loader no próximo boot | loader init_path / module_path / *_load / vfs.root.mountfrom / console | Integridade (inferido): o loader do próximo boot honra as chaves do atacante. Não reiniciado neste gadget. |
Linhas de loader inválidas / vfs.root.mountfrom errado | /boot/loader.conf | Disponibilidade (inferido): falha de boot ou root errado. |
POST /api/core/tunables/searchItem | API de tunables | Recon (inferido): lista tunables, incluindo atual/padrão/tipo. Destinado a esta ACL. |
sysctl -w em tempo real de um OID válido | set_sysctl + filtro de OID | Tarefa pretendida da página. As linhas extras do loader são o resquício. |
Comprovado em lab vs inferido: linha extra do loader por newline e valor limpo em linha única são SUCESSO no lab. A aplicação pelo loader no próximo boot é inferida. Gadget, não uma VM FreeBSD completa do OPNsense.
Requer: usuário autenticado ou a chave de API Local desse usuário com page-system-advanced-sysctl e sem page-all. POST /api/core/tunables/*. CSRF em POST de sessão. A reconfiguração reinicia o login; rc.reload_all e o boot também chamam system_login_configure.
| Superfície | Laboratório |
|---|---|
| Injeção de shell em sysctl ao vivo | shell_safe mais filtro de OID |
| Valor limpo | linha de atribuição única |
| Não autenticado | 401 |
Usuário sem page-system-advanced-sysctl | 403 |
user-config-readonly | save() lança exceção |
Administrador de ajustes page-all definindo um OID real | pretendido |
| Campos de texto da GUI corrigidos pelo GHSA-fq94 | sinks diferentes; este campo não foi nomeado |
Sem não autenticado. Sem shell sysctl ao vivo. Sem Diagnostics: Command.
cd lab
./run.sh
Compose do projeto opnsense-tunables-loader. Witness OPNSENSE-TUNABLES-LOADER-WITNESS. Última linha:
SUCCESS opnsense-tunables-loader newline-extra-line=yes clean-value-single-line=yes OPNSENSE-TUNABLES-LOADER-WITNESS
Root launcher: python3 opnsense-tunables-loader-Abraxas-Labs.py.
Remover CR/LF e " do nome e do valor dos tunables, mesma classe do GHSA-fq94. Tipar o nome como uma máscara OID, não como um TextField simples. Colocar entre aspas com um helper que não possa fechar a atribuição. Não escrever um tunable em /boot/loader.conf a menos que seja uma chave de loader conhecida.
a842fe48c21288d11a422cb944678e8eb308becfsystem.inc interpolação de loader.conf em system_login_configureTunables.xml nome/valor como TextField simples