Bug de mise en miroir de liste de diffusion avec implications de sécurité

J’ai trouvé un bug intéressant et obscur concernant la façon dont les réponses aux publications sur les listes de diffusion qui sont mises en miroir sur Discourse sont classées.

J’ai la preuve que les réponses à une liste de diffusion peuvent être incorrectement classées dans une seconde liste de diffusion (avec un lectorat différent) si l’e-mail initial a été envoyé aux deux listes de diffusion en même temps.

Imaginez que je sois membre de deux listes de diffusion, A et B, abonné avec mon adresse Gmail. Elles ont des lectorats potentiellement différents. Le serveur de liste envoie une seule copie d’un message à ceux qui sont sur les deux listes de diffusion, mais la ligne To: indique que le message a été envoyé aux listes A et B dans le même e-mail. Cet e-mail arrive à mon adresse Gmail qui, via un filtre, transfère une copie à listA@mydiscourse.org.uk, Gmail choisissant l’une des deux listes dans la ligne To:. Gmail est configuré pour transférer les publications à A vers listA@mydiscourse.org.uk et les publications à B vers listB@mydiscourse.org.uk. Discourse est configuré avec deux catégories avec ces deux adresses e-mail de mirroring entrantes différentes (listA@mydiscourse.org.uk et listB@mydiscourse.org.uk).

Le problème de l’envoi d’une seule copie par le serveur de liste et Gmail est distinct et n’est pas l’objet de ce bug.

Après cela, une copie de l’e-mail qui m’a été envoyée à mon compte Gmail se retrouve affichée dans la catégorie associée à l’adresse de mirroring entrante listA@mydiscourse.org.uk après que Gmail l’ait transférée.

Tout va bien jusqu’ici (mis à part le fait qu’un seul e-mail est arrivé du serveur de liste en premier lieu).

Maintenant, un utilisateur distinct, qui n’est que sur la liste de diffusion B, répond à cet e-mail au serveur de liste. Le serveur de liste envoie ce message à tous les membres de la liste de diffusion B. Cela arrive à mon adresse Gmail avec une ligne To: indiquant qu’il a été envoyé à la liste B. Gmail le transfère à listB@mydiscourse.org.uk.

Mais ensuite, Discourse le classe comme s’il avait été envoyé par e-mail à listA@mydiscourse.org.uk !

Cela révèle donc à ceux qui ont accès à la liste A le contenu d’une publication d’un membre de la liste B !

Je soupçonne que Discourse ignore la voie par laquelle l’e-mail est entré dans Discourse et l’a classé en fonction des indicateurs d’ID de message dans les en-têtes, contournant ainsi la voie d’entrée.

L’e-mail original, envoyé à A et B, contient un seul ID de message et je soupçonne que le classement basé uniquement sur cet ID de message se produit.

Si l’expéditeur original avait rédigé deux e-mails distincts aux listes A et B, ce problème ne se serait pas produit car les deux messages auraient eu leurs propres ID de message.

Correction suggérée : Si une catégorie met en miroir une liste de diffusion et qu’un message arrive via l’adresse de mirroring qui semble, d’après les en-têtes, être une réponse à une autre publication qui réside ailleurs sur Discourse, alors une nouvelle publication doit être créée (peut-être sans parent évident) dans la catégorie attendue, plutôt que la réponse ne se retrouve dans une catégorie associée à une autre liste de diffusion.

En effet, ou :

Je pense que c’est l’objet de ce bug. Cela devrait être corrigé dans le serveur de liste, pas dans Discourse.

1 « J'aime »

Je ne suis pas sûr d’avoir bien expliqué mon propos, car je ne comprends pas pourquoi Discourse placerait un message dans la mauvaise catégorie. C’est comme s’il ne regardait pas la route dans (qui devrait avoir la priorité) mais seulement l’ID du message. Pour un seul e-mail envoyé simultanément à deux listes de diffusion, il y aura un ID de message mais avec deux listes de distribution (qui sont indépendantes), deux adresses « À : » et deux adresses « Reply-To : » (avec une adresse différente affichée sur chacun des messages selon la liste à laquelle il a été envoyé).

Si c’est ce qui se passe, que se passerait-il si quelqu’un déplaçait un sujet hors d’une catégorie qui était un miroir de liste de diffusion, et le plaçait ailleurs sur Discourse, mais que les réponses (via la liste de diffusion) continuaient d’arriver ? Discourse ajouterait-il ces réponses à la catégorie associée à la liste de diffusion (même si le message original a pu être déplacé) ou toutes les réponses finiraient-elles magiquement dans la catégorie où le sujet avait été déplacé ?

