
OPNsense 26.7.6 - Élevée - À distance - Injection de ligne de configuration - chargeur de tunables
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-tunables-loader
Write-up : https://abraxaslabs.tech/research/opnsense-tunables-loader
Classe : Injection de ligne de configuration Portée : Distante
Cœur d'OPNsense 26.7.6 (a842fe48) - opnsense.org
System: Advanced: Tunables interpole toujours le nom/valeur dans /boot/loader.conf. Vestige frère de GHSA-fq94. Les champs tunable / value de Tunables.xml sont de simples TextField (retours à la ligne activés). system_login_configure() écrit {$param}="{$value}". La reconfiguration des Tunables redémarre également login. Le sysctl(8) en direct passe par shell_safe plus un filtre OID, donc ce saut n'est pas une injection shell. Le vestige consiste en des directives loader supplémentaires au prochain démarrage. Le privilège est page-system-advanced-sysctl, pas page-all.
Ce pack GitHub reste privé jusqu'à la divulgation coordonnée.
| ID | pas encore de CVE |
| Classe | Injection de ligne de configuration |
| Portée | Distante (WebGUI / API authentifié) |
| CWE | CWE-93 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produit | OPNsense core |
| Affecté | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) System: Advanced: Tunables |
| Auth | Session WebGUI ou clé API avec page-system-advanced-sysctl |
| Licence | GNU Affero GPL v3.0 |
| Lab | compose exec gadget (hunt slot 18850) |
J'ai épinglé le tag 26.7.6 peel a842fe48. Le lab est un gadget PHP de l'interpolation épinglée de system_login_configure(). Projet Compose opnsense-tunables-loader. Hunt slot 18850 dans la famille de gadgets 18800-18860 ; ce fichier compose utilise docker compose exec php, pas un bind HTTP publié.
| Méthode | Sink | Privilège |
|---|---|---|
Valeur de Tunable avec CR/LF (hw.usb.no_boot_wait plus "\n# witness) | épingler une ligne supplémentaire de system_login_configure() dans /boot/loader.conf | Intégrité (prouvé en lab) : # OPNSENSE-TUNABLES-LOADER-WITNESS supplémentaire sur sa propre ligne après une affectation fermée. Lab : newline-extra-line=yes. |
Valeur propre 1 | même writer | Négatif (prouvé en lab) : ligne d'affectation unique, pas de witness. Lab : clean-value-single-line=yes. |
| Mêmes lignes loader supplémentaires au prochain démarrage | loader init_path / module_path / *_load / vfs.root.mountfrom / console | Intégrité (inféré) : le loader au prochain démarrage honore les clés de l'attaquant. Pas de redémarrage dans ce gadget. |
Lignes loader invalides / mauvais vfs.root.mountfrom | /boot/loader.conf | Disponibilité (inféré) : échec de démarrage ou mauvais root. |
POST /api/core/tunables/searchItem | API tunables | Recon (inféré) : lister les tunables, y compris current/default/type. Prévu pour cette ACL. |
sysctl -w en direct d'un OID valide | set_sysctl + filtre OID | Tâche prévue de la page. Les lignes loader supplémentaires sont le vestige. |
Prouvé en lab vs inféré : la ligne loader supplémentaire par retour à la ligne et la valeur propre sur une seule ligne sont des SUCCÈS en lab. L'application par le loader au prochain démarrage est inférée. Gadget, pas une VM FreeBSD OPNsense complète.
Nécessite : un utilisateur connecté ou la clé API locale de cet utilisateur avec page-system-advanced-sysctl et sans page-all. POST /api/core/tunables/*. CSRF sur les POST de session. La reconfiguration redémarre login ; rc.reload_all et le boot appellent aussi system_login_configure.
| Surface | Lab |
|---|---|
| Injection de shell sysctl en direct | shell_safe plus filtre OID |
| Valeur propre | ligne d'affectation unique |
| Non authentifié | 401 |
Utilisateur sans page-system-advanced-sysctl | 403 |
user-config-readonly | save() lève une exception |
page-all tunables admin définissant un OID réel | prévu |
| Champs texte de l'interface graphique corrigés par GHSA-fq94 | sinks différents ; ce champ n'était pas nommé |
Pas de non authentifié. Pas de shell sysctl en direct. Pas de Diagnostics : Command.
cd lab
./run.sh
Compose le projet opnsense-tunables-loader. Témoin OPNSENSE-TUNABLES-LOADER-WITNESS. Dernière ligne :
SUCCESS opnsense-tunables-loader newline-extra-line=yes clean-value-single-line=yes OPNSENSE-TUNABLES-LOADER-WITNESS
Lanceur racine : python3 opnsense-tunables-loader-Abraxas-Labs.py.
Supprimer les CR/LF et les " du nom et de la valeur des tunables, même classe que GHSA-fq94. Typer le nom comme un masque OID, et non comme un simple TextField. Mettre entre guillemets à l'aide d'un helper qui ne peut pas fermer l'affectation. Ne pas écrire un tunable dans /boot/loader.conf à moins qu'il ne s'agisse d'une clé de loader connue.
a842fe48c21288d11a422cb944678e8eb308becfsystem.inc interpolation de loader.conf dans system_login_configureTunables.xml nom/valeur en TextField simple