EDR, EPP & Endpoint Agents

The laptop in the airport lounge is behind none of your network controls

Every phishing control in the stack assumes the traffic passes through it. Once a device leaves the office, most of them stop applying and the agent on the machine becomes the only thing left. This page is about getting a DNS-verified phishing domain set onto that agent, keeping it current from a daily changelog, and deciding what happens locally when the set says no.

390,000+DNS-verified domains in the shipped set
24 hRebuild cycle with an added and removed changelog
<50 msTypical latency when the agent has to ask
0Network calls for a lookup the local set answers
Roaming and off-VPN devices
Agent-side local domain set
Browser-extension enforcement
Process and network telemetry
MDM-managed and BYOD fleets
Offline and intermittent links
Home / Use Cases / Endpoint Protection
Enforcement of last resort

Every other control depends on the traffic coming to it

The endpoint is not the best place to block a phishing domain. It is the only place that still works when the device is somewhere you do not control.

Draw the path a click actually takes on a corporate laptop sitting in a hotel room, then draw the same path again with the machine plugged in at a desk. The two diagrams share a user, a message and a browser. They share almost nothing else.

The click happens on the device

The user opens a message in a desktop client, clicks a link, and the browser resolves a hostname. Nothing about this first step differs between the office and the hotel room.

On the office network, three controls get a look

If the machine is on your LAN, that resolution goes to a resolver you run, the request leaves through a firewall you configured, and it may traverse a web gateway that inspects it before anything is fetched.

In the hotel, none of that is true

The resolver is whatever the hotel handed out over DHCP, or a public one baked into the browser. There is no firewall of yours anywhere in the path, and no gateway to inspect anything.

The tunnel does not rescue it

If the VPN is up at all it is very likely split-tunnelled, because full-tunnel VPN for every laptop is a bandwidth bill nobody wants to pay, and a split tunnel by design sends general web traffic straight out of the local connection.

One thing is still in the path

The agent is running on the device. It sees the process, it sees the socket, and on most platforms it can see the DNS query before the resolver ever hears it.

Coverage with a geography attached to it

The rule

A network control enforces on the packets it sees, and a device that is not on your network produces no such packets. That is the gap the agent exists to fill, and it cannot be closed anywhere else.

What follows

You can mandate always-on VPN and some organisations do, but the failure mode is not that the policy is wrong — the tunnel drops on a captive portal, the conference network blocks the VPN protocol, or the device wakes from sleep with the browser already loading. Every one of those windows is a few minutes long, and a credential-harvesting page needs about forty seconds.

Coverage with no geography at all

The rule

The agent applies identically on the office LAN, on a home network, on a phone hotspot and on an aircraft connection. It does not care whether the VPN is up.

What follows

It is the only layer in the stack whose coverage does not have a geography attached to it, and that property — not superior detection — is the reason phishing enforcement belongs on the device rather than only in front of it.

A resolver logs a device; an agent logs a story

The rule

The agent knows things about the request that no network control can recover. When a hostname is blocked at a resolver, all you learn is that a device asked for it.

What follows

When the same hostname is blocked at the endpoint, you can learn which process asked, what its parent was, which document or message it was launched from, and which user session it belonged to. That turns a block from a log line into an incident with a shape, and the telemetry section below is entirely about exploiting it.

None of this argues for switching the network controls off

A resolver-level block still stops the request for every device on the LAN including printers, conference-room panels and contractor machines that will never run your agent, and it does so with no per-device deployment at all. Most organisations that get this right run both, from the same source list, so a domain blocked by DNS filtering in the building is also blocked by the agent in the hotel, and the two produce consistent verdicts a help desk can explain.

What the agent can see

Six vantage points a network device does not have

Enforcement is only half of it. The agent is also the only sensor positioned to explain how the request came to be made.

The process that asked

A blocked hostname requested by a browser tab is a user who clicked. The same hostname requested by a scripting host is a loader that is already running.

The parent chain

