cve_lookup¶
Authoritative data for one CVE, fused from three canonical feeds into a single record with per-field provenance.
Use it before rating or reporting any CVE. A recalled CVSS score goes stale, and affected-version detail is the easiest thing in security work to misremember with confidence. Every source is keyless, so the tool is always registered.
Parameters¶
| Parameter | Type | Default | Description |
|---|---|---|---|
cve_id |
string | required | The identifier, e.g. CVE-2021-44228. Case-insensitive; validated against the CVE-YYYY-NNNN shape before any request. |
action |
string | get |
Only get — one CVE by id — is supported. |
refresh |
boolean | false |
Re-fetch from every source, ignoring the cache. Only worth setting for a CVE published or revised inside the cache TTL. |
Sources¶
| Source | Contributes | Answers |
|---|---|---|
| NVD | CVSS score, severity, vector, CWE, description, references | How bad is it, in the abstract? |
| CISA-KEV | Whether the CVE is on the Known Exploited Vulnerabilities catalog | Is it being exploited in the wild right now? |
| EPSS | Exploitation probability score | How likely is exploitation in the next 30 days? |
The three are merged into one record that records which source supplied each field, so a partial answer is still a usable one. If NVD is unreachable but KEV answers, you still learn the most urgent fact available.
KEV and EPSS outrank CVSS for prioritization
A CVSS 9.8 nobody is exploiting is a lower priority than a CVSS 7.5 on the KEV catalog. Rank by what is actually happening, and use CVSS for the technical severity of the flaw rather than the urgency of the finding.
A KEV listing is also proof the identifier is real. A bare "not on the KEV catalog" is not proof of anything — it comes back identically for a CVE that does not exist — so the tool does not treat KEV non-membership alone as data.
Caching¶
Records are cached on disk under
INTEL_CACHE_DIR for
CVE_CACHE_TTL_HOURS (24), so
repeat lookups cost nothing.
Negative answers are cached too. That stops an unknown identifier re-hitting
three APIs on every mention, and it means a refresh that now finds nothing
correctly overwrites a stale positive. A cache write that fails — a read-only or
full cache directory — is logged and ignored rather than discarding data already
fetched.
Approval¶
Approval widens to the whole tool: every call is a keyless read of public
vulnerability intelligence, and there is nothing below it worth distinguishing.
The packaged rules do not auto-approve it, so it prompts in strict and normal
— allow: "cve_lookup({})" in ~/.kerkov/approvals.yaml is a sensible addition
if you look up CVEs often.
Returns¶
A compact human-readable summary as output: the id, CVSS score and severity, title, vector, CWE, KEV status, EPSS score, and references.
Metadata carries action, cve_id, cache_hit, and record — the complete
merged record, including the per-source provenance the summary leaves out.
Two shapes of "nothing found" are distinguished, and the difference matters:
- Every source that could answer failed →
success: false. This is a network or availability problem; retry. - The sources answered, and none of them knows this CVE →
success: truewith a note to check the identifier. A very recently published CVE may simply not be indexed yet.
Examples¶
{ "cve_id": "CVE-2021-44228" }
Forcing a re-fetch of a CVE that was revised today:
{ "cve_id": "CVE-2026-1234", "refresh": true }
Configuration¶
| Variable | Default | Effect |
|---|---|---|
NVD_API_KEY |
(unset) | Optional. Raises NVD's rate limit; nothing else. |
CVE_CACHE_TTL_HOURS |
24 |
Cache lifetime for merged records. |
INTEL_CACHE_DIR |
~/.kerkov/cache/intel |
Cache location. |
CVE_LOOKUP_TIMEOUT_SECONDS |
15 |
Per-source request timeout. |
Related¶
vulnerability_scan— finds which CVEs apply to a target;cve_lookupsays how much each one matters.web_searchandread_url— for what the feeds do not carry: exploit availability, vendor advisories, writeups.ledger— record the CVE as a finding once it is confirmed, so it survives compaction.