Which assets does your scanner see that your EDR doesn't? One query.

John Le
•
Oct 15th, 2026

Every security team has two lists that should match and don't. One is the set of devices your vulnerability scanner reports on. The other is the set of devices your endpoint protection agent reports on. Ask which assets appear on one list but not the other and most teams answer with a spreadsheet, a few days of effort, and a caveat that the numbers are already stale.

That gap is not a tooling failure. It is a data-model problem and it is solvable with one query once your assets live in a graph.

Why the two lists never match

Scanners and EDR agents answer different questions. A scanner knows what it can reach on the network and what it found there. An EDR agent knows what it was installed on. Neither knows what the other knows, and neither knows what neither one covers.

The gaps that result are ordinary and predictable:

  • A server the scanner assesses every week that never got an EDR agent.
  • A laptop with a healthy agent that sits outside every scan window.
  • A cloud instance launched last Tuesday that appears in neither tool yet.
  • The same machine under three names, one per tool, so every count is inflated and no comparison is reliable.

The last one is the quiet cause of most coverage reporting errors. You cannot compare two lists until you know which rows are the same asset.

Step one: resolve identity before you compare

JupiterOne ingests assets from each source as its own entities, then resolves matching records into a single unified device using attributes such as serial number, device ID, FQDN, hostname and IP address, each weighted by how reliably it identifies a machine. The scanner's record, the EDR agent's record, the MDM record and the cloud record for the same machine become one asset with links back to every source that reported it.

Once that is done, "which tools see this device" stops being a lookup across systems. It is a property of the asset.

Step two: ask the question in both directions

Because each source is connected to the unified device, a coverage question is a graph traversal. Devices your scanner reports that have no endpoint protection agent are one query. Devices with an agent that your scanner has never assessed are the same query with the condition reversed.

Start with the protection gap: devices your vulnerability scanner has assessed that have no record in any endpoint protection tool. Every unified device lists the sources that reported it, so this is a filter, not a join. The example uses Tenable as the scanner, with CrowdStrike and SentinelOne as the endpoint tools. Swap in your own.

FIND UnifiedDevice WITH _sourceType = 'tenable_asset'

  AND _sourceType != 'crowdstrike_host'

  AND _sourceType != 'sentinelone_host'

  AND osType = ('windows' OR 'windows-server' OR 'Windows' OR 'macos' OR 'MacOS') AS ud

RETURN ud.displayName AS device, ud.osType AS os, ud._sourceType AS sources

Then reverse it: devices your endpoint tools report that your scanner has never assessed. These are machines you defend but do not measure, so their vulnerabilities appear in no report.

FIND UnifiedDevice WITH _sourceType = 'crowdstrike_host'

  AND _sourceType != 'tenable_asset' AS ud

RETURN ud.osType AS os, count(ud) AS devices

ORDER BY devices DESC

Because the unified device keeps a list of every source that reported it, the question "which tool sees this and which does not" is a property of the asset. It does not depend on remembering which system holds which list.

Both directions matter. The first list is your protection gap. The second is your assessment gap: machines you defend but do not measure, so their vulnerabilities are invisible to every report you produce.

Step three: separate real gaps from expected ones

A raw gap list is a starting point, not a to-do list. Some devices should not have an agent: network appliances, printers, lab hardware. Some are retired and not yet decommissioned. Enrichment is what turns the list into decisions.

Two examples worth building into the same view:

  • Operating system support status. A device missing from endpoint protection and running an operating system past end of life is a very different priority from a supported workstation that is a week behind on an agent rollout.
  • Ownership and location. The same gap on a production server owned by a named team has a fix and an owner. On an unowned device it needs triage first.

Recency. Filter on last seen date before you hand anyone a list. Stale records of retired machines inflate every gap count, and a list that includes them loses the reader's trust at the first row they recognize as decommissioned. Add a line such as AND lastSeenOn > date.now - 30 days to the first query.

What the result looks like

In the JupiterOne demo environment, the scanner has assessed 117 Windows and macOS devices, and 2 of them have no record in CrowdStrike or SentinelOne. Both are also seen by a cloud security tool, so the gap is small and specific. The reverse query is the bigger finding: 190 of the 305 devices CrowdStrike protects, 62%, have never been assessed by the scanner. That is 120 Windows servers, 49 Windows machines and 21 Macs.

Linux servers and network appliances are left out of these numbers on purpose. Many run no endpoint agent by design, so counting them would inflate the protection gap with devices nobody expects to cover.

The demo environment uses synthetic data, so read these figures as an illustration of the method, not a benchmark. JupiterOne customers describe the same pattern in their own words. An American Financial Services Company ran several scanners whose databases did not agree with each other, and cut the time spent correlating vulnerabilities to assets by 20 times, from 2 days to about 5 minutes. Its Head of Vulnerability put the problem this way: "There's a huge problem in the industry of different products building their own databases of vulnerabilities... all of these databases don't agree with each other."

Socotra found forgotten infrastructure across more than 50 AWS environments. Its CISO, Mark Holtz, said the platform "paid for itself by saving us from having to purchase separate GRC and vulnerability management tools and easily showing us leftover AWS resources we were paying for but weren't using."

What this does not do

A coverage query is only as complete as the sources connected to it. If a scanner has no visibility into a network segment and no other integration reports on it, those assets will not appear in either list. The way to close that last gap is to add a discovery source: cloud account integrations, network discovery, identity and MDM data. Each new source makes the comparison stronger because it is one more place an asset can be seen.

Identity resolution has the same limit. A record with too little identifying data, such as a hostname alone, does not carry enough weight to be matched safely, so it stays a separate asset instead of being merged by guesswork. That is the right default, and it is a reason to feed the graph sources that carry serial numbers and device IDs.

Try it

Find your coverage gaps. Request to book a demo.

Other articles

Emerging Threats is now available to every JupiterOne customer, ranking the CVEs that just escalated so your team knows what to act on today.

John Le
•
Oct 5th, 2026
  • UVM
  • CAASM
  • CTEM

Patch-speed metrics are breaking under AI-accelerated vulnerability discovery. Here's what exposure-based prioritization looks like and what closes the gap.

John Le
•
Oct 2nd, 2026
  • Exposurement Management
  • CAASM
  • CTEM
  • Vuln Mgmt

Technical debt, an expanding remit, and ungoverned AI agents are reshaping CISO governance in 2026. Here's what's changing and what closes the gap.

John Le
•
Sep 25th, 2026
  • CCM
  • CAASM

Tools are silent.
Risks aren't.

See your full security program as one connected picture in a 30-minute demo tailored to your environment.