Office application spawning a shell spawning a network call is a different story from a browser launched by the user, and the agent records both.

The session and account

Which logged-in user, on which device, in which session — the detail that turns a domain hit into a named person to call.

The referrer path

A browser extension can record the page or message the click came from, which is how you find the other recipients of the same lure.

Requests inside encryption

DNS over HTTPS hides queries from a network resolver, but the agent observes the request at the point where the application makes it.

What happened next

Whether the user retried, whether credentials were typed elsewhere, whether a file was written — sequence, not a single event.

The encryption point deserves expanding, because it has quietly changed where enforcement can happen at all. When a browser resolves names over DNS-over-HTTPS to a resolver of its own choosing, a network-level DNS block simply does not see the query. Organisations respond with policy — disabling the browser's own resolver on managed devices — but that policy applies only where you can set it, which excludes personal devices and any browser installed outside your management. An agent that hooks the request where the application makes it is unaffected by the transport the resolution eventually uses, and that is increasingly the difference between a control that works and one that used to.

Do not use the hosts file as the delivery mechanism for a 390,000-entry set

Host-file enforcement, the crudest form of endpoint blocking, is worth mentioning precisely because it is the approach teams reach for first: writing entries that map known-bad hostnames to a loopback address costs nothing and needs no agent code at all. It is also a poor fit at this scale — a file with hundreds of thousands of entries slows name resolution on some platforms, it requires administrative rights to modify, it produces a connection failure rather than an explanation, and it is bypassed entirely by a browser doing its own encrypted resolution. Use it for a handful of critical entries if you like.

The set on the device

What 390,000 domains actually cost on a laptop

The whole design hinges on one number: how much memory an agent can spend to answer a lookup without asking anybody.

Start with the raw material. The daily feed is the complete database as CSV, delivered on a separate subscription from API credits, alongside a changelog listing the domains added and removed in that rebuild. Domain names average somewhere around twenty bytes, so a 390,000-entry list is roughly eight megabytes of text — a perfectly reasonable download once a day over any connection, but not a reasonable in-memory structure to search linearly.

Four ways to hold the same 390,000 entries on a device
Structure Memory Lookup cost Removals Verdict
Raw CSV, scanned in place ~8 MB Linear scan per request Trivial Shipping the feed verbatim to every agent is the naive version of this design. Correct, and far too slow to sit in front of a name resolution.
Sorted 64-bit hash array ~3.1 MB About 19 comparisons, binary search Clean, in place Store a 64-bit hash of each normalised hostname. Invisible on a laptop, acceptable on a phone, and where most endpoint agents should stop — simple, exact and easy to reason about when something goes wrong at two in the morning.
Bloom filter, 1% false positives ~470 KB A handful of hashes and bit tests Not supported About 9.6 bits per entry. Fits comfortably inside a browser extension's memory budget. Says maybe, never definitely yes.
Bloom filter, 0.1% false positives ~700 KB A handful of hashes and bit tests Not supported About 14.4 bits per entry: ten times fewer confirmation calls for roughly fifty percent more memory. Still cannot delete an entry without a rebuild.

The false positive is not a bug in this design — it is the trigger for the second tier

When the local filter says a hostname might be on the list, the agent asks GET /api/v1/check?domain=host&apikey=key and gets an authoritative answer in under fifty milliseconds, along with the category, the DNS status and the timestamp of the last verification.

  • When the filter says no, nothing leaves the device at all. No query, no hostname, no record anywhere but the machine itself.
  • Most lookups are free and silent. The overwhelming majority of hostnames a user visits are not phishing domains, so the overwhelming majority of lookups cost nothing and reveal nothing.
  • The draw is tiny. A one-percent filter on a device making a few thousand distinct hostname requests a day produces a few dozen confirmations — a trivial credit draw for a substantial privacy and latency win.

Updating is where the changelog earns its keep

