Cybersecurity-Projects/PROJECTS/intermediate
CarterPerez-dev 5865bb6149 feat(nadezhda): M3 CVE extraction + NVD/KEV/EPSS enrichment
The intelligence layer. scrape now extracts CVE IDs (cheap, no network) into
article_cves, which activates M2's shared-CVE clustering. A separate 'enrich'
command does the slow, cached API work (Carter's split: fast scrape, deliberate
enrich).

- internal/cve: regex CVE-ID extraction + three clients (stdlib net/http):
  - nvd: API 2.0, CVSS precedence v4.0>v3.1>v3.0>v2 with nullable metrics and v2
    metric-level severity fallback, totalResults==0 => not-found, apiKey header
    (exact case), token-bucket rate limit (5/30s anon, 50/30s keyed) + retry on
    429/5xx, timeouts non-retryable.
  - kev: one catalog download -> membership map; knownRansomwareCampaignUse is the
    STRING 'Known'/'Unknown' mapped explicitly to bool.
  - epss: batched; epss/percentile are QUOTED STRINGS parsed with ParseFloat (a
    parse failure is skipped, a legitimate 0.0 is kept); partial batches survive
    a transient error.
- internal/enrich: enriches only unenriched/stale CVEs (positive + negative TTL),
  KEV once per run, EPSS batched, NVD per-CVE. NVD/EPSS soft per-item (resumable),
  KEV fatal by design (enriching without it would persist wrong is_kev for a TTL).
- store: UpsertCVEStub/LinkArticleCVE, CVEsNeedingEnrichment (TTL), UpdateCVEEnrichment
  (nullable *float64 -> SQL NULL), GetCVE, ArticlesForCVE, ListArticles (parameterized
  --source/--since/--min-cvss/--kev/--keyword via EXISTS subqueries).
- commands: enrich, cve, list (cve/list off the stub list). Trimmed kev-sample.json
  (7KB) fixture for KAT tests; nvd/epss fixtures committed.
- KAT proven offline AND live: CVE-2021-44228 -> CVSS 10.0 CRITICAL (3.1), CWE-20,
  KEV added 2021-12-10 ransomware yes, EPSS 0.99999. 215 articles -> 82 CVEs, and
  shared-CVE clustering lit up (multi-source clusters 2 -> 5). Suite offline + -race.

One read-only audit agent run; 0 Crit/High/Med, Low/Nit fixes applied in-phase.

NVD apiKey header set with exact case to bypass Go header canonicalization.
2026-07-05 15:54:49 -04:00
..
api-security-scanner chore(deps): bump pydantic-settings 2026-06-20 01:35:21 +00:00
binary-analysis-tool Merge pull request #286 from CarterPerez-dev/project/ja3-ja4-tls-fingerprinting 2026-06-18 19:38:51 -04:00
credential-enumeration fix(credential-enumeration): rename .nimble to credenum.nimble 2026-04-29 01:23:40 -04:00
credential-rotation-enforcer feat(cre): one-shot curl|bash installer for credential-rotation-enforcer 2026-06-18 23:24:30 -04:00
dlp-scanner chore(deps): bump lxml in /PROJECTS/intermediate/dlp-scanner 2026-04-21 23:13:03 +00:00
docker-security-audit chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp 2026-04-08 20:02:55 +00:00
ja3-ja4-tls-fingerprinting feat(tlsfp): add social-share OG image and one-command tunnel redeploy 2026-06-18 23:24:30 -04:00
sbom-generator-vulnerability-matcher cracked 2026-05-23 05:01:01 -04:00
secrets-scanner chore(deps): bump golang.org/x/net 2026-07-03 17:47:33 +00:00
security-news-scraper feat(nadezhda): M3 CVE extraction + NVD/KEV/EPSS enrichment 2026-07-05 15:54:49 -04:00
siem-dashboard chore(deps): bump axios 2026-05-29 16:25:57 +00:00