メーリングリストのミラーリングバグとセキュリティへの影響

メーリングリストへの投稿に対する返信が Discourse でミラーリングされる際の、興味深く珍しいバグを見つけました。

最初のメールが両方のメーリングリストに同時に送信された場合、一方のメーリングリストへの返信が、誤って 2 番目のメーリングリスト(異なる読者層を持つ)に対して誤って記録される可能性があることを示す証拠があります。

メーリングリスト A と B の両方に登録しており、Gmail アドレスで購読していると想像してください。それらは異なる読者層を持つ可能性があります。リストサーバーは、両方のメーリングリストの購読者に 1 つのメッセージコピーを送信しますが、To: 行には、メッセージが A と B の両方のリストに同じメールで送信されたことが示されています。このメールは私の Gmail アドレスに届き、その後フィルターを介して listA@mydiscourse.org.uk にコピーを転送します。Gmail は、To: 行の 2 つのリストのいずれかを選択します。Gmail は、A への投稿を listA@mydiscourse.org.uk に、B への投稿を listB@mydiscourse.org.uk に転送するように設定されています。Discourse は、それらの 2 つの異なる受信ミラーリングメールアドレス(listA@mydiscourse.org.uk と listB@mydiscourse.org.uk)を持つ 2 つのカテゴリで設定されています。

リストサーバーと Gmail が 1 つのコピーのみを送信するという問題は別であり、このバグの主題ではありません。

その後、Gmail が転送した後、私の Gmail アカウントに送信されたメールのコピーが、listA@mydiscourse.org.uk 受信アドレスに関連付けられたカテゴリに表示されます。

ここまでは順調です(そもそもリストサーバーからメールが 1 通しか届かなかったという事実を除けば)。

次に、B メーリングリストにのみ登録している別のユーザーが、そのメールにリストサーバーに返信します。リストサーバーはそのメッセージを B メーリングリストの全員に送信します。これは、B リストに送信されたことを示す To: 行とともに私の Gmail アドレスに届きます。Gmail はそれを listB@mydiscourse.org.uk に転送します。

しかし、Discourse はそれを listA@mydiscourse.org.uk にメールされたかのように記録します!

これにより、リスト A にアクセスできるユーザーに、リスト B メンバーの投稿の内容が表示されてしまいます!

Discourse がメールが Discourse に入ってきたルートを無視し、ヘッダーのメッセージ ID フラグに基づいて記録しているため、入力ルートを回避しているのではないかと疑っています。

A と B に送信された元のメールには、1 つのメッセージ ID が含まれており、そのメッセージ ID だけで記録が行われているのではないかと疑っています。

元のメール送信者がリスト A とリスト B に別々のメールを 2 通書いていた場合、2 つのメッセージにはそれぞれ独自のメッセージ ID があったため、この問題は発生しなかったでしょう。

修正案:カテゴリがメーリングリストをミラーリングしており、ミラーリングアドレスを通じてメッセージが受信された場合、ヘッダーから見て Discourse の他の場所に存在する別の投稿への返信であるように見える場合、期待されるカテゴリに新しい投稿を作成する必要があります(おそらく親が不明な状態)。返信が異なるメーリングリストに関連付けられたカテゴリに収まるのではなく。

実際、または:

これはこのバグの対象だと思います。これはDiscourseではなく、リストサーバーで修正されるべきです。

「いいね!」 1

Discourse が投稿を間違ったカテゴリに入れる理由がよくわかりません。あたかもルート(優先されるべき)ではなく、メッセージ ID のみを見ているかのようです。1 つの電子メールが同時に 2 つのメーリング リストに送信される場合、メッセージ ID は 1 つですが、2 つの配布リスト(独立している)、2 つの「To: 」アドレス、および 2 つの「Reply-To: 」アドレス(どちらのリストに送信されたかによって、各メッセージに異なるものが表示される)があります。

もしこれが起こっているとしたら、誰かがメーリング リストのミラーであるカテゴリからトピックを移動して Discourse の別の場所に移動した場合、返信(メーリング リスト経由)は引き続き受信されるのでしょうか? Discourse は、元の投稿が移動された場合でも、メーリング リストに関連付けられたカテゴリにそれらの返信を追加するのでしょうか、それともすべての返信は、トピックが移動されたカテゴリに魔法のように収まるのでしょうか?

