
OPNsense 26.7.6 - Alta - Remota - Privilegi residui - mirror firmware personalizzato sed-salta le impronte pkg
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
Classe: Salto della firma Portata: Remota
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Sistema: Firmware set invia POST con un mirror / flavour personalizzato. Il core FILTER_SANITIZE_URL mantiene \|#;". opnsense-update -m / -n interpola quella stringa in sed su OPNsense.conf e può commutare signature_type da "fingerprints" a "none". Poi pkg install come root dall'URL dell'attaccante. La pagina delle impostazioni offre un mirror personalizzato di pacchetti OPNsense ancora firmati. Non ha un controllo "disabilita firme". Il privilegio è page-system-firmware-manualupdate, non page-all.
Sed risiede in opnsense-update, fuori dal pin. Il core su questo pin è il campo non sanificato più il passaggio -m. Il laboratorio riesegue quel testo di programma s||| con GNU sed.
Questo pacchetto GitHub resta privato fino alla divulgazione coordinata.
| ID | nessuna CVE al momento |
| Classe | Salto della firma |
| Portata | Remota (WebGUI / API autenticata) |
| CWE | CWE-74 / CWE-347 |
| CVSS | Alto: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | OPNsense core |
| Affetto | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) Firmware set mirror personalizzato |
| Auth | Sessione WebGUI o chiave API con page-system-firmware-manualupdate |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Ho fissato il tag 26.7.6 peel a842fe48. Il laboratorio è un gadget PHP di FILTER_SANITIZE_URL più il sed mod_mirrorurl di opnsense-update, HTTP su loopback 127.0.0.1:18860. PR:H perché alla pagina del firmware è già consentito installare pacchetti firmati. Punteggio 8.8 se quella pagina è trattata come PR:L.
| Metodo | Sink | Privilegio |
|---|---|---|
FILTER_SANITIZE_URL su un mirror personalizzato con | poi sed in stile opnsense-update | riscrittura di OPNsense.conf | Integrità (dimostrata in lab): signature_type "none". Il mirror di controllo resta "fingerprints". Lab: sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes. |
| Stesso set, campo plugins | setAction scarta plugins | Negativo (dimostrato in lab): plugins scartati prima del salvataggio. |
Poi POST /api/core/firmware/install/<pkg> | pkg install -y come root dall'URL dell'attaccante | Integrità (inferita): pacchetto non firmato come root. La pagina del firmware installa già pacchetti firmati; questo residuo è il salto della verifica. Nessun payload non firmato nel lab. |
Poi POST /api/core/firmware/update o /upgrade | opnsense-update -pt / -u come root | Integrità (inferita): set base/kernel con verifica saltata (DO_INSECURE). |
GET /api/core/firmware/info, /running, /upgradestatus | API firmware | Ricognizione (inferita): elenchi pacchetti, log di aggiornamento, opzioni mirror. Previsto per questa ACL. |
POST /api/core/firmware/reboot, /poweroff, /remove/<pkg> | azioni firmware configd | Disponibilità (inferita): reboot/halt/remove. Previsto per questa ACL, non per il residuo. |
Dimostrato in lab vs inferito: sanitize mantiene | e signature_type none sono SUCCESSO in lab. pkg install live di un pacchetto non firmato è inferito. Gadget, non una VM OPNsense FreeBSD completa. Nessun payload di pacchetto non firmato.
Richiede: utente autenticato o la chiave API Locale di quell'utente con page-system-firmware-manualupdate e senza page-all. CSRF su POST di sessione. Non non-autenticato. Non solo dashboard.
| Superficie | Lab |
|---|---|
| Firmware non autenticato | 401 |
| Solo dashboard | 403 |
Mirror di controllo https://pkg.opnsense.org | signature_type resta "fingerprints" |
| Traversal nel nome del plugin | filter_pkgname |
| Recupero changelog | ancora opnsense-verify |
user-config-readonly su save() | throwReadOnly() |
| Mirror HTTP standard senza salto della verifica | MITM sul trasporto; fingerprints ancora richiesti |
| Firmware XMLRPC | solo stringhe di versione |
Nessun non autenticato. Nessun solo dashboard. Changelog ancora firmato.
cd lab
./run.sh
Loopback 127.0.0.1:18860. Progetto Compose opnsense-firmware-mirror-sed. Witness OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS. Ultima riga:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
Launcher root: python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py.
Forma del mirror d'attacco usata nel lab (solo witness, nessun pkg non firmato):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
Rifiutare un mirror personalizzato che non sia un URL. Rimuovere i metacaratteri di sed (|, ;, #, ") prima di opnsense-update -m / -n, oppure passare l'URL come file in modo che sed non lo veda mai come testo di programma. Mantenere signature_type: "fingerprints" a meno che un controllo separato e verificato disattivi la verifica. Non permettere che Firmware set riscriva i fingerprints a "none".
a842fe48c21288d11a422cb944678e8eb308becfFirmwareController.php setAction FILTER_SANITIZE_URLscripts/firmware/repos/OPNsense.php opnsense-update -sd -mOPNsense.conf.shadow.in stock signature_type: "fingerprints"opnsense-update mod_mirrorurl (s\|\| sulla riga url:)