(Anteriormente reportado através de canais de segurança, foi rejeitado, agora fazendo divulgação pública seguindo um processo de divulgação responsável)
Resumo / Solicitação
Como usuário, quero que as imagens hotlinked postadas no chat sejam cacheadas pelo servidor e, somente então, exibidas para mim, a fim de proteger meu IP de um servidor malicioso de hospedagem de imagens de terceiros. Ainda quero ver a imagem cacheada/proxy, no entanto!
O Discourse já possui configurações para isso, mas elas não são aplicadas corretamente ao chat. Ter ambas as configurações relevantes de hotlinking (abaixo) habilitadas deve funcionar da mesma forma que o fórum. Ou seja: a imagem hospedada por terceiros é baixada para o servidor e, somente então, exibida ao usuário.
Contexto / Impacto
Nos tempos antigos dos fóruns de internet, era bastante popular permitir que os usuários postassem embeds de imagens “hotlinkando” para servidores de terceiros que hospedavam as imagens.
Embora isso fosse comum em fóruns mais antigos, à medida que a internet avançou, aprendemos que essa era uma má prática. Quase todas as plataformas de mídia social evoluíram para impedir isso. Parte do motivo foi evitar problemas com imagens quebradas/perdidas ou sobrecarregar servidores pequenos, mas há também uma consideração de segurança muito importante:
Um usuário postando uma imagem de um servidor externo a baixa do servidor vinculado. Isso permite que um servidor malicioso de terceiros registre o IP do usuário. Isso é bastante problemático, pois se o servidor for operado por um usuário malicioso, ele agora conhecerá o IP do outro usuário. (Imagine um caso em que um usuário malicioso lhe envia uma mensagem para descobrir seu IP doméstico)
Um IP vazado pode ser usado por uma pessoa maliciosa para determinar a verdadeira identidade do usuário ou para escanear seu roteador doméstico/PC em busca de vulnerabilidades, etc. Você pode até conseguir fazer um XSS com ele em outro site se o outro site tiver alguma vulnerabilidade XSS.
É por isso que praticamente todas as grandes redes sociais (Twitter, Discord, Facebook, etc.) não fazem mais hotlinking de imagens por motivos de segurança. Todas as imagens de terceiros agora são cacheadas no servidor em vez de o usuário baixá-las diretamente.
Configurações Relevantes do Discourse
O Discourse oferece duas configurações relevantes:
Block hotlinked media substituirá imagens hotlinked por um link de texto.
Download remote images to local converterá imagens hotlinked em imagens armazenadas localmente.
Comportamento das Configurações no Fórum
Com ambas essas configurações habilitadas, o fórum parece funcionar como esperado em meus testes limitados. Imagens externas são convertidas em imagens locais antes de serem exibidas a outros usuários, protegendo o IP do usuário. Não fiz ataques de tempo extensivos para verificar o comportamento, mas pelo menos em meus testes limitados funcionou corretamente.
(Este é o que eu esperaria para qualquer plataforma social moderna, semelhante ao comportamento no Twitter/Discord/Facebook etc.)
Comportamento das Configurações no Chat
No chat, não consegui obter um comportamento semelhante. Nenhuma combinação de configurações produz resultados satisfatórios:
Ter ambas as configurações habilitadas converte a imagem remota apenas em um link. No entanto, há uma janela de tempo muito curta em que a imagem ainda é exibida para o outro usuário e, portanto, faz uma solicitação da web, expondo o IP do usuário ao outro usuário. Este é basicamente o pior resultado, pois o IP do usuário é exposto e você nem consegue ver a imagem.
Ter Block hotlinked media desabilitado e Download remote images to local habilitado apenas faz um hotlink; não pareceu realmente baixar a imagem remota. Não é uma vulnerabilidade, mas parece um bug.
Ter Block hotlinked media habilitado e Download remote images to local desabilitado tem o mesmo comportamento de tê-los ambos habilitados. Ele é exibido como um link em vez de uma imagem - mas a imagem é às vezes baixada pelo cliente remoto, expondo o IP. (Descobri que às vezes, na primeira vez que a imagem é enviada, ela bloqueava, mas na segunda vez brevemente não, ou outros problemas provavelmente relacionados ao tempo ocorrendo com frequência.)
(Re-testado em um checkout de desenvolvimento do git hoje: 3.5.0.beta8-dev (2c0635ee4c))
Divulgação / Resposta
Eu relatei isso anteriormente (em 2024) por e-mail e hackerone, mas me disseram que não era um problema de segurança e o relatório de segurança (2844784) foi rejeitado, infelizmente. Aqui estava a declaração relevante:
Obrigado pelo seu relatório. Após uma análise cuidadosa, estou fechando isso, pois o comportamento descrito é funcionalidade padrão da web, em vez de uma vulnerabilidade de segurança.
Quando um navegador carrega qualquer recurso externo (imagens, scripts, etc.), ele necessariamente faz uma solicitação ao servidor de hospedagem. Este servidor naturalmente verá o endereço IP solicitante - isso é fundamental para como a internet funciona e não é considerado uma vulnerabilidade de segurança por si só. Embora os endereços IP possam ser considerados dados pessoais em alguns contextos, sua exposição através de solicitações web padrão é um comportamento esperado que os usuários implicitamente aceitam ao navegar na internet.
A proteção contra hotlinking no Discourse foi projetada para impedir o uso não autorizado de conteúdo hospedado, não para ocultar endereços IP de usuários de servidores externos.
Este pode muito bem ser o caso de uso pretendido do recurso de bloqueio de hotlinking, mas acho que não resolver isso coloca os usuários do plugin de chat em risco - especialmente em comunidades mais agitadas que podem ter usuários que tentariam encontrar o IP doméstico de um inimigo e fazer doxxing/DDOS.
Também me oponho à ideia de que os usuários consentem implicitamente em acessar URLs de hotlink não confiáveis em um site de fórum confiável na era moderna. Não comentarei sobre implicações de GDPR/etc, pois não as conheço, mas apenas de uma expectativa básica de privacidade, isso não é esperado, exceto em fóruns muito antigos. Definitivamente não os da era moderna.
Informei sobre minha intenção de postar publicamente neste fórum sobre o problema em 22 de novembro de 2024 e não ouvi mais nada desde então.
Estou postando aqui para que outros administradores do Discourse possam estar cientes e, esperançosamente, incentivar a melhoria da proteção contra hotlinking pela equipe de engenharia. Como já se passou muito tempo e nenhuma melhoria, estou postando de boa fé na esperança de que a conscientização e talvez o encorajamento da comunidade sobre a importância do problema trarão melhorias.
Obrigado por ler ![]()