Mirroring-Bug bei Mailinglisten mit Sicherheitsimplikationen

Ich habe einen interessanten und obskuren Fehler gefunden, wie Antworten auf Beiträge an Mailinglisten, die auf Discourse gespiegelt werden, abgelegt werden.

Ich habe Beweise dafür, dass Antworten an eine Mailingliste falsch gegen eine zweite Mailingliste (mit einer anderen Leserschaft) abgelegt werden können, wenn die ursprüngliche E-Mail gleichzeitig an beide Mailinglisten gesendet wurde.

Stellen Sie sich vor, ich bin Mitglied zweier Mailinglisten, A und B, abonniert mit meiner Gmail-Adresse. Sie haben potenziell unterschiedliche Leserschaften. Der Listenserver sendet eine einzelne Kopie einer Nachricht an diejenigen, die auf beiden Mailinglisten sind, aber die Zeile „An:“ gibt an, dass die Nachricht in derselben E-Mail an die Listen A und B gesendet wurde. Diese E-Mail erreicht meine Gmail-Adresse, die dann über einen Filter eine Kopie an listA@mydiscourse.org.uk weiterleitet, wobei Gmail eine der beiden Listen in der Zeile „An:“ auswählt. Gmail ist so eingestellt, dass Beiträge an A an listA@mydiscourse.org.uk und Beiträge an B an listB@mydiscourse.org.uk weitergeleitet werden. Discourse ist mit zwei Kategorien mit diesen beiden unterschiedlichen eingehenden spiegelnden E-Mail-Adressen (listA@mydiscourse.org.uk und listB@mydiscourse.org.uk) eingerichtet.

Das Problem, dass der Listenserver und Gmail nur eine Kopie senden, ist separat und nicht Gegenstand dieses Fehlers.

Danach wird eine Kopie der an mich gesendeten E-Mail an mein Gmail-Konto in der Kategorie angezeigt, die der eingehenden Adresse listA@mydiscourse.org.uk zugeordnet ist, nachdem Gmail sie weitergeleitet hat.

Bis hierhin alles gut (abgesehen davon, dass vom Listenserver überhaupt nur eine E-Mail eingegangen ist).

Nun antwortet ein separater Benutzer, der nur auf der Mailingliste B ist, auf diese E-Mail an den Listenserver. Der Listenserver sendet diese Nachricht an alle auf der Mailingliste B. Diese erreicht meine Gmail-Adresse mit einer Zeile „An:“, die angibt, dass sie an die Liste B gesendet wurde. Gmail leitet sie an listB@mydiscourse.org.uk weiter.

Aber dann legt Discourse sie so ab, als wäre sie an listA@mydiscourse.org.uk gesendet worden!

Dies offenbart daher denjenigen, die Zugriff auf Liste A haben, den Inhalt eines Beitrags eines Mitglieds von Liste B!

Ich vermute, Discourse ignoriert den Weg, den die E-Mail genommen hat, um in Discourse zu gelangen, und legt sie basierend auf den Message-ID-Flags in den Headern ab, wodurch der Eingangs-Weg umgangen wird.

Die ursprüngliche E-Mail, die an A und B gesendet wurde, hat eine einzige Message-ID und ich vermute, dass die Ablage nur basierend auf dieser Message-ID erfolgt.

Wenn der ursprüngliche E-Mail-Absender zwei separate E-Mails an Liste A und Liste B geschrieben hätte, wäre dieses Problem nicht aufgetreten, da die beiden Nachrichten ihre eigenen Message-IDs gehabt hätten.

Vorgeschlagene Korrektur: Wenn eine Kategorie eine Mailingliste spiegelt und eine Nachricht über die spiegelnde Adresse eingeht, die aus den Headern zu stammen scheint, als Antwort auf einen anderen Beitrag, der sich irgendwo anders auf Discourse befindet, dann muss ein neuer Beitrag erstellt werden (vielleicht ohne offensichtlichen Elternteil) in der erwarteten Kategorie, anstatt dass die Antwort in einer Kategorie landet, die mit einer anderen Mailingliste verbunden ist.

