[ Standards & DMARCbis ]

Revise aggregate report parsers for RFC 9990

Preserve current aggregate-report structure and meaning while giving legacy, extension, duplicate and malformed inputs explicit bounded handling.

By the EmailAuth research team · 6 min read

[ Key points ]

  • The dmarc-2.0 XML namespace and version=1.0 element do not change DNS v=DMARC1.
  • Keep raw authentication results separate from DMARC alignment and policy disposition.
  • Unknown extensions, duplicate information and malformed inputs need explicit handling rather than silent coercion.
On this page

Treat the parser upgrade as a data contract change

A report collector can continue displaying charts while losing the distinctions that the updated aggregate format was designed to carry. An RFC 9990 migration therefore needs more than accepting a new filename or ignoring validation errors. Define which wire formats are recognized, how their fields map into the internal model and how incompatible or suspicious input is handled before changing production ingestion.

Keep source receipt, decompression, XML parsing, schema interpretation and aggregation as separate stages. Each should produce a bounded outcome and preserve enough provenance for diagnosis. This article proposes that design and its test inventory. It does not provide a deployed parser, executed fixtures or evidence that any existing collector conforms to the new specification.

Identify the format without changing the DNS version

RFC 9990 Appendix A defines the current XML schema with namespace urn:ietf:params:xml:ns:dmarc-2.0. The optional version element has value 1.0 under section 3.1.1.2. Those identifiers describe the report format; neither means that a domain should publish v=DMARC2 in DNS. The DMARC policy version remains governed by RFC 9989 section 4.7.

A compatibility design should recognize a supported legacy profile separately from the current profile. Preserve which profile was selected and why. Do not rename an unfamiliar namespace to make an input validate, silently insert missing required fields or reinterpret a legacy report as current merely because the root element is named feedback. Unknown input should receive an explicit unsupported or quarantined outcome.

Retain the original report bytes under an appropriate access and retention policy, alongside a digest and normalized interpretation. If a later parser correction changes results, that separation makes reprocessing reviewable. It also prevents a normalized record from being mistaken for exactly what the reporter sent.

Preserve policy context and alignment meaning

The current policy_published structure includes optional discovery_method and testing information. Discovery can be reported as psl or treewalk, and testing carries the t value. An absent optional field is not proof of a particular implementation version. RFC 9990 section 3.1.1.5 defines these fields and their scope.

Keep policy_evaluated separate from auth_results. The former records DMARC-related alignment outcomes and disposition; the latter carries authentication results before that DMARC interpretation. A raw DKIM pass from an unrelated domain must not be promoted to an aligned pass during normalization. Preserve override reasons rather than changing the authentication result to match the final disposition. Sections 3.1.1.9 and 3.1.1.11 describe that separation.

Current DKIM result entries require the selector. A legacy record without one should not receive an invented value such as default to satisfy the current schema. Record the supported legacy interpretation or the validation failure. Multiple signatures, optional envelope information and policy changes during a report period also need explicit representation; collapsing them prematurely can erase the explanation an analyst needs.

Handle extensions without surrendering validation

The specification provides namespaced extension points at defined locations. The presence or absence of an extension is not itself an error, and arbitrary unfamiliar elements are not automatically valid everywhere. RFC 9990 sections 3.2 and 5 supply the distinction. Preserve supported extension content or bounded opaque data without allowing it to overwrite core field meanings.

Treat archive and XML input as untrusted. Section 8.1 identifies resource-exhaustion risks in decompression and parsing. Proposed implementation controls include limits on compressed and expanded size, nesting, element counts and processing time, plus disabling external entity resolution and network retrieval. Display report-supplied text as data. These are defensive design recommendations, not assertions that the collector has passed malicious-input tests.

Malformed input should not enter ordinary aggregates as if it were valid. Section 3.1.1 recommends discarding nonconforming reports while allowing a cautious attempt to use some data. If a product supports partial recovery, label the result and keep it outside normal decision totals until the recovery policy has been reviewed. Silent coercion is especially dangerous when a graph appears complete.

Make duplicate handling an explicit policy

Report-ID is intended to aid duplicate recognition, but a single identifier should not be assumed globally unique across unrelated reporters. Section 3.5.4 recognizes exact duplicates and overlapping information, leaving handling to the consumer. Preserve reporter and policy context, reporting period, identifier and content digest when proposing deduplication rules.

An exact repeat and a changed report covering overlapping time are not necessarily the same case. Avoid simply summing both or discarding one because their date ranges intersect. Record the resolution decision and retain a way to investigate policy changes and late corrections without rewriting history invisibly.