Discourse peut-il gérer deux messages dans deux catégories en même temps qui ont le même ID de message (mais des adresses « À : » différentes ?

Indépendamment de la façon dont Discourse gère cela, un Message-ID doit être unique. À mon avis, lorsqu’un serveur de listes envoie un message à une liste de diffusion, il crée une nouvelle instance de ce message et devrait donc réécrire l’ID du message.

De plus, je ne comprends pas comment le message original pouvait convenir à la fois aux membres des listes A et B, mais la réponse du membre de la liste B ne pouvait pas être révélée aux membres de la liste A. Si ces publics sont si différents, pourquoi l’utilisateur envoie-t-il les mêmes messages aux deux listes en même temps ?

Peut-être qu’il existe une bonne solution technique pour cela et peut-être que Discourse peut être modifié pour gérer cela correctement, mais je trouve cela un cas limite vraiment étrange dans une technologie vieille de 36 ans.

On pourrait soutenir que, comme le message est le même, il a un identifiant de message unique. En fait, pour l’exemple en question, l’auteur original a composé le message dans Gmail (qui a attribué l’identifiant du message) et il a été envoyé à deux adresses de listserv sur le même serveur. Ce n’est pas rare, par exemple, il pourrait s’agir d’un communiqué de presse commun aux managers et aux cliniciens, chacun étant sur sa propre liste de diffusion. Il peut y avoir un problème médical dans le communiqué de presse qui nécessite une discussion, de sorte qu’un clinicien pourrait répondre (et l’adresse Reply-to: aurait été définie sur la liste des cliniciens même si l’en-tête To: mentionnait toujours les deux listes de diffusion). De même, les managers pourraient souhaiter discuter de leur propre point de vue sur les nouvelles. Ils répondraient et l’en-tête Reply-to: pertinent serait utilisé pour refléter la liste des managers. Si un poster avait utilisé les adresses To: en faisant un « répondre à tous », un message de rebond aurait été généré à partir de la liste dont il n’était pas membre.

Le comportement ci-dessus n’est pas si inhabituel, mais il semble que Discourse ne puisse pas le gérer correctement s’il est utilisé comme un miroir de liste de diffusion et qu’il maintient les réponses divergentes séparées, car elles seront toutes liées à l’identifiant du message d’origine et à la catégorie dans laquelle ce message est apparu pour la première fois.

Cela pourrait signifier que les managers pourraient voir les messages des cliniciens, par exemple, si le clinicien, répondant à la liste des cliniciens, avait ce message apparaître dans le miroir de la liste des managers en raison de la façon dont Discourse classe les messages.

Une solution pourrait être de vérifier chaque adresse dans l’en-tête To: des messages entrants pour voir si elle correspond à une adresse de miroir de liste de diffusion dans chacun des paramètres de catégorie. Si c’était le cas, une copie du message pourrait être publiée dans chaque catégorie correspondante, et il pourrait y avoir potentiellement plusieurs copies du message dans différentes catégories. Ensuite, si des réponses arrivaient, l’identifiant du message pourrait être utilisé, comme c’est actuellement le cas, mais uniquement si la ligne To: correspondait également à la catégorie.

Une solution possible serait-elle d’avoir une option pour réécrire l’ID du message afin qu’il reflète l’ID d’origine créé par le client de messagerie de l’expéditeur, plus un identifiant supplémentaire, par exemple l’adresse To: de la liste de diffusion que Discourse recherche déjà ? Cela signifierait que si un message provenait de la liste de diffusion B mais référençait un en-tête message-id qui se trouvait également dans un message de la liste de diffusion A, il serait correctement classé par Discourse ?

Par exemple. Un e-mail original envoyé simultanément à deux listes de diffusion A et B a un message-id unique ‘1234567890gmail’.

Discourse reçoit deux copies transférées à l’adresse entrante générique de Discourse. Le premier message est classé en fonction de l’adresse To: qui est adressée à la liste A et Discourse ajoute des caractères supplémentaires à l’ID du message pour qu’il devienne ‘1234567890gmailListA’. Le deuxième message n’est pas classé car il semble être un doublon. (Je pense que c’est le comportement actuel).

Quelqu’un de la liste B répond en utilisant l’adresse To: de la liste B. Discourse reçoit une copie et repère qu’il y a un en-tête “en réponse à” qui contient ‘1234567890gmail’. Discourse, voyant que l’e-mail est arrivé avec une ligne To: reflétant la liste B, ajoute des caractères à la fin pour que l’en-tête “en réponse à” ressemble à ‘1234567890gmailListB’. Il procède ensuite à son classement comme un nouveau message dans la catégorie correcte car il n’est plus lié au message qui a été classé sous la liste A.

Cette approche pourrait également fonctionner pour le transfert d’archives où le même ID de message pourrait être trouvé dans plusieurs listes de diffusion si un utilisateur a envoyé le message à plusieurs listes en même temps. Au moment de l’importation, tous les champs message-id (et en réponse à) pourraient avoir du texte unique ajouté, lié au nom de la liste de diffusion, pour éviter une sorte de dialogue croisé entre les archives lors de l’indexation des messages.