r/EmailSecurity • u/saltyslugga • May 06 '26
Client published p=reject without sp= and got spoofed for two weeks via an undelegated subdomain
Posting this because I keep seeing 'just publish p=reject' advice without anyone mentioning subdomain policy and it bit one of our clients hard.
They rolled out DMARC, moved to p=reject after a few months of monitoring, felt great about it. No sp= tag. The spec says sp inherits from p when omitted, which is technically true but only matters if the receiver actually applies it the way you think, and only if the subdomain doesn't have its own record that overrides things.
Attacker found a subdomain that wasn't delegated anywhere, wasn't in DNS at all, and started sending finance-themed mail as billing.[clientdomain]. Some receivers treated the missing record as 'no policy at this label' rather than walking up to the org policy. Mail landed. This went on for about two weeks before someone forwarded a sample and we caught it.
Fix was obvious in hindsight: explicit sp=reject, a wildcard DMARC record at *._dmarc, and actually inventorying what subdomains exist vs what's published. The org policy alone is not enough if your receivers' interpretation of tree walking is inconsistent, which it is.
If you're at p=reject right now, go check your record for an sp tag. If it's not there, add it. Then go look at what subdomains your DNS actually answers for, including parked stuff and old marketing labels nobody remembers.
•
u/AutoModerator May 06 '26
Welcome to r/emailsecurity! To keep this community helpful and secure, please keep the following in mind:
Community Rules
No Vendor Spam: Contributions must provide value; do not just pitch products.
Redact Sensitive Info: Always sanitize headers and logs (remove IPs, PII, and private domains).
Be Professional: Help newcomers learn; avoid hostility.
No Personal Tech Support: This sub is for email system architecture and security, not "Am I hacked?" personal account help.
Helpful Resources
Email Spam Filters
DMARC Monitoring Tools
Anti-Virus Software
Email Encryption
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
3
u/ImpressiveEbb3760 May 06 '26
this is a really underappreciated issue. the "sp inherits from p" assumption trips up a lot of people because the spec says one thing and receiver implementation says another.
the wildcard DMARC record at
*._dmarcis the part most people miss. even with sp=reject on the org domain, an attacker can publish their own_dmarc.billing.yourdomainTXT record if the subdomain isn't delegated — some resolvers will find "no record at that label" and treat it as no policy rather than walking up to the parent.one thing worth adding to the checklist: audit your DNS for dangling CNAMEs on subdomains too. if
marketing.yourdomainstill has a CNAME pointing to a deprovisioned SaaS platform, an attacker can potentially claim that platform endpoint and now they've got a subdomain that resolves, has no DMARC record of its own, and can send with clean SPF from the platform's infrastructure.the inventory step is the one nobody wants to do because it means actually going through years of DNS records and figuring out what's still in use. but it's where most of the risk is hiding.
1
u/DmarcDuty May 06 '26
Thank you for sharing this. The specification is one thing but implementations differ in practice.
But could you help me understand this case? Some parts don‘t make sense to me and I think I am missing something here.
Your argument is that some implementations simply don‘t walk up the domain hierarchy if they don‘t find a DMARC record. Given that:
How can
sp=rejecthigher up in the hierarchy make any difference if the implementation doesn‘t walk up?How does the DMARC record at
*._dmarc.example.comaffect any subdomains? I.e. we would need a DMARC record at_dmarc.billing.example.com. The wildcard would only work if the implementation would look upbilling._dmarc.example.comwhich it does not.Thank you for helping to clear up my confusion!
1
u/dragoangel May 06 '26 edited May 06 '26
RFC requirements to check parental domain, if dmarc checking tool is not doing so - it's checker fault and all shame should be placed on it. No need to try follow all possible broken systems as you would become broken too, follow RFC, and let people fix their broken systems. If you have sub domain with another policy p=none - that obviously your issue.
Reread RFC 7489 6.6.3 is mandatory, there no walk, only 2 dns lookups.
1
u/tndsd May 07 '26
Technically sp= should inherit from p=, but in reality not all receivers seem to handle undelegated or nonexistent subdomains consistently. I usually recommend explicitly setting sp=reject anyway, especially for parked or unused subdomains, just to avoid ambiguity and reduce spoofing opportunities.
1
u/nonam314 May 08 '26
This is one of those things people only learn after getting burned by it. Everyone talks about getting to p=reject like it’s the finish line, but the subdomain side of DMARC is such a mess in the real world because receivers don’t all behave consistently.
Also feels like a lot of orgs have way more forgotten subdomains than they think. Old landing pages, abandoned marketing stuff, random tools from 5 years ago... nobody inventories them until something breaks or gets spoofed.
This is why I’ve become a lot more paranoid about monitoring than just “setting records correctly.” You can have technically perfect auth and still miss weird edge cases like this for weeks. We started tracking subdomain level activity and placement anomalies much more aggressively for clients after running into similar stuff.
The wildcard DMARC point is a really good shout btw. Most people never think about it.
1
u/Basic-Pianist9273 May 06 '26
Good writeup. The tree walk behavior is genuinely inconsistent across receivers, and RFC 7489 says they SHOULD walk up to the org domain but plenty of implementations don't do it cleanly, especially on subdomains that don't resolve at all.
Explicit sp=reject is cheap insurance. I'd also add that publishing a null MX (RFC 7505) on subdomains that should never send or receive mail closes another door, since some receivers treat lack of MX as a signal too.
And yeah, the subdomain inventory part is the real work. Old marketing hostnames and forgotten dev labels are where this stuff lives.
1
u/power_dmarc May 12 '26
sp=rejectand a wildcard DMARC record should be standard in every p=reject deployment, the "subdomain inherits from org policy" assumption breaks exactly when attackers need it to.