A full eight-megabyte pull to every device every day is defensible on a corporate laptop and rude on a metered mobile connection. The changelog gives you the delta instead: apply the added list, drop the removed list, and the agent's set matches the day's rebuild after transferring a fraction of the data.

  • A sorted hash array handles both operations directly, so a daily delta keeps the structure exactly in step with the rebuild.
  • A Bloom filter can absorb additions in place but cannot process removals, so the honest pattern is to merge additions daily and take a full rebuild on a schedule.
  • Weekly is usually enough for that rebuild, accepting that entries removed since the last one will keep producing filter hits which the API then correctly answers as clean.
Design decisions

Four choices that determine how the agent behaves

None of these have a universally right answer, but every one of them has to be answered explicitly before the agent ships.

Block outright, or warn and allow through

A confirmed entry is a hostname verified as currently resolving and confirmed as phishing infrastructure, which is a strong enough signal to block without a prompt in most environments. Warning instead of blocking is defensible where a wrong call would stop a business-critical workflow.

If you do allow an override, make it a deliberate act that names the person: a typed reason, a logged event, and an expiry. An override that is one click and forgotten becomes the standing configuration within a month.

Where the block surfaces to the user

A dropped connection produces a generic browser error, which teaches the user nothing and generates a help-desk ticket that nobody can diagnose. A browser extension can render a real interstitial naming the hostname and the reason, which is worth the extra deployment effort.

Whatever the surface, put the hostname on it. Users who see which domain was blocked report the message that carried it far more often than users who see a connection error.

What happens when the device is offline

The local set keeps working with no network at all, which is the main argument for holding one. What ages is its currency: a laptop that has been off for three weeks holds a three-week-old list, and it will miss everything registered since.

Record the set's build timestamp and surface it in the management console. A fleet-wide view of set age is the single most useful health metric this design produces.

How much leaves the device

The local-set-first pattern means routine browsing generates no outbound query, which matters enormously on personal devices. Only candidate hits are confirmed remotely, and only the hostname is sent.

Say so in the deployment documentation. On a BYOD fleet, the difference between "every site you visit is checked with a third party" and "nothing leaves unless it matches locally" decides whether the rollout happens.

The fallback path is where most agents go wrong

A cache miss has to resolve into something, and the two failure modes are opposite. An agent that blocks on any lookup failure will block the internet the first time the API is unreachable from a coffee-shop network with a broken captive portal. An agent that silently allows on failure has quietly disabled itself, and nobody will notice for months.

The workable middle is to fail open on the network call, mark the request as unverified in telemetry, and retry asynchronously once connectivity returns. Because the local set answered independently, failing open on the confirmation step only affects hostnames the filter already flagged as candidates — a small, reviewable population. Pair that with an alert when the proportion of unverified requests on a device crosses a threshold, and a broken /api/v1/check path becomes visible in a day rather than a quarter.

Fleet arithmetic

What this costs across ten thousand devices

The local set does the volume. Credits are spent only on the handful of lookups the device could not answer itself.

~3 MBSorted 64-bit hash set for 390,000 entries
~470 KBBloom filter at a one-percent false-positive rate
1Credit per confirmation lookup, billed monthly
100Domains per batch request for bulk reconciliation

Take a fleet of 10,000 managed devices. Each active device resolves a few thousand hostnames on a working day, but almost all of that is repetition — the same handful of business applications, the same content hosts, the same telemetry endpoints — so a per-device cache of recent verdicts collapses it to a few hundred genuinely distinct lookups. Every one of those is answered by the local set with no network call. The only traffic that reaches the API is candidate hits: entries the local filter flagged, which need an authoritative answer.

The confirmation result belongs in a shared cache at the management server, not on each device.

The one decision that sets the bill

With a one-percent filter and a few hundred distinct hostnames per device per day, that is a handful of confirmations per device — call it five. Across 10,000 devices that is 50,000 credits a day, which is far too many, and the fix is not a bigger package. Route confirmations through your own backend, cache the verdict centrally for the rest of the day, and 10,000 devices asking about the same flagged hostname become one credit rather than ten thousand.

