Discourse — дискуссионная платформа с открытым исходным кодом. До версий 2025.12.2, 2026.1.1 и 2026.2.0 уязвимость IDOR в конечной точке элементов каталога позволяла любому пользователю, включая анонимных пользователей, получать значения полей частного пользователя для всех пользователей в каталоге. Параметр `user_field_ids` в `DirectoryItemsController#index` принимает произвольные идентификаторы пользовательских полей без проверок авторизации, минуя ограничения видимости (`show_on_profile` / `show_on_user_card`), которые применяются в других местах (например, `UserCardSerializer` через `Guardian#allowed_user_field_ids`).
Злоумышленник может запросить GET /directory_items.json? period=all&user_field_ids=<id>` с любым идентификатором частного поля и получить значение этого поля для каждого пользователя в ответе каталога. Это обеспечивает массовую фильтрацию личных пользовательских данных, таких как номера телефонов, адреса или другие конфиденциальные настраиваемые поля, которые администраторы явно настроили как закрытые. Проблема исправлена в версиях 2025.12.2, 2026.1.1 и 2026.2.0 путем фильтрации `user_field_ids` по `UserField.public_fields` для пользователей, не являющихся сотрудниками, перед созданием карты настраиваемых полей.
В качестве обходного пути администраторы сайта могут удалить конфиденциальные данные из частных пользовательских полей или отключить каталог пользователя с помощью настройки сайта `enable_user_directory`.
Показать оригинальное описание (EN)
Discourse is an open source discussion platform. Prior to versions 2025.12.2, 2026.1.1, and 2026.2.0, an IDOR vulnerability in the directory items endpoint allows any user, including anonymous users, to retrieve private user field values for all users in the directory. The `user_field_ids` parameter in `DirectoryItemsController#index` accepts arbitrary user field IDs without authorization checks, bypassing the visibility restrictions (`show_on_profile` / `show_on_user_card`) that are enforced elsewhere (e.g., `UserCardSerializer` via `Guardian#allowed_user_field_ids`). An attacker can request `GET /directory_items.json?period=all&user_field_ids=<id>` with any private field ID and receive that field's value for every user in the directory response. This enables bulk exfiltration of private user data such as phone numbers, addresses, or other sensitive custom fields that admins have explicitly configured as non-public. The issue is patched in versions 2025.12.2, 2026.1.1, and 2026.2.0 by filtering `user_field_ids` against `UserField.public_fields` for non-staff users before building the custom field map. As a workaround, site administrators can remove sensitive data from private user fields, or disable the user directory via the `enable_user_directory` site setting.
Характеристики атаки
Последствия
Строка CVSS v3.1