Entidadactivecreado Thu Jun 04#monitoring#prometheus#metricsql#injection#security#multi-tenancy#python
Descripción
Módulo monitoring/services/group_service.py que consulta métricas agregadas de grupos de dispositivos en VictoriaMetrics. En sesión 107 se añadió validación contra inyección PromQL/MetricsQL.
Cambios sesión 107
Guard anti-inyección PromQL
La función query_group_metric(target_ids, tenant_id, metric, hours, avg_metrics=None) interpolaba los parámetros en la query sin validar:
_VALID_METRIC_NAME = re.compile(r"^[a-zA-Z_:][a-zA-Z0-9_:]*$")
# Validaciones:
if not _VALID_METRIC_NAME.match(metric or ""):
logger.warning("query_group_metric rejected metric=%r (invalid token)", metric)
return {"data": []}
if not str(tenant_id).isdigit():
logger.warning("query_group_metric rejected tenant_id=%r (not numeric)", tenant_id)
return {"data": []}
if not all(str(tid).isdigit() for tid in target_ids):
logger.warning("query_group_metric rejected non-numeric target_ids")
return {"data": []}
Una métrica maliciosa (cpu"}} or snmp_bandwidth_in_mbps{tenant_id="99) podía romper la query y leer datos de otro tenant. Ahora se rechaza silenciosamente (retorna {"data": []}).
Firma pública
query_group_metric(target_ids: list[int], tenant_id: int, metric: str, hours: int, avg_metrics: list[str] | None = None) → dict
Consulta VictoriaMetrics para un grupo de targets.
Retorna: {"data": [...]} (lista de muestras) o {"data": []} si parámetros inválidos.
Testing
TestGroupMetricInjectionGuard.test_rejects_injection_metric() — verifica rechazo de payloads PromQL.
Véase también
- [[feature—monitoring—sesion-107-auditoria-suprema-sub-area-2]]
- [[concept—security—injection]]