# Microsoft en el catálogo KEV de CISA · 2026

Análisis reproducible de las vulnerabilidades de Microsoft que CISA agregó a su catálogo KEV entre el 1 de enero y la fecha de la versión descargada (2026.11.03). Node 22 o superior, sin dependencias.

## Reproducir

```bash
# 1. KEV desde el commit fijado de github.com/cisagov/kev-data
#    (escribe data/raw/known_exploited_vulnerabilities.json y data/raw/kev-source.json
#     con commit, versión, fecha de descarga y SHA-256)
node analyze.mjs download fee9528c7588002b356d4f3288834169677d207b

# 2. Registros de cve.org y extractos de los boletines CVRF de Microsoft (MSRC) de cada CVE
#    (data/cve-records/, data/msrc/; SHA-256 de todo data/ en data/sha256sums.txt)
node analyze.mjs fetch

# 3. Cálculo → output/results.json, output/results.md, output/microsoft-kev-2026.csv
node analyze.mjs

# 4. Artículo (es/en), meta.json, fuentes.md y lista de CVE desde results.json
#    → ../blog-2026-11/microsoft-kev-2026/ y article-cves.txt
node build-article.mjs

# 5. Verificación en vivo de cada CVE nombrado contra cve.org → output/verificacion-cve.md
node verify-cves.mjs
```

SHA-256 esperado del KEV 2026.11.03: `0e7e91681f2207c7920a338f0d2b14c67933473ecf9550153627efaaba8d2e4c`.
`analyze.mjs` se niega a calcular si el archivo no coincide con el hash registrado en `kev-source.json`.

`fetch` no vuelve a descargar lo que ya está en `data/`. Los registros de cve.org y los boletines de Microsoft se revisan con el tiempo: para reproducir exactamente las cifras, usa la copia guardada; para actualizarlas, borra `data/cve-records/` y `data/msrc/` y vuelve a correr `fetch`.

## Criterios (detalle en los comentarios de `analyze.mjs`)

- **Microsoft:** `vendorProject` = "Microsoft". **Período:** `dateAdded` entre 2026-01-01 y la versión del catálogo.
- **Familia de producto:** primera expresión regular de `FAMILIES` que calza sobre `product + vulnerabilityName`.
- **Tipo de falla:** impacto según Microsoft (CVRF Threats Type 0; si falta, título o problemTypes en cve.org).
- **Días a KEV:** `dateAdded` − `cveMetadata.datePublished` (cve.org), días calendario.
- **Día cero:** días a KEV ≤ 0. Contraste: "Exploited:Yes" en el CVRF de MSRC (valor vigente).
- **Patch Tuesday:** segundo martes del mes. **Ransomware:** `knownRansomwareCampaignUse` = "Known".
- **Plazo de CISA:** `dueDate` − `dateAdded`; `forensicTriage` = "Yes" según BOD 26-04.
