🇰🇷 한글 설명
Discourse 오픈소스 토론 플랫폼의 discourse-policy 플러그인에서 인증된 사용자가 권한이 없는 게시물의 정책을 조작할 수 있는 취약점이 발견되었습니다. PolicyController가 게시물 접근 권한을 검증하지 않고 ID로 게시물을 로드하여, 비공개 카테고리나 개인 메시지의 정책을 변경하거나 게시물 ID를 열거할 수 있습니다.
💡 쉬운 설명
로그인한 사용자라면 자신이 볼 수 없는 비밀 게시물의 규칙을 마음대로 바꾸거나, 어떤 게시물이 존재하는지 알아낼 수 있는 보안 결함입니다. 이로 인해 개인적인 대화나 비공개 글의 내용이 노출될 위험이 있습니다.
🇺🇸 원문 (English)
Discourse is an open source discussion platform. Prior to versions 2025.12.2, 2026.1.1, and 2026.2.0, `discourse-policy` plugin allows any authenticated user to interact with policies on posts they do not have permission to view. The `PolicyController` loads posts by ID without verifying the current user's access, enabling policy group members to accept/unaccept policies on posts in private categories or PMs they cannot see and any authenticated user to enumerate which post IDs have policies attached via differentiated error responses (information disclosure). The issue is patched in versions 2025.12.2, 2026.1.1, and 2026.2.0 by adding a `guardian.can_see?(@post)` check in the `set_post` before_action, ensuring post visibility is verified before any policy action is processed. As a workaround, disabling the discourse-policy plugin (`policy_enabled = false`) eliminates the vulnerability. There is no other workaround without upgrading.
📍 영향받는 시스템
Discourse versions prior to 2025.12.2, 2026.1.1, and 2026.2.0 (with discourse-policy plugin)
⚔️ 공격 벡터
인증된 사용자가 권한이 없는 게시물의 ID를 이용해 PolicyController에 직접 요청을 보내는 방식
🛡️ 대응 방법
Discourse를 2025.12.2, 2026.1.1 또는 2026.2.0 이상의 버전으로 업데이트하거나, discourse-policy 플러그인을 비활성화하십시오.
🔧 검증 코드
출력된 Discourse 관련 패키지 버전이 취약한 버전 범위(2025.12.2, 2026.1.1, 2026.2.0 미만)에 해당하는지 확인하십시오.
gem list | grep discourse