(Rapporté précédemment via les canaux de sécurité, a été rejeté, maintenant divulgation publique suite à un processus de divulgation responsable)
Résumé / Demande
En tant qu’utilisateur, je souhaite que les images hotlinkées postées dans le chat soient mises en cache par le serveur, puis seulement affichées pour moi, afin de protéger ma propriété intellectuelle contre un serveur d’hébergement d’images tiers malveillant. Je veux toujours voir l’image mise en cache/proxifiée, cependant !
Discourse dispose déjà de paramètres pour cela, mais ils ne sont pas correctement appliqués au chat. Avoir les deux paramètres de hotlinking pertinents (ci-dessous) activés devrait agir de la même manière que le forum. C’est-à-dire : l’image hébergée par un tiers est téléchargée sur le serveur, puis seulement affichée à l’utilisateur.
Contexte / Impact
Dans les temps anciens des forums Internet, il était très populaire de laisser les utilisateurs poster des images intégrées en “hotlinkant” vers des serveurs tiers hébergeant les images.
Bien que cela ait été très courant avec les anciens forums, à mesure qu’Internet a progressé, nous avons appris que c’était une mauvaise pratique. Presque toutes les plateformes de médias sociaux ont évolué pour empêcher cela. Une partie de la raison était d’éviter les problèmes d’images cassées/perdues, ou de surcharger de petits serveurs, mais il y a aussi une considération de sécurité très importante :
Un utilisateur postant une image d’un serveur externe la télécharge depuis le serveur lié. Cela permet à un serveur tiers malveillant d’enregistrer l’adresse IP de l’utilisateur. C’est très problématique car si le serveur est géré par un utilisateur malveillant, il connaît maintenant l’adresse IP de l’autre utilisateur. (Imaginez un cas où un utilisateur malveillant vous envoie un message pour découvrir votre adresse IP personnelle)
Une adresse IP divulguée peut être utilisée par une personne malveillante pour déterminer la véritable identité de l’utilisateur ou pour scanner son routeur domestique / PC à la recherche de vulnérabilités, etc. Vous pourriez même être en mesure de faire un XSS avec cela sur un autre site si l’autre site a des vulnérabilités XSS.
C’est pourquoi presque tous les grands réseaux sociaux (Twitter, Discord, Facebook, etc.) ne font plus de hotlinking d’images pour des raisons de sécurité. Chaque image tierce est maintenant mise en cache sur le serveur au lieu que l’utilisateur la télécharge directement.
Paramètres Discourse pertinents
Discourse fournit deux paramètres pertinents :
Bloquer les médias hotlinkés remplacera les images hotlinkées par un lien texte à la place.
Télécharger les images distantes en local convertira les images hotlinkées en images stockées localement.
Comportement des paramètres sur le forum
Avec ces deux paramètres activés, le forum semble fonctionner comme prévu lors de mes tests limités. Les images externes sont converties en images locales avant d’être montrées aux autres utilisateurs, protégeant ainsi l’adresse IP de l’utilisateur. Je n’ai pas effectué d’attaques temporelles approfondies pour vérifier le comportement, mais au moins dans mes tests limités, cela a fonctionné correctement.
(C’est ce que j’attendrais de toute plateforme sociale moderne, similaire au comportement sur Twitter/Discord/Facebook, etc.)
Comportement des paramètres dans le chat
Dans le chat, je n’ai pas pu obtenir un comportement similaire. Aucune combinaison de paramètres ne donne de résultats satisfaisants :
Avoir les deux paramètres activés convertit l’image distante en un simple lien. Cependant, il y a une très courte fenêtre de temps pendant laquelle l’image est toujours montrée à l’autre utilisateur et effectue donc une requête web, exposant l’adresse IP de l’utilisateur à l’autre utilisateur. C’est fondamentalement le pire résultat, car l’adresse IP de l’utilisateur est exposée et vous ne voyez même pas l’image.
Avoir Bloquer les médias hotlinkés désactivé et Télécharger les images distantes en local activé fait simplement un hotlink ; il ne semblait pas réellement télécharger l’image distante. Ce n’est pas une vulnérabilité, mais cela semble être un bug.
Avoir Bloquer les médias hotlinkés activé et Télécharger les images distantes en local désactivé a le même comportement que de les avoir tous les deux activés. Il s’affiche comme un lien au lieu d’une image – mais l’image est parfois récupérée par le client distant, exposant l’adresse IP. (J’ai trouvé que parfois la première fois que l’image est envoyée, elle était bloquée, mais la deuxième fois brièvement pas, ou d’autres problèmes probablement liés au timing se produisant fréquemment.)
(Re-testé sur un checkout de développement depuis git aujourd’hui : 3.5.0.beta8-dev (2c0635ee4c))
Divulgation / Réponse
J’ai signalé cela précédemment (en 2024) par e-mail et sur HackerOne, mais on m’a dit que ce n’était pas un problème de sécurité et que le rapport de sécurité (2844784) a été rejeté, malheureusement. Voici la déclaration pertinente :
Merci pour votre rapport. Après un examen attentif, je ferme ceci car le comportement décrit est une fonctionnalité web standard plutôt qu’une vulnérabilité de sécurité.
Lorsqu’un navigateur charge une ressource externe (images, scripts, etc.), il effectue nécessairement une requête vers le serveur d’hébergement. Ce serveur verra naturellement l’adresse IP de la requête - c’est fondamental dans le fonctionnement d’Internet et n’est pas considéré comme une vulnérabilité de sécurité en soi. Bien que les adresses IP puissent être considérées comme des données personnelles dans certains contextes, leur exposition via des requêtes web standard est un comportement attendu que les utilisateurs acceptent implicitement lorsqu’ils naviguent sur Internet.
La protection contre le hotlinking dans Discourse est conçue pour empêcher la réutilisation non autorisée de contenu hébergé, et non pour masquer les adresses IP des utilisateurs aux serveurs externes.
C’est peut-être bien le cas d’utilisation prévu de la fonctionnalité de blocage du hotlinking, mais je pense que ne pas résoudre ce problème expose les utilisateurs du plugin de chat à des risques – en particulier dans les communautés plus turbulentes qui peuvent avoir des utilisateurs qui essaieraient de trouver l’adresse IP d’un ennemi pour le doxxer/DDOSer.
Je m’oppose également à l’idée que les utilisateurs consentent implicitement à accéder à des URL hotlink non fiables sur un site de forum fiable à l’ère moderne. Je ne commenterai pas les implications du RGPD/etc car je ne les connais pas, mais d’un point de vue de base de la vie privée, ce n’est pas attendu sauf sur de très anciens forums. Certainement pas sur ceux de l’ère moderne.
J’ai informé de mon intention de publier publiquement sur ce forum à ce sujet le 22 novembre 2024 et je n’ai rien entendu depuis.
Je publie ici afin que d’autres administrateurs de Discourse soient au courant et encouragent, espérons-le, l’amélioration de la protection contre le hotlinking par l’équipe d’ingénierie. Comme cela fait longtemps et qu’aucune amélioration n’a été apportée, je publie de bonne foi dans l’espoir que la sensibilisation et peut-être les encouragements de la communauté sur l’importance du problème apporteront une amélioration.
Merci de votre lecture ![]()