§1The honest output can be “incomplete”
A fail-closed vulnerability watcher does not treat silence as safety. If an authoritative feed fails, if a package name only looks similar, or if the installed version is unknown, the run stays incomplete or the item stays on watch. It does not quietly become “not affected.”
That sounds conservative because it is. The purpose of the system is not to maximize the number of alerts or produce a comforting green dashboard. It is to turn public vulnerability intelligence into a small set of decisions whose evidence can be inspected.
No advisory is promoted from signal to validation candidate without exact product identity, affected-version evidence, installed-version evidence, a primary advisory, and a safe detection objective.
§2A CVE list is not a monitor
A vulnerability list answers “what has been reported?” An operational monitor has to answer harder questions: Which records changed? Which ones map to software I actually run? Is the match exact? Is my version inside the affected range? Is exploitation known, predicted, or merely possible? What evidence is still missing?
The public sources each contribute a different kind of fact. The CISA Known Exploited Vulnerabilities catalog is an input for prioritising vulnerabilities with evidence of exploitation. The NVD vulnerability API supplies CVE records, metrics, references, and applicability data. FIRST EPSS estimates the probability of exploitation. The GitHub Advisory Database adds ecosystem and package context.
None of those sources can, by itself, prove that one of my systems is exposed. The local inventory and version evidence close that loop.
§3The evidence pipeline
I designed the watcher as a sequence of evidence gates. Every stage narrows the question, and every transition leaves a record.
- 01CollectFetch authoritative feeds and keep their health, time, and raw response.
- 02NormalizeTurn different schemas into one advisory record without erasing provenance.
- 03MatchCompare vendor, product, package, and ecosystem against maintained inventory.
- 04EnrichAdd exploitation, probability, severity, affected ranges, and vendor context.
- 05GateRequire installed-version evidence and a bounded defensive objective.
- 06RecordWrite WATCH, REVIEW, rejected, or incomplete—with the reason preserved.
Normalization is deliberately loss-aware. I keep the source, retrieval time, advisory identifiers, affected ranges, and enough raw evidence to explain how a decision was reached later. A neat table is useful; a reproducible decision is better.
§4Feed health is part of the result
The easiest dangerous mistake is converting a network or parser failure into zero findings. If a required source returns nothing because DNS failed, an API changed, or the runtime was denied network access, zero is not a security conclusion. It is an observer failure.
Those states must remain distinct in the artifact and the operator summary. If a feed fails, I preserve the failed run, mark the catalog incomplete, and retry the same bounded collection path when the environment is available. I do not reconcile the failed artifact as a clean scan.
§5Product identity comes before urgency
Names create false confidence. A recent match connected CVE-2021-21315 to a Node.js inventory entry because the advisory described a “System Information Library for Node.JS.” The affected component is the systeminformation npm package, not the Node.js runtime. The words overlap; the products do not.
The same failure appears when an advisory for an integration package is mistaken for the application it connects to. “n8n-MCP” and “n8n” are not interchangeable inventory identities. Severity cannot rescue a bad join.
Vendor + product + ecosystem + package identifier must agree. Fuzzy names may create a review lead, but they cannot establish exposure.
This is where an agent helps most as a skeptical reconciler: it can compare aliases, source descriptions, package ecosystems, and previous decisions. The deterministic gate still decides whether the exact identity evidence exists.
§6The version-evidence gate
Once the product matches, the next question is not “is the CVE severe?” It is “what version is actually installed, and does an authoritative advisory place that version inside the affected range?”
- 01WATCHRelevant signal; exposure not established.
- 02REVIEWExact evidence supports bounded lab validation.
- 03REJECTWrong product, version, or scope.
product + affected range + installed version + safe objective → review candidate
A missing installed version is not a minor metadata gap. It blocks the key inference. The watcher keeps the item visible and tells me what evidence to collect next.
§7Public systems stay passive; active work belongs in the lab
The monitor is metadata-only. It does not download exploit code, scan public targets, or attempt to confirm a vulnerability on production. Those actions require a different authority surface and a different safety envelope.
An item can move toward active validation only when the target is an authorized, disposable replica; the product and version are exact; the detection objective is defined; logging and containment are ready; and reset is proven. The purpose is to test whether a defensive control observes a bounded scenario—not to “see if the exploit works” on a useful system.
- Build the target from known inputs. Pin the vulnerable component and capture its checksum or image digest.
- Define one detection objective. Name the event, log, alert, or control expected to fire.
- Contain every route. Keep the target isolated from public and production networks.
- Retain the evidence. Record the scenario, observations, timestamps, and limitations.
- Reset and prove it. Destroy or restore the target, then verify the baseline.
Passive intelligence can identify a question. It cannot silently authorize active testing. Promotion changes the kind of work, so it requires exact evidence and explicit approval.
§8What the latest run taught me
The latest seven-day snapshot is useful because the right answer was restraint. Six feed and validation lanes completed successfully. The watcher normalized 11,080 advisories and found 61 inventory-relevant signals. After identity checks, history reconciliation, and evidence gates, 60 remained on watch and zero were promoted for lab review.
| Stage | Result | What it means |
|---|---|---|
| Feed health | 6 of 6 complete | The observation window was usable; no required lane failed. |
| Normalized advisories | 11,080 | Broad public intelligence, not 11,080 exposures. |
| Inventory-relevant signals | 61 | Records worth reconciling against actual product evidence. |
| WATCH | 60 | Relevant enough to retain; not proven exposure. |
| REVIEW FOR LAB | 0 | No item passed every promotion gate. |
| Version-evidence gaps | 8 assets | The next task is inventory evidence, not active testing. |
Seven apparent alert changes also collapsed into duplicates or non-material differences when compared with the previous successful catalog. Preserving decision history prevented the system from repeatedly interrupting me with the same conclusion.
The shortest honest version
- Feed health is part of vulnerability evidence.
- A name match is not a product match.
- KEV, EPSS, and CVSS prioritize different questions; none proves local exposure.
- Unknown installed versions block promotion.
- Zero lab candidates can be a successful result.
- Active validation belongs only on an authorized disposable target.
Primary references
- CISA Known Exploited Vulnerabilities Catalog — confirmed exploitation signal and remediation prioritization input.
- NVD Vulnerability API — CVE records, applicability, metrics, references, and change history.
- FIRST Exploit Prediction Scoring System — probability-oriented exploitation estimate.
- GitHub Advisory Database documentation — ecosystem and package-level advisory search.
- Ubuntu CVE reports — distribution-specific package status and remediation context.
§9Questions I would ask first
What does fail-closed mean in vulnerability monitoring?
Required evidence must be present before the system can reach a reassuring conclusion. A failed feed, ambiguous match, or unknown installed version produces an incomplete or watch state—not “safe.”
Is a CISA KEV or high EPSS score proof that my system is vulnerable?
No. KEV indicates known exploitation of that vulnerability, and EPSS estimates exploitation probability. Local exposure still depends on exact product identity, affected version, installed version, configuration, and reachability.
Why keep WATCH items if they are not confirmed exposure?
They preserve relevant signals and evidence gaps without overstating certainty. A watch item can become actionable when a vendor advisory changes or installed-version evidence arrives.
Should the watcher automatically run exploits?
No. Public and production systems remain passive. Any active validation belongs on an authorized, isolated, disposable target with a defined defensive objective, logging, containment, and reset.