Tatsächlich oder:

Ich denke, es ist Gegenstand dieses Fehlers. Dies sollte im Listserver und nicht in Discourse behoben werden.

1 „Gefällt mir“

Ich bin mir nicht sicher, ob ich mich sehr gut ausgedrückt habe, da ich nicht verstehen kann, warum Discourse einen Beitrag in die falsche Kategorie einordnen würde. Es ist, als ob es nicht die Route in berücksichtigt (die Vorrang haben sollte), sondern nur die message-id. Bei einer einzelnen E-Mail, die gleichzeitig an zwei Mailinglisten gesendet wird, gibt es eine message-id, aber mit zwei Verteilerlisten (die unabhängig voneinander sind), zwei „To:“-Adressen und zwei „Reply-To:“-Adressen (mit einer anderen, die auf jeder der Nachrichten angezeigt wird, je nachdem, an welche Liste sie gesendet wurde).

Wenn dies der Fall ist, was würde passieren, wenn jemand ein Thema aus einer Kategorie, die ein Mailinglisten-Spiegel war, verschieben und es woanders in Discourse platzieren würde, aber dann Antworten (über die Mailingliste) weiterhin eingehen würden? Würde Discourse diese Antworten der Kategorie hinzufügen, die mit der Mailingliste verbunden ist (auch wenn der ursprüngliche Beitrag möglicherweise verschoben wurde), oder würden alle Antworten auf magische Weise in der Kategorie landen, in die das Thema verschoben wurde?

Kann Discourse damit umgehen, dass zwei Nachrichten in zwei Kategorien gleichzeitig dieselbe message-id (aber unterschiedliche „To:“-Adressen) haben?

Unabhängig davon, wie Discourse damit umgeht, sollte eine Message-ID eindeutig sein. Meiner Meinung nach erstellt ein Listserver, wenn er eine Nachricht an eine Mailingliste sendet, eine neue Instanziierung dieser Nachricht und sollte daher die Message-ID umschreiben.

Außerdem verstehe ich nicht, wie die ursprüngliche Nachricht sowohl für Mitglieder der Listen A als auch B geeignet sein könnte, aber die Antwort des Mitglieds der Liste B könnte nicht den Mitgliedern der Liste A offenbart werden. Wenn diese Zielgruppen so unterschiedlich sind, warum sendet der Benutzer gleichzeitig dieselben Nachrichten an beide Listen?

Vielleicht gibt es dafür eine gute technische Lösung und vielleicht kann Discourse so geändert werden, dass es dies korrekt handhabt, aber ich halte dies für einen wirklich seltsamen Grenzfall in 36 Jahre alter Technologie.

Man könnte argumentieren, dass es eine einzige Message-ID hat, da die Nachricht dieselbe ist. Tatsächlich hat im fraglichen Beispiel der ursprüngliche Poster die Nachricht in Gmail verfasst (die die Message-ID zugewiesen hat) und sie wurde an zwei Listserv-Adressen auf demselben Server gesendet. Dies ist nicht ungewöhnlich, zum Beispiel könnte es sich um eine Pressemitteilung handeln, die für Manager und Kliniker bestimmt ist, die sich jeweils in ihren eigenen Mailinglisten befinden. Es könnte ein medizinisches Problem in der Pressemitteilung geben, das diskutiert werden muss, so dass ein Kliniker antworten könnte (und die Reply-to:-Adresse wäre auf die Klinikerliste gesetzt worden, obwohl der To:-Header immer noch beide Mailinglisten erwähnt hätte). Ebenso könnten die Manager ihre eigene Sicht auf die Nachrichten diskutieren wollen. Sie würden antworten und der relevante Reply-to:-Header würde verwendet, um die Managerliste widerzuspiegeln. Hätte ein Poster die To:-Adressen durch eine „Antwort an alle“-Funktion genutzt, wäre eine Fehlermeldung von der Liste, der er nicht angehörte, generiert worden.