Professional $249 · 100,000 lookups Business $499 · 250,000 lookups Enterprise $999 · 750,000 lookups Credits billed monthly, no API subscription

With central caching in place the arithmetic changes shape entirely. The draw is no longer proportional to the fleet; it is proportional to the number of distinct hostnames the fleet collectively flags, which is a few hundred to a few thousand a day regardless of whether you have a thousand devices or a hundred thousand. Against the packages above, a centrally cached fleet of this size sits inside Professional or Business for a year.

The feed subscription is the other half of the bill, and it is flat

One subscription supplies the CSV and changelog that every agent's local set is built from, regardless of how many agents you have. That is the correct shape for this workload: per-lookup pricing is right when each question is a decision, a bulk list is right when the same answer is needed on ten thousand machines at once, and an endpoint fleet needs both for different parts of the same job.

Telemetry that means something

Correlate the blocked domain with the process that wanted it

The same hostname, blocked on the same device, is two completely different incidents depending on what asked for it.

Consider two events that look identical in a resolver log: the same device, the same minute, the same blocked hostname. To the agent they are not remotely the same incident.

Event one

The browser asked, four seconds after a message was opened

The requesting process is the user's browser and its parent is the desktop mail client. That is a user who clicked a link in an email — an awareness and mail-filtering story, and the immediate response is to find who else received the message and confirm no credentials were entered.

Event two

A scripting host asked, with no browser window involved at all

The requesting process is a scripting host and its parent is an office application. That is code already executing on the machine reaching for its next stage, and the response is isolation and forensics, not a conversation about link hygiene.

A resolver cannot tell those apart. It has an IP address, a timestamp and a query. The agent has the whole tree, and recording it at block time costs nothing because the agent already collects process and network events for its primary job. These are the fields worth capturing on every phishing-domain block:

  • The hostname and the verdict source — answered by the local set, or confirmed remotely through the API.
  • The process and its parent, which is the single pair of fields that separates the two events above.
  • The user session, the timestamp and the action taken, so the block resolves to a named person on a named machine.
  • The build date of the local set that produced the decision — the field teams forget, and the one that answers "why did this device not block it" three weeks later.
  • The referrer, wherever the block came from a browser extension that can record it.

That last field is worth more than it looks. Knowing that a blocked hostname was reached from a specific webmail message, or from a particular internal page, is what turns one device's event into a campaign view: search for the same referrer across the fleet and you have every user who was shown the same lure, including the ones who have not clicked yet. That is a materially better starting point than a list of devices that happened to resolve the same name.

Where the block goes next

Feed the result into whatever aggregates the rest of your detections. A phishing-domain block is a low-volume, high-specificity signal, which makes it unusually good material for correlation rules — it pairs naturally with an authentication event from an unusual location, or with a process-creation alert on the same host within the same minute. Teams routing this into SIEM integration generally find the volume small enough to keep indefinitely, and the triage path shares most of its shape with incident response work they already run.

Retrospective hunting turns your product into a browsing-history archive

When the daily rebuild adds hostnames, it is tempting to replay the fleet's recorded resolution history against the added list to find devices that reached a domain before it was known. That is a genuinely valuable hunt, and it is also the point at which an endpoint product starts holding a complete browsing history of every employee. Decide deliberately how long that history lives, keep it hashed where you can, and write the retention period into the product documentation rather than leaving it to a configuration default nobody reads.

Rollout

Five steps from feed subscription to enforcing fleet

The order matters more than the speed. Every step below produces something reviewable before the next one changes user experience.

01

Ingest the feed

Pull the daily CSV and changelog into your build server. Normalise hostnames and produce the structure the agent will ship.

02

Distribute the set

Push the built set through your existing agent update channel. Version it, sign it, and record the build date on the device.

03

Run in observe mode

Match without blocking for two weeks. Count hits per device and per domain, and review anything unexpected before enforcing.

04

Wire the confirmation path

Route candidate hits through your backend to the check endpoint, with a shared cache so the fleet asks once, not once per device.

