Volver a la wiki

Servicio VendorRegistry (carga/cacheo/detección de vendors con ReDoS mitigation)

Propósito

VendorRegistry (en network/services/vendor_registry.py) carga y cachea el catálogo de VendorProfile en memoria, compila las regexes editables, y proporciona funciones de detección rápida de vendor:

Estructura de cachés

L1 in-process

_l1_cache: list[dict] | None = None           # VendorProfiles parseados
_l1_compiled: list[dict] | None = None        # Con regexes compiladas (pre-compiled)

Cachés en memoria Python.

L2 Valkey (Redis)

Clave: vendor_profiles_registry con TTL 3600s (1 hora).

Si la L1 expira o se invalida, se recarga desde Valkey; si Valkey falla, se recarga desde BD.

Funciones principales

detect_vendor_from_sys_descr(sys_descr) → dict | None

Detecta vendor y retorna su dict (con regexes compiladas).

Entrada: sys_descr (string de hasta ~256 caracteres típicamente).

s114 change: El input se cappa a 2048 caracteres antes de matching:

sys_descr = (sys_descr or "")[:_MAX_SYS_DESCR]

Motivo: Las regexes editables del VendorProfile pueden tener backtracking catastrófico. Un sysDescr muy largo (posible en algunos equipos) + regex maliciosa/compleja = ReDoS (Regular Expression Denial of Service = cuelga el worker).

Capar a 2048 chars acota el coste del matching (paridad con cap HTTP body[:2048]).

detect_vendor_from_http(server_header, body) → dict | None

Detecta vendor por HTTP (headers + body).

s114 change: El body se cappa a 2048 caracteres (ya existía), aplicable a las regexes de patterns.

get_model_from_sys_descr(slug, sys_descr) → str

Extrae modelo de sysDescr usando regex del VendorProfile.

s114 change: Cap a 2048 chars:

sys_descr = (sys_descr or "")[:_MAX_SYS_DESCR]

get_version_from_sys_descr(slug, sys_descr) → str

Extrae versión de sysDescr.

s114 change: Cap a 2048 chars.

Regexes editables

Los campos sys_descr_patterns, sys_descr_model_regex, sys_descr_version_regex del VendorProfile son editables por admin. Por lo tanto, un admin malicioso o un vendor comprometido podrían inyectar regexes con backtracking catastrófico.

El cap a 2048 chars reduce el impacto potencial.

Véase también

Subir