Bug mirroring mailing list con implicazioni di sicurezza

Ho trovato un bug interessante e oscuro riguardo al modo in cui le risposte ai post inviati alle mailing list che vengono specchiate su Discourse vengono archiviate.

Ho prove che le risposte a una mailing list possono essere archiviate in modo errato in una seconda mailing list (con un pubblico diverso) se l’e-mail iniziale è stata inviata contemporaneamente a entrambe le mailing list.

Immagina di far parte di due mailing list, A e B, iscritto con il mio indirizzo Gmail. Hanno potenzialmente diversi destinatari. Il server di posta invia una singola copia di un messaggio a coloro che sono iscritti a entrambe le mailing list, ma la riga To: indica che il messaggio è stato inviato alle liste A e B nella stessa e-mail. Questa e-mail arriva al mio indirizzo Gmail che, tramite un filtro, inoltra una copia a listA@mydiscourse.org.uk, con Gmail che sceglie una delle due liste nella riga To:. Gmail è impostato per inoltrare i post ad A a listA@mydiscourse.org.uk e i post a B a listB@mydiscourse.org.uk. Discourse è configurato con due categorie con questi due diversi indirizzi e-mail in ingresso di mirroring (listA@mydiscourse.org.uk e listB@mydiscourse.org.uk).

Il problema dell’invio di una sola copia da parte del server di posta e di Gmail è separato e non è oggetto di questo bug.

Dopo questo, una copia dell’e-mail inviata a me al mio account Gmail finisce per essere visualizzata nella categoria associata all’indirizzo di posta in ingresso listA@mydiscourse.org.uk dopo che Gmail l’ha inoltrata.

Tutto bene finora (a parte il fatto che è arrivata solo un’e-mail dal server di posta in primo luogo).

Ora, un utente separato, che fa parte solo della mailing list B, risponde a quell’e-mail al server di posta. Il server di posta invia quel messaggio a tutti gli iscritti alla mailing list B. Questo arriva al mio indirizzo Gmail con una riga To: che indica che è stato inviato alla lista B. Gmail lo inoltra a listB@mydiscourse.org.uk.

Ma poi Discourse lo archivia come se fosse stato inviato via e-mail a listA@mydiscourse.org.uk!

Ciò rivela quindi a coloro che hanno accesso alla lista A il contenuto di un post di un membro della lista B!

Sospetto che Discourse ignori il percorso che l’e-mail ha seguito per entrare in Discourse e l’abbia archiviata in base ai flag dell’ID del messaggio nelle intestazioni, aggirando così il percorso di ingresso.

L’e-mail originale, inviata ad A e B, ha un singolo ID del messaggio al suo interno e sospetto che si verifichi un archiviazione basata solo su quell’ID del messaggio.

Se il mittente originale avesse scritto due e-mail separate alla lista A e alla lista B, questo problema non si sarebbe verificato poiché i due messaggi avrebbero avuto i propri ID di messaggio.

Correzione suggerita: Se una categoria sta specchiando una mailing list e un messaggio arriva tramite l’indirizzo di mirroring che, dalle intestazioni, sembra essere in risposta a un altro post che si trova altrove su Discourse, allora è necessario creare un nuovo post (forse senza un genitore ovvio) nella categoria prevista, anziché far finire la risposta in una categoria associata a una mailing list diversa.

Infatti, o:

Penso che sia l’oggetto di questo bug. Questo dovrebbe essere risolto nel listserver, non in Discourse.

1 Mi Piace

Non sono sicuro di essermi spiegato bene, dato che non riesco a capire perché Discourse dovrebbe mettere un post nella categoria sbagliata. È come se non stesse guardando il percorso in (che dovrebbe avere la priorità) ma solo l’ID del messaggio. Per una singola e-mail inviata contemporaneamente a due mailing list ci sarà un ID messaggio ma con due liste di distribuzione (che sono indipendenti), due indirizzi ‘To:’ e due indirizzi ‘Reply-To:’ (con uno diverso mostrato su ciascuno dei messaggi a seconda della lista a cui è stato inviato).

Se è così, cosa succederebbe se qualcuno spostasse un argomento da una categoria che era uno specchio di una mailing list, e lo mettesse altrove su Discourse, ma poi le risposte (tramite la mailing list) continuassero ad arrivare? Discourse aggiungerebbe quelle risposte alla categoria associata alla mailing list (anche se il post originale potrebbe essere stato spostato altrove) o tutte le risposte finirebbero magicamente nella categoria a cui l’argomento era stato spostato?

Discourse può gestire due messaggi in due categorie contemporaneamente che hanno lo stesso ID messaggio (ma indirizzi ‘To:’ diversi)?

Indipendentemente da come Discourse gestisce questo, un Message-ID dovrebbe essere univoco. A mio parere, quando un listserver invia un messaggio a una mailing list, crea una nuova istanza di quel messaggio e quindi dovrebbe riscrivere l’ID del messaggio.

