(Segnalato in precedenza tramite canali di sicurezza, è stato rifiutato, ora si procede alla divulgazione pubblica seguendo un processo di divulgazione responsabile)
Riepilogo / Richiesta
Come utente, desidero che le immagini hotlinkate pubblicate in chat vengano memorizzate nella cache dal server e solo allora mostrate a me, al fine di proteggere il mio IP da un server di hosting di immagini di terze parti nefasto. Voglio comunque vedere l’immagine memorizzata nella cache/proxy!
Discourse ha già impostazioni per questo, ma non sono applicate correttamente alla chat. Avere entrambe le impostazioni di hotlinking pertinenti (sottostanti) abilitate dovrebbe comportarsi allo stesso modo del forum. Ovvero: l’immagine ospitata da terze parti viene scaricata sul server e solo allora mostrata all’utente.
Contesto / Impatto
Nei vecchi tempi dei forum Internet, era piuttosto popolare consentire agli utenti di pubblicare embed di immagini tramite “hotlinking” a server di terze parti che ospitavano le immagini.
Sebbene ciò fosse piuttosto comune nei forum più vecchi, con l’avanzare di Internet abbiamo imparato che si trattava di una cattiva pratica. Quasi tutte le piattaforme di social media si sono evolute per impedirlo. Parte del motivo era evitare problemi con immagini rotte/perse o sovraccarico di piccoli server, ma c’è anche una considerazione di sicurezza molto importante:
Un utente che pubblica un’immagine da un server esterno la scarica dal server collegato. Ciò consente a un server dannoso di terze parti di registrare l’IP dell’utente. Questo è piuttosto problematico poiché se il server è gestito da un utente nefasto, ora conosce l’IP dell’altro utente. (Immagina un caso in cui un utente nefasto ti invia un messaggio per scoprire il tuo IP di casa)
Un IP trapelato può essere utilizzato da una persona nefasta per determinare la vera identità dell’utente o per scansionare il suo router domestico/PC per vulnerabilità, ecc. Potresti persino essere in grado di eseguire un XSS con esso su un altro sito se l’altro sito ha vulnerabilità XSS.
Ecco perché quasi tutte le principali reti sociali (Twitter, Discord, Facebook, ecc.) non fanno più hotlinking di immagini per motivi di sicurezza. Ogni immagine di terze parti viene ora memorizzata nella cache sul server anziché essere scaricata direttamente dall’utente.
Impostazioni Discourse Pertinenti
Discourse fornisce due impostazioni pertinenti:
Blocca media hotlinked sostituirà le immagini hotlinked con un link di testo.
Scarica immagini remote in locale convertirà le immagini hotlinked in immagini memorizzate localmente.
Comportamento delle Impostazioni nel Forum
Con entrambe queste impostazioni abilitate, il forum sembra funzionare come previsto nei miei test limitati. Le immagini esterne vengono convertite in immagini locali prima di essere mostrate ad altri utenti, proteggendo l’IP dell’utente. Non ho provato attacchi temporali estensivi per verificare il comportamento, ma almeno nei miei test limitati ha funzionato correttamente.
(Questo è ciò che mi aspetterei per qualsiasi piattaforma social moderna, simile al comportamento su Twitter/Discord/Facebook ecc.)
Comportamento delle Impostazioni in Chat
Nella chat, non sono riuscito a ottenere un comportamento simile. Nessuna combinazione di impostazioni fornisce risultati soddisfacenti:
Avere entrambe le impostazioni abilitate converte l’immagine remota solo in un link. Tuttavia, c’è una finestra di tempo molto breve in cui l’immagine viene ancora mostrata all’altro utente e quindi effettua una richiesta web, esponendo l’IP dell’utente all’altro utente. Questo è fondamentalmente il peggior risultato, poiché l’IP dell’utente è esposto e non si vede nemmeno l’immagine.
Avere Blocca media hotlinked disabilitato e Scarica immagini remote in locale abilitato esegue solo un hotlink; non sembrava effettivamente scaricare l’immagine remota. Non è una vulnerabilità, ma sembra un bug.
Avere Blocca media hotlinked abilitato e Scarica immagini remote in locale disabilitato ha lo stesso comportamento di averli entrambi abilitati. Viene mostrato come un link invece di un’immagine, ma l’immagine viene talvolta scaricata dal client remoto, esponendo l’IP. (Ho scoperto che a volte la prima volta che l’immagine viene inviata veniva bloccata, ma la seconda volta brevemente non lo era, o altri problemi probabilmente legati al tempo che si verificavano frequentemente.)
(Ri-testato su un checkout di sviluppo da git oggi: 3.5.0.beta8-dev (2c0635ee4c))
Divulgazione / Risposta
Ho segnalato questo in precedenza (nel 2024) via e-mail e hackerone, ma mi è stato detto che non era un problema di sicurezza e il rapporto di sicurezza (2844784) è stato purtroppo rifiutato. Ecco la dichiarazione pertinente:
Grazie per la tua segnalazione. Dopo un’attenta revisione, chiudo questo perché il comportamento descritto è una funzionalità web standard piuttosto che una vulnerabilità di sicurezza.
Quando un browser carica qualsiasi risorsa esterna (immagini, script, ecc.), effettua necessariamente una richiesta al server di hosting. Questo server vedrà naturalmente l’indirizzo IP della richiesta, il che è fondamentale per il funzionamento di Internet e non è considerato una vulnerabilità di sicurezza di per sé. Sebbene gli indirizzi IP possano essere considerati dati personali in alcuni contesti, la loro esposizione tramite richieste web standard è un comportamento previsto che gli utenti accettano implicitamente quando navigano su Internet.
La protezione dall’hotlinking in Discourse è progettata per prevenire l’uso non autorizzato di contenuti ospitati, non per nascondere gli indirizzi IP degli utenti dai server esterni.
Questo potrebbe benissimo essere il caso d’uso previsto della funzionalità di blocco dell’hotlinking, ma penso che non affrontare questo problema metta a rischio gli utenti del plugin chat, specialmente nelle comunità più turbolente che potrebbero avere utenti che cercherebbero di trovare l’IP di casa di un nemico e fare doxxing/DDOS.
Mi oppongo anche all’idea che gli utenti acconsentano implicitamente ad accedere a URL hotlink non attendibili su un sito forum attendibile nell’era moderna. Non commenterò le implicazioni GDPR/ecc. poiché non le conosco, ma solo da una base di aspettativa di privacy, questo non è previsto tranne che nei forum molto vecchi. Sicuramente non quelli dell’era moderna.
Ho informato della mia intenzione di pubblicare pubblicamente su questo forum riguardo al problema il 22 novembre 2024 e da allora non ho più sentito nulla.
Sto pubblicando qui in modo che altri amministratori di discourse possano esserne consapevoli e, si spera, incoraggiare il miglioramento della protezione dall’hotlinking da parte del team di ingegneria. Poiché è passato molto tempo e non ci sono stati miglioramenti, sto pubblicando in buona fede nella speranza che la consapevolezza e forse l’incoraggiamento della comunità sull’importanza della questione portino a miglioramenti.
Grazie per aver letto ![]()