Internet-Draft | DKIM Access Control and Differential Cha | March 2025 |
Nurpmeso | Expires 21 September 2025 | [Page] |
This document specifies a bundle of DKIM (RFC 6376) extensions and adjustments. They do not hinder the currently distributed processing environment that includes DKIM, ARC, DMARC and SPF, and are as such backward compatible. Their aim is however to ultimately slim down the email environment that needs to be administrated and maintained, by establishing mutual agreements in between sender and receiver(s), verifiable through public-key cryptography, and let the SMTP protocol handle decisions solely based upon that.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 21 September 2025.¶
Copyright (c) 2025 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Public-key cryptography is used for secure transactions on many levels, and in many protocols. For example, transport layer security TLS[RFC9325] provides encrypted data exchange. It is omnipresent, desired where optional, even enforced by standard means: newer IETF transports, like QUIC[RFC9369], may even exist only in conjunction with it. The usual public-key cryptography mode of operation is, that if no trust can be established, the operation is cancelled. It simply does not happen.¶
DKIM[RFC6376], on the other hand, defines as one of its core details that "signature verification failure does not force rejection". Yet there is such a pressing need of email operators to be able to enforce policy, that a plethora of extensive accompanying standards surrounding SMTP[RFC5321] and DKIM were developed, among which are ARC, DMARC and SPF. Reality is that the complexity of email setup, of administrative effort, has massively increased in the last decade plus, so much that many small commercial and private operators have ceased to exist, or have turned away from providing their own service. Reality is also that large parts of those which still exist do not follow-suit "so-called" IETF progress out of belief of improving the situation, but instead they wait until interoperability problems arise, especially with the giant email players, before minimally invasive solutions are searched for. These are usually found by searching the internet, often by doing copy and paste of shared configuration snippets.¶
Some of the mentioned standards even introduce massive complications of decade old habits and usage patterns. For example, many universities and other "groupings" offer stable member email addresses, and then forward email to current, "real addresses". This is made impossible by SPF[RFC7208] if taken by the word (RECOMMENDET), which it often, but dependent upon a software implementation or configuration, is. Non-standardized solutions, like "Sender Rewriting Scheme" for the given example, are then developed, and implemented, by the sheer necessity to keep a grown infrastructure in a usable state. Often these solutions are imperfect. In any case they try to circumvent a defect of an IETF standard, in an onion-alike environment of standards that has no other desire, if one lets aside all those masses of "reporting" capabilities that IETF standards developed over the last years, than to provide reliable and trustworthy verification of the sender / receiver relationship and the communicated data.¶
What this specification tries to achieve is to provide a path to lesser complexity, to easier maintenance and administration efforts, on the one hand. And on the other hand it tries to solve the issues which still exist, regardless of the sheer number of IETF standards invented to improve the situation.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The DKIM[RFC6376] extension Access Control and Differential Changes:¶
RCPT TO
addressees,
as well as to ensure that the
SMTP[RFC5321]
MAIL FROM
mailbox is identifieable;
the latter avoids that receivers can be fooled by man-in-the-middle
to send backscatter bounces to random addresses.¶
The DKIM[RFC6376] extension Access Control and Differential Changes is announced by adding an acdc= tag to the DKIM-Signature. (For efficiency reasons it SHOULD be placed early, before tags like h=, bh= and b=, for example.) The tag starts with "sequence", a decimal number starting at 1, or incremented by 1 from the highest DKIMACDC sequence number encountered in the message; the maximum value is 999: if incrementing would result in overflow, the message MUST to be rejected; sequence holes MUST also cause rejection (but see below); in both cases SMTP[RFC5321] reply code 550 is to be used; with enhanced SMTP status codes[RFC3463] 5.5.4 MUST be used.¶
Informative remark: 999 is both a constraint and a very high limit, dependent upon which type of processing is actually involved. In todays' DKIM use several signatures per actual hop are not uncommon, also in the sense that per-hop processing pipelines involve several processing steps that each create DKIM signatures. Since DKIMACDC is meant as a transparent upgrade path it seems unwise to introduce a limit too low thus. On the other hand a high limit creates a D(enial) O(f) S(ervice) attack surface, but again, since most often only the highest numbered signature needs to be verified, this seems acceptable.¶
Flag description is normative.
(Note the missing FWS
separators around =
.)
ABNF[RFC5234]:¶
acdc = %x61 %x63 %x64 %x63 = sequence ":" 1*(flag) ":" [id] ":" sequence = 1*3DIGIT; DIGIT from RFC 5234 flag = "A" / "a" / "D" / "E" / "O" / "P" / "R" / "V" / "v" / "X" / "x" / "Y" / "y" / "Z" / "z" id = *42(ALPHA / DIGIT / "+" / "-"); optional (bounce) identifier¶
MAIL FROM
, RCPT TO
) was modified.
Necessarily only in combination with the O flag.
The y flag has to be set.¶
MAIL FROM
is adjusted to refer to the domain that claims
ownership etc.
Any formerly present DKIM-Access-Control header was removed.
Access control headers are only generated for messages with
the O flag set.¶
RCPT
recipient,
and if no more than two RCPT
recipients exist in
total,
then the P flag has to be set.
Once set, all future DKIMACDC signatures must copy it.
(It may be removed by a signature which claims a new
message origin by setting the O flag.)¶
Unknown flags MUST be ignored. Invalid flag combinations and flag misuse MUST result in rejection with SMTP reply code 550; if enhanced status codes[RFC3463] are used, 5.5.4 MUST be used. (This includes the P flag upon incorrect use.)¶
The DKIM-Store header has no meaning in the email system. The sole purpose of mentioning it is to announce that it MUST be removed when messages enter and leave the email system. It could for example be temporarily created and used by non-integrated mail filter (milter) software to pass informational data in between the "ingress" and the "egress" processing side. To aid in software bugs and possible configuration errors this specification enforces removal of all occurrences. It is suggested to encrypt data passed around in this temporary header with a key internal to the "local" email processing system in order to achieve locality.¶
DKIM replay attacks have been reported,
where messages with valid DKIM signatures were repeatedly sent
to receivers not initially addressed by the sender.
That is: because the sent
IMF[RFC5322]
message does not include Bcc headers,
and, to be exact, because the actual
SMTP[RFC5321]
RCPT
recipients are not included at all,
DKIM does not cover the real set of message receivers:
effectively any malicious party can use the validatable message
with any possible SMTP recipient.¶
Whereas DKIM x= signature validity expiration tags can (MUST with ACDC as below) be used, the stamina and forgiveness of SMTP, owed to the necessity to deliver messages to receivers in various conditions, requires an expiration timestamp that leaves plenty of time for malicious players to misuse messages with valid signatures.¶
In addition the actual
SMTP[RFC5321]
MAIL FROM
sender is not covered by DKIM:
any intermediate hop can (use the validatable message and) cause
bounces to any possible MAIL FROM
(backscatter bounce).¶
Access control addresses replay and backscatter bounces.
When signing as an originator (O flag set),
all distinct domain-names found within the list of intended
SMTP RCPT
addressees are collected.
Thereafter the DKIMACDC state of all found domains is queried,
by looking up their _dkimacdc DNS entry, as below.
For any domain that announces DKIMACDC support
the completely prepared message,
including the readily prepared DKIM-Signature(s), is forged,
the A flag is set,
(a) dedicated DKIM-Access-Control header(s) is/are created and
prepended,
and the resulting domain-specific message is sent to the logical
recipient subset.¶
Informative remark: Dedicated DKIM-Signatures are necessary: if the message is also sent to a domain which does not support DKIMACDC, but which forwards the message to a domain which does, that destination would otherwise falsely assume the presence of access control; To simplify per-receiver-domain message creation the DKIM-Signature header(s) can be readily prepared except for toggling the single flag byte a to A, and, of course, creation of the cryptographic signature itself.¶
To address replay attacks by man-in-the-middle the DKIM x= tag MUST be used, in order to allow receiver domains to manage a message identity cache. The maximum t= to x= delta MUST NOT be greater than 864000 seconds (ten days: to reach into the next working week). Example delta values for tag auto-generation may be the bounce defaults 432000 seconds (five days: used for example by the Mailman2 and mlmmj mailing-list managers and the postfix MTA), 345600 seconds (four days: OpenSMTPD MTA), 172800 seconds (two days: Exim MTA). DKIMACDC aware receivers must keep a cache of received message identities to address this kind of replay attack during delta validity. (The DKIM-Access-Control header's signature appears like a natural cache key source, but see below.) In order to keep things simple, and the cache a write-once data structure, DKIMACDC senders MUST NOT generate per-receiver-domain messages with more than the 100 recipients that SMTP[RFC5321] section 4.5.3.1.8 guarantees as a minimum: if more recipients need to be addressed on a single domain, multiple messages with recipient subsets must be generated: like this each message is "atomic", and it is ensured the recipients of the SMTP envelope are all included in the DKIMACDC access-control signature, and vice versa. SMTP MTAs of domains which announce DKIMACDC MUST conform to SMTP[RFC5321] (section 4.5.3.1.8).¶
Informative remark: Implementations MAY offer configuration options to specify other recipient limits. For example, it may offer domain whitelist settings which can be used to bundle domains with higher limits. Like this the much higher limits in actual use (for example, the Exim MTA has a default limit of 50000) can be utilized. The _dkimacdc DNS entry *could* announce a definitive limit of whatever sort!¶
Informative remark: Space constraints resulting from maintaining an identity cache may be addressed by timing out entries by minutes or hours not seconds, by partitioning the cache through DKIM d= tag values, and by using a hash-attack proven message-digest output instead of message (access-control signature) content data for keys. To selectively garbage collect cache entries on memory shortage, collected reputation (see R flag) may be used.¶
A DKIMACDC-enabled and -announcing domain that receives a message with a set A flag MUST reject the message unless it contains (a) DKIM-Access-Control header(s) dedicated to itself with SMTP reply code 550; if enhanced status codes[RFC3463] are used, 5.5.4 MUST be used. It MUST also reject messages which fail the signature, condition and flag check verification of such a header with SMTP reply code 550; the enhanced status code MUST be 5.7.7. Senders MAY use Delivery Status Notifications[RFC3461] to fine-tune the resulting behaviour.¶
The presence of this header empowers the receiving domain to
cryptographically verify
that it is indeed the correct destination domain,
and that any given
SMTP[RFC5321]
RCPT TO
was indeed addressed by the message sender,
which indeed is the one mentioned in
MAIL FROM
;
if the header included does not contain a superset of the SMTP
envelope list,
the message MUST be rejected with SMTP reply
code 550; if
enhanced status codes[RFC3463]
are used, 5.5.4 MUST be used;
5.7.7 instead if signature verification failed.¶
This header is to be sent only as part of exclusive and dedicated message instances, as documented above, it MUST be removed by the destination domain as soon as possible; it MUST NOT be delivered by local delivery agents as part of the message, and it MUST NOT be part of a rejected message. Any instance of such a header that is not targeted to the destination domain indicates an error and MUST result in message rejection with SMTP reply code 550; if enhanced status codes[RFC3463] are used, 5.5.4 MUST be used.¶
The syntax of this header is a semicolon separated list.
It starts with the sequence number of the DKIM-Signature
to which it links.
As there may be multiple DKIM signatures with the same
sequence number, which differ only in the used algorithm,
multiple DKIM-Access-Control headers may be generated;
in any case the linked signature(s) necessarily MUST
have the O flag set.
The sequence number is followed by the selector value of the s=
tag of the according DKIM-Signature;
the actual algorithm can be deduced from there.
The next field is reserved for later extension,
it MUST be skipped over.
(It may include the string "VERP" to indicate variable envelope
return path addresses at some later time.)
Thereafter follows the
SMTP[RFC5321]
MAIL FROM
of the covered message,
the receiver domain name which is addressed,
followed by all SMTP
RCPT TO
local-parts of the receiver domain actually addressed by the message.
The list is concluded with the cryptographic signature which
has been generated on the DKIM "relaxed" normalized content
of the DKIM-Access-Control header up to, and including, the
semicolon that precedes the signature.
Warning:
SMTP[RFC5321]
address local-parts permit quoted-strings.¶
Apologies. We now come to the reason why this proposal does not work in todays', totally distorted state of the email infrastructure, including IETF's very own email system (ok: bug tracker; not ok: other mailing-lists i know). The problem is that DKIMv1 signatures may be consciously broken, or even removed completely, (or renamed, for example, mailman2 may rename to X-Mailman-Original-DKIM-Signature), along the path from the sender to the receiver domain. This (also) depends on the DMARC state of the sender etc. In any case this destroys DKIMACDC chains. This is why i, somewhere, somewhen, claimed that the DNS RR of DMARC is the sole use case for it i can think about: if, instead of _dkimacdc, we would extend the DMARC RR to include things necessary for ACDC, so that everybody who wants ACDC has to actually provide a (necessarily =reject) DMARC DNS entry, then things were different. The only other possibility would be to create a new header field, say, DKIM2, because the infrastructure does not know that yet. It could be absolutely identical to the DKIM signature, though.¶
The format of this DNS resource record mirrors the syntax of
DKIM[RFC6376]
section 3.5 on the DKIM-Signature header,
with the exception that FWS
separation is not allowed;
supported are the tags v= and a=
(other tags MUST be ignored),
however, v= is optional,
and none to multiple a= tags MAY exist.
They indicate, in descending order, the most desirable algorithms
for this domain,
and that the domain prefers to receive DKIM-Access-Control
(and DKIM-Signature, if applicable)
headers of the best fit algorithm.
This can avoid unnecessary signature instances of undesired
algorithms in case a domain normally produces signatures with
multiple algorithms:
it is only a hint to reduce processing cost of senders,
it has no meaning beside this.
Senders MUST be capable to follow DNS CNAME chains
when looking up this DNS RR.
It could or should or must announce a definitive recipient limit of whatever sort!¶
DKIM signatures never were designed to work with the existing mailing-list infrastructure, which often tags message subjects and/or appends footers (headers are supposed to be more of a theoretical issue). With the advent of some supplementary standard which worked around the DKIM "signature verification failure does not force rejection" paradigm, the resulting DKIM signature verification failures started to cause non-deliveries. Mailing-list software adopted in that they started to rewrite the From header in order to avoid breakage of the sender's signature. Further standards were developed that tried to bring back trust that was lost by those modifications initiated to avoid that the forced signature breakage caused message delivery breakage.¶
This specification adds the creation of differential changes, which can be applied in reverse order of creation, and therefore be used to cryptographically verify all intermediate changes back to the original version as sent by the sender. Whenever a DKIMACDC enabled domain breaks a message signature, for example if a mailing-list tags the subject and adds a message footer, an according DKIM-Diff header has to be created, with flag changes as described above. All existing DKIM-Diff headers MUST be included in DKIMACDC enabled DKIM-Signatures.¶
Informative remark: It follows that the "changes cause a new message" paradigm of today's DKIM/DMARC usage stays intact. It is deemed correct behaviour: Note that a message sent to a mailing list is addressed to a mailing list. It is not addressed to the 'final' recipients. That additional addressing is done by the mailing list, not the original author. This is a rather stark demonstration that the intermediary has taken delivery and then re-posted the message. However, DKIMACDC allows for cryptographically verifying the original message, and therefore can overcome the trust problem incurred by those "correct" changes, which of course break the DKIM signature of the original message.¶
Informative remark: Today many mailing-list instances re-encode message data for policy reasons, needlessly: for example from some 7-bit clean content-transfer-encoding to 8-bit, or anything into base64 (as below). This policy usually causes enlargening of the differential changes on at least the first level (which for one is most often the only one involved, and second it depends on the content of the original message). This negative impact can thus easily vanish, upon policy change.¶
The DKIM-Diff header consists of a sequence number that links it with a DKIMACDC enabled DKIM-Signature header, followed by a semicolon, and the result of the BSDiff differential algorithm, as below. The input to this algorithm is the DKIM[RFC6376] "relaxed" normalized header and body content, separated by an empty (normalized) line, alongside the equally normalized version present before modifications took place. For non-integrated systems like mail filters for example the DKIM-Store header can be used to pass around the necessary data in between the ingress side that sees the original message, and the egress side which will dispatch the modified variant.¶
All headers covered by the DKIM-Signature MUST be included, as MUST be all MIME[RFC2045] related headers, regardless of their normal inclusion in the DKIM-Signature. (MIME related headers SHOULD be regulary included in DKIM signatures to avoid the otherwise existing attack surface against the MIME structure through maliciously injected headers and body content, but as a domain policy this is not in scope of this document.) All DKIMACDC-enabled DKIM-Signature headers MUST be included, as MUST be all DKIM-Diff ones. The headers MUST be sorted byte-wise by-value by name, and the formed subgroups MUST consist in the order defined by DKIM[RFC6376] section 5.4.2, Signatures Involving Multiple Instances of a Field. Other than that the advice of DKIM[RFC6376], section 5.4.1, on recommended signature content, still applies, but is hereby extended with the Author Header[RFC9057].¶
Informative remark: Since DKIMACDC is meant to (effectively) incur the most minimal changes on the software side it does not change the way how existing DKIM software verifies or creates signatures in general. To integrate this extension into the existing infrastructure it seems best to accept a small overhead in the highly compressible BSDiff control data, instead of introducing expensive prefiltering processing costs, for example, by grouping "old" and "new" headers. Here also to note that in mail filters the name and the content of headers fly by as distinct data arrays, for example, so that the necessary control structures for the sorting algorithm as above can be implemented more efficiently than it sounds at first, and alongside the normal processing.¶
Differences are generated with the BSDiff algorithm of Colin Percival, which has excellent characteristics. No reimplementation of the algorithm was necessary due to the Open Source licenses used in all its different parts, instead it was taken from the FreeBSD operating system source code, and slightly rearranged. There is a freely usable (BSD 2-clause, ISC and MIT licenses) plug-and-play ISO C99 and perl implementation available (https://github.com/sdaoden/s-bsdipa), which includes further references on the algorithm. DKIMACDC uses a 32-bit adaption sufficient for email that almost halves memory requirements compared to 64-bit, and also produces smaller difference control data. The resulting binary difference is then ZLIB[RFC1950] compressed and encoded with BASE64[RFC4648] for inclusion in the DKIM-Diff header.¶
Overall, the patch consists of the header, followed by the control data. Thereafter the two byte streams of differential data (in reverse order) and extra data conclude the patch. The header and the control data consist of 32-bit signed integers, stored in big endian byte order (as above). The control data is a stream of tuples of three values each, the first denoting the length of differential data to copy in 8-bit bytes, the second that of extra data. The last value denotes the number of 8-bit bytes to seek relatively in the data source after the copying has taken place: of all the values, only this one may be negative. The header consists of four values denoting the length of the control block in 8-bit bytes, the length of the difference data block, the length of the extra data block, concluded by the length of the original data source; The sum of the first three values must be one less than the maximum positive 32-bit signed integer. It follows that control data copy instructions also do not exceed this value.¶
Differences are included to allow DKIM verifiers to restore previous message content for cryptographical verification purposes. Whereas user interfaces may (and should) use them to offer differential visualization (after signature verification, and with the usual precautions necessary for displaying content), empowering users to make decisions on the trustworthiness of those intermediate stations which actually incurred message modifications, the restored message data is not meant to result in a usable message by itself. For example some embedded OpenPGP signature and text couple would likely fail to verify because of DKIM normalization (dependent upon the original MIME transfer encoding). This was deemed acceptable because of the purpose of including differential changes, and because a visualization of the DKIM covered message should still be sufficient to allow users making responsible decisions. Finally, the given example will likely verify as part of the complete received message, unless altered along the SMTP path: DKIMACDC can ideally say where (and exactly what, in an unbroken ACDC chain).¶
User interfaces could for example use traffic light semantics that unfold on click to traffic light semantics of all stations that a message passed, which would visualize differences on a further click. They could build complex reputation statistics based upon DKIMACDC verification and perceived user hints. This could be used to restrict DKIMACDC verification, to reduce complete-chain-verification to random samples. Further possibilities could arise shall SMTP/DKIM/DKIMACDC remain as the only solution to email verification in the future.¶
This memo includes no request to IANA.¶
Public-key cryptography is the safest approach to identification of counterparts and verification of data. This specification aims in making use of these attributes for the combined pair of SMTP and DKIM. It opens a door to reduction of email server maintenance and administration efforts, and to restoration of some email core aspects which got lost, or became a nuisance to use, over the last decade(s), like email forwarding and mailing-list usage. It may reduce implementation burden and complexity of the entire email infrastructure. It allows for building of organizational trust ([RFC5863], section 2.5) that aids in decision making, to increase processing performance and decrease energy consumption. If superfluous protocols vanish this effect potentiates.¶
FWS
in ag-spec.
Second its use was never encountered by the author.
But first of all
MIME[RFC2045]
introduced parameters in ABNF as
parameter := attribute "=" value
without FWS
,
and its presence complicates parsers and hinders parser code reuse.
The acdc= tag ("parameter") is defined without FWS
support.¶
This document contains a citation of Dave Crocker. Thanks to, in the order of appearance, Jesse Thompson, Richard Clayton for arguments against reliance on header stacks, and pro the numbering scheme, and especially for noticing the partial transaction replay attack problem, Douglas Foster, Michael Thomas for explicit man-in-the-middle replay addressing; Alessandro Vesely inspired the explicitness of the E flag. A big fat acknowledgment is due to Murray S. Kucherawy. Special thanks to Klaus Schulze, Manuel Goettsching, both also as Ash Ra Tempel, Laeuten der Seele, Laurent Garnier, as well as the Sleeping Environmental Bot broadcast.¶