Утечка конфиденциальной информации: секрет клиента OAuth2 открыт в настройках администратора (не скрыт)

Описание проблемы

В ходе проверки безопасности нашего кастомизированного развертывания Discourse мы обнаружили потенциальную утечку конфиденциальной информации в интерфейсе Администрирование > Настройки, касающуюся секретов клиента OAuth2.

Детали

  • На странице конфигурации администратора секрет клиента OAuth2 (а также, возможно, другие конфиденциальные токены/ключи) отображается в открытом виде, а не маскируется (например, звездочками).

  • Администраторам требуется вводить секрет напрямую в открытом виде в настройки. Любой, у кого есть доступ к интерфейсу администратора, может увидеть весь секрет.

  • Если злоумышленник получит доступ (даже временно) к сессии администратора, он сможет легко получить секрет клиента и использовать его для несанкционированных запросов токенов OAuth2 или для подделки запросов к сторонним сервисам.

Влияние на безопасность

  • Отображение секретов в открытом виде в интерфейсе администратора повышает риск утечки учетных данных.

  • Отсутствие маскирования не соответствует лучшим практикам безопасности при работе с секретами.

  • Секреты/токены могут быть использованы для повышения привилегий, имперсонации или для дальнейших атак на интегрированные сервисы.

Вопросы

  • Планируется ли маскирование конфиденциальных полей, таких как секреты OAuth2, в интерфейсе настроек администратора (например, отображение как ****** с возможностью раскрытия при необходимости)?

  • Существуют ли рекомендуемые подходы или плагины для усиления защиты конфиденциальных учетных данных в развертываниях Discourse?

  • Обсуждалась ли эта проблема ранее? Существуют ли какие-либо временные решения до официального исправления?

Благодарим вас за внимание к этой важной проблеме безопасности!

Привет @Evie_Tao
Вы поднимаете множество вопросов безопасности. Подумали ли вы о том, чтобы сообщить о них через HackerOne, как это описано в репозитории GitHub?

Overview · discourse/discourse · GitHub

Мы не считаем утечку информации администраторам проблемой, но да, такие данные должны помечаться как конфиденциальные, чтобы они не отображались без необходимости, так же как, например, google_oauth2_client_secret.

Это простое исправление:

https://github.com/discourse/discourse-oauth2-basic/pull/136

Здесь есть компромисс между секретностью и удобством: запрет на раскрытие секретов в интерфейсе создаст лишь иллюзию недоступности, поскольку у администратора есть и другие способы легко прочитать их из базы данных.

Тем не менее, любые секреты (по сути, любые настройки сайта) можно указать через переменные окружения; в этом случае они не будут отображаться в интерфейсе администратора.

(правильно, @pmusaraj?)