Resumen

Esta entrega no repite lo cubierto en el post anterior sobre multi-tenant, Cloud Connect y Executive Report. Aquí están las features nuevas de la iteración del 11 de mayo, en orden de impacto para un equipo SOC.

Si llegas desde un buscador, este post asume contexto sobre la plataforma. Empieza por Presentando Sentry si es tu primera lectura.

1. EPSS funcionando de verdad — enriquecimiento por CVE

Antes, todos los epss_score salían en null por un bug en el pipeline: el collector EPSS corría en paralelo al resto, así que consultaba la lista top-100 de FIRST.org en vez de los CVE IDs realmente enriquecidos.

Cambios:

  • Pipeline Python: EPSS ahora corre después de la correlación, consultando los CVE IDs reales del lote enriquecido.
  • lib/epss-enricher.ts: enricher server-side con cache in-memory de 6h. Consume el endpoint /data/v1/epss de FIRST.org en lotes de 100 CVEs.
  • Ruta /api/threats: enriquece el JSON estático con EPSS fresco antes de servirlo, así el dashboard no depende de re-ejecutar el pipeline para actualizar.
  • Badges EPSS en las cards del BriefingsGrid cuando el score ≥ 5%:
    • 🔴 Rojo si EPSS ≥ 50%
    • 🟠 Naranja si ≥ 20%
    • 🟡 Amarillo en caso contrario
    • Tooltip que explica que EPSS es probabilidad de explotación a 30 días.

Con esto, el Sentry Priority Score (0-10) recupera su componente EPSS, que estaba siempre en 0.

2. KEV Catalog Dashboard — página dedicada

Hasta ahora KEV era solo un badge en cada amenaza. Ahora hay una vista dedicada del catálogo CISA KEV:

  • /api/kev: proxy del feed JSON de CISA con cache de 4h y stale fallback (si CISA cae, se sirve la última copia conocida).
  • /kev (nueva página): catálogo completo con:
    • Búsqueda full-text.
    • Filtro Ransomware-only.
    • Sort por fecha de adición o por due date.
    • DueBadge con semáforo: rojo + animación si due ≤ 7 días, naranja ≤ 30, amarillo en otro caso.
    • Stats strip arriba: Total · Ransomware · Urgentes · Matching (los que cruzan con tu inventario).
  • Navegación: nuevo enlace “KEV Catalog” en la sección Intelligence del sidebar, i18n EN/ES, también en la MobileTopBar.

Es la lectura natural cuando te preguntas “¿qué de KEV aplica a mi entorno hoy?”.

3. Chips MITRE ATT&CK en cards

Las técnicas ATT&CK ya estaban en el dataset (mitre_techniques[]), pero no se veían en las tarjetas del feed. Ahora el BriefingsGrid muestra las tácticas únicas (Initial Access, Execution, Privilege Escalation, etc.) como chips violetas debajo de los badges KEV/EPSS/Exploit.

Beneficio operativo: scaneas el feed y de un vistazo identificas qué amenazas tocan tu detection coverage por táctica, sin entrar al detalle de cada una.

4. Asset Mapper — correlación CVE ↔ activos Azure

Nueva ruta /api/asset-cve-match: correlaciona los activos Azure del tenant conectado contra las briefings de CVE.

Esto cierra el bucle que el módulo Cloud Assets abrió en el sprint anterior: ya no solo sabes qué tienes y qué CVEs hay, sino la intersección real entre ambas listas. El siguiente paso natural es promover esa intersección a la priorización del dashboard.

5. ThreatDetail rediseñado — Hunt tab + SOC Playbook

El detalle de cada amenaza recibió la mejora más densa de esta iteración:

Tabla de referencia rápida en el header

CVSS · EPSS · KEV · Exploit · Attack Vector · Auth Required — todo escaneable sin leer texto. Esto resuelve la queja típica de “tengo que bajar 4 pantallazos para saber si requiere autenticación”.

