Home | Sitemap | Recent Changes | Login

SPF Logo

Sender Policy Framework

RFC 4408/Errata

Difference (from prior major revision) (author diff)
Paragraph 91Paragraph 91

''Suggested fix and rationale:''

''Suggested fix '''(variant 1)''':''

Paragraph 95Paragraph 95

Please note that an unexpected <code><target-name></code> can be also handled as <tt>no match</tt>, ideally implementations document how they handle such issues. The outcome for an unexpected <code><domain-spec></code> without macros might differ from the outcome for an unexpected <code><target-name></code> after macro expansion.

Please note that an unexpected <code><target-name></code> can be also handled as <tt>no match</tt>, ideally implementations document how they handle such issues. The outcome for an unexpected <code><domain-spec></code> without macros might differ from the outcome for an unexpected <code><target-name></code> after macro expansion.

''Suggested fix '''(Variant 2)''':''

The last sentence in the [[RFC 4408#op-result-permerror|Permerror]] definition is misleading. A syntactically malformed <code><target-name></code> can be also handled as <tt>no match</tt>. The specification should say:

> Be aware that it is also possible that this result is generated by certain SPF clients due to the input arguments having an unexpected format; see [[RFC 4408#domain-spec|Section 4.8]].

At the end of [[RFC 4408#domain-spec|Section 4.8]] add:

> Note: Historically, this document has made no provisions for how to handle <code><domain-spec></code>s, or macro-expansions thereof, that are syntactically invalid per <nowiki>[</nowiki>[[RFC:1035|RFC1035]]<nowiki>]</nowiki>, such as names with empty labels (e.g., "foo..example.com") or overlong labels (more than 63 characters).  Some implementations choose to treat as a no-match mechanisms, and ignore modifiers, with such names, whereas others throw a "PermError" exception.  The outcome for an unexpected <code><domain-spec></code> without macros might even differ from that for an unexpected <code><target-name></code> after macro expansion.

''Rationale:''

Reporting a <tt>TempError</tt> in such cases is no option, the syntax problem won't go away for a given sender policy, HELO identity, envelope sender address, and sending IP combination with a ''try again later'' <tt>TempError</tt> approach. If anything else is as expected the sender policy might need to be fixed manually, supporting <tt>PermError</tt>.

Reporting a <tt>TempError</tt> in such cases is no option, the syntax problem won't go away for a given sender policy, HELO identity, envelope sender address, and sending IP combination with a ''try again later'' <tt>TempError</tt> approach. If anything else is as expected the sender policy might need to be fixed manually, supporting <tt>PermError</tt>.


Errata published by the RFC Editor

RFCs do not change once published. However, the RFC Editor does accept errata for technical and editorial errors. Potential errata can be also submitted for consideration on the SPF discuss or devel lists.

The following list might be incomplete, check out the official RFC 4408 errata page.

  • Typo: aParticipants in the IESG note
  • Link to this page added (2007-11-06)

Errata approved by the council and/or by the RFC authors

Add %v macro to ABNF grammar

Suggested wording:

The ABNF grammar in section 8.1 and appendix A are missing the letter "v". The macro-letter production should look like this:

  macro-letter     = "s" / "l" / "o" / "d" / "i" / "p" / "h" /
                     "c" / "r" / "t" / "v"

Rationale:

The %v macro is listed in the table of macros in section 8.1, and used in the examples.

Undefined uric set

Suggested wording:

Replace "uric" by "unreserved" in section 8.1.

Rationale:

uric was defined in RFC 2396, but later removed in RFC 3986. Because RFC 4408 has a normative reference to RFC 3986 (AKA STD 66) uric has to be replaced by a modern set of characters affected by the URL escaping for uppercased macros.

Reported by Julian and confirmed by Wayne.

Recommend an SMTP reply code for optional PermError rejections

Suggested wording:

 If the message is rejected during the SMTP transaction for
 this reason, the software SHOULD use an SMTP reply code of
 550 and, if supported, the 5.5.2 DSN code.

(to be added at the end of 2.5.7 in the style of the wording at the end of 2.5.6)

Rationale:

The PermError section in Wayne's first SPF I-D stated:

 A PermError result means that the domain's published records
 couldn't be correctly interpreted.  Checking software SHOULD
 reject the message.  If rejecting during SMTP transaction
 time, it SHOULD use an SMTP reply code of 550 and, if supported,
 the 5.5.2 DSN code.

This was removed later when the first SHOULD was identified as receiver policy.

However the second SHOULD recommends an appropriate reply code for receivers wishing to reject PermError. The issue was resolved in an appeal to the SPF Council proposing to use a similar wording as for FAIL, but the missing status code didn't make it again into the final draft.

Received-SPF examples use incorrect syntax

Suggested wording:

The examples in section 7 are incorrectly quoted, and should look like this:

  Received-SPF: Pass (mybox.example.org: domain of
   myname@example.com designates 192.0.2.1 as permitted sender)
      receiver=mybox.example.org; client-ip=192.0.2.1;
      envelope-from="myname@example.com"; helo=foo.example.com;
  Received-SPF: Fail (mybox.example.org: domain of
                    myname@example.com does not designate
                    192.0.2.1 as permitted sender)
                    identity=mailfrom; client-ip=192.0.2.1;
                    envelope-from="myname@example.com";

Rationale:

In RFC4408, key-value-pair is defined as:

  key-value-pair   = key [CFWS] "=" ( dot-atom / quoted-string )

However, the examples look like this:

  Received-SPF: Pass (mybox.example.org: domain of
   myname@example.com designates 192.0.2.1 as permitted sender)
      receiver=mybox.example.org; client-ip=192.0.2.1;
      envelope-from=<myname@example.com>; helo=foo.example.com;

Notice that envelope-from in both cases is NOT a dot-atom or quoted-string.

None of '<','>','@' are legal chars for dot-atom.

unknown-modifier clause is too greedy in ABNF

In section 4.6.1/2, unknown-modifier should be changed to:

  unknown-modifier = name "=" macro-string
                     ; where name is not any known modifier

Rationale:

The unknown-modifier clause is too greedy, causing any syntax errors in redirect or explanation to simply become unknown-modifier. For instance, "exp=-all" would match unknown-modifier. This was not the intent.

For a similar case see RFC 2822, where the field names of any optional-field MUST NOT be identical to any field name specified elsewhere in this standard.

Empty domain-spec on exp modifier

Problem statement:

Section 6.2/4 says:

If domain-spec is empty, or there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given.

However, 6.2/1 gives the grammar for exp as:

  explanation = "exp" "=" domain-spec
  domain-spec      = macro-string domain-end
  domain-end       = ( "." toplabel [ "." ] ) / macro-expand

Thus, domain-spec can never be empty. Syntax errors require a permerror result, which conflicts with the instruction to "proceed as if no exp modifier was given."

Suggested fix and rationale:

Section 6.2/4 should be changed to say:

If there are any DNS processing errors (any RCODE other than 0), or if no records are returned, or if more than one record is returned, or if there are syntax errors in the explanation string, then proceed as if no exp modifier was given.

The exp and redirect modifiers are special since they are included in the spec. They must be fully parsed, with any resulting Permerror, even when exp= is not otherwise supported. Clear syntax errors are supposed to be identified a.s.a.p. and reported as PermError, and supporting explanations in syntax isn't optional.

The prose obviously wants that an empty <target-name> and similar issues after the macro expansion of <domain-spec> are ignored. It's more important to reject the FAIL than to deal with obscure explanation issues.

PermError on invalid domains after macro expansion

Problem statement:

The Permerror definition ends with:

Be aware that if the domain owner uses macros (Section 8), it is possible that this result is due to the checked identities having an unexpected format.

A <target-name> after macro expansion of <domain-spec> can be invalid, i.e. a string not suited for DNS queries like foo..example (adjacent dots), a <target-name> with overlong labels, or similar issues not permitted in the DNS syntax.

Suggested fix (variant 1):

The last sentence in the Permerror definition is misleading. A syntactically malformed <target-name> can be also handled as no match. The specification should say:

Be aware that if the domain owner uses macros (Section 8), it is possible that this result is due to the checked identities having an unexpected format.

Please note that an unexpected <target-name> can be also handled as no match, ideally implementations document how they handle such issues. The outcome for an unexpected <domain-spec> without macros might differ from the outcome for an unexpected <target-name> after macro expansion.

Suggested fix (Variant 2):

The last sentence in the Permerror definition is misleading. A syntactically malformed <target-name> can be also handled as no match. The specification should say:

Be aware that it is also possible that this result is generated by certain SPF clients due to the input arguments having an unexpected format; see Section 4.8.

At the end of Section 4.8 add:

Note: Historically, this document has made no provisions for how to handle <domain-spec>s, or macro-expansions thereof, that are syntactically invalid per [RFC1035], such as names with empty labels (e.g., "foo..example.com") or overlong labels (more than 63 characters). Some implementations choose to treat as a no-match mechanisms, and ignore modifiers, with such names, whereas others throw a "PermError" exception. The outcome for an unexpected <domain-spec> without macros might even differ from that for an unexpected <target-name> after macro expansion.

Rationale:

Reporting a TempError in such cases is no option, the syntax problem won't go away for a given sender policy, HELO identity, envelope sender address, and sending IP combination with a try again later TempError approach. If anything else is as expected the sender policy might need to be fixed manually, supporting PermError.

If the DNS syntax problem is caused by random net abuse, or intentionally by an attacker, a no match approach, eventually reaching a FAIL for -all or whatever the sender policy offers, is better. In common practice this problem is handled as no match OR PermError, like similar problems explicitly addressed in the specification.

Miscellaneous typos

  • Missing indentation for the second paragraph of the [US-ASCII] reference reported by Wayne.
  • Missing line break on page 46 before mary.mobile-users reported by Wayne.
  • Typo: "Danish" instead of "Danisch" in the references confirmed by Wayne and Frank.
  • Missing words in the last sentence of the third paragraph of section 6.1: "The <ip> and <sender> arguments remain the same as in the current evaluation of check_host()." (reported by Julian)

Edit text of this page | View other revisions
Last edited 2008-08-16 18:46 (UTC) by Frank Ellermann (diff)