1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
|
Titre: RFC 7960: Interoperability Issues between Domain-based Message Authentication, Reporting, and Conformance (DMARC) and Indirect Email Flows
Auteur:
Date: Tue 11 Oct 2016 02:00:00 +0200
Lien: https://www.bortzmeyer.org/7960.html
Le mécanisme DMARC permet d'indiquer dans le DNS la politique d'un domaine
concernant l'authentification du courrier. Si je reçois un message prétendant
venir de ma-banque.example, et qu'il n'est pas authentifié (ni SPF, ni DKIM, ni
autre chose), comment savoir si c'est parce que ma banque est nulle en sécurité
du courrier, ou bien parce que le message est un faux ? DMARC (normalisé dans
le RFC 7489) permet de répondre à cette question en publiant un enregistrement
qui indique si le courrier est censé être authentifié ou pas. Comme toutes les
techniques de sécurité, ce mécanisme est imparfait et il pose notamment des
problèmes avec les messages indirects. Par exemple, si vous avez une adresse à
votre ancienne université, alice@univ.example et que le courrier qui lui est
adressé est automatiquement transmis à votre adresse professionnelle,
alice@evilcorp.example, comment DMARC va-t-il réagir avec cette indirection ?
C'est ce qu'explore ce RFC.
Voici la politique DMARC de Gmail. Elle est tolérante (p=none, accepter les
messages non authentifiés) :
% dig TXT _dmarc.gmail.com
...
;; ->>HEADER<><>- opcode: QUERY, status: NOERROR, id: 59294
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
...
;; ANSWER SECTION:
_dmarc.gmail.com. 600 IN TXT "v=DMARC1; p=none; rua=mailto:mailauth-reports@google.com"
...
Paypal est plus violent, demandant qu'un récepteur rejette les messages
prétendant venir de Paypal mais pas authentifiés :
_dmarc.paypal.com. 300 IN TXT "v=DMARC1; p=reject; rua=mailto:d@rua.agari.com; ruf=mailto:dk@bounce.paypal.com,mailto:d@ruf.agari.com"
La question de départ de l'administrateur système est « si je mets une
politique DMARC restrictive (genre p=reject), vais-je perdre des courriers
légitimes, à cause d'indirections comme les listes de diffusion ? » (section 1
du RFC). Il est d'autant plus difficile de répondre à cette question que
l'architecture du courrier électronique est complexe et mal spécifiée (RFC
5598). Bien des logiciels ne suivent pas les règles, d'autant plus que beaucoup
de ces règles n'ont pas été explicites dès le début. (Un bon exemple : avec un
.forward, le serveur de courrier doit-il garder l'expéditeur indiqué dans l'
enveloppe du message ? Essayez de trouver un RFC qui spécifie cela !)
La section 2 de notre RFC décrit les causes des problèmes DMARC. Si un message
est légitime (le destinataire veut le recevoir), et qu'il est en outre
techniquement correct, un problème, au sens de ce RFC, est quand la politique
de DMARC (qui peut être de rejet) est appliquée à ce message, parce qu'il a été
transmis indirectement. C'est injuste. Évidemment, si la politique DMARC est
p=none (ne rien faire), ce n'est pas un vrai problème. Mais un p=reject peut
être très ennuyeux.
Première cause de problèmes, des différences entre les identificateurs
utilisés. DMARC n'authentifie pas directement, il dépend de SPF (RFC 7208) et
DKIM (RFC 6376) pour cela. Ce qui intéresse l'utilisateur, évidemment, c'est le
nom dans le champ From: (RFC 5322) du message. Pour lui, c'est ça l'expéditeur.
Mais DKIM, et surtout SPF, n'ont pas la même conception : ils peuvent utiliser
d'autres identificateurs. DMARC considère que l'accord (alignment, cf. RFC
7489, section 3.1) entre les identificateurs authentifiés par SPF et DKIM, et
le champ From: du message peut être strict ou laxiste. « Strict » indique une
correspondance parfaite, laxiste se limite à vérifier que le nom de domaine est
le même.
Le principal identificateur utilisé par SPF est celui donné par la commande
MAIL FROM dans la session SMTP (RFC 5321). C'est la principale cause de
désaccord : si SPF authentifie cet identificateur et qu'il est différent de
l'adresse utilisée dans le champ From: de l'en-tête du message, que faire ?
Deuxième cause de problème, le relayage d'un message. Si Bob bob@isp.example
écrit à alice@univ.example, et qu'elle (ou son administrateur système) a
demandé un relayage automatique vers alice@evilcorp.example, les serveurs de
courrier de evilcorp.example verront un message prétendant être de isp.example,
mais transmis par les serveurs de univ.example... SPF sera content ou pas,
selon la façon exacte dont a été fait le relayage (en préservant le MAIL FROM
ou pas). DMARC ne sera jamais content car, si le MAIL FROM a été changé
(reflétant le relais), SPF authentifiera mais il n'y aura plus d'accord entre
les identificateurs.
Évidemment, si le message est modifié en cours de route, c'est encore pire. SPF
ne protège pas l'intégrité du message, mais DKIM le fait. Mais qui diantre se
permet de modifier les messages ? Hélas, pas mal de gestionnaires de listes de
diffusion le font. DKIM a une option (déconseillée... voir la section 8.2 du
RFC 6376) pour ne signer que le début du message, évitant ainsi que la
signature soit invalidée par l'ajout, par exemple, d'un paragraphe final. Cela
ne couvre que le cas des messages simples, sans MIME, où la modification est un
simple ajout à la fin. Autre possibilité de DKIM pour éviter d'invalider les
signatures en cas de modification du message, le mode relaxed de
canonicalisation du contenu, qui permet de supporter des modifications
triviales comme la transformation de N espaces consécutifs en un seul.
Reprenant le vocabulaire du RFC 5598 (relisez-le d'abord !), la section 3 de
notre RFC liste les différents composants de la messagerie qui peuvent jouer un
rôle dans les transmissions indirectes, et les problèmes qu'elles posent.
D'abord, le MSA (Message Submission Agent.) C'est la première ligne de
vérification : il fait respecter les règles d'une organisation (ADMD,
ADministrative Management Domain). S'il accepte un message où le champ From: du
RFC 5322 n'est pas dans un domaine contrôlé par l'ADMD, il y a des chances que
DMARC râle par la suite. Le RFC cite plusieurs cas d'usage où cela se produit :
la fonction « envoyer cet article à un ami » de certains sites Web, par
exemple, puisque le message va partir avec le domaine du lecteur de l'article,
pas avec celui du site Web. On peut trouver de nombreux autres exemples, comme
un service de gestion d'agenda qui envoie des courriers de rappel, en utilisant
comme expéditeur l'adresse de l'utilisateur, ce qui est plutôt une bonne chose
(pour des messages du genre « l'heure de la réunion a changé ») mais peut gêner
DMARC. (Mon exemple préféré est le cas où on a une adresse de courrier mais pas
de moyen de soumettre du courrier via cette organisation, ce qui est fréquent
avec les adresses de fonction. Par exemple, on est membre d'une organisation
qui fournit des adresses à ses membres et/ou responsables, ce qui permet de
recevoir du courrier, mais on n'a pas de MSA pour en envoyer, on doit donc
utiliser celui d'une autre organisation.)
Et les MTA, eux, quel est leur rôle dans les problèmes DKIM ? S'il change
l'encodage (par exemple en passant du « 8 bits » à l'abominable
Quoted-Printable), il va invalider les signatures DKIM (la canonicalisation de
DKIM ne prévoit pas des transformations aussi radicales, même si elles ne
modifient pas le message final). Idem si le MTA corrige les en-têtes du message
pour les rendre conformes (une tâche qui relève plutôt du MSA, le MTA devant
lui, transmettre fidèlement les messages qu'il a choisi d'accepter) : cela sort
également du champ de la canonicalisation DKIM et cela invalide donc les
éventuelles signatures. Enfin, le changement ou la suppression de certaines
parties MIME (par exemple l'élision d'un document ZIP attaché, pour des raisons
de protection contre les logiciels malveillants transmis par courrier) va
évidemment également rendre les signatures invalides.
Et le MDA ? Peut-il casser des choses, également ? Oui, s'il passe les messages
par Sieve (RFC 5228), qui a la possibilité d'ajouter ou de retirer des
en-têtes, voire de modifier le corps (extension Sieve du RFC 5703). Si les
tests DMARC sont faits après le passage de Sieve, ou bien si le message est
ensuite réinjecté dans le système de courrier, des problèmes peuvent se
produire.
Reste le cas des intermédiaires (mediators). Ce sont les entités qui prennent
un message, puis le ré-expédient (parfois après modification). Un exemple est
l'alias. Via une entrée dans /etc/aliases ou bien via un .forward, ou bien via
le redirect de Sieve, ou encore via encore une autre méthode, un message
initialement destiné à une adresse est finalement transmis à une autre. C'est
par exemple courant pour les adresses « ancien élève », que fournissent
certaines universités, et qui permettent de garder à vie une adresse dans le
domaine de l'établissement où on a fait ses études. Un certain nombre
d'associations professionnelles fournissent un service équivalent. En général,
ces intermédiaires ne cassent pas DKIM (ils ne modifient pas le message) mais,
selon la façon dont ils redirigent, peuvent invalider l'autorisation SPF.
Un autre exemple d'intermédiaire classique est le gestionnaire de listes de
diffusion. En plus de rediriger un message (ce qui fait que le message écrit
par alice@univ.example n'est pas émis par les serveurs de courrier de
l'université), ces logiciels changent souvent le message, par exemple en
ajoutant une inutile étiquette [Ma jolie liste] aux sujets des messages, en
ajoutant un texte à la fin (instructions de désabonnement, pourtant déjà
possibles avec l'en-tête List-Unsubscribe:), en retirant des pièces jointes, ou
bien (surtout dans les théocraties comme les États-Unis) en remplaçant des gros
mots par des termes plus acceptables.
Toutes ces modifications vont probablement invalider les signatures DKIM (cf.
RFC 6377) et faire que les messages envoyés par certains participants à la
liste (ceux qui ont une politique DMARC p=reject) ne seront pas reçus par les
destinataires qui testent cette politique. (Si un avis de non-remise est
transmis, le logiciel de gestion de la liste peut en déduire que l'adresse
n'existe pas, et désabonner d'autorité le destinataire.)
Et les filtres ? Certaines organisations insèrent dans le réseau des
dispositifs qui vont analyser le courrier, par exemple à la recherche de
logiciel malveillant. Souvent, ils vont modifier les messages, afin de
supprimer ces contenus indésirables. Ces modifications vont évidemment
invalider les signatures. Idem si on change ou supprime des URL contenus dans
le message et considérés « dangereux ». Même chose avec un système anti-spam
qui ajouterait un [SPAM] dans le sujet.
En revanche, le courrier reçu d'un serveur secondaire (MX de secours), qui a
pris le relais pendant une panne du primaire, puis expédié le courrier quand le
primaire remarche, ne pose pas de problèmes. Bien sûr, les tests SPF échoueront
mais, normalement, on ne fait pas ces tests sur le courrier qui vient de son
propre serveur secondaire.
Bon, voici le tour d'horizon complet de tout ce qui peut marcher mal. Mais que
faire ? La section 4 du RFC s'attaque aux solutions. Elles sont nombreuses et
très différentes. Mais attention : DMARC est là pour rejeter des messages
considérés comme invalides. On peut arranger les choses pour que certains de
ces messages « passent » mais cela va contre le but de DMARC. Si les messages
sont de grande valeur (transactions financières, par exemple), il vaut mieux ne
pas chercher de solutions, et simplement se contenter de messages transmis
directement, ne subissant pas de traitements qui vont invalider SPF ou DKIM.
C'est d'autant plus vrai que l'écosystème du courrier électronique est très
complexe. On trouve un zillion de logiciels différents, plus ou moins bien
écrits. Par exemple, des gens utilisent encore Qmail, qui n'a plus eu une seule
mise à jour depuis 1998. Certaines des mesures ou contre-mesures utilisées pour
la sécurité du courrier sont parfaitement légales, mais vont casser tel ou tel
logiciel qui est utilisé à certains endroits.
Assez d'avertissements, les solutions. D'abord, du côté de l'expéditeur.
Celui-ci (ou son premier MTA) peut faire des efforts pour améliorer l'accord
entre les identificateurs. Un logiciel sur info.example qui envoie du courrier
pour le compte de bob@univ.example peut ainsi décider d'utiliser un en-tête
From: qui ne posera pas de problème, celui du vrai envoyeur, et de mettre
l'adresse de Bob dans un Reply-To:. Comme la plupart des solutions présentées
dans cette section 4, elle est imparfaite (le destinataire peut se demander qui
est cet envoyeur qu'il ne connait pas). Le RFC fournit de nombreux autres
exemples de désaccord entre identités, qui peuvent être réparés en changeant un
peu le processus d'envoi du message. Comme le disait ma grand-mère, « il y a
toujours une solution, pour peu que chacun y mette du sien ».
Les envoyeurs peuvent aussi limiter le risque de modifications invalidantes, en
ne signant pas trop d'en-têtes avec DKIM, ou en envoyant des messages
parfaitement formés (pour éviter aux serveurs ultérieurs la tentation de les
« réparer »).
Les receveurs peuvent aussi agir mais leurs possibilités sont plus limitées,
note le RFC.
Entre les expéditeurs et les receveurs, il y a tous les intermédiaires qui
prennent un message et le ré-expédient. Ce sont souvent eux qui causent le
problème, et ils sont donc souvent en position de le réparer. Par exemple, ils
peuvent changer le From: du message pour mettre le leur, ce qui permettrait à
peu près n'importe quelle modification, et serait plus « franc » (puisque le
message n'est plus tout à fait l'original, autant changer l'auteur...)
Évidemment, dans ce cas, assez violent, il faut au minimum garder l'information
sur l'émetteur originel, avec l'en-tête Original-From: (RFC 5703). Le problème
est que le récepteur humain sera sans doute déconcerté par cet expéditeur
(d'autant plus qu'Original-From: est peu ou pas affiché).
Comme les modifications invalident les signatures, les ré-expéditeurs
pourraient les éviter, par exemple en ajoutant des en-têtes au lieu de modifier
les existants, lorsqu'ils veulent ajouter un contenu (du genre « ceci est un
spam »). Il serait peut-être préférable, dans certains cas, de rejeter les
messages plutôt que de les modifier, ce qui cassera la vérification de
signatures plus loin.
Et, en parlant des ré-expéditeurs, les listes de diffusion, pas vraiment
prévues par DKIM, que faire pour elles ? Le RFC 6377 a déjà traité leur cas.
Une technique courante est de modifier le champ From: pour mettre l'adresse de
la liste, réduisant l'auteur original à un commentaire dans cet en-tête (avis
personnel : je déteste ça). Comme cela rend difficile de répondre en privé au
vrai auteur d'un message, l'ajout d'un Reply-To: peut aider. Une autre solution
est d'emballer le message original dans une partie MIME message/rfc822. Cette
partie resterait intact et le message emballant aurait comme expéditeur la
liste. Mais peu de MUA savent afficher proprement ce genre de messages
(spécialement dans le monde des mobiles).
Encore plus fasciste, le gestionnaire de liste pourrait interdire l'abonnement
des gens utilisant une adresse où il y a une politique DMARC autre que p=none.
(Le RFC oublie de parler du cas où une politique p=reject n'existait pas au
moment de l'abonnement mais a été rajoutée après.)
Enfin, il existe aussi des solutions qui sont encore en cours de discussion à
l'IETF, et dont le RFC décourage l'usage dans un environnement de production.
Ce sont entre autres des extensions au modèle du RFC 7601 pour créer une chaîne
d'authentification où chaque acteur important signerait le message en route.
Ou, plus radical, des mécanismes stockant l'état initial d'un message avant
transformation, pour pouvoir retrouver cet état original et vérifier la
signature.
Bref, le problème n'est pas résolu...
|