
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
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 do GHSA-fq94. Tunables.xml tunable / value são TextField puros (newlines ativados). system_login_configure() escreve {$param}="{$value}". A reconfiguração de Tunables também reinicia o login. O sysctl(8) ao vivo passa por shell_safe mais um filtro de OID, então 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 (comprovada 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 escritor | Negativo (comprovado em lab): linha de atribuição única, sem witness. Lab: clean-value-single-line=yes. |
| Mesmas linhas extras do loader no próximo boot | loader init_path / module_path / *_load / vfs.root.mountfrom / console | Integridade (inferida): o loader do próximo boot honra chaves do atacante. Não reiniciado neste gadget. |
Linhas de loader inválidas / vfs.root.mountfrom errado | /boot/loader.conf | Disponibilidade (inferida): falha de boot ou root errado. |
POST /api/core/tunables/searchItem | API de tunables | Recon (inferida): lista tunables, incluindo atual/default/tipo. Destinado a esta ACL. |
sysctl -w ao vivo de um OID válido | set_sysctl + filtro de OID | Tarefa pretendida da página. 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 em 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 | Lab |
|---|---|
| Injeção de shell no 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 tunables com 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 de sysctl ao vivo. Sem Diagnostics: Command.
cd lab
./run.sh
Projeto Compose 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
Launcher root: python3 opnsense-tunables-loader-Abraxas-Labs.py.
Remova CR/LF e " do nome e do valor dos tunables, mesma classe do GHSA-fq94. Tipar o nome como uma máscara de OID, não um TextField puro. Colocar entre aspas com um helper que não possa fechar a atribuição. Não escreva 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 TextField puro de nome/valor