[ SPF ]

SPF void lookups: diagnose empty and non-existent DNS answers

Distinguish empty DNS answers from DNS failures and track void lookups along the actual SPF evaluation path.

By the EmailAuth research team · 7 min read

[ Key points ]

  • Void answers and temporary DNS failures are different categories.
  • The void recommendation is distinct from the ten-term limit.
  • Retain the response and branch that caused the diagnosis.
On this page

Define the problem before changing DNS

A void lookup diagnosis means more than “DNS did not provide the expected address.” RFC 7208 describes relevant queries returning a positive response with zero answers, or a Name Error response. These are commonly called void lookups. A timeout or server failure is not the same response category. Treating all unsuccessful lookups as void can turn a transient resolver incident into an incorrect recommendation to rewrite a valid sender policy.

The standard says implementations SHOULD limit void lookups to two. It permits a configurable limit and recommends two as the default in that case. Exceeding the applicable limit produces permerror. Preserve those normative distinctions: two is not an unconditional universal MUST across every implementation, but a reviewer also should not assume an unknown receiver has raised its limit. RFC 7208, section 4.6.4

Maintain two separate counters

The overall SPF budget limits evaluated DNS-causing terms, including include, a, mx, ptr, exists and redirect. The void restriction concerns qualifying empty or nonexistent answers encountered during evaluation. They overlap in operational consequences but measure different things. A policy can encounter problematic void responses before exhausting its overall term budget. A long successful dependency path can exhaust the term budget without producing void responses.

A packet capture count, a resolver cache hit count and an SPF term count are not interchangeable. Caching can change network activity without making the logical policy free to evaluate. Likewise, one syntactic term can require additional resolution work or have its own supplementary constraints. Keep the evaluated term, expanded query name, record type, answer classification and running totals in distinct fields. RFC 7208, section 4.6.4

Collect enough response detail to classify the event

For a proposed authorized investigation, preserve the queried name and type, DNS response code, answer count, relevant returned records, resolver context and timestamp. Keep the raw response or a faithful structured transcript, not only a green or red dashboard label. A positive response with no answers should not be silently recast as NXDOMAIN. Both may matter to void accounting, but their DNS meanings and remediation paths can differ.

Record whether the lookup was actually reached by the SPF evaluator. A static discovery tool may explore dependencies that the particular message never evaluates. Such exploration can reveal risks, but it is not evidence that the message consumed those lookups. Identify the connecting address, sender input and policy branch so another reviewer can understand why a mechanism was evaluated or skipped.

Preserve errors separately. A timeout, truncated collection log or inaccessible resolver is an uncertainty that needs its own classification. Do not replace missing observations with an assumed empty answer. The investigation should be reproducible without requiring the reviewer to infer response types from prose.

Interpret mechanisms before proposing a repair

An exists mechanism tests whether the expanded domain has address data in the way defined by the standard. An a mechanism compares the relevant addresses with the connecting client. Their nonmatching outcomes do not, by themselves, establish that the publisher made a mistake. Some policies intentionally use existence checks. The diagnostic question is whether the actual path remains within the applicable limits and whether the dependency still serves its intended authorization purpose.

A nonexistent include target deserves a different explanation. Include recursively evaluates a policy; a child none result maps to permerror, rather than being treated as an ordinary nonmatch that safely falls through. Thus a report can encounter missing DNS data and have a more immediate include error than a cumulative void-limit explanation. Explain the earliest supported error, not every imaginable consequence of the same missing name. RFC 7208, section 5.2, 5.3 and 5.7

Operational worksheet and acceptance criteria

Prepare a worksheet with columns for step, enclosing policy, mechanism, expanded target, query type, response code, answer count, logical-term total, void total and continuation decision. Include the evaluator’s documented void-limit configuration if available. If that configuration is unknown, state the assumption and avoid attributing it to a real receiving service without evidence.

For each suspected empty answer, assign an owner who can confirm whether the target is current. A typographical error, retired provider dependency, intentional existence test and temporarily unavailable evidence require different responses. Document the proposed correction and the sender routes it could affect. Never substitute a guessed supplier include merely because its name looks familiar.

Acceptance requires a coherent path and exact failing branch, not simply fewer terms in a draft record. The reviewer should be able to identify which response was classified as void, when the configured threshold was exceeded, and why that event determined the result. After any separately approved change, current evidence would be needed again because provider dependencies and caches may differ from the planning snapshot.

