Skip to content

DMARC for subdomains: sp=, np= and domains you forgot

Attackers love subdomains you never configured. How sp= and the new np= tag cover them, how policy discovery works, and when to publish per-subdomain records.

Koltrix Team4 min read
A wall of numbered metal mailboxes
Photo by Tasha Kostyuk on Unsplash
On this page(11 sections)
  1. How receivers find a policy for a subdomain
  2. The three policy tags
  3. Why np exists
  4. Patterns for real-world domains
  5. Simple: everything at enforcement
  6. Gradual: subdomains first
  7. Mixed: root enforced, some subdomains still in progress
  8. The subdomains you forgot
  9. Subdomains that should never send
  10. Testing subdomain policies
  11. Subdomains in aggregate reports
  12. Delegated subdomains need special care
  13. Checklist
  14. Key takeaways

You locked down example.com with p=reject. An attacker sends mail from invoices.example.com, a name that has never existed.

Whether that message is rejected depends on tags many DMARC records leave out.

How receivers find a policy for a subdomain

When mail arrives with a From address at invoices.example.com, the receiver looks for a DMARC record at _dmarc.invoices.example.com. If there is one, it uses that record. If there is not, it falls back to the organizational domain's record, _dmarc.example.com, and applies the subdomain policy from that record.

Under RFC 7489 the organizational domain came from the Public Suffix List. Under RFC 9989, published in 2026, receivers walk up the DNS tree looking for _dmarc records. In both cases, for an ordinary company domain, the organizational domain's record governs subdomains that have no record of their own.

The three policy tags

Tag Applies to Default if absent
p The organizational domain itself Required
sp Subdomains that exist but have no DMARC record Same as p
np Subdomains that do not exist in DNS Same as sp (new in RFC 9989)

So a record of v=DMARC1; p=reject already applies reject to subdomains, because sp defaults to p. Many people do not realize the subdomain policy is inherited until something breaks.

Why np exists

Non-existent subdomains are a favorite of spoofers because they look plausible and nobody monitors them. secure-billing.example.com, hr.example.com, noreply.example.com all sound legitimate. Before np, the only way to cover them was sp, which also applies to real subdomains you may still be bringing into compliance.

np separates the two cases. A receiver applies np when the subdomain has no DNS records at all, specifically when an address query returns NXDOMAIN or no data for the relevant record types. That lets you write:

_dmarc.example.com. TXT "v=DMARC1; p=quarantine; sp=none; np=reject; rua=mailto:[email protected]"

Here the organizational domain is quarantined, real subdomains are still being monitored, and made-up subdomains are rejected outright. Because np is new, not every receiver honors it yet; receivers that do not understand it fall back to sp.

Patterns for real-world domains

Simple: everything at enforcement

v=DMARC1; p=reject; rua=mailto:[email protected]

sp and np inherit reject. Use this when you have inventoried every subdomain that sends mail and they all pass.

Gradual: subdomains first

v=DMARC1; p=none; sp=reject; rua=mailto:[email protected]

Subdomains often have short, well-understood sender lists, while the organizational domain has a long tail of vendors. Enforcing subdomains first protects the names you have cleaned up while you keep working on the root.

Mixed: root enforced, some subdomains still in progress

Give the subdomains that are not ready their own records:

_dmarc.example.com.        TXT "v=DMARC1; p=reject; rua=mailto:[email protected]"
_dmarc.events.example.com. TXT "v=DMARC1; p=none; rua=mailto:[email protected]"

A record on the subdomain overrides the inherited policy for that name only. The rest of the tree inherits reject.

The subdomains you forgot

When you audit, look beyond the obvious sending subdomains:

  • Legacy names like mail.example.com, smtp.example.com or old.example.com that once had servers.
  • Marketing subdomains like news.example.com or go.example.com used by campaign tools.
  • Product subdomains like app.example.com that might send notifications directly from application servers.
  • Regional or acquired brands living under your domain.
  • Wildcard DNS. If your zone has a wildcard record (*.example.com), every subdomain "exists" as far as DNS is concerned, so np never applies. Attackers can use any name, and sp is what governs them.

Aggregate reports list the From domain for each record in the header_from field. Filter for anything other than your root domain to see which subdomains appear in mail, legitimate or not.

Subdomains that should never send

For subdomains that exist for web or API use but should never send email, publish explicit records that make abuse easy to reject:

api.example.com.         TXT "v=spf1 -all"
_dmarc.api.example.com.  TXT "v=DMARC1; p=reject"

The inherited sp=reject would already cover DMARC, but an explicit -all SPF record also helps receivers that evaluate SPF independently.

Testing subdomain policies

Use dig to see what a receiver would find:

dig +short TXT _dmarc.invoices.example.com   # empty: falls back to the parent
dig +short TXT _dmarc.example.com            # the governing record
dig +short A invoices.example.com            # NXDOMAIN means np applies, if supported

Then send a test message from a subdomain you control and read the Authentication-Results header. Many receivers include the applied policy, for example dmarc=pass (p=reject sp=reject).

Subdomains in aggregate reports

Aggregate reports are organized by the From domain the receiver saw, so a single report for your organizational domain may contain rows for several subdomains. Each row's identifiers section names the header_from domain, and policy_published shows the policy the receiver applied. When you review reports, group rows by header_from first. That makes it obvious which subdomains carry real traffic, which ones only appear in spoofing attempts, and which ones you did not know were sending at all.

A subdomain that suddenly appears in reports with failing results, especially one that does not exist in your DNS, is a strong sign someone is trying it as a spoofing target. That is exactly the traffic np=reject is designed to stop, and it is useful evidence when you decide whether to tighten sp as well.

Delegated subdomains need special care

If you delegate a subdomain to another DNS provider or to a partner, with NS records pointing elsewhere, the _dmarc record for that subdomain lives in their zone, not yours. They can publish a weaker policy that overrides your inherited one. Keep a list of delegated subdomains and check their DMARC records periodically, or agree contractually on the policy they must publish.

Checklist

  • Know that sp defaults to p; set it explicitly if you want something different.
  • Add np=reject once your organizational policy is at enforcement.
  • Give subdomains that are still being cleaned up their own _dmarc record.
  • Check for wildcard DNS, which defeats np.
  • Publish v=spf1 -all on subdomains that never send.
  • Filter aggregate reports by header_from to find subdomains in use.

Key takeaways

  • Subdomains without their own DMARC record inherit the organizational domain's record.
  • sp sets policy for existing subdomains and defaults to p; np sets policy for non-existent ones.
  • np=reject cheaply blocks spoofing of made-up subdomains, where receivers support it.
  • Per-subdomain records let you enforce the root while some subdomains are still in progress.
  • Wildcard DNS and forgotten legacy names are the most common gaps.

Start with Koltrix

Your domain, one inbox, and an API that sends.

A team inbox where AI sorts and drafts (nothing is sent without your click), plus the transactional API and SMTP relay your product sends with. 7 days free, no card.

SharePost on XLinkedIn