CreaRack-SL

Modelo CustomMib (MIBs compilados subidos por admin)

Propósito

CustomMib registra los MIBs (Management Information Base, “fichas técnicas SNMP” en ASN.1) que un admin carga manualmente para extender el catálogo de fabricantes. Cada entrada:

  • Apunta a un VendorProfile (catálogo global)
  • Contiene metadatos del MIB (nombre de módulo, hash)
  • Linkea OIDs extraídos propios y los que el asistente IA propone

Estructura

CampoTipoNotas
vendor_profileFK → VendorProfileEl vendor para el que se sube este MIB (catálogo global)
module_nameCharFieldNombre del módulo ASN.1 (ej: CISCO-SYSTEM-MIB)
file_hashCharFieldSHA256 del contenido original (evita duplicados)
extracted_oids_jsonJSONFieldOIDs parseados de pysmi (name, oid, type, syntax)
extracted_countIntegerFieldCantidad de OIDs extraídos
compiled_pathCharFieldRuta del .py compilado por pysmi (en MIB_CACHE_DIR)
is_staleBooleanField¿Requiere recompilación? (si hay cambios en dependencias)
error_logTextFieldErrores de compilación pysmi (si ocurrieron)
created_atDateTimeFieldTimestamp de upload

Seguridad (s114)

Upload (path traversal fix)

POST /api/vendor-profiles/{slug}/upload-mib:

  1. Autorización: admin only (new in s114)
  2. Validación de extensión: debe estar en {.mib, .my, .txt, .asn1, .asn}
  3. Extracción de module_name: del contenido del fichero (búsqueda de “MODULE DEFINITIONS ::= BEGIN”)
  4. Validación de module_name: debe coincidir con ^[A-Za-z0-9._-]+$ (s114 fix):
    • Previo: module_name sin validación + nombres con ../ permitían path traversal
    • Ahora: lista blanca estricta, rejaza separadores y relativos
  5. Verificación realpath: el fichero resultante debe quedar dentro de custom_dir:
    if os.path.dirname(os.path.realpath(source_path)) != os.path.realpath(custom_dir):
        return 400, {"message": "Resolved MIB path escapes the custom MIB directory."}

Borro (nombre exacto, no prefijo)

DELETE /api/vendor-profiles/{slug}/custom-mibs/{mib_id}:

  1. Autorización: admin only (s114)
  2. Borro por nombre exacto (new in s114):
    • Previo: startswith(f"{slug}_{module_name}") arrastraba ficheros con prefijo común (FOO vs FOO-EXT)
    • Ahora: itera MIB_ALLOWED_EXT y borra solo {slug}_{module_name}{ext} si existe

Compilación

Los .py compilados por pysmi se almacenan en MIB_CACHE_DIR pero NUNCA se importan/ejecutan (solo se leen como texto en extract_oids_from_compiled). El docstring de get_mib_dir() advierte: son archivos derivados de input no confiable.

OID Extraction y Gemma 4

Tras compilación, se extraen OIDs y se almacenan en extracted_oids_json. Luego:

  • El endpoint /mib-assistant/analyze (admin only, s114) envía estos OIDs a Gemma 4 (google_genai) para proponer categorías (monitoring vs deep_discovery)
  • Los nombres/sintaxis se sanitizan con wrap_untrusted() (reutiliza sanitize.py de CNS) para evitar prompt injection

Véase también

  • [[entity—network—model—vendor-profile]]
  • [[entity—network—service—mib-manager]]
  • [[entity—network—service—mib-assistant]]
  • [[feature—network—sa3-auditoria-vendor-mib]]