Fictional diagnosis: empty answers versus an unavailable resolver

Imagine an entirely fictional policy that reaches three existence checks in order, each returning a positive response with zero answers. Assume a fictional evaluator configured with a void limit of two and no earlier match or error. On the third qualifying response, the proposed trace identifies the exceeded limit and permerror. This is an explanatory scenario, not an executed fixture or a claim about any provider.

Change the third observation to a timeout. The diagnosis can no longer say that this response was the third void answer. The investigator must preserve the temporary DNS error and the evaluator’s handling, rather than forcing the event into the previous explanation. Change the second observation to a positive address answer that matches the exists mechanism, and the later branch may never be reached at all.

These variations show why a flat list of unresolved hostnames is insufficient. The relevant facts are response semantics, order and the termination point. They also show why the same policy text can produce different paths for different inputs or DNS states without implying that one observer fabricated its result.

Keep original evidence and release gates open

No public or private domain was queried for this manuscript. The worksheet is a proposed method and the worked diagnosis is fictional. The catalogue requires an annotated path showing each counted term and the exact failing branch; that requirement remains open until actual authorized evidence exists and is reviewed.

A publication should label the resolver context, collection time and evaluator assumptions. It should not claim universal receiver behavior from one implementation’s configurable threshold. Source applicability, human review, original evidence, production routes, visual accessibility and owner release remain open. Any real DNS repair belongs to a separately authorized change process with a current sender inventory and rollback plan.

[ Takeaway ]

Diagnose void limits from response evidence and evaluator policy, not from a raw query count.

[ By role ]

What this means for you

Choose your role for practical next steps.

DNS operator

Preserve response semantics

Empty and failed responses lead to different repairs.

Next steps

  1. Retain response codes and answer counts.
  2. Confirm target ownership before editing.

Evaluator maintainer

Expose separate counters

Term and void budgets measure different conditions.

Next steps

  1. Document the configured threshold.
  2. Show the exact termination point.

Support reviewer

Require the failing branch

A screenshot cannot replace a trace.

Next steps

  1. Separate static discovery from evaluation.
  2. Keep missing evidence explicitly unresolved.

[ FAQs ]

Frequently asked questions

What is a void lookup?

RFC 7208 describes positive responses with zero answers and Name Error responses in this category.

RFC 7208: Sender Policy Framework

Is a timeout a void answer?

No. Preserve temporary DNS failures separately from qualifying empty or nonexistent responses.

RFC 7208: Sender Policy Framework

Is two an unconditional mandatory limit?

No. The RFC uses SHOULD, permits configuration and recommends two as the configurable default.

RFC 7208: Sender Policy Framework

What happens when the applicable void limit is exceeded?

The specified result is permerror.

RFC 7208: Sender Policy Framework

Are void and ten-term budgets identical?

No. They are different limits and require separate accounting.

RFC 7208: Sender Policy Framework

Can a missing include simply fall through?

A child none result maps to permerror for include.

RFC 7208: Sender Policy Framework

Were DNS responses collected?

No. The examples are fictional and original query transcripts are empty.

What proves this diagnosis?

An annotated evaluated path with exact response classifications and the failing branch, still outstanding here.

[ Sources ]

Sources

  1. RFC 7208: Sender Policy Framework

    Sections §2.3 The HELO Identity · §2.4 The MAIL FROM Identity · §3.2 Multiple DNS Records · §3.3 Multiple Strings in a Single DNS Record · §4.5 Selecting Records · §4.6 Record Evaluation · §4.6.4 DNS Lookup Limits · §5.1 "all" · §5.2 "include" · §5.3 "a" · §5.7 "exists" · §6 Modifier Definitions · §6.1 redirect: Redirected Query · §8 Result Handling · §8.4 Fail · §8.7 Permerror · §10 Effects on Infrastructure

[ Glossary ]

Glossary

Void lookup
A qualifying empty positive or Name Error DNS response during SPF evaluation.

RFC 7208: Sender Policy Framework

Response classification
The retained distinction between answer data, empty answers, nonexistent names and errors.
Void threshold
The implementation’s applicable limit, subject to RFC 7208 guidance.

RFC 7208: Sender Policy Framework

Evaluated branch
The mechanisms actually reached for the specific SPF inputs.

RFC 7208: Sender Policy Framework

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