
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
Classe : Injection de ligne de configuration Portée : Distante
OPNsense core 26.7.6 (a842fe48) - opnsense.org
System: Advanced: Tunables interpole encore 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 aussi 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, ce sont 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 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 de bind HTTP publié.
| Méthode | Sink | Privilège |
|---|---|---|
Valeur de Tunable 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 erronées / 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 cet ACL. |
sysctl -w en direct d'un OID valide | set_sysctl + filtre OID | Tâche de page prévue. 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 OPNsense FreeBSD 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 le POST de session. La reconfiguration redémarre login ; rc.reload_all et le boot appellent aussi system_login_configure.
| Surface | Lab |
|---|---|
| Injection 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 |
Admin tunables page-all définissant un vrai OID | prévu |
| Champs texte GUI patchés 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
Projet Compose opnsense-tunables-loader. Witness 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 root : python3 opnsense-tunables-loader-Abraxas-Labs.py.
Supprimer les CR/LF et " du nom et de la valeur des tunables, même classe que GHSA-fq94. Typer le nom comme un masque OID, pas un TextField nu. Mettre entre guillemets avec 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é loader connue.
a842fe48c21288d11a422cb944678e8eb308becfsystem.inc interpolation loader.conf de system_login_configureTunables.xml nom/valeur TextField nus