Salta al contingut
← Tornar al blog
3 min ca

Vigilar el catàleg KEV de CISA sense tenir un servidor encès

kev-digest comprova el catàleg CISA KEV cada tres hores, detecta què ha canviat i publica el resultat, tot sobre GitHub Actions i sense cap dependència externa.

  • cisa-kev
  • vulnerabilidades
  • github-actions
  • automatizacion
  • python
  • blue-team
Vigilar el catàleg KEV de CISA sense tenir un servidor encès

El catàleg KEV (Known Exploited Vulnerabilities) de CISA és de les poques fonts que responen la pregunta que de debò ordena una cua de pedaços: de tot el que s'ha publicat, què s'està explotant ara mateix. Ja vaig escriure sobre per què creuar-lo amb NVD i EPSS canvia per complet l'ordre de prioritat. El que em faltava era deixar de mirar-lo a mà.

El disseny: sense dependències, sense servidor

kev-digest és un script de Python que fa servir només llibreria estàndard (urllib, json, hashlib, pathlib) i corre cada tres hores en un cron de GitHub Actions. No hi ha base de dades: l'estat complet viu en un fitxer seen_cves.json versionat al mateix repositori. Cada canvi real (entrada nova, camp modificat, termini que entra a la finestra de set dies, o el cas que més m'interessa: un CVE que portava mesos al catàleg i de sobte passa a tenir ús confirmat en ransomware) s'afegeix al fitxer del dia a digest/ i genera un commit. Si no hi ha novetats, no s'escriu res: amb vuit passades al dia, escriure sempre ompliria l'historial de commits buits.

El guardià anti-encongiment

La part que de debò em preocupava no era detectar canvis, era no destruir l'historial per una fallada de xarxa. Si el catàleg arriba buit o amb un deu per cent menys d'entrades que l'última vegada, l'script avorta sense desar res. Una descàrrega a mitges marcaria centenars de CVE com a retirats i gravaria aquella foto com a bona, esborrant la línia base d'un cop. Quan l'encongiment és real (CISA sí que retira entrades de tant en tant), es llança a mà amb --force. És la mateixa lògica que aplicaria a qualsevol pipeline que escriu estat persistent: millor no escriure res que escriure alguna cosa corrupta amb confiança.

Enriquiment sense fer-se car

Que alguna cosa sigui a KEV diu que s'explota, no si és un 9,8 o un 5,4. Les entrades noves s'enriqueixen amb EPSS (probabilitat d'explotació en 30 dies, consulta en bloc) i NVD (CVSS i severitat, amb cache a disc perquè té rate-limit). Només les entrades noves: demanar el CVSS de les més de mil sis-centes que ja són en seguiment a cada passada no aportaria res i esgotaria la quota.

On acaba la dada

data/latest.json és la sortida pública, amb contracte de camps estable perquè alguna altra cosa el consumeix: la secció KEV Watch de Blue Team Hub descarrega aquest JSON ja processat cada tres hores i el pinta. El càlcul del diff viu en un sol lloc a propòsit: dues implementacions del mateix diff en dos llenguatges acabarien discrepant, i aquesta discrepància seria difícil de detectar fins que algú confiés en el número equivocat.

Ara mateix el catàleg té més de 1.694 CVE en seguiment, 352 amb ús confirmat en campanyes de ransomware. Tot això corre sense que hagi de recordar-me de mirar-ho, i sense cap servidor per mantenir.