OPNsense 26.7.6 - Élevé - À distance - Privilège résiduel - verrouillage d'usine IP
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-lockout-factory-ip
Classe : Reliquat de privilège Portée : Distante
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Une connexion WebGUI non authentifiée pilote toujours lockout_handler à partir d'une ligne LOG_AUTH d'usine qui ne contient pas d'IP de socket. GHSA-2v2x a fermé la division CRLF et a basculé la sélection de l'IP de verrouillage vers le dernier jeton afin que le from REMOTE_ADDR final de authgui.inc l'emporte. AuthenticationFactory::authenticate() continue de syslog() le nom d'utilisateur brut sans suffixe d'adresse. Un nom d'utilisateur qui correspond à une phrase False de verrouillage plus un jeton IPv4 est la dernière (seule) adresse sur cette ligne. Après 5 tentatives espacées par défaut : pfctl -t sshlockout -T add et pfctl -k. Par défaut : verrouillage activé, GUI LAN.
| ID | pas encore de CVE |
| Classe | Reliquat de privilège |
| Portée | Distante (POST de connexion WebGUI non authentifié) |
| CWE | CWE-117 / CWE-863 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produit | OPNsense core (Deciso B.V.) |
| Affecté | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) AuthenticationFactory / lockout_handler |
| Auth | Non authentifié. Cookie CSRF + jeton depuis GET /. |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
J'ai épinglé le tag 26.7.6. Le lab est le lockout_handler épinglé plus un stub pfctl dans le PATH, identité loopback 127.0.0.1:18800. Ce n'est pas du CRLF. Un enregistrement syslog PHP reste une ligne de handler. Le dernier-IP était le bon durcissement pour le template authgui et le mauvais durcissement pour le template d'usine.
| Méthode | Cible | Privilège |
|---|---|---|
Nom d'utilisateur LOG_AUTH d'usine non authentifié avec une phrase False de verrouillage plus un jeton IPv4 (6 lignes espacées) | épingler lockout_handler -> stub pfctl -t sshlockout -T add et pfctl -k | Intégrité (prouvée en lab) : table sshlockout plus argv de kill d'état. Lab : planted=203.0.113.77. |
| même plant, pf en production | filter.lib.inc:293-314 from <sshlockout> to (self) ports 22/GUI | Disponibilité (inférée) : abandon des nouveaux TCP 22/GUI depuis l'hôte planté ; pfctl -k détruit les états existants depuis cette IP. |
| même nom d'utilisateur avec seulement l'IPv4 (sans phrase False) | lockout_handler | Négatif (prouvé en lab) : aucun ajout à la table. negative-ip-only=no. |
ligne authgui avec from REMOTE_ADDR final | parseur dernier-IP | Intégrité de sa propre IP (prouvée en lab) : le dernier jeton authgui reste 198.51.100.10. |
| Corps de connexion échouée | aucun | Recon (fermé, prouvé en lab) : « Wrong username or password. » existant. Pas d'énumération d'utilisateurs. |
Prouvé en lab vs inféré : le plant d'usine, le négatif nom d'utilisateur seul et le dernier-IP authgui sont des SUCCÈS en lab. Le blocage pf en production et le kill de session en production sont inférés. Le lockout_handler épinglé est copié sans modification ; syslog-ng et le POST WebGUI sont stubbés.
Nécessite : un POST de connexion WebGUI non authentifié. Cookie CSRF + jeton depuis GET /. Verrouillage activé (system.no_sshlockout non défini). Installation par défaut.
| Surface | Lab |
|---|---|
Session non authentifiée / root / écriture de config.xml | fermée |
| Ligne authgui plantant une IP étrangère | le dernier jeton est REMOTE_ADDR (authgui-last-ip=198.51.100.10) |
readline() supplémentaire via CRLF | réécriture GHSA-2v2x ; un enregistrement reste une ligne |
| Connexion avec mot de passe vide | authgui.inc exige un mot de passe non vide |
| Réinitialisation par mot-clé de succès CVE-2026-44195 sur la ligne authgui | les règles d'échec d'abord |
TypeError pfctl -k str(ip) d'Omar Habra dans 26.7.6 | déjà sur cette épingle |
| IP plantée comme destination DNS/passerelle | les règles sont from <sshlockout> to (self) ports 22/GUI uniquement |
Aucun contournement de connexion. Aucun RCE. Aucune réécriture de config.xml. Ne crée pas de session.
cd lab
./run.sh
Loopback 127.0.0.1:18800. Projet Compose opnsense-lockout-factory-ip. Tag d'image opnsense-lockout-factory-ip:26.7.6. Témoin OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS. Dernière ligne :
SUCCESS opnsense-lockout-factory-ip planted=203.0.113.77 table=sshlockout negative-ip-only=no authgui-last-ip=198.51.100.10 OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS
Ajouter l'IP de socket au template syslog(LOG_AUTH) d'usine, avec le même from REMOTE_ADDR final que authgui.inc. Ou ignorer les IP de verrouillage qui ne proviennent pas du propre pair du handler. Ne pas traiter le dernier jeton comme un substitut à « l'adresse du client ».
a842fe48c21288d11a422cb944678e8eb308becfAuthenticationFactory.phplockout_handler