Comment j'ai cassé moncompteformation.gouv.fr

 x0r   7
web site borken bugs rfc2822

Je commencerai par dédicacer ce premier billet de l'année aux intrépides qui estiment pouvoir coder eux-mêmes leur algorithme de validation syntaxique d'adresses e-mail sans lire le sacro-saint RFC 2822, le document définissant ce qu'est une adresse e-mail valable.

Ceux qui ont vu mes informations de contact sur mon blog se sont sûrement aperçus que j'utilise un caractère inhabituel dans mon adresse mail : le signe « plus ».

Pour moi, cela me sert à créer des « alias » ad hoc, qui sont automatiquement redirigés vers mon adresse principale sans avoir à toucher à un quelconque fichier de configuration de Postfix. Ces alias me servent ensuite à trier mes mails plus efficacement (y compris pour les mettre directement à la poubelle lorsqu'un organisme abuse de mes coordonnées pour m'envoyer du spam).

Il m'est ensuite bien plus facile de créer des règles de tri fondées sur l'adresse e-mail du destinataire (ce destinataire étant l'un de ces nombreux alias) plutôt que sur des critères moins fiables. Certains fournisseurs, comme GMail, proposent également la même fonctionnalité.

RFC 2822, une lecture indispensable

La RFC 2822 (§ 3.2.4) donne la liste des caractères acceptables dans une adresse e-mail, mis à part le "@" qui sert de séparateur : tout caractère alphanumérique, mais aussi les symboles "!", "#", "$", "%", "&", "'" (apostrophe), "*", "+", "-", "/", "=", "?", "^", "_", "`" (backtick), "{", "|", "}", "~". Le point est aussi accepté, sauf en début ou en fin de chaîne de caractère.

Cela signifie donc qu'une adresse comme « !&'}.|`?@example.com » est tout à fait valable et que tous ceux qui rejettent cette adresse e-mail violent la RFC 2822. Je dispose d'une liste croissante de sociétés, dont des FAI (voyez l'ironie) et des banques, qui rejettent mes adresses contenant juste un « plus ». C'est consternant, car des bibliothèques faisant cette validation syntaxique cor­rec­tement existent déjà et qu'il est donc parfaitement inutile de réinventer une roue carrée.

Un petit plus qui casse tout

Maintenant que j'ai fait cette petite parenthèse sur tous les caractères qu'on peut mettre dans une adresse mail, revenons au sujet. L'histoire remonte à l'an dernier. À cause d'un mauvais algorithme de validation d'adresses e-mail et d'une ribambelle d'autres bugs, j'ai en effet réussi à "casser" le site moncompteformation.gouv.fr d'une façon que je n'aurais jamais cru possible.

J'ai voulu créer mon compte en remplissant le formulaire, où l'on demande : numéro de Sécurité sociale, nom, prénom, adresse e-mail et d'autres joyeusetés. Ce faisant, j'ai pris soin de saisir une adresse e-mail avec comme partie utilisateur « x0r+cpf ».

Je valide. Le formulaire passe. Mon adresse e-mail est acceptée et on me laisse donc passer à l'étape suivante, qui consiste à choisir un mot de passe. Je valide. Et là, erreur : impossible de créer le compte car mon adresse e-mail n'est pas valable.

Je me demande pourquoi cette validation ne s'est pas faite directement après avoir soumis le premier formulaire. Je reviens donc en arrière, en maugréant et en ajoutant un alias à la main dans la configuration Postfix ; je substitue alors un point au caractère plus dans mon adresse, ce qui devrait théoriquement passer.

Et là, nouvelle erreur : il existe déjà un compte avec ce numéro de Sécurité sociale.

Pourtant, c'est impossible : on m'avait pourtant dit que le compte ne pouvait pas être créé car « x0r+cpf » n'était pas valable. Je n'ai même pas reçu d'e-mail de confirmation. Il y avait bien eu un mail, en fait, d'après les logs de Postfix, mais il a dû se faire manger par SpamAssassin : un collègue m'a confirmé que le mail de confirmation était envoyé depuis une machine sans reverse DNS, ce qui va à l'encontre des bonnes pratiques. Étant donné que les spammeurs envoient souvent leurs spams depuis des machines sans reverse DNS, ce genre de messages finira dans les dossiers « Spams » à coup sûr chez beaucoup de monde.

Conclusion : je me retrouve avec un compte à moitié créé, auquel je n'ai pas accès car le mot de passe n'a jamais pu être défini pour ce compte. La base de données utilisant visiblement le numéro de Sécurité sociale comme clé primaire, il m'était impossible de recommencer.

La valse des analyseurs syntaxiques en mousse

La page de contact du site donne l'adresse e-mail du webmaster, que je m'empresse de contacter afin de lui expliquer les faits que je viens d'évoquer, et que je me retrouve du coup avec un compte inexploitable. En pensant que la plupart des clients e-mail de nos jours géreraient mon adresse correctement, je mets « x0r+cpf » dans le champ From. J'envoie.

Mes logs Postfix montrent ensuite que quelqu'un, ou un robot, a alors essayé d'envoyer un message à... « cpf ».

Non seulement ils valident mal les adresses, non seulement leurs machines n'ont pas de reverse DNS, mais quelqu'un ou quelque chose parvenait encore, en 2015, à mal extraire l'adresse e-mail du champ "From" d'un mail. L'e-mail tel qu'on le connaît existe pourtant depuis 1982.

Je crée donc encore un alias pour que les messages adressés à l'utilisateur « cpf » ne finissent pas à la cyber-poubelle, et je renvoie un deuxième mail pour informer le webmaster du dysfonctionnement. Même adresse From que le mail précédent, et même réponse sur la mauvaise adresse : c'était en fait un mail de confirmation envoyé par un robot d'une plate-forme d'e-mails destinée aux entreprises.

Enfin, à mon premier mail, je reçois en réponse un message à côté de la plaque me conseillant de faire des choses que j'avais déjà essayées : à savoir, m'inscrire, réinitialiser mon mot de passe, et ainsi de suite. J'avais pourtant déjà dit que j'avais essayé tout cela avant d'envoyer mon mail au webmaster.

En fin de compte, c'est seulement en décrochant le bon vieux téléphone (ou un téléphone IP chez moi, donc pas vraiment "bon vieux", certes) et en appelant le support technique que j'ai plus ou moins réussi à résoudre le problème : mon interlocutrice a su défaire cette tentative de création de compte qui avait échoué, puis tout a fini par rentrer dans l'ordre. Mais malheureusement sans caractère plus dans l'adresse e-mail.

Conclusion

Ce genre de situations montre bien ce à quoi peut aboutir plusieurs « petits » problèmes, qui, mis bout à bout, entraînent des résultats potentiellement catastrophiques :

  • un algorithme de validation syntaxique d'adresses e-mail non conforme à la RFC 2822 ;
  • une configuration de zone DNS non conforme aux bonnes pratiques (i.e. enregistrements PTR manquants pour les serveurs mail sortants) ;
  • un processus de création de compte non atomique ;
  • enfin, une plateforme e-mail de support technique buguée.

Ce qui me choque est surtout le fait que la création de compte ne soit pas atomique. L'atomicité signifie qu'à la fin, on a soit un compte parfaitement créé, soit rien du tout. Je vois d'ailleurs mal comment quelque chose d'aussi simple que l'ajout d'un seul tuple dans une seule table peut échouer de manière aussi catastrophique.

En fin de compte, si on dit que le développement informatique est le BTP des temps modernes, j'ai bien peur qu'on finira par être entouré de châteaux de cartes. Y compris dans le service public.

Commentaires

Poster un commentaire

FJ

Excellent billet et frustrant problème, hélas trop courant ! Les administrations, hélas, ne sont pas du tout prêtes à gérer les demandes de support technique de leurs utilisateurs, même lorsqu'on leur signale des bugs évidents. (Essayez les douanes, tout un poème !)

Il est hélas souvent nécessaire de configurer les serveurs de courrier pour accepter des envois à tous les sous-domaines possibles de façon à pouvoir utiliser une adresse du style x0r@cpf.example.com au lieu du signe +. Les bons fournisseurs, comme FastMail, mettent cela à la portée de tous, même ceux qui n'ont pas leur propre serveur de courrier.

Hélas, bien évidemment, authentifier les emails sortants devient alors autrement plus délicat. Heureusement, ces adresses sont essentiellement utiles pour les notifications entrantes.

x0r

J'aime bien l'idée d'utiliser des sous-domaines. Le problème principal cependant serait la validation du reverse DNS, car une adresse IP a nécessairement un seul reverse DNS. Cependant, en IPv6, on pourrait contourner ce problème plus facilement, mais cela exigerait quand même de mettre en place une architecture somme toute assez lourde.

J'aurais aussi pu changer de séparateur, mais j'avais choisi + par habitude. De bons candidats seraient le point (que j'utilise déjà comme alternative avec des sites peu coopératifs), le tiret - ou l'underscore _. Mais ces caractères pourraient entrer en conflit avec des noms d'utilisateurs.

John

"Y compris dans le service public." : SURTOUT dans le service public non ? :D

Art

Je tombe ici par hasard, mais au cas où ça puisse servir : Postfix se configure facilement pour utiliser _ en plus de + comme caractères "alias". Avec cette option, l'adresse x0r_cpf arrive au même endroit que x0r et tout va bien (le tiret bas est généralement accepté partout).

Youpi6v

Pour ma part, je dirais que la morale de l'histoire est plutôt de ne pas trop en attendre de la correction des autres. Il est courant de constater qu'une norme n'est pas totalement mise en œuvre par tel ou tel éditeur ou constructeur, ce qui empêche ou diminue grandement l'interopérabilité. Dans cette histoire de "+", le premier ennuyé est quand même l'auteur. Même si le traitement correct du "+" serait exigible, utiliser une autre manière de faire, qui est plus acceptée, est possible. On ne peut pas se changer, lorsqu'on est, par exemple, victime de racisme. En revanche, on peut changer sa manière d'écrire, dans cet exemple, les adresses email qu'on donne à ses interlocuteurs. C'est peut-être ennuyeux, mais ça ne me semble pas être un renoncement fondamentalement aliénant.

Par ailleurs, inutile de fustiger "le service public", outre que je ne suis pas sûr que cela désigne bien quelqu'un, les configs pourries dans les entreprises privées, il m'est arrivé d'en voir plus d'une fois (à commencer par des configs que j'ai faites moi, avec plus ou moins de bonheur).

Youpi6v

"Même si le traitement serait exigible" : même pas mal ;-)

Elektordi

Une autre technique que j'utilise tous les jours est de configurer un catch-all sur mon domaine, et ainsi pouvoir taper une nouvelle adresse à la volée sur chaque site. Il suffit dans postfix de créer un alias spécial (je n'ai plus la syntaxe de tête) qui renvoie vers le compte mail.

A la demande de plusieurs membres de ma famille, je leur ait aussi ouvert le service avec des sous-domaines (un par personne), ce qui reste assez light en configuration (entre-autres par-rapport à ta problématique de reverse).

En parlant de reverse d'ailleurs, beaucoup de gros opérateurs email refusent depuis un moment les serveurs sans reverse, donc normalement ils devraient corriger assez rapidement en voyant le nombre de mails rejetés, il faut juste s'assurer de le rejeter au niveau SMTP et non pas l'accepter puis le jeter comme font trop de systèmes...

Poster un commentaire