05

Enforce in rings

Turn blocking on for a pilot group, then widen. Watch help-desk volume and set-age metrics at each ring before proceeding.

Step 03

Observe mode is the step teams skip, and the one that decides whether the rollout survives

Two weeks of observe-mode data tells you the real hit rate on your fleet, which departments generate it, and whether any hostname is appearing often enough to warrant a look before it starts producing block pages. It also gives you a number to take to whoever has to approve enforcement — not a vendor claim, but a count of how many times your own users would have been stopped last fortnight.

Step 05

Enforcement rings are not bureaucratic caution

They are how you discover that one business unit uses a marketing platform whose click tracker happens to look like something else, or that a particular department's workflow depends on a redirect service you had not seen. Widen the ring only when the previous one has been quiet for a week, and keep the set-age metric from step two on the same dashboard, because a ring where a third of devices are running a two-week-old set is not actually enforcing what you think it is.

Fleet shapes

Managed, personal, shared and roaming devices are four problems

The same domain set applies to all of them. Almost nothing else about the deployment does.

Fully managed devices

The easy case and the one every design starts from. You control the operating system image, you can install a kernel-level or system-extension agent, you can force-install a browser extension through managed browser policy, and you can guarantee the update channel.

  • Local set Large — no reason to economise on memory
  • Policy Hard blocking with no override, telemetry complete
  • Stale set An operational failure with a name attached, not an unavoidable condition

Personal devices under BYOD

These invert almost all of that. You cannot install a system-level agent on a machine you do not own, and attempting it is usually the fastest way to end a BYOD programme. What you can realistically deploy is a managed browser profile with a force-installed extension scoped to work accounts, covering the browsing surface — where phishing actually happens — without touching the rest of the device.

  • Local set Extension-sized, which is what the probabilistic filter is for
  • Policy Browser-scoped enforcement, nothing outside the work profile
  • Why it lands An extension that resolves locally and sends nothing for ordinary browsing is a very different privacy proposition from one that phones home about every site, and that distinction is what gets the deployment approved

Mobile devices under MDM

These sit between the two. Platform restrictions mean a background process cannot generally intercept arbitrary network traffic, so enforcement typically arrives as a managed browser, a per-app tunnel, or an on-device content-blocking extension supplied through the management profile.

  • Local set Tight memory budget — where the probabilistic filter earns its place
  • Update path Changelog delta rather than the full CSV, on an unmetered network unless the set is badly out of date
  • Constraint Whatever the management profile is allowed to install, and nothing beyond it

Shared and unattended devices

Kiosks, shop-floor terminals, ward workstations and meeting-room panels have no user to warn and often no interactive session to warn into. Hard blocking is the only sensible policy, because there is nobody present to make a judgement call.

  • Policy Block, always — an interstitial carrying a phone number rather than an override
  • Set age Matters more here than anywhere else in the fleet, because nobody reboots these for months
  • Ownership Someone has to watch them, since they will never complain

Across all four, the roaming case cuts sideways

A managed laptop is a managed laptop whether it is at a desk or in an airport, but its effective control set changes completely when it leaves. Design the agent so that nothing about its enforcement depends on reaching your infrastructure: the local set answers, the confirmation call is an enhancement rather than a requirement, and the update is opportunistic. An agent built that way behaves the same in both places, which is the only property that makes it trustworthy in either.

Integration

Two data paths, one key, and a very small amount of code

The feed builds the set. The check endpoint resolves what the set could not decide. Everything else is your own distribution machinery.

Daily CSV feed + changelog

Builds the agent-side set

The complete database as CSV on a separate subscription, plus the daily added and removed lists that drive delta updates.

GET /api/v1/check?domain=

Resolves a candidate hit

One hostname, one credit, answered against the current database with category, DNS status and last-verified timestamp.

POST /api/v1/batch

Bulk reconciliation

Up to 100 domains per request, one lookup each. Used by the management server to confirm a batch of pending candidates at once.