Tarjeta “Exploitation Context”

Parsea el vector CVSS y lo traduce a campos legibles:

  • Attack Vector (Network / Adjacent / Local / Physical)
  • Attack Complexity (Low / High)
  • Privileges Required (None / Low / High)
  • User Interaction (None / Required)
  • Scope (Unchanged / Changed)
  • CIA Impact (None / Low / High)

Con resaltado rojo cuando un valor representa el peor caso (Network, None required, High impact).

Nueva pestaña Hunt con KQL contextual

Genera consultas KQL según el contexto de cada amenaza, con botón de copia one-click por query:

  • DeviceTvmSoftwareVulnerabilities — exposure scan (si hay CVE).
  • SecurityAlert — hunt en Sentinel (si hay CVE).
  • T1190 — hunt de exploit en aplicaciones públicas (si la técnica está mapeada).
  • Credential access & dumping detection.
  • Lateral movement vía anomalía de logons.
  • C2 / exfiltration por volumen de tráfico saliente.
  • Fallback genérico de artefactos de exploit.

Esto se complementa con la sección Boletín Sentry — CVEs críticos donde escribimos KQL a mano: el dashboard ahora genera la base.

SOC Playbook estructurado

Pasos de respuesta en orden: Scope → Escalate → Hunt → Identify → Patch → Detect → Close, derivados de los datos de la amenaza. Si KEV o explotación activa están presentes, los pasos se marcan como urgent / critical.

Badge de validación CVE

Estado derivado de in_kev + exploit_status:

  • Confirmed Exploited
  • Actively Exploited (pulsa para llamar la atención)
  • PoC Available
  • Confirmed CVE

Reemplaza la ambigüedad de “esto es un CVE 9.6, ¿está pasando algo o no?”.

6. Detalles de UI con consecuencias operativas

Pequeños cambios que se notan cada día:

  • Botón MSRC condicional: solo aparece en CVEs de productos Microsoft. Antes salía siempre y devolvía 404 para Linux/Apache/nginx/OpenSSL.
  • Botón “Export Now”: cambió a fondo amber con texto oscuro para alto contraste — destaca como CTA primario y deja de confundirse con elementos secundarios.
  • CVE ID links: pasaron de indigo a cyan-400, alineados con la convención visual habitual de identificadores CVE.
  • Past-due badge y due date genérico: pasaron de rojo pulsante / amarillo a gris neutral — la urgencia se reserva para fechas con presión real (≤ 7 / ≤ 30 días).

7. KEV Dashboard — branding & UX overhaul

Sobre la nueva página /kev se aplicó un polish pass completo:

  • Custom SortDropdown: el <select> nativo abría un popup blanco que rompía el modo oscuro. Sustituido por un componente custom totalmente dark-themed, con check en la opción activa y cierre al click fuera.
  • Colores semánticos por stat card:
    • Total KEV → rojo
    • Ransomware → naranja
    • Due ≤ 7d → amber
    • Matching → indigo (primario) Antes todos los iconos eran indigo y los valores mezclados — incoherencia.
  • Header breadcrumb pill: border genérico → tinte indigo (bg-primary/8 border-primary/20).
  • Action badge: pasó a bg-indigo-500/10 explícito en vez de variable CSS, para evitar el “indigo-fantasma” cuando la variable no carga.
  • Search input: icono con pointer-events-none para que el click llegue siempre al input; text-foreground explícito para corregir el color en algunos navegadores.

8. Audit completo de UX móvil

Probablemente el cambio más visible para usuarios diarios. Auditoría exhaustiva con tres niveles de severidad:

