Volver a la wiki

Auditoría Suprema Etapa 3 network sub-área 3: Vendor/MIB/OUI (s114)

Descripción

Tercera sub-área de network (sesión 114, 2026-06-08): el catálogo de fabricantes y MIBs (las “fichas técnicas” que usa el sistema para reconocer dispositivos SNMP/HTTP) y los endpoints de perfiles auto-descubiertos. Auditoría identificó 25 hallazgos confirmados (8 ALTA, 5 MEDIA, 12 BAJA) en:

Esta PR merge todos los hallazgos viables en una tanda (Regla 22), diferiendo a PRs propias:

Hallazgos resueltos

Raíz A: Autorización ausente en endpoints MIB (6 ALTA)

Problema: upload_mib, delete_custom_mib, apply_custom_oids, mib_assistant_analyze, mib_assistant_apply no exigían rol admin. El catálogo de MIBs/OIDs es GLOBAL y compartido por todas las orgs del SaaS. Un usuario normal de cualquier org podía:

Solución: Los 5 endpoints anteponen if not is_admin(request.user): return 403 + 403 declarado en el response del decorador.

Raíz B: Path traversal / arbitrary file write en upload_mib (ALTA)

Problema: module_name (nombre interno del MIB) se extraía del contenido del fichero con regex \S+ sin validación. Un MIB malicioso podía incluir ../ en el nombre → escritura fuera de custom_dir (potencial RCE).

Solución:

Raíz C: Broken Access Control en profiles.py → require_perm (ALTA)

Problema: Ningún endpoint del router profiles gateaba por rol (solo get_current_org). Un usuario readonly podía:

Solución: Cada endpoint exige:

Patrón coherente con discovery.py/scripts.py.

ReDoS en regex editables del vendor (MEDIA)

Problema: Las expresiones de detección de marca (sys_descr_patterns, sys_descr_model_regex, sys_descr_version_regex) son campos editables del VendorProfile. Un patrón con backtracking catastrófico + un sysDescr largo colgaba el worker.

Solución: Capar sysDescr a 2048 caracteres antes de aplicar patrones en:

Paridad con el body[:2048] HTTP.

SSRF defense-in-depth en refresh-interfaces/read-port-config (MEDIA)

La IP del profile se valida con check_scan_ip (rechaza loopback/metadata) antes de abrir SNMP/SSH.

Prompt injection OID→LLM (MEDIA)

Problema: Los nombres/sintaxis de OIDs subidos se enviaban al LLM sin sanitización.

Solución: Wrapping con wrap_untrusted() (reutiliza sanitize.py de CNS) + redacción de secretos antes de llegar a Gemma 4.

Code-exec latente documentado (MEDIA)

get_mib_dir() deja constancia: los .py compilados por pysmi derivan de input no confiable y NUNCA deben importarse (hoy solo se leen como texto).

Cambios de robustez / pulido

Tests

Nuevos tests en tests/api/test_network_sa3.py (12 tests):

CI improvements

Véase también

Subir