The database-stats endpoint is worth wiring into the build job even though it looks like a diagnostic. It returns the current database size and the last-update timestamp, which gives your ingestion process a cheap way to confirm the feed it just pulled is the rebuild it expected rather than yesterday's file served from a cache. A build that silently ships a stale set to a fleet is the kind of failure that goes unnoticed for weeks, and one comparison at build time prevents it.

Calling the confirmation path

Below is that path as your management server would call it — a single check for one candidate, and a batch call when several devices have flagged different hostnames within the same window.

Management server — candidate confirmation
# One candidate flagged by an agent's local filter
curl -s "https://phishingdetectionapi.com/api/v1/check\
?domain=account-security-review.example&apikey=YOUR_KEY"

# Several pending candidates confirmed in one request (max 100)
curl -s -X POST https://phishingdetectionapi.com/api/v1/batch \
 -H "Content-Type: application/json" \
 -d '{"apikey":"YOUR_KEY",
 "domains":["account-security-review.example",
 "vpn-portal-reauth.example",
 "files-shared-invoice.example"]}'

# Verdict cached centrally, then pushed to every agent that asked
{
 "domain": "account-security-review.example",
 "is_phishing": true,
 "category": "phishing",
 "dns_status": "active",
 "last_checked": "2026-07-27T04:22:00Z",
 "confidence": "high",
 "database_size": 390000
}

The key never ships with the agent

The API key must be used server-side only. An agent binary or browser extension distributed to thousands of devices is not a secret store — anyone can extract a string from it. Have the agent ask your own management endpoint, and let that endpoint hold the key and call the API. This also gives you the shared cache the fleet arithmetic above depends on, so the two requirements are satisfied by the same piece of infrastructure.

Questions from engineering

What agent teams ask before the set ships

These come up in design review, usually in this order, and every one of them deserves a straight answer.

Why hold a local set at all instead of just calling the API?

Three reasons, and latency is the least important of them.

  • Connectivity. An agent that calls out for every hostname stops working the moment the device has none, which is precisely the situation the endpoint layer exists to cover.
  • Economics. The credit draw would scale with total browsing volume rather than with candidate hits, which is a materially worse shape.
  • Privacy, and this is usually decisive. Sending every hostname a user visits to any external service is a position most organisations will not accept on employee devices and no organisation should accept on personal ones.

The local-set-first design fixes all three at once. The device answers from memory, nothing leaves for ordinary browsing, and the API is consulted only when the local structure says a hostname might be on the list. That is the pattern the rest of this page assumes.

How stale is a device that has been offline for two weeks?

Exactly two weeks stale, and there is no way around that. The set on the device is a snapshot of the rebuild it last received; anything added since is invisible to it, so a laptop that spent a fortnight in a drawer will not block a domain that entered the database ten days ago until it reconnects and applies the delta. What you can do is make the staleness visible and make reconnection cheap.

  • Record the set's build date on the device and report it to the management console.
  • Apply the accumulated changelog deltas as soon as the device comes back, rather than waiting for the next scheduled cycle.
  • Treat the fleet view of set age as an operational metric somebody owns, which is what turns an invisible risk into a visible one.
Will a 390,000-entry set slow down browsing?

Not in any form worth measuring, provided you do not search it linearly. A binary search over a sorted array of hashes resolves in about nineteen comparisons; a Bloom filter is a handful of hash computations and bit tests. Both are microsecond-scale operations that sit well below the noise floor of a DNS resolution or a TLS handshake.

  • What can slow things down is the wrong structure — a plain text list scanned per request, or host-file entries on a platform that reloads the file on every lookup.
  • Build the structure once when the set updates, hold it in memory, and the per-request cost stops being a consideration at all.
What happens when the local filter produces a false positive?

