Skip to content

Your names, read from the certificate record

Every publicly trusted TLS certificate issued for one of your names is in a public log. That record is the most honest inventory of your external surface you have, because it was not written by the team that was supposed to keep the inventory.

external attack surface managementcertificate transparency monitoringsubdomain takeover detection

The problem

The asset inventory is wrong, and it is wrong in one direction. Things are added to the external surface by people who are shipping — a staging host, a vendor subdomain, a marketing microsite, a demo that got a certificate and then got forgotten. Nothing is added to the inventory by the same act.

Certificate transparency is useful here precisely because you do not maintain it. Every publicly trusted certificate is logged, so the log holds the names that were provisioned whether or not anyone wrote them down. It is the one record of your external estate that nobody on your side curates.

What this actually does

You give it a domain. It reads the certificate transparency record for the names beneath it, resolves them, and runs four checks over what it found.

  1. 01

    Enumerate from the certificate log

    Every name under the domain that appears on a publicly logged certificate, capped at 500. Each becomes an external asset record, which is what lets a later scan report that a name has disappeared.

  2. 02

    Resolve and probe, narrowly

    IPv4 resolution of the first 100 names, public addresses only, up to 20 of them. TCP connect to 80, 443, 8080, 8443, 22, 21, 25, 3306, 5432, 6379 and 27017, with a passive banner read. SSH, FTP, SMTP and MySQL speak first and so identify themselves; HTTP, Postgres, Redis and MongoDB do not, and stay unidentified.

  3. 03

    Check where CNAMEs point

    A CNAME whose target returns NXDOMAIN or no data is a takeover candidate, reported high. A CNAME pointing at an S3 endpoint is fetched as well, and a NoSuchBucket response is reported critical: that name is claimable by whoever creates the bucket. Other providers are not fingerprinted.

  4. 04

    Check the certificates themselves

    Expiry, and the issuer chain against the compromised-CA blocklist. That second check is why this and the ACM transparency audit share one module: the question after a CA incident is not whether you are on a list, it is whether anything you own chains through the wrong issuer.

All of it lands as signals on the same bus as the cloud engines, which is the point of running it here rather than as a standalone scanner. A dangling CNAME with no other context is a hygiene ticket. The same name with a certificate chaining through a distrusted root, or an open database port on an address that also appears in an attack path, is a different conversation — and the correlation rules are what hold the two observations together.

What this is not

This is a certificate-transparency-led view of your external names. It is not a full-surface scanner, and the gap is wide enough to belong on the page rather than in a footnote.

  • It does not discover your domains. You supply the domain, through a scan request or the integration's configuration. Connecting a cloud account does not teach it your apex names, and there is no WHOIS, ASN, netblock, passive DNS or search-engine discovery.
  • It sees only what the certificate log sees. A host that never received a publicly trusted certificate — an internal name, something behind a wildcard, anything on a private CA — does not appear, and there is no DNS brute force to fill that gap.
  • It does not fingerprint web applications. No HTTP request is made to your hosts, no TLS handshake, no headers, no page titles, no technology detection, no exposed-admin-panel checks, no CVE matching. The only version strings it reads come from services that announce themselves on connect.
  • The port probe is crude, and errs quiet. Open means the TCP connection was established; a host that silently drops packets reads as closed, so a filtered port is indistinguishable from an absent one. One probe, one timeout, no retry, so a slow or rate-limited host can be missed.
  • Takeover coverage is DNS plus S3 only. A dangling CNAME is caught by resolution, and a CNAME at an S3 endpoint is checked for the unclaimed-bucket response. There are no provider fingerprints beyond S3 — Azure, GitHub Pages, Heroku, Fastly and the rest are not checked — so the absence of a takeover finding is not the absence of a takeover.
  • Expiry is checked for the apex, from the log. Certificate transparency records what was issued, not what your server presents today.
  • IPv4 only, five domains per scheduled run, and the scheduled path requires a Growth or Enterprise plan.

Where it fits

Run it as external corroboration of a cloud inventory you already have, not as the inventory. The cloud engines know what is in the accounts you connected. This knows what the public record says exists under your names — which is how you find the things that are in neither place: the vendor subdomain, the certificate a team requested without telling anyone, the CNAME left behind by a migration two years ago.

Does it scan hosts we do not own?
It can, and you should know that before pointing it at a domain. The addresses it probes come from resolving names in the certificate log, and those names often resolve to a CDN, a SaaS provider or a cloud load balancer that is not yours. The probe is a TCP connect with a passive banner read and sends no payload, but it is still traffic to a third party. Scope the domains you give it to infrastructure you are authorised to test.
How is this different from the ACM certificate audit?
The ACM engine reads the certificates in your AWS account through the ACM API — authoritative, but limited to that account. This reads the public certificate log for a domain, which covers certificates issued anywhere by anyone, including ones you did not request. They share the compromised-CA module, so a poisoned chain is scored the same way whichever side finds it.
Why is a dangling CNAME scored higher than an open port?
Because of who can act on it. An open port is your exposure to assess — it may well be intentional, and the probe cannot tell a deliberate public service from an accident. A CNAME pointing at a target that no longer exists is an exposure anyone can claim by registering that target, and the remediation is deleting one DNS record. High severity with a one-line fix is the right shape for that.
Can it monitor for new subdomains appearing?
Yes. Each run compares the names on the certificate log against the ones recorded by the previous run for that domain, and reports both the new names and the ones that stopped appearing. A run that fails to read the log reports no change rather than declaring your estate gone. What it cannot do is see a name that never received a logged certificate, so treat it as a certificate-log change feed rather than a complete one.

Run it in your own account

One Docker Compose stack, your datastores, read-only credentials into your clouds. The Community edition is free to run in production.