Inoltre, non riesco a capire come il messaggio originale potesse essere adatto sia ai membri della lista A che della lista B, ma la risposta del membro della lista B non potesse essere rivelata ai membri della lista A. Se quei pubblici sono così diversi, perché l’utente invia gli stessi messaggi a entrambe le liste contemporaneamente?

Forse esiste una buona soluzione tecnica per questo e forse Discourse può essere modificato in modo che gestisca questo correttamente, ma trovo questo un caso limite davvero strano in una tecnologia di 36 anni.

Si potrebbe sostenere che, poiché il messaggio è lo stesso, ha un singolo message-id. Infatti, per l’esempio in questione, l’autore originale ha composto il messaggio in Gmail (che ha assegnato il message-id) ed è stato inviato a due indirizzi listserv sullo stesso server. Questo non è raro, ad esempio, potrebbe essere un comunicato stampa comune a manager e clinici, ognuno dei quali siede nelle proprie mailing list. Potrebbe esserci una questione medica all’interno del comunicato stampa che necessita di discussione, quindi un clinico potrebbe rispondere (e l’indirizzo Reply-to: sarebbe stato impostato sulla lista dei clinici anche se l’intestazione To: conteneva ancora entrambe le mailing list menzionate). Allo stesso modo, i manager potrebbero voler discutere la propria visione della notizia. Risponderebbero e l’intestazione Reply-to: pertinente verrebbe utilizzata per riflettere la lista dei manager. Se un poster avesse utilizzato gli indirizzi To: facendo un “rispondi a tutti”, sarebbe stato generato un messaggio di rimbalzo dalla lista di cui non era membro.

Il comportamento sopra descritto non è poi così insolito, ma sembra che Discourse non riesca a gestirlo correttamente se utilizzato come specchio di una mailing list e a mantenere separate le risposte biforcate, poiché saranno tutte collegate all’originale message-id e alla categoria in cui è apparso per primo quel post.

Ciò potrebbe significare che i manager potrebbero vedere i post dei clinici, ad esempio, se il clinico, rispondendo alla lista dei clinici, avesse quel post apparire nello specchio della lista dei manager a causa del modo in cui Discourse archivia i messaggi.

Una soluzione potrebbe essere quella di controllare ogni indirizzo nell’intestazione To: dei messaggi in arrivo per vedere se corrisponde a un indirizzo di specchio della mailing list in ciascuna delle impostazioni della Categoria. Se corrispondesse, una copia del messaggio potrebbe essere pubblicata in ogni categoria corrispondente, e potrebbero esserci potenzialmente diverse copie del post in categorie diverse. Quindi, se arrivassero delle risposte, il message-id potrebbe essere utilizzato, come avviene attualmente, ma solo se la riga To: corrispondesse anche alla categoria.

Potrebbe una soluzione consistere nell’opzione di riscrivere il message-id per riflettere l’ID originale creato dal client di posta del mittente più un identificatore aggiuntivo, ad esempio l’indirizzo To: della mailing list che Discourse già cerca? Ciò significherebbe che se un post provenisse dalla mailing list B ma facesse riferimento a un header message-id che era presente anche in un post della mailing list A, verrebbe archiviato correttamente da Discourse?

Ad esempio. L’email originale inviata contemporaneamente a due mailing list A e B ha un message-id univoco ‘1234567890gmail’.

Discourse riceve due copie inoltrate all’indirizzo generico di ingresso di Discourse. Il primo messaggio viene archiviato in base all’indirizzo To: che è per la Lista A e il message-id ottiene caratteri aggiuntivi aggiunti da Discourse per diventare ‘1234567890gmailListA’. Il secondo messaggio non viene archiviato poiché sembra un duplicato. (Penso che questo sia il comportamento attuale).

Qualcuno sulla Lista B risponde utilizzando l’indirizzo To: per la Lista B. Discourse riceve una copia e nota che c’è un header in risposta a che contiene ‘1234567890gmail’. Discourse, vedendo che l’email è arrivata con una riga To: che riflette la Lista B, aggiunge caratteri alla fine per far sì che l’header in risposta a sembri ‘1234567890gmailListB’. Quindi procede ad archiviare questo come un nuovo messaggio nella categoria corretta poiché non è più collegato al messaggio che è stato archiviato per la Lista A.

Questo approccio potrebbe funzionare anche per il trasferimento di archivi dove lo stesso message-id potrebbe essere trovato in diverse mailing list se un utente ha inviato il messaggio a diverse liste contemporaneamente. Al momento dell’importazione, tutti i campi message-id (e in risposta a) potrebbero avere testo univoco aggiunto collegato alla mailing list nominata per interrompere una sorta di interferenza tra archivi quando i messaggi vengono indicizzati.