The agent asks the API and gets the correct answer. That is the entire purpose of the second tier: a probabilistic filter is allowed to be wrong in one direction only, and the direction it can be wrong in is the one where a confirmation call resolves it. A clean hostname flagged by the filter is confirmed clean in well under fifty milliseconds and cached, so it never asks again.

  • A looser filter uses less memory and produces more confirmation calls.
  • A tighter filter uses more memory and produces fewer.
  • Neither changes what the user experiences, only what the design costs — which makes filter sizing an economic decision rather than a correctness one.
Can we deploy this without installing anything on the device?

Partially. A managed browser extension force-installed through browser policy needs no system-level installation and covers the browsing surface, which is where the great majority of phishing clicks land. That is often the only realistic option on personal devices, and it is a legitimate deployment rather than a compromise.

  • What it does not cover is anything outside the browser: a link opened from a desktop mail client into a non-managed browser, a document that fetches a remote resource, or a process making its own connections.
  • If those matter to your threat model you need something at the network layer of the device, which does require an installed component.
How do we avoid ten thousand devices each spending a credit on the same domain?

Route confirmations through your own management endpoint and cache the verdict there. The first device to flag a hostname causes one lookup; every other device that flags the same hostname that day is answered from your cache at no cost. This is the single most important optimisation in the whole design, and it also solves the key-handling problem, since the API key then lives only on your server.

  • Push the confirmed verdict back down to agents proactively — if one device has flagged and confirmed a hostname, every other device benefits from holding that verdict already.
  • The push is small enough to ride along with the agent heartbeat traffic you already send.
Does this replace the web gateway and DNS filtering we already run?

No, and a design that assumes it does will leave gaps. Network-layer controls cover every device on the network including the ones that will never run your agent — printers, cameras, contractor laptops, conference-room hardware — and they do so with no per-device deployment. The endpoint agent covers the devices that leave. Those two populations overlap but neither contains the other.

  • Running both from the same source list is what makes them coherent rather than merely redundant.
  • When the resolver and the agent work from the same daily rebuild, a user gets the same answer in the office and in a hotel, and the help desk does not have to explain why a site was reachable yesterday and is not today.
Honest limits

What the agent will not stop, however well you build it

A known-bad domain set is a floor. Describing it as anything more is how endpoint products lose the trust of the teams that run them.

A hostname registered an hour ago that nobody has seen serve anything

Verification requires observation, so a domain in its first minutes of life is absent from every list including this one, and an agent that says clean about it is answering correctly with the information that exists. The daily rebuild shortens that window and the changelog lets you find, after the fact, which devices reached the domain before it was known — but neither prevents the first visit.

A phishing page hosted under a hostname that belongs to a large legitimate service

When the credential form lives on a mainstream file-sharing platform or a general-purpose hosting subdomain, the hostname is shared with an enormous volume of legitimate traffic and blocking it is not an option. The hostname is simply the wrong unit of decision for that case, and content-level inspection is what addresses it.

A lure read on the laptop and completed on a personal phone

This happens more than endpoint teams like to acknowledge, particularly with QR-code lures and anything involving a mobile authenticator. The agent protects the device it runs on and no other, which is an obvious statement that nonetheless shapes what an endpoint control can honestly claim.

An agent that is disabled, uninstalled, out of date or never checks in

The set-age metric described above exists precisely because this failure mode is silent: nothing breaks, no alert fires, and the device simply stops being protected while continuing to appear in the console. Treat set age as a first-class health signal rather than a diagnostic curiosity.

What it does do is make a large, specific population of hostnames unreachable from your devices wherever those devices are — more than 390,000 DNS-verified active phishing domains, rebuilt every twenty-four hours so that dead infrastructure is dropped rather than accumulated, enforced with no network dependency and no query leaving the machine for ordinary browsing. That is a real reduction in exposure for the population of attacks that has already been catalogued, and it pairs naturally with the mail-path work described under email security gateways, the perimeter enforcement under firewall security, and the analyst workflows under threat intelligence. Sold as a floor, it holds up. Sold as a solution, it will not.

Put the list on the device, where the device actually is

Build the agent-side set from the daily feed, delta it from the changelog, and resolve the candidates your local structure cannot decide.