Пользователи могут узнавать IP-адреса других пользователей через плагин чата (исправлена защита от хотлинкинга)

(Ранее сообщалось через каналы безопасности, запрос был отклонен; теперь осуществляется публичное раскрытие в рамках процесса ответственного раскрытия)

Краткое описание / Запрос

Как пользователь, я хочу, чтобы изображения, размещенные по прямым ссылкам (hotlink) в чате, кэшировались на сервере и только после этого отображались у меня, чтобы защитить мой IP-адрес от злонамеренных серверов хостинга изображений. При этом я всё ещё хочу видеть кэшированное/проксируемое изображение!

В Discourse уже есть настройки для этого, но они не применяются корректно к чату. Если включить обе соответствующие настройки для прямой вставки (см. ниже), поведение должно быть таким же, как на форуме. То есть: изображение с внешнего хостинга загружается на сервер, и только после этого показывается пользователю.

Предыстория / Влияние

В старые времена интернет-форумов было очень популярно позволять пользователям вставлять изображения путем «прямой ссылки» (hotlinking) на внешние серверы, где эти изображения размещены.

Хотя это было довольно распространено на старых форумах, с развитием интернета мы поняли, что это плохая практика. Почти все социальные платформы эволюционировали, чтобы предотвратить это. Одной из причин было избежать проблем с битыми/потерянными изображениями или перегрузки небольших серверов, но также существует очень важное соображение безопасности:

Пользователь, публикующий изображение с внешнего сервера, загружает его с этого связанного сервера. Это позволяет злонамеренному внешнему серверу записать IP-адрес пользователя. Это крайне проблематично, поскольку, если сервер управляется злоумышленником, он теперь знает IP-адрес другого пользователя. (Представьте ситуацию, когда злоумышленник пишет вам, чтобы узнать ваш домашний IP).

Утечка IP-адреса может быть использована злоумышленником для определения реальной личности пользователя или для сканирования его домашнего роутера / ПК на наличие уязвимостей и т. д. Вы даже можете выполнить XSS-атаку на другом сайте, если на этом сайте есть уязвимости XSS.

Именно поэтому практически каждая крупная социальная сеть (Twitter, Discord, Facebook и т. д.) больше не использует прямые ссылки на изображения по соображениям безопасности. Каждое изображение с внешнего хостинга теперь кэшируется на сервере, а не загружается пользователем напрямую.

Соответствующие настройки Discourse

Discourse предоставляет две соответствующие настройки:

Block hotlinked media (Блокировать медиа по прямым ссылкам) заменит изображения по прямым ссылкам текстовой ссылкой.

Download remote images to local (Загружать удаленные изображения локально) преобразует изображения по прямым ссылкам в локально хранящиеся изображения.

Поведение настроек на форуме

:white_check_mark: При включении обеих настроек форум, судя по моим ограниченным тестам, работает как ожидалось. Внешние изображения преобразуются в локальные перед показом другим пользователям, защищая IP-адрес пользователя. Я не проводил обширных тестов на тайминговые атаки для подтверждения поведения, но хотя бы в моих ограниченных тестах всё работало корректно.

(Это то, что я ожидаю от любой современной социальной платформы, аналогично поведению на Twitter/Discord/Facebook и т. д.)

Поведение настроек в чате

В чате мне не удалось добиться аналогичного поведения. Ни одна комбинация настроек не дает удовлетворительных результатов:

:cross_mark: При включении обеих настроек удаленное изображение преобразуется только в ссылку. Однако существует очень короткое окно времени, когда изображение всё ещё отображается другому пользователю и, следовательно, отправляет веб-запрос, раскрывая IP-адрес пользователя другому пользователю. Это по сути худший результат, так как IP-адрес пользователя раскрывается, и вы даже не видите изображение.

:cross_mark: При отключении Block hotlinked media и включении Download remote images to local происходит просто прямая ссылка; похоже, что удаленное изображение на самом деле не загружается. Это не уязвимость, но похоже на баг.

:cross_mark: При включении 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 были осведомлены и, возможно, побудили инженерную команду улучшить защиту от прямых ссылок. Поскольку прошло много времени и улучшений не произошло, я публикую это добросовестно в надежде, что повышение осведомленности и, возможно, поддержка сообщества относительно важности этой проблемы приведут к улучшениям.


Спасибо за чтение :slight_smile:

3 лайка

Спасибо за подробный отчёт. Команда изучит его в ближайшие несколько недель и оценит, что потребуется для блокировки этого вектора.

Я согласен, что настройка сайта должна работать одинаково во всём продукте и не быть ограничена только темами.

3 лайка

Мне интересно, была ли эта ошибка уже устранена/исправлена? Похоже, что это серьёзная уязвимость в функционале чата, позволяющая каким-либо образом раскрывать IP-адреса. Спасибо!

2 лайка

Извините, что, возможно, поднимаю этот пост, но так как на этот вопрос до сих пор нет чёткого ответа, я хотел бы узнать, есть ли какие-то шаги, которые могли бы смягчить проблему?

1 лайк

Как удивительно, что я сообщил об этой уязвимости ещё в 2024 году, а она до сих пор не исправлена :sweat_smile:

1 лайк

Я бы согласился: для такой серьёзной проблемы, как раскрытие IP-адресов, действительно заслуживает хотя бы ответа от разработчиков. :thinking: Discourse — отличная программа, но это серьёзная проблема…

1 лайк