Digital Infrastructure Mapping

Map the digital estate an indicator belongs to. Starting from any domain, IP, ASN or prefix, this works out the true owner — even behind privacy WHOIS and CDNs — via the atlas operator, the canonical registrant organization and the registrant email, then enumerates everything that owner owns: the subdomain namespace, the rest of its domain estate, the networks and prefixes that host it, and the facilities it physically sits at. Assets run by someone else (CDN, managed DNS, cloud) are marked as the vendor border, not owned.

The alert

A supplier review lands with one line under critical vendors: github.com. The reviewer wants the estate behind that name — what the owner runs, and who else is inside the boundary.

The question

Do I sign this off as one supplier, and what would tell me I am wrong?

Not "who owns github.com". A registrant lookup answers that in one call, and on this domain it answers github hostmaster — a string, not an owner, and nowhere near an estate.

What this cannot answer

  • Which hostnames on an owned address belong to the owner. 140.82.121.3 carries 21 resolving hostnames, among them torad.cfd, vip-banana.cdn661.com and codeweaver.guru. Address attribution counts them as co-tenants for exactly that reason: no edge records who pointed them there.
  • The owner of a host under a private suffix. Apex resolution follows the Public Suffix List, so raw.githubusercontent.com collapses to itself, and that node holds zero REGISTERED_BY and zero HAS_EMAIL edges. Seed githubusercontent.com instead and both come back, which is what the naming and lookup helpers are for.
  • Whether the announced prefixes are protected. The RPKI step counts ROA_AUTHORIZES_ORIGIN edges, five of them on AS36459, and never checks that each of the 26 announced prefixes falls inside one.
  • How much of the estate was reachable at all. That is the coverage qualifier, and it is the first thing to read rather than a footnote — Coverage.

What do we know

No step in this run calls a scoring procedure, and none is wanted here. What comes back is an attribution with its evidence attached, and the useful part is that the run answers "who" three separate ways and the three do not agree.

whisper.identify returns the atlas operator: Github, category saas, host class multi_tenant_user_content. WHOIS returns the registrant string github hostmaster, which SAME_ORG_AS folds onto GitHub, Inc.; the apex in fact carries two organization strings, github hostmaster and github,, and both fold onto that one node. The network layer returns four addresses on two networks, AS36459 (GITHUB) and AS8075 (Microsoft Corporation).

A host with no registrant returns a row of nulls, the way raw.githubusercontent.com does. It never returns an empty result set: zero rows is never a verdict.

Why

  1. 01Registrable apex. whisper.psl.tldPlusOne collapses a deep host to its registrable domain via the Public Suffix List — so a subdomain input attributes to the apex that actually owns the estate, not to its immediate DNS label.
  2. 02Operator (atlas). whisper.identify folds the atlas view — the operating vendor, the category (saas / cloud / cdn …) and the derived roles (DNS_OPERATOR / CDN / ORIGIN_AS …) — onto the indicator. When the operator is a CDN or managed host, that is the vendor BORDER, not the owner.
  3. 03Registered owner. REGISTERED_BY names the WHOIS registrant; SAME_ORG_AS folds a messy string ("github hostmaster") to the canonical organization ("GitHub, Inc."); the non-privacy HAS_EMAIL is the contact the rest of the estate is pivoted on. A registrant present but all-privacy is flagged, not hidden.
  4. 04ASN footprint. For an ASN seed: how many prefixes it routes (ROUTES), how many facilities (AS_PRESENT_AT) and exchanges (IX_MEMBER) it is present at, and its registered name / country / org — the owned network estate.
  5. 05Address attribution. For an IPv4 seed: the announcing prefix and ASN (ANNOUNCED_BY→ROUTES) with the ASN name and its registrant org — the owner via the network layer. The hostnames that resolve to it are counted as CO-TENANTS (shared-IP neighbours), not as owned assets.
  6. 06IPv6 attribution. The IPv6 twin of address attribution: the announcing prefix and ASN, plus the co-tenant count on the address.
  7. 07Prefix profile. For a CIDR seed: the ASN(s) that route it (ROUTES) with their name, the registrant organization (REGISTERED_BY), and how many member IPs it carries — the owned address block.
  8. 08Namespace. The subdomains published beneath the apex (CHILD_OF, reverse). The count is the substrate aggregate the canvas draws as "+N"; the sample seeds the graph. The breadth of the owned namespace before per-host enrichment.
  9. 09DNS & mail providers. The DNS and mail operators the domain delegates to (NAMESERVER_FOR / MAIL_FOR, reverse; SPF_INCLUDE, out). These are the third-party providers in the footprint — surfaced as the vendor border, not owned assets. The 13 DNS root servers are filtered.
  10. 10Addresses. The addresses the apex resolves to (RESOLVES_TO → IPV4), each with its announcing prefix and routing ASN — the owned (or vendor-hosted) addressing, one row per address.
  11. 11Owner's other domains. The registrant contact email (HAS_EMAIL, non-privacy) is the strongest ownership pivot: every OTHER domain registered under it (HAS_EMAIL, reverse) is very likely the same owner. Capped at 500 with a saturation flag.
  12. 12Organization's registered assets. The other hostnames registered by the same WHOIS ORGANIZATION (REGISTERED_BY, reverse) — the org estate. Reached only via the edge from the apex (never by scanning ORGANIZATION by id). Capped at 200 per org.
  13. 13Estate hosting spread. Which networks actually host the owned subdomain estate: sample the resolving subdomains (CHILD_OF → RESOLVES_TO → ANNOUNCED_BY → ROUTES) and tally by ASN. A single dominant ASN is a concentration; a spread across CDNs is the vendor border.
  14. 14Subdomain tree. The immediate subdomain layer (CHILD_OF) hung off the apex as a tree — a sample of the owned namespace. Capped at 20 children; the true size lives in the namespace count.
  15. 15De-CDN origins. whisper.origins peels back CDN/anycast fronting to the real origin IP and ASN (with a confidence and the method that found it). High-confidence origins are where the owner actually runs the service, behind the vendor border (the confidence bar adapts to the scale whisper.origins returns).
  16. 16Network topology. The apex’s addresses as a tree — each address under its announced prefix, each prefix under the ASN that routes it. Parallel ASN subtrees reveal multi-homing (github.com sits on GitHub AND Microsoft), which a flat list hides.
  17. 17Physical footprint. The data-center facilities (AS_PRESENT_AT) and internet exchanges (IX_MEMBER) the owning network is present at, as a tree per ASN. The ASN is the seed itself, or the ASN behind the resolved addresses. Sparse for small networks (PeeringDB coverage).
  18. 18RPKI coverage. The route-origin authorizations (ROA_AUTHORIZES_ORIGIN) the owning ASN has published — the RPKI posture that protects the owned prefixes from route hijack. May be sparse.

