CVE Tools
Back to blog

I gave cve.tools my software inventory. Here's exactly what it does with it.

A hands-on walkthrough of My Stack — what matched, where it's honestly too broad, and the patch queue it left me.

A personal software watchlist in focus against a field of thousands of dim CVE identifiers
A personal software watchlist in focus against a field of thousands of dim CVE identifiers

Every morning there are a few hundred new CVEs. Almost none of them are mine. The whole job of vulnerability triage is throwing away the ones that don't touch anything I run, fast enough that I still have time to fix the ones that do. That's the job My Stack is supposed to do for me — so this is me actually using it on my own machines, screenshots and all, including the parts it gets wrong.

I'm the person who builds cve.tools, so treat this as dogfooding, not a demo. I fed it a scan of one real host plus a handful of internet-facing appliances — 29 products — and I'm going to show you the unedited result: the good matches, the too-broad ones, and the daily queue it hands me.

The problem I actually have

The database behind cve.tools holds hundreds of thousands of CVEs. On any given week a scanner or a feed will happily show me thousands that are technically about a vendor I run. That's not triage — that's a second firehose. What I want is the intersection of two small sets: what I actually run and what is actually being exploited right now. My Stack is the attempt to store the first set once and let the server keep computing the second.

What I put in — the 30-second version and the honest version

There are four ways to fill a stack: type a product name, star a vendor on a Trends page, click Watch on any CVE page, or import from the CLI (cvetools stack scan on a host, or cvetools stack import --sbom sbom.cdx.json). I did the honest thing for a real environment: I imported a host scan — which is where the operating-system packages below come from — and then typed in the handful of internet-facing appliances I care about by hand. The free tier caps you at 5 tracked products; I'm on the unlimited tier, which is why you'll see more than five here.

My actual stack: 29 products, 17 with a KEV-listed CVE. Note the SOURCE column — OS-SCAN rows came from a host scan, SBOM from a lockfile, MANUAL from me typing.
My actual stack: 29 products, 17 with a KEV-listed CVE. Note the SOURCE column — OS-SCAN rows came from a host scan, SBOM from a lockfile, MANUAL from me typing.

Two things matter in that screenshot. First, the SOURCE column: the operating-system packages (sudo, openssl, systemd, curl, openssh…) landed via a host scan, not manual entry — which is the only way this survives contact with a real environment of hundreds of packages. Second, normalization: I typed messy vendor strings and they collapsed to canonical products, so nginx tracks every vendor spelling of nginx at once and I don't maintain a synonym list.

What matched — and where it's honestly too broad

This is the part most tool write-ups would hide. Look at the CVE counts per product. apache log4j resolved to a canonical product and matched 30 CVEs, 2 of them on CISA KEV — tight and useful. But microsoft resolved to a vendor and matched 14,406 CVEs; cisco, 6,814. That's not the tool being clever, that's me handing it a vendor name with no product or version and getting back everything that vendor ever shipped a bug for.

The part I actually use every day: Decisions

A list of matched CVEs is still too long to be a plan. The Decisions view applies a cut-line policy — mine is act on CISA KEV, or a public exploit, or EPSS ≥ 50% — and splits every matched CVE into ACT vs DEFER. High CVSS alone does not force ACT; exploitation does. Every decision freezes the policy and the risk snapshot at the moment I made it, so the DEFER pile isn't me ignoring things — it's a timestamped, exportable record of why each one was safe to wait on.

The cut-line at work — but note the ACT count is dominated by my vendor-level watches (Microsoft alone is 14k CVEs in this stack); a versioned import collapses it to a real queue. What holds up regardless: the frozen reason on every item, and the 4 blind spots I'd act on but a scanner can't see.
The cut-line at work — but note the ACT count is dominated by my vendor-level watches (Microsoft alone is 14k CVEs in this stack); a versioned import collapses it to a real queue. What holds up regardless: the frozen reason on every item, and the 4 blind spots I'd act on but a scanner can't see.

That 6,645 ACT count is inflated by the vendor-level watches I just complained about — narrow the stack with versions and it drops hard. But two numbers on that page earn their keep regardless: the DEFER pile with a frozen reason on each item (the thing an auditor actually asks for), and the blind spots — 4 CVEs that clear my cut-line but have no scanner check available, so my scanner would never raise them. Those four are the whole point: they're what a scan-only workflow misses.