Das oben beschriebene Verhalten ist nicht so ungewöhnlich, aber es scheint, dass Discourse damit nicht richtig umgehen kann, wenn es als Spiegel einer Mailingliste verwendet wird und die verzweigten Antworten getrennt hält, da sie alle der ursprünglichen Message-ID und der Kategorie zugeordnet werden, in der dieser Beitrag zuerst erschien.

Dies könnte bedeuten, dass Manager beispielsweise die Beiträge von Klinikern sehen könnten, wenn der Beitrag des Klinikers, der auf die Klinikerliste antwortet, im Spiegel der Managerliste erscheint, aufgrund der Art und Weise, wie Discourse Nachrichten ablegt.

Eine Lösung könnte darin bestehen, jede Adresse im To:-Header eingehender Nachrichten zu überprüfen, um zu sehen, ob sie mit einer Mailinglisten-Spiegeladresse in den jeweiligen Kategorieeinstellungen übereinstimmt. Wenn dies der Fall wäre, könnte eine Kopie der Nachricht in jeder übereinstimmenden Kategorie veröffentlicht werden, und es könnten potenziell mehrere Kopien des Beitrags in verschiedenen Kategorien vorhanden sein. Dann, wenn Antworten eingehen, könnte die Message-ID wie bisher verwendet werden, aber nur, wenn die To:-Zeile auch mit der Kategorie übereinstimmt.

Könnte eine Lösung darin bestehen, die message-id so umzuschreiben, dass sie die ursprüngliche ID widerspiegelt, die vom Mail-Client des Posters erstellt wurde, plus eine zusätzliche Kennung, z. B. die To:-Adresse der Mailingliste, nach der Discourse bereits sucht? Das würde bedeuten, dass, wenn ein Beitrag von Mailingliste B käme, aber sich auf einen message-id-Header bezog, der auch in einem Beitrag von Mailingliste A vorhanden war, er von Discourse korrekt zugeordnet würde?

Z. B. Eine ursprüngliche E-Mail, die gleichzeitig an zwei Mailinglisten A und B gesendet wurde, hat die eindeutige message-id ‘1234567890gmail’.

Discourse empfängt zwei Kopien, die an die generische eingehende Discourse-Adresse weitergeleitet werden. Die erste Nachricht wird basierend auf der To:-Adresse, die an Liste A gerichtet ist, zugeordnet, und die message-id erhält von Discourse angehängte zusätzliche Zeichen, um ‘1234567890gmailListA’ zu werden. Die zweite Nachricht wird nicht zugeordnet, da sie wie eine Duplikat aussieht. (Ich glaube, das ist das aktuelle Verhalten).

Jemand in Liste B antwortet unter Verwendung der To:-Adresse für Liste B. Discourse erhält eine Kopie und stellt fest, dass ein In-Reply-To-Header vorhanden ist, der ‘1234567890gmail’ enthält. Discourse, das sieht, dass die E-Mail mit einer To:-Zeile eingegangen ist, die Liste B widerspiegelt, hängt Zeichen am Ende an, um den In-Reply-To-Header wie ‘1234567890gmailListB’ aussehen zu lassen. Anschließend wird dies als neue Nachricht in der richtigen Kategorie zugeordnet, da es nicht mehr mit der Nachricht verknüpft ist, die für Liste A zugeordnet wurde.

Dieser Ansatz könnte auch für die Übertragung von Archiven funktionieren, bei denen dieselbe message-id in mehreren Mailinglisten gefunden werden könnte, wenn ein Benutzer die Nachricht gleichzeitig an mehrere Listen gesendet hat. Zum Zeitpunkt des Imports könnten alle message-id-Felder (und In-Reply-To) eindeutige Textzeichen angehängt bekommen, die mit der benannten Mailingliste verknüpft sind, um eine Art Querverbindung zwischen Archiven zu verhindern, wenn Nachrichten indiziert werden.