(Ранее сообщалось через каналы безопасности, запрос был отклонен; теперь осуществляется публичное раскрытие в рамках процесса ответственного раскрытия)
Краткое описание / Запрос
Как пользователь, я хочу, чтобы изображения, размещенные по прямым ссылкам (hotlink) в чате, кэшировались на сервере и только после этого отображались у меня, чтобы защитить мой IP-адрес от злонамеренных серверов хостинга изображений. При этом я всё ещё хочу видеть кэшированное/проксируемое изображение!
В Discourse уже есть настройки для этого, но они не применяются корректно к чату. Если включить обе соответствующие настройки для прямой вставки (см. ниже), поведение должно быть таким же, как на форуме. То есть: изображение с внешнего хостинга загружается на сервер, и только после этого показывается пользователю.
Предыстория / Влияние
В старые времена интернет-форумов было очень популярно позволять пользователям вставлять изображения путем «прямой ссылки» (hotlinking) на внешние серверы, где эти изображения размещены.
Хотя это было довольно распространено на старых форумах, с развитием интернета мы поняли, что это плохая практика. Почти все социальные платформы эволюционировали, чтобы предотвратить это. Одной из причин было избежать проблем с битыми/потерянными изображениями или перегрузки небольших серверов, но также существует очень важное соображение безопасности:
Пользователь, публикующий изображение с внешнего сервера, загружает его с этого связанного сервера. Это позволяет злонамеренному внешнему серверу записать IP-адрес пользователя. Это крайне проблематично, поскольку, если сервер управляется злоумышленником, он теперь знает IP-адрес другого пользователя. (Представьте ситуацию, когда злоумышленник пишет вам, чтобы узнать ваш домашний IP).
Утечка IP-адреса может быть использована злоумышленником для определения реальной личности пользователя или для сканирования его домашнего роутера / ПК на наличие уязвимостей и т. д. Вы даже можете выполнить XSS-атаку на другом сайте, если на этом сайте есть уязвимости XSS.
Именно поэтому практически каждая крупная социальная сеть (Twitter, Discord, Facebook и т. д.) больше не использует прямые ссылки на изображения по соображениям безопасности. Каждое изображение с внешнего хостинга теперь кэшируется на сервере, а не загружается пользователем напрямую.
Соответствующие настройки Discourse
Discourse предоставляет две соответствующие настройки:
Block hotlinked media (Блокировать медиа по прямым ссылкам) заменит изображения по прямым ссылкам текстовой ссылкой.
Download remote images to local (Загружать удаленные изображения локально) преобразует изображения по прямым ссылкам в локально хранящиеся изображения.
Поведение настроек на форуме
При включении обеих настроек форум, судя по моим ограниченным тестам, работает как ожидалось. Внешние изображения преобразуются в локальные перед показом другим пользователям, защищая IP-адрес пользователя. Я не проводил обширных тестов на тайминговые атаки для подтверждения поведения, но хотя бы в моих ограниченных тестах всё работало корректно.
(Это то, что я ожидаю от любой современной социальной платформы, аналогично поведению на Twitter/Discord/Facebook и т. д.)
Поведение настроек в чате
В чате мне не удалось добиться аналогичного поведения. Ни одна комбинация настроек не дает удовлетворительных результатов:
При включении обеих настроек удаленное изображение преобразуется только в ссылку. Однако существует очень короткое окно времени, когда изображение всё ещё отображается другому пользователю и, следовательно, отправляет веб-запрос, раскрывая IP-адрес пользователя другому пользователю. Это по сути худший результат, так как IP-адрес пользователя раскрывается, и вы даже не видите изображение.
При отключении Block hotlinked media и включении Download remote images to local происходит просто прямая ссылка; похоже, что удаленное изображение на самом деле не загружается. Это не уязвимость, но похоже на баг.
При включении Block hotlinked media и отключении Download remote images to local наблюдается то же поведение, что и при включении обеих настроек. Оно отображается как ссылка вместо изображения — но изображение иногда загружается удаленным клиентом, раскрывая IP. (Я обнаружил, что иногда при первой отправке изображение блокируется, но при второй раз оно ненадолго не блокируется, либо происходят другие проблемы, вероятно, связанные с таймингами, которые случаются часто.)
(Перепроверено сегодня на development-сборке из git: 3.5.0.beta8-dev (2c0635ee4c))
Раскрытие / Ответ
Я сообщал об этом ранее (в 2024 году) по электронной почте и через HackerOne, но мне сказали, что это не проблема безопасности, и отчет о безопасности (2844784) был отклонен, к сожалению. Вот соответствующее заявление:
Спасибо за ваш отчет. После тщательного рассмотрения я закрываю его, так как описанное поведение является стандартной функциональностью веб-технологий, а не уязвимостью безопасности.
Когда браузер загружает любой внешний ресурс (изображения, скрипты и т. д.), он неизбежно отправляет запрос на хостинг-сервер. Этот сервер, естественно, увидит запрашивающий IP-адрес — это фундаментально для того, как работает интернет, и само по себе не считается уязвимостью безопасности. Хотя IP-адреса в некоторых контекстах могут считаться персональными данными, их раскрытие через стандартные веб-запросы является ожидаемым поведением, которое пользователи неявно принимают при просмотре интернета.
Защита от прямых ссылок в Discourse предназначена для предотвращения несанкционированного повторного использования размещенного контента, а не для скрытия IP-адресов пользователей от внешних серверов.
Это может быть и предполагаемым сценарием использования функции блокировки прямых ссылок, но я считаю, что игнорирование этого ставит пользователей плагина чата под угрозу — особенно в более беспокойных сообществах, где могут быть пользователи, которые попытаются найти домашний IP-адрес оппонента и совершить doxx/DDoS-атаку.
Я также возражаю против идеи, что пользователи неявно соглашаются на доступ к ненадежным URL-адресам с прямыми ссылками на доверенном сайте форума в современную эпоху. Я не буду комментировать последствия в контексте GDPR и т. д., так как не знаком с ними, но с точки зрения базовых ожиданий конфиденциальности это не ожидается, кроме как на очень старых форумах. Определенно не на современных.
Я уведомил о своем намерении публично опубликовать информацию об этой проблеме на этом форуме 22 ноября 2024 года и с тех пор не получил никакого ответа.
Я публикую это здесь, чтобы другие администраторы Discourse были осведомлены и, возможно, побудили инженерную команду улучшить защиту от прямых ссылок. Поскольку прошло много времени и улучшений не произошло, я публикую это добросовестно в надежде, что повышение осведомленности и, возможно, поддержка сообщества относительно важности этой проблемы приведут к улучшениям.
Спасибо за чтение ![]()