The pivot the score did not suggest

The registrant email is the pivot, and no amount of name matching finds it. hostmaster@github.com is attached to 231 hostnames, and the ones that matter are the ones with no "github" in them: speakerdeck.asia, npmjs.app, probot.app, hubot.app, octoc.at, brickworkapp.com, codeconf.com and ghub.com, alongside defensive misspellings such as gitgub.com, gisthub.com, git-hub.com and choosealicence.com.

An estate assembled from the supplier's name carries none of those. The edge that finds them runs one hop out of the apex and back — Pivoting examples.

Falsify it

Ask which networks actually carry the estate, because that is what "one supplier" rests on.

github.com publishes 36,131 subdomains. 232 of them resolve through to a routing ASN, and seven networks carry those: AS36459 (GitHub) 178, Fortinet 33, Fastly 17, Microsoft 7, Cloudflare 2, Amazon 1, MailChimp 1. The figures sum past 232 because one host can resolve onto more than one network. The workflow's own tally counts edges rather than distinct hosts and moved between two consecutive runs (228, then 227), so read the per-network rows and not the total.

Delegation says the same thing one layer earlier. The apex's nameservers are awsdns and nsone.net hosts, neither run by the owner; mail goes to aspmx.l.google.com and github-com.mail.protection.outlook.com; and eight SPF_INCLUDE edges authorize third parties — _spf.salesforce.com, mail.zendesk.com, mktomail.com, servers.mcsv.net among them — to send as github.com. whisper.identify lists DNS_OPERATOR among the roles while NAMESERVER_FOR names two DNS vendors. Read the edges, not the role.

Both queries, with output, sit on Compliance evidence and Posture audits.

The conclusion

github.com attributes to GitHub, Inc. behind two WHOIS strings, and the estate is 231 registered hostnames, 36,131 published subdomains, 26 prefixes announced by AS36459, and presence at 45 facilities and 3 exchanges. The vendor boundary is not where the name stops — six networks the owner does not run carry part of the namespace, and DNS, mail and SPF are delegated outward. "One supplier" is the wrong unit for the review.

Four things would change that, and each is a query:

  • a second unmasked registrant contact on the apex, which would split the estate — this one has exactly one;
  • a masked registrant, which yields the flag and no estate: cloudflare.com carries domains@cloudflare.com next to noreply@data-protected.net, and a domain carrying only the second has nothing to pivot on;
  • a later run of the hosting tally, since network membership churns and a moved subdomain re-ranks the vendors;
  • an origin behind the fronts. whisper.origins returned ten candidates for this seed and the run published none: the two strongest sat at confidence 0.4499, under the step's own bar, both in IANA special-purpose space (198.18.1.190, 192.0.2.2) with no routing ASN attached. Where the service runs behind Fastly and Cloudflare is not established here.

What this cost

18 named steps across the DNS, BGP, RPKI, physical, GeoIP, WHOIS, email 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 DNS, BGP, RPKI, physical, GeoIP, WHOIS, email layers of the graph, in 18 steps:

How it walks the graph18 steps
01Registrable apex

Resolving the registrable apex (eTLD+1)…

DNS
02Operator (atlas)

Attributing the indicator to a known operator…

DNS
03Registered owner

Reading the registrant org, email and registrar…

WHOIS
04ASN footprint

Profiling the ASN — prefixes, facilities, exchanges, registrant…

BGP
05Address attribution

Attributing the address — prefix, ASN, registrant, co-tenants…

BGP
06IPv6 attribution

Attributing the IPv6 address — prefix, ASN, co-tenants…

BGP
07Prefix profile

Profiling the prefix — routing ASN, registrant org, member IPs…

BGP
08Namespace

Sizing the owned subdomain estate via CHILD_OF…

DNS
09DNS & mail providers

Reading nameservers, mail hosts and SPF includes…

DNSemail
10Addresses

Resolving the apex to its addresses and their networks…

BGP
11Owner's other domains

Pivoting the registrant email to the rest of the estate…

WHOIS
12Organization's registered assets

Enumerating the registrant organization's other assets…

WHOIS
13Estate hosting spread

Grouping the subdomain estate by hosting ASN…

BGP
14Subdomain tree

Building the subdomain tree beneath the apex…

DNS
15De-CDN origins

Discovering the real origin behind any CDN front…

BGP
16Network topology

Grouping the addresses by ASN and prefix…

BGP
17Physical footprint

Mapping the owning network’s facilities and exchanges…

physical
18RPKI coverage

Counting the owning ASN’s RPKI ROAs…

RPKI