Fictional fixture worksheet and release gate

A fictional current-format case contains the dmarc-2.0 namespace, version 1.0, testing=y and an explicit DKIM selector. A separate invented legacy-shaped case lacks that selector. The planned acceptance worksheet expects distinct profile handling, not insertion of a made-up selector. Additional proposed rows cover a namespaced extension, exact duplicate, overlapping report and malformed input. None has been executed.

The exact original requirement remains: Run legacy and current schema fixtures, extension cases, duplicate reports and malformed inputs. The commissioning gate is: Validate current primary specifications and retain a worked example before drafting. The retained paper cases and source review do not satisfy runtime acceptance. Parser security, backward compatibility, human SME approval, production behavior and publication authorization remain open until the required tests and decisions exist.

[ Takeaway ]

A parser migration is incomplete until format recognition, field semantics and defensive ingestion are tested together.

[ By role ]

What this means for you

Choose your role for practical next steps.

Parser maintainer

Separate wire profiles from normalized data

Compatibility must not erase what the reporter actually supplied.

Next steps

  1. Record selected profile and original evidence digest.
  2. Avoid inventing missing fields or changing unknown namespaces.

Security engineer

Bound untrusted ingestion

Compression and XML processing can consume resources or expose unsafe behavior.

Next steps

  1. Review expansion, nesting and execution-time limits.
  2. Verify external resolution is disabled in the intended parser configuration.

Reporting analyst

Protect the meaning of totals

A useful chart depends on correct alignment, policy and duplicate interpretation.

Next steps

  1. Keep raw authentication separate from policy outcomes.
  2. Define reviewed treatment of partial and overlapping reports.

[ FAQs ]

Frequently asked questions

Does the dmarc-2.0 report namespace mean the DNS version is DMARC2?

No. The report namespace identifies XML structure. RFC 9989 still requires the policy version value DMARC1.

What is the current report version element value?

If the optional version element is present, RFC 9990 specifies 1.0. Do not infer its value from the namespace suffix.

May a parser invent a selector to upgrade a legacy DKIM result?

No. The current format requires the DKIM selector, but a legacy input lacking it needs an explicit compatibility or validation outcome, not fabricated data.

Are policy_evaluated dkim and auth_results dkim interchangeable?

No. policy_evaluated carries the DMARC-related alignment result; auth_results carries authentication before DMARC interpretation. Preserve both.

Does an unknown extension automatically invalidate a report?

No. RFC 9990 defines namespaced extension points. Handle the supported structure without treating arbitrary unknown elements at any location as valid.

What should happen to a malformed report?

The specification recommends discarding nonconforming reports and permits cautious partial use. Any recovery policy should label uncertainty and prevent silent inclusion as fully valid data.

Can overlapping date ranges alone identify a duplicate?

No. Exact repetition and overlapping information are distinct cases. Preserve reporter, policy, period, identifier and content evidence for the consumer’s handling decision.

Have decompression or hostile XML tests been run here?

No. Size, nesting, time, entity-resolution and display controls are proposed safeguards. The required legacy/current, extension, duplicate and malformed-input fixtures remain unexecuted.

[ Sources ]

Sources

  1. RFC 9989: Domain-Based Message Authentication Reporting and Conformance
  2. RFC 9990: DMARC Aggregate Reporting

[ Glossary ]

Glossary

XML namespace
The identifier that qualifies report element names; the current aggregate namespace is urn:ietf:params:xml:ns:dmarc-2.0.
discovery_method
An optional aggregate policy field that can identify psl or treewalk discovery.
testing
The optional aggregate policy field carrying the t tag’s y or n value.
Opaque extension
Bounded extension data preserved without assigning unsupported meaning to it.
Partial recovery
A deliberately labeled attempt to retain usable information from nonconforming input, distinct from full validation.

Enterprise provenance

Why top financial institutions and governments retired their email security dashboards.

Traditional email authentication platforms sell you a dashboard and ask your engineers to do the labour. In high-stakes environments, manual oversight means delayed enforcement, configuration drift and unmonitored shadow domains.

EmailAuth is the agentic email provenance platform. Our agents enforce p=reject, keep third-party senders aligned and move your domains to full RFC 9989 compliance, the new DMARC standard,, with human-in-the-loop auditability.

Governments Large enterprises Tier-1 financial institutions

SaaS · Dedicated tenancy · Air-gapped on-prem · BYOK encryption

Knowledge Base