Discourse は、同じメッセージ ID を持つ 2 つのメッセージを 2 つのカテゴリに同時に配置できますか(ただし、「To: 」アドレスは異なりますか?

Discourse がこれをどのように処理するかは別として、Message-ID は一意であるべきです。私の意見では、リストサーバーがメーリングリストにメッセージを送信するとき、そのメッセージの新しいインスタンスを作成し、それゆえメッセージIDを書き換えるべきです。

また、元のメッセージがリストAとリストBの両方のメンバーに適しているのに、リストBのメンバーからの返信がリストAのメンバーに公開されないのはなぜなのか理解できません。それらのオーディエンスがそれほど異なるのであれば、なぜユーザーは同時に両方のリストに同じメッセージを送信するのでしょうか?

これに対する良い技術的解決策があるのかもしれませんし、Discourse を修正してこれを正しく処理できるようにすることもできるかもしれませんが、私は 36 年前の技術における非常に奇妙なエッジケースだと感じています。

メッセージが同じであるため、単一のメッセージIDを持つと主張することもできます。実際、問題の例では、元の投稿者はGmailでメッセージを作成し(メッセージIDを割り当てた)、同じサーバー上の2つのリストサーブアドレスに送信しました。これは珍しいことではありません。たとえば、マネージャーと臨床医の両方に共通するニュースリリースであり、それぞれが独自のメーリングリストに属している可能性があります。ニュースリリースには議論が必要な医学的問題がある可能性があり、臨床医が返信した場合(返信先:アドレスは臨床医リストに設定されますが、宛先:ヘッダーには両方のメーリングリストが記載されています)。同様に、マネージャーは自身の見解を議論したい場合があります。返信すると、関連する返信先:ヘッダーがマネージャーリストを反映するように使用されます。投稿者が宛先:アドレスを使用して「全員に返信」した場合、メンバーではないリストからバウンスメッセージが生成されます。

上記の動作はそれほど珍しいものではありませんが、Discourseはメーリングリストミラーとして使用された場合に正しく処理できず、フォークされた返信を分離できないようです。これは、それらがすべて元のメッセージIDと、その投稿が最初に表示されたカテゴリに紐付けられるためです。

これは、たとえば臨床医が臨床医リストに返信した場合、Discourseがメッセージをファイルする方法により、その投稿がマネージャーリストのミラーに表示されると、マネージャーが臨床医の投稿を見ることができる可能性があることを意味します。

解決策としては、受信メッセージの宛先:ヘッダーの各アドレスを確認し、各カテゴリ設定のメーリングリストミラーアドレスと一致するかどうかを確認することが考えられます。一致した場合、メッセージのコピーが一致する各カテゴリに投稿される可能性があり、潜在的に複数のカテゴリに投稿のコピーが複数存在する可能性があります。その後、返信があった場合、メッセージIDは現在のように使用できますが、宛先:行がカテゴリとも一致した場合に限ります。

メッセージIDを、投稿者のメールクライアントによって作成された元のIDに、Discourseが既に探しているメーリングリストのTo:アドレスなどの追加識別子を反映するように書き換えるという解決策は考えられますか?これにより、メーリングリストBから投稿されたメッセージが、Discourseによって正しく分類されるように、メーリングリストAからの投稿にも含まれていたメッセージIDを参照していた場合、正しく処理されるでしょうか?

例:メーリングリストAとBの両方に同時に送信された元のメールには、一意のメッセージID「1234567890gmail」が付いています。

Discourseは、汎用のDiscourse受信アドレスに転送された2つのコピーを受信します。最初のメッセージは、To:アドレスがList A宛てであることに基づいて分類され、メッセージIDはDiscourseによって追加の文字が追加されて「1234567890gmailListA」になります。2番目のメッセージは重複しているように見えるため、分類されません。(これが現在の動作だと思います)。

List Bの誰かがList BのTo:アドレスを使用して返信します。Discourseはコピーを受信し、「1234567890gmail」を含む「返信先」ヘッダーがあることを検出します。Discourseは、メールがList Bを反映したTo:行で受信されたことを確認し、末尾に文字を追加して「返信先」ヘッダーを「1234567890gmailListB」のように見せます。その後、これはList Aに対して分類されたメッセージとはもはや関連付けられないため、新しいメッセージとして正しいカテゴリに分類されます。

このアプローチは、同じメッセージIDが複数のメーリングリストで見つかる可能性のあるアーカイブの転送にも役立つ可能性があります。ユーザーが同時に複数のリストにメッセージを送信した場合です。インポート時に、すべてのメッセージIDフィールド(および返信先)に、メッセージがインデックス化されたときにアーカイブ間のクロスワードのようなものを防ぐために、名前付きメーリングリストに関連付けられた一意のテキストを追加できます。