уязвимость безопасности ![]()
TL;DR: Установка этого плагина — даже в отключенном состоянии — приводит к утечке всех пользовательских полей темы для любого, кто имеет доступ к теме, включая анонимных пользователей. В зависимости от других установленных плагинов, пользовательские поля темы могут содержать конфиденциальные данные.
При проверке этого плагина для клиента мы обнаружили ряд проблем безопасности. Мы исправили эти проблемы в нашем форке (https://github.com/communiteq/discourse-topic-trade-buttons/tree/master) и отправили запрос на слияние. Однако автор темы не ответил ни на наш запрос на слияние, ни на наше личное сообщение, поэтому мы теперь раскрываем эти проблемы.
Исправление безопасности: утечка информации
Все пользовательские поля (включая те, что добавлены другими плагинами!) сериализуются, в том числе для анонимных пользователей. Пользовательские поля могут содержать конфиденциальные данные и никогда не должны сериализоваться таким образом.
Поскольку значения вроде sold_at и аналогичные устанавливаются на стороне сервера, а кнопки «вычисляются» на основе topic.archived, логику работы с пользовательскими полями можно убрать из фронтенд-кода, видимого пользователям. Сериализация пользовательских полей потребуется только для работы административного интерфейса — следовательно, её можно ограничить только администраторами. Мы также подозреваем, что даже это может быть излишним.
Исправления инициализации
Проверка if SiteSetting.topic_trade_buttons_enabled, которая ограничивает логику сериализации, вынуждает перезапускать Discourse после включения или отключения плагина. Эта проверка избыточна, поскольку Discourse уже сам обрабатывает это.
Использование respect_plugin_enabled: false излишне и усугубляет описанную выше проблему безопасности.