Threat Investigation
The deep-dive you run when something looks bad and you need the full story. Give it one indicator and it works outward across its whole footprint — the related domains, the real servers behind any CDN, the neighbouring infrastructure — and checks each piece for known abuse. You get one coherent read on how dangerous it is and why, with safe next steps to pivot on. Reach for it when a quick check says 'look closer.'
The alert
A proxy log shows an internal host reached 185.220.101.1, and the feed that flagged it scores the address 21.32 / LOW. Low enough to close, listed enough that closing it is a decision somebody will ask you about.
The question
Do I escalate this to an incident, and what would tell me I am wrong?
Not "what does this IP score". The score is an input to that question, and on this indicator it is the input that points the wrong way.
What this cannot answer
- Which direction the connection went. Nothing in the graph records that your host initiated it. Outbound to a Tor exit and inbound from one are different tickets; only your own logs separate them.
- Whether the internal host is compromised. A Tor exit is an ordinary destination for a privacy tool and a plausible one for a beacon. This workflow reads the external address, never yours.
- How much of the answer was actually looked at. That is
whisper.assess's coverage qualifier, and reading it is step one rather than a footnote — Coverage. - A stable count of origin-AS conflicts. Aggregating over
CONFLICTS_WITHis non-deterministic on production: three consecutive runs of one identical anchored query returned 2, 2 and 0. Read the rows, never the count.
What do we know
The run opens with explain(), which returns the score and its arithmetic — six feeds, their weights, the recency and age multipliers — then whisper.assess, which returns a label and a band with an explicit coverage qualifier attached.
The qualifier is the part that decides the ticket. explain()'s verdict on 185.220.101.1 was computed for that address and nothing else — not the network it sits in, not the network that routes it. "LOW" is a true statement about one host's feed listings and not a statement about its neighbourhood, and Falsify it is where that distinction changes the answer.
A clean read comes back as known-clean — coverage: known-clean. In coverage, no malicious evidence. or no-data — coverage: no-data. Not in coverage. This is not a verdict — nothing was looked at., as a populated row that says so. It never comes back as an empty result set: zero rows is never a verdict.
Why
- 01Capability preflight. db.relationshipTypes()/db.labels() are cheap schema-introspection calls; the flags they yield gate the §9 aggregate pass so a layer absent on this server degrades to a coverage note instead of erroring — the same instructions enrich automatically as layers ship.
- 02Threat-engine reading. explain() auto-detects the indicator type and returns the graph's own score, level, factors and cited sources — the first-hand observation everything else is read alongside.
- 03Suspicion assessment. whisper.assess returns a label + band with an explicit coverage qualifier, so a clean read is reported as "known-clean" vs "no-data" rather than silently implying safety.
- 04Threat-feed listings. Names the LISTED_IN feeds and their categories, EXCLUDING popularity/trust lists (Tranco, Cloudflare Radar — a legitimacy signal, not a threat) and ad/tracking blocklists, so the threat-feed count is real.
- 05Popularity / trust context. Tranco / Cloudflare Radar top-1M membership is a popularity/legitimacy signal, and ad/tracking blocklists merely flag ad-serving domains — neither is a security threat, so they are reported as CONTEXT, never as a threat hit. (Popularity VDP — returns nothing until the layer ships to prod, then activates automatically.)
- 06What this is. The indicator is routed into the right typed frontier (hostname / IP / ASN / prefix) so round one expands it by the correct rules.
- 07De-CDN origins. whisper.origins peels back CDN/proxy fronting to the likely origin IP(s) and network; those origin IPs are seeded into the IP frontier so the fan-out expands the infrastructure that actually serves the content — not the CDN front-end (whose co-tenants are suppressed).
- 08Subdomain family. Derives the registrable apex with the Public Suffix List and enumerates its subdomain family, each threat-checked. ANCHORED ON THE HOSTNAME LABEL: fed a bare IP, whisper.psl.tldPlusOne happily returns '101.33' as the 'apex' of 185.220.101.33, which then poisons the profile card and the subdomain table. Matching (h:HOSTNAME) first makes the step a clean no-op for an address, network or prefix seed.
- 09Infrastructure classification. Reads vendor delegation, the prefix anycast flag (ip.isAnycast is null — read it from the prefix), co-tenant degree and the node's own egress/abuse flags to tag the infra class (§15.7). A threat/egress flag on a SHARED address (CDN vendor / anycast / high-degree) is a bad co-tenant, not the seed's own infra, so it does NOT flip a fronted domain to BULLETPROOF/TOR — shared seeds suppress co-tenant fan-out and lean on de-CDN origins; only a DEDICATED abuse address expands HARDER.
- 10Round 1: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 11Round 1: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 12Round 1: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 13Round 1: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 14Round 2: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 15Round 2: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 16Round 2: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 17Round 2: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 18Round 3: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 19Round 3: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 20Round 3: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 21Round 3: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 22Round 4: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 23Round 4: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 24Round 4: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 25Round 4: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 26Round 5: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 27Round 5: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 28Round 5: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 29Round 5: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 30Round 6: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 31Round 6: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 32Round 6: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 33Round 6: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 34Round 7: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 35Round 7: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 36Round 7: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 37Round 7: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 38Round 8: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 39Round 8: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 40Round 8: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 41Round 8: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 42Round 9: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 43Round 9: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 44Round 9: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 45Round 9: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 46Round 10: hostnames → IPs & subdomains. Each hostname fans out to the IP(s) it resolves to (its hosting), the subdomains beneath it, its parent domain (up to the apex, never the TLD), and the hostnames it links out to — all become nodes the next round expands.
- 47Round 10: IPs → hosts & prefix. Each IP fans out to the hostnames it serves and the prefix that announces it. CDN/cloud-delegated addresses host millions of unrelated tenants, so their co-tenant promotion is suppressed (DELEGATED_TO a VENDOR) — the de-CDN origins pivot carries the meaningful neighbours instead.
- 48Round 10: ASNs → prefixes. Each owning network fans out to the prefixes it announces — the address space that depends on it, and the next nodes to expand to their IPs.
- 49Round 10: prefixes → IPs & ASN. Each prefix fans out to the IPs it contains and the ASN that routes it — but a prefix on a large provider network (anycast / many-prefix ASN / CDN vendor) holds hundreds of unrelated tenants, so its IP expansion is suppressed (the toxic-neighbourhood poison pivot); a small dedicated prefix still reaches its sibling hosts.
- 50Threat sweep across the fan-out. Every hostname, IP, prefix and ASN reached is read for its own threat listing & level, LISTED_IN feeds, HAS_SIGNAL threat signals and per-node flags — so a compromised node anywhere in the neighbourhood surfaces, not just the indicator itself.
- 51Fan-out recap. A count of everything reached — hostnames, IPs, prefixes and networks — the strategy expands each branch as far as its signal warrants.
- 52MOAS route conflicts (with RPKI status). MOAS is USUALLY LEGITIMATE — multihoming, anycast, DDoS scrubbing, aggregation and mergers all look identical to a hijack, and >90% of MOAS prefixes are plain multihoming. So the row that matters is not "is it MOAS" but the per-(prefix, origin) RPKI status: a ROA that covers the prefix but does NOT authorize this origin ('not-authorized') is the only aggravating case, and it is the only one the highlight rules will promote. 'not-found' means no ROA covers the prefix at all — unverifiable, not invalid (only ~45% of routable prefixes carry one). ROAs are typed to PREFIX while routing produces ANNOUNCED_PREFIX, so the join is by NAME — and it must be the UNWIND value `n`, never the bound `ap.name`: anchoring the PREFIX lookup on a bound node property both misses the index (13s — 65x slower than the indexed form) AND silently returns 0 ROAs, which would have reported every MOAS conflict as 'not-found'. Live-validated on 216.168.228.0/24: 180ms, two VeriSign origins, both 'not-authorized'.
- 53RPKI origin authorization. ROAs are typed to PREFIX and routing produces ANNOUNCED_PREFIX, so bridge through the ASN. roa_n = 0 is a CANDIDATE unverified origin (labelled "unverified", not "invalid") — corroborate per (prefix, origin).
- 54Shared-IP clusters. Hosts sharing one IP are a co-hosting cluster (size ≥ 2, ≤ 200 — a mapping to hundreds is shared hosting, not a cluster).
- 55Shared-nameserver clusters. Domains behind one nameserver (NAMESERVER_FOR goes ns→domain) form a shared-NS cluster — a bulk-registration pivot (a boutique NS, not a mega-managed-DNS one with 137k siblings).
- 56Shared-registrant clusters. Domains registered by one email are a campaign cluster — the highest-value shared-infra pivot (exclude privacy-proxy contacts that map to countless domains).
- 57Threat density by network. A raw count of threat-listed addresses says nothing without a denominator: 200 listed IPs in a hyperscaler is background noise, 4 in a 30-address block is a toxic neighbourhood. The sampled percentage is what makes the finding promotable (the highlight rules require BOTH a floor on the count and a floor on the density), and capping the sample at 300 addresses keeps the query bounded on a large network.
- 58Egress / anonymizer concentration. A concentration of egress/anonymizer nodes in one class is a stronger signal than any single hit (per-node flags; no assess round-trip needed).
- 59Clean-in-toxic contradictions. A clean IP inside a prefix that also carries threat-listed IPs is not "safe" — no-data at the IP granularity inside a hostile neighbourhood is a contradiction worth surfacing (WHOIS/GeoIP mismatch is computed in the handler from whois + origins).
- 60Abuse-infra neighbours. Co-tenants of a bulletproof/abuse address are likely related bad actors (the opposite of CDN noise) — the highest-value branch to expand, bounded to threat-flagged neighbours in the same prefix. Fires on the aggregate pass or whenever the seed classified as bulletproof/abuse.
- 61WHOIS ownership. Registrar, registrant org and contact email are the ownership anchors that link this domain to siblings and to known actors.
- 62WHOIS history. Registration age and the history of registrar/registrant/nameserver changes separate stable assets from freshly-registered, disposable ones.
- 63Vendor / host identity. whisper.identify maps the host to a canonical vendor, category and role set (CDN, mail receiver, DNS operator…), so known-good infrastructure is recognised rather than re-investigated.
- 64Listing vector — feeds, weights & recency. Breaks the base score into its direct-listing evidence: every feed that listed the indicator, the weight it contributed, and when it was first and last seen — the sourced, dated rows that justify the verdict to an analyst or auditor.
- 65Threat-class vector — phishing / malware / C2 / spam / anon. Decomposes the indicator's own verdict into named abuse types — phishing, malware, C2, spam, botnet, DGA, brute-force, scanner, anonymizer/Tor — so the score reads as a class breakdown rather than one opaque number.
- 66Network-neighborhood vector — toxic density on the hosting prefix. The guilt-by-hosting signal: how many threat-listed IPs share the announced prefix behind the indicator. An IP anchors directly on its prefix; a domain resolves to its serving IPs first, so a clean indicator sitting in a bad block still surfaces the neighbourhood risk.
- 67ASN composite vector — threatDensity / graphMetrics / historical / prefixAge. Exposes the engine's structured reputation breakdown for the owning network — threat-density, graph-metrics, historical-behaviour and prefix-age sub-scores. Scores the ASN directly when the indicator is one, otherwise resolves the owning ASN behind an IP or domain.
- 68DNS records. The seed hostname’s resolved v4/v6 addresses, its nameservers and mail servers, any CNAME aliases, and the count of sites it links to and that link to it — the DNS + web-graph facts an analyst reads first.
- 69Nameservers & providers. Each nameserver (NAMESERVER_FOR goes NS→domain) with the vendor its own address is delegated to — the managed-DNS / hosting provider behind the zone.
- 70Mail servers & providers. Each mail server (MAIL_FOR goes MX→domain) with the vendor its address is delegated to — who actually receives the domain’s mail.
- 71SPF authorization chain. The domain’s SPF record expanded one and two levels deep — which hosts, mail exchangers and IP ranges it authorizes to send mail as it — rendered as a tree.
- 72Network & hosting attribution. For the indicator’s own address(es): the announcing prefix and ASN (with its name), the registered-prefix owner org, the GeoIP city/country, and the CDN/cloud vendor or cloud region — the hosting story as one coherent table instead of five.
- 73Physical footprint. The data-center facilities (AS_PRESENT_AT) and internet exchanges (IX_MEMBER) the owning ASN is present at — the physical-layer footprint behind the address. Sparse for small networks (PeeringDB coverage).
- 74Address tenancy. The most load-bearing number in the report: it decides whether co-hosting is evidence at all. On an address with 4,000 tenants, "a flagged domain shares this IP" says nothing — threat actors and enterprises sit on the same shared platforms. On an address with 3, it says a great deal. Every neighbourhood highlight is gated on this class (shared ≥20 / low-density / dedicated ≤2); the count is a capped sample, because the only question ever asked of it is which tenancy band it falls into.
- 75Structural context (whisper.walk). A novel host is not a clean host. whisper.walk answers the question a feed lookup cannot: does the graph hold ANY structural record of this thing? `no_atlas_match` means it matched nothing we know — which is a coverage statement, not a verdict, and is exactly the case where a not-listed reading is least trustworthy.
- 76Network reputation. The graph pre-computes a per-ASN reputation (max/avg threat score, overall level, whether it announces threatening prefixes). Running it over the networks the FAN-OUT reached — not just an ASN input — means a domain or IP investigation also gets its hosting network's posture, which is the difference between a boutique bulletproof AS and a Fortune-500 cloud.
- 77Unflagged registrant siblings. The forward-TI arm: the domains registered by the same contact that NOTHING has flagged yet. If the seed is bad, these are the not-yet-burned infrastructure — the most actionable rows in the whole report, and by definition invisible to every feed lookup.
- 78Abuse signals. The typed abuse signals (THREAT_SIGNAL_TYPE) are a first-class layer, distinct from the boolean flags and the feed listings — an entity can carry a signal with no feed listing at all. Gated on the PREFLIGHT capability probe, so a server without the layer degrades to a coverage note instead of an error.
- 79Tor exit relays on the resolved addresses. Anonymised traffic changes how every other piece of evidence is weighed — an exit address is the source of other people's traffic, not necessarily its operator's. Anchoring on the seed AND its resolved addresses (OPERATES_EXIT_NODE runs IPV4 → TOR_RELAY) means a DOMAIN pointing at an exit is caught too, not just a bare IP. Running an exit relay is legal and common for nonprofits and universities: this is context, never a verdict.
- 80Tor relay record. Only runs once the graph traversal has already found an exit relay, and is bound to THAT address — so the procedure is always handed an IP (it takes a scalar), never a hostname. It adds the provenance the edge alone cannot: which consensus/source recorded it, and when.
- 81Tor exit presence across the network. The network-scale view: how much of this ASN is Tor egress, and where. Deliberately gated — it only runs when the seed IS a network, or when the seed itself already touched an exit relay, because walking every prefix of an arbitrary hosting ASN is expensive and, for an ordinary domain, pointless. Capped at the first 5 in-scope networks.
The pivot the score did not suggest
Six listings, and their categories are four generic abuse blacklists, one spam list, and one feed that names a mechanism: tor. The "our host is talking to malware infrastructure" hypothesis just got weaker and a different one appeared.
One hop confirms it. OPERATES_EXIT_NODE returns four relay fingerprints for this address, and isTor / isAnonymizer corroborate on the node itself — measured 2026-08-09, worked end to end on Your first investigation.
21.32 / LOW contains no hint of any of that. This is the reason the product exists: the category is where the pivot lives, and a score is a compression that throws the category away.
Falsify it
Ask the enclosing network, which the verdict explicitly did not cover. The /24 this address sits in is routed by AS60729 — TORSERVERS-NET / Stiftung Erneuerbare Freiheit, a Tor infrastructure non-profit: the Tor read now stands on routing as well as on threat feeds, two layers that fail independently.
Then score the prefix rather than the host. 185.220.101.0/24 returns 164 listed addresses of 256 — 64 % threat density, recovered score 73.66. The host reads LOW and the block it lives in reads CRITICAL. Both are true, and only one of them was in the answer you started with.
The queries are runnable, with their measured output, on SOC triage.
The conclusion
185.220.101.1 is a Tor exit relay, not attacker-controlled infrastructure: four exit relays, six feed listings that are generic abuse and spam plus a Tor list, and a network operator that is a Tor non-profit. No C2, phishing or malware category appears anywhere on it. Reclassify from "external threat" to "outbound Tor usage" — the open question is why an internal host is reaching the Tor network, not whether this address is malicious.
Four things would change that, and each is a query rather than an opinion:
- a C2, phishing or malware category on this address — re-run the listings step rather than trusting the score;
- the connection being inbound, which nothing above establishes;
OPERATES_EXIT_NODEreturning nothing on a later run — relay membership churns, and a former exit still on blacklists reads very differently;- independent evidence that the internal host was compromised.
A verdict with a falsification list can be argued with. A verdict without one can only be believed or ignored.
What this cost
81 named steps across the threat-intel, DNS, BGP, WHOIS, historical layers. The runner reports what each step returned, row by row, so the evidence and what it took to get it arrive together rather than as one number at the end.
How it uses the graph
Traverses the threat-intel, DNS, BGP, WHOIS, historical layers of the graph, in 81 steps:
Reading the live capability map (which threat layers this server carries)…
Reading the indicator through explain()…
Asking whisper.assess for a coverage-qualified suspicion band…
Listing the actual threat feeds that name the indicator (popularity & ad/tracking lists excluded)…
Checking popularity/trust & ad-tracking lists (context, NOT threat feeds)…
Detecting the indicator type to seed the fan-out…
Discovering the real origin behind any CDN…
Deriving the apex and enumerating its subdomains (the whole domain family)…
Classifying the seed address — CDN/cloud vendor, anycast prefix, co-tenant degree, egress/abuse flags…
Expanding round-1 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-1 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-1 ASNs announce…
Reading the IPs inside round-1 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-2 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-2 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-2 ASNs announce…
Reading the IPs inside round-2 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-3 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-3 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-3 ASNs announce…
Reading the IPs inside round-3 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-4 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-4 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-4 ASNs announce…
Reading the IPs inside round-4 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-5 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-5 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-5 ASNs announce…
Reading the IPs inside round-5 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-6 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-6 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-6 ASNs announce…
Reading the IPs inside round-6 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-7 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-7 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-7 ASNs announce…
Reading the IPs inside round-7 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-8 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-8 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-8 ASNs announce…
Reading the IPs inside round-8 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-9 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-9 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-9 ASNs announce…
Reading the IPs inside round-9 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Expanding round-10 hostnames to their IPs, subdomains, parent domain and the sites they link to…
Reverse-resolving round-10 IPs to their hosts and prefix (CDN co-tenancy suppressed)…
Listing the prefixes round-10 ASNs announce…
Reading the IPs inside round-10 prefixes and the ASN that routes them (large-provider blocks suppressed)…
Threat-checking every discovered node — feeds, threat signals and flags (C2 / malware / phishing / Tor / proxy / botnet / scanner / spam)…
Tallying the fan-out…
Reading the competing origins of each in-scope prefix, and whether RPKI authorizes them…
Counting authorizing ROAs per in-scope network (roa_n = 0 → unverified origin)…
Grouping in-scope hosts that resolve to the same IP…
Grouping in-scope domains served by the same nameserver…
Grouping in-scope domains sharing a registrant email…
Measuring the abuse DENSITY of each small in-scope network (listed IPs as a share of the sampled block)…
Rolling up in-scope nodes by egress / anonymizer class (Tor / VPN / proxy / exfil)…
Finding SMALL prefixes where clean-looking IPs sit alongside threat-listed ones (provider blocks excluded)…
Expanding abuse infrastructure harder — threat neighbours of in-scope C2/threat IPs…
Reading the registrar and registrant contacts…
Pulling historical WHOIS snapshots…
Classifying the host — vendor, category and roles…
Listing vector — feeds, weights & recency…
Threat-class vector — phishing / malware / C2 / spam / anon…
Network-neighborhood vector — toxic density on the hosting prefix…
ASN composite vector — threatDensity / graphMetrics / historical / prefixAge…
Reading the DNS record set — resolved addresses, nameservers, mail servers, links…
Listing the nameservers and attributing each to a provider…
Listing the mail servers and attributing each to a provider…
Resolving the SPF authorization chain (include / a / mx / ip)…
Attributing each hosting address — prefix, ASN, org, geolocation, CDN/cloud vendor…
Mapping the physical footprint — facilities and internet exchanges of the owning network…
Counting how many other hostnames share each address this indicator resolves to…
Asking whisper.walk where this host sits structurally — coverage, nearest known vendors, siblings…
Reading the reputation the graph already holds for every network the fan-out reached…
Finding the registrant-shared siblings that sit in NO threat feed…
Reading the explicit HAS_SIGNAL edges on every node the fan-out reached…
Checking whether any address this indicator resolves to operates a Tor exit relay…
Pulling the authoritative relay record (fingerprint, exit addresses, source, ingest time)…
Mapping the whole network's Tor exit presence by block and country…