Críticos

  • BottomNav: safe-area-inset-bottom movido fuera del contenedor h-16 que lo comprimía y deformaba la fila de iconos.
  • BottomNav: la barra de accent ahora es absolute-positioned, eliminando el “salto” de 7 px que daban los iconos al cambiar de tab.
  • BottomNav: labels de tab 10px → text-xs (12px); gap-0.5 → gap-1 para aire entre icono y texto.
  • MobileTopBar: env(safe-area-inset-top) para Dynamic Island / notch.
  • MoreMenu: mismo safe-area top.
  • ExploitTimeline: label 10→11 px, fecha 9→10 px. 9 px nunca es aceptable en móvil.

Altos

  • MobileTopBar: título de página de t-eyebrow (11 px uppercase) → text-sm font-semibold (14 px). Legible.
  • MoreMenu: botón de cierre p-2 (36 px) → p-3 + min-h/w-[44px] (cumple Apple HIG de 44 pt).
  • MoreMenu: section headers text-[10px] tracking-widest → text-[11px] tracking-wide.
  • BriefingsGrid bookmark: p-1 (24px tap) → p-2.5 + min-h/w-[40px].
  • BriefingsGrid filter tabs: py-1.5 (32px) → py-2.5 + min-h-[40px].
  • BriefingsGrid Load More: py-2 → py-3 + min-h-[44px].
  • FeaturedThreat bookmark: p-2 → p-3 + min-h/w-[44px].

Medios

  • SentryPriorityRow: el gauge ahora ocupa col-span-2 en móvil (full-width). Antes quedaba apareado asimétricamente con el bucket “Act Now”.
  • globals.css @media (max-width: 480px): card-padding 24→16 px, card-gap 20→14 px, kpi-number 36→30 px, featured-title 21→18 px.
  • MainContent: padding-bottom: calc(6rem + env(safe-area-inset-bottom)) — el último card nunca queda oculto bajo el home indicator.
  • MainContent: pt-16 → pt-20 para mayor separación visual con la top bar.
  • mission-control.css: t-eyebrow line-height 1→1.35, letter-spacing 0.12→0.08 em.

9. Bug del build de producción

Pequeño detalle que paró un despliegue: claves nav.audit duplicadas en en.ts y es.ts. TypeScript estricto rechazó la duplicación y reventó el build. Una vez identificadas, eliminadas en una sola pasada.

Resumen ejecutivo

ÁreaEntregableBeneficio
PipelineEPSS real (fix del null + enricher 6h cache)Priority Score completo, no degradado
InteligenciaKEV Catalog Dashboard /kevVista dedicada con stats, búsqueda, sort, matching
InteligenciaChips MITRE ATT&CK en cardsCoverage gap visible en el feed
API/api/asset-cve-matchCruce automático CVE ↔ activos Azure
ThreatDetailQuick reference + Exploitation ContextDecisión en 5 segundos
ThreatDetailHunt tab con KQL contextualKQL listo para Sentinel en 1 click
ThreatDetailSOC Playbook estructuradoRespuesta en pasos, no narrativa
UIMSRC condicional, Export amber, CVE cyanMenos ruido, más jerarquía
KEV UISortDropdown custom, colores semánticosCoherencia dark mode
MóvilAudit completo de typography, safe area, tap targetsCumple Apple HIG, sin texto a 9 px

Cómo verificar las novedades

  • EPSS real: entra a cualquier briefing — si el CVE ≥ 5% EPSS, verás el badge amarillo/naranja/rojo.
  • KEV Catalog: nuevo enlace en sidebar y MobileTopBar. Filtra por ransomware o due ≤ 7 d.
  • Hunt tab: abre el detalle de una amenaza → pestaña Hunt → copia la KQL → pega en Sentinel o Defender XDR.
  • SOC Playbook: misma vista de detalle, pestaña Analysis → sección SOC Playbook.
  • Mobile: abre sentry.d3fend.me desde el teléfono. La barra inferior, el notch, los tap targets y los tamaños de letra deberían sentirse correctos.

👉 sentry.d3fend.me — sign-in con Microsoft Entra ID, GitHub o Google.

Series anterior: