Volver a la wiki

Cierre de deudas Etapa 3 SA3 — DNS-rebinding + clasificación de insights

Cierre de deudas Etapa 3 SA3

Comisión: Edu (con Claude Code Opus) | Fecha: 2026-06-05 | Commit: cb4fe5e

Resumen

Cierre de dos deudas operacionales de Etapa 3 anotadas tras la auditoría Suprema de Monitoring SA3:

M15: DNS-rebinding / TOCTOU en webhooks y HTTP probes

Problema: Al validar destinos SSRF, la aplicación resolvía + validaba el hostname una vez. Pero el cliente HTTP (httpx o requests) re-resolvía el hostname al conectar — una ventana TOCTOU donde un atacante DNS podría cambiar la respuesta a una IP interna.

Solución: Nuevo módulo centralizado net_guard.resolve_and_validate() que:

Implementación:

Verificación smoke (sa3 suite): 5/5 destinos reales (Cloudflare, Discord, Google, webhooks internos) verificados. Limitación documentada: un destino CDN-fronted que rechaza conexiones IP-directas (example.com-like) se reporta down — trade-off aceptado (pin estricto sin fallback).

B18: auto_resolve de insights por campo estructurado

Problema: auto_resolve_connectivity_insights() filtraba por substrings del texto de summary y anomaly_trigger — frágil, escalable solo agregando keywords, y asumía que todo text-match era connectivity.

Solución: Nuevo campo AIInsight.category (enum: CONNECTIVITY / SECURITY / PERFORMANCE / OTHER):

Implementación:

Impacto

ComponenteCambioRiesgo
net_guard.pyNueva capa de pinning DNS-rebindingBajo (nuevo módulo, bien testado)
http_service.pyRefactor para usar resolve_and_validate + try_each_ipBajo (lógica de retry preservada)
notification_service.pyWebhooks ahora pineados (generic, Slack, Teams)Bajo (SSRF + DNS-rebinding cerrados)
AIInsight modelNuevo campo category, indexedBajo (migration aditiva, backfill autónomo)
auto_resolveFiltra por category en lugar de text-matchBajo (lógica equivalente, más eficiente)

Cobertura de pruebas

Regla 22 (auditoría Suprema)

“Todos arreglados en una tanda”: explotando 7 raíces comunes (net_guard, scoping org, sanitización, bug Tutor, cost guard, parseo compartido, async diferido). Monitoring: 4 de 6 sub-áreas cerradas (sa1, sa2, sa3, sa6).

Véase también

Subir