Description
Discourse is an open-source discussion platform. Prior to versions 2026.3.0-latest.1, 2026.2.1, and 2026.1.2, an authorization bypass in the poll plugin allowed authenticated users to vote on, remove votes from, or toggle the open/closed status of polls they did not have access to. By passing post_id as an array (e.g. post_id[]=&post_id[]=), the authorization check resolves to the accessible post while the poll lookup resolves to a different post's poll. This affects the vote, remove_vote, and toggle_status endpoints in DiscoursePoll::PollsController. Versions 2026.3.0-latest.1, 2026.2.1, and 2026.1.2 contain a patch.
Published: 2026-03-20
Score: 5.3 Medium
EPSS: < 1% Very Low
KEV: No
Impact: Unauthorized Poll Manipulation
Action: Patch Immediately
AI Analysis

Impact

The vulnerability in Discourse’s poll plugin allows an authenticated user to manipulate polls they do not have permission to affect. By submitting the post identifier as an array parameter, the system resolves the authorization check against a reachable post while the poll lookup references a separate post’s poll. This enables voting, removing votes, and toggling the open or closed status of unauthorized polls. The weakness is a combination of improper input validation (CWE‑20) and flawed authorization checks (CWE‑863). The result is the potential for users to corrupt poll results or deny proper moderation control, thereby undermining the integrity of discussions that rely on poll outcomes.

Affected Systems

Discourse forums running any version of the platform before 2026.3.0‑latest.1, 2026.2.1, or 2026.1.2 are affected. These installations use the DiscoursePoll plugin and have not yet applied the patch that moves the poll lookup into the authorized context. Versions 2026.3.0‑latest.1 and earlier that do not include the fix are vulnerable, while the indicated patched releases contain the remediation.

Risk and Exploitability

The CVSS score of 5.3 indicates a moderate impact, while the EPSS probability of exploitation is below 1% and the vulnerability is not listed in the CISA KEV catalog. Exploitation requires an authenticated user with any level of access to the forum, who can perform crafted API calls to the vote, remove_vote, or toggle_status endpoints. The post_id array trick allows the attacker to bypass authorization checks. Although the likelihood of widespread use is low, an attacker with legitimate credentials can bias survey results or subvert moderation decisions, constituting a significant risk to any organization that relies on poll integrity.

Generated by OpenCVE AI on March 24, 2026 at 21:32 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Apply the official patch to upgrade to Discourse 2026.3.0‑latest.1, 2026.2.1, or 2026.1.2
  • If an immediate upgrade is not possible, restrict poll voting permissions or disable the poll plugin to prevent unauthorized access to poll endpoints
  • Monitor user activity for anomalous voting patterns and review poll integrity logs to detect potential abuse

Generated by OpenCVE AI on March 24, 2026 at 21:32 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 24 Mar 2026 20:30:00 +0000

Type Values Removed Values Added
CPEs cpe:2.3:a:discourse:discourse:*:*:*:*:*:*:*:*
cpe:2.3:a:discourse:discourse:2026.3.0:*:*:*:latest:*:*:*

Fri, 20 Mar 2026 16:15:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Fri, 20 Mar 2026 09:00:00 +0000

Type Values Removed Values Added
First Time appeared Discourse
Discourse discourse
Vendors & Products Discourse
Discourse discourse

Fri, 20 Mar 2026 03:15:00 +0000

Type Values Removed Values Added
Description Discourse is an open-source discussion platform. Prior to versions 2026.3.0-latest.1, 2026.2.1, and 2026.1.2, an authorization bypass in the poll plugin allowed authenticated users to vote on, remove votes from, or toggle the open/closed status of polls they did not have access to. By passing post_id as an array (e.g. post_id[]=&post_id[]=), the authorization check resolves to the accessible post while the poll lookup resolves to a different post's poll. This affects the vote, remove_vote, and toggle_status endpoints in DiscoursePoll::PollsController. Versions 2026.3.0-latest.1, 2026.2.1, and 2026.1.2 contain a patch.
Title Discourse has a poll authorization bypass via post_id array parameter
Weaknesses CWE-20
CWE-863
References
Metrics cvssV3_1

{'score': 5.3, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N'}


Subscriptions

Discourse Discourse
cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-03-20T15:46:27.399Z

Reserved: 2026-03-09T16:33:42.913Z

Link: CVE-2026-31805

cve-icon Vulnrichment

Updated: 2026-03-20T15:46:23.076Z

cve-icon NVD

Status : Analyzed

Published: 2026-03-20T03:15:59.350

Modified: 2026-03-24T20:17:35.913

Link: CVE-2026-31805

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-03-25T14:09:32Z

Weaknesses