One CVE, start to finish

Concretely: apache log4j was in my stack from an SBOM. CVE-2021-44228 — Log4Shell, CVSS 10, on KEV, public exploit — matched the canonical product (not a vendor guess), cleared the cut-line on all three axes, and landed in ACT with the reason frozen: in CISA KEV, public exploit available, EPSS far above my 50% line. One click records the decision; the ledger keeps the receipt. That's the loop: a product I run → a real exploited bug → a defensible call I can point at later.

What brings me back: "since your last visit"

The dashboard leads with what changed on my stack since I last looked, and an hourly monitor diffs the KEV and exploit sets so "new" means new to me, not new to the world. When a KEV or a fresh exploit lands on something I track, a daily digest pushes it out — today that channel is Telegram (opt-in; you link it once), with more channels to come. The value lives in the push, not in me remembering to open a tab.

The dashboard I actually open: what's new on my stack since last visit, the ACT/DEFER summary, and the stack stats — 686 tracked CVEs on KEV, 4 scanner blind spots.
The dashboard I actually open: what's new on my stack since last visit, the ACT/DEFER summary, and the stack stats — 686 tracked CVEs on KEV, 4 scanner blind spots.

Where it falls short (so you don't have to find out yourself)

  • It's a daily digest, not a pager. The feed updates hourly, the push is daily. For most patching cadences that's fine; if you need sub-hour alerting, this isn't it yet.
  • Vendor-level watches are broad. Type only a vendor and you get a firehose. Import a scan or SBOM with versions if you want a real patch list.
  • Manual typing does not scale. A real environment is hundreds of products across dozens of versions — that's what cvetools stack scan and SBOM import are for. Typing is fine for a first taste, not for the whole fleet.
  • It does not replace a scanner. There's no version-level detection on your actual hosts unless you import it. This is a watch layer, not a scan.
  • Coverage is bounded by normalization. Obscure or in-house software may not map to a canonical product yet — it'll sit as an unmatched entry until it does.
  • Digest channel is Telegram-only today. Email and other channels are on the roadmap; if Telegram isn't an option for you, you'll be reading the feed on the site for now.

Who it's for — and who it isn't

My Stack vs. a vulnerability scanner

My Stack
  • Watches products you can't scan — SaaS, appliances, dev tooling, shadow IT
  • Fires on the exploitation event (KEV/exploit added), not your scan cadence
  • Free; product names only unless you import versions
  • A defensible ACT/DEFER ledger for the few that matter
A watch + triage layer.
A scanner (Nessus/Qualys/Wiz…)
  • Version-level detection on hosts it can actually reach
  • Authoritative inventory of what's really installed
  • Runs on your scan schedule
  • Owns remediation tracking in your environment
Ground truth on assets you control.

So: if you already scan your fleet, My Stack is the layer that watches the things your scanner can't reach and tells you the morning a known-exploited bug lands on any of them. If you don't scan at all — a small team, a few internet-facing boxes — it's a cheap way to stop watching a dozen vendor advisory pages by hand. It complements a scanner; it does not replace one.

Do I have to upload my exact software versions?
No. By default My Stack stores product names, and you can watch at the vendor level. Versions only enter if you import a scan or SBOM yourself — and importing is what makes the matches precise.
How is this different from my vulnerability scanner?
A scanner detects versions on hosts it can reach, on your scan schedule. My Stack watches products you can't always scan (SaaS, appliances, shadow IT) and alerts on the exploitation event — a new KEV entry or public exploit — the day it lands. It's a watch layer, not a replacement.
How do the CVEs get ranked?
By exploitation, not raw severity. The cut-line acts on CISA KEV, a public exploit, or EPSS ≥ 50%; CVSS only ranks within that. A 10.0 nobody is exploiting sits below a 6.5 that's on KEV.
Is it really free?
Yes — up to 5 tracked products on the free tier, with unlimited monitoring on the paid tier. The walkthrough above is the unlimited tier, which is why it shows more than five.