decidim-verifications CVE-2026-45330
MEDIUMSeverity by source
AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N
PR:H required as attacker must be an authenticated platform admin; I:L added over vendor score because cross-tenant approve/reject modifies victim authorization state.
Primary rating from Vendor (https://github.com/decidim/decidim).
CVSS VectorVendor: https://github.com/decidim/decidim
Lifecycle Timeline
2DescriptionCVE.org
Description
The verification admin mutation flow allows accessing, verifying, and rejecting participants records from another tenant.
Technical description
The verification admin controllers loads pending_authorization_id with a raw Authorization.find(...) and then authorizes the record without checking whether it belongs to current_organization.
Reproduction steps:
- An org2 participant uploads their ID:
<img width="2184" height="1288" alt="decidim-verification-01" src="https://github.com/user-attachments/assets/c6713454-c787-4795-b852-3c2c672358d6" />
- An admin from another organisation, in this case org1, is able to open the ID from org2 by opening request 35, e.g
http://localhost:3001/admin/id_documents/pending_authorizations/35/confirmations/new
<img width="1539" height="1037" alt="decidim-verification-02" src="https://github.com/user-attachments/assets/6ed646de-a501-4964-8467-013ada55ce2d" />
- The admin then approves this request by looking up the ID in the picture (not shown in this image, but a real ID would expose this)
<img width="1542" height="652" alt="decidim-verification-03" src="https://github.com/user-attachments/assets/c7ee5bea-3fa2-43d9-8330-8d834f34a9af" />
- Now the request has been approved, which can be seen from the org2 participant authorizations page:
<img width="2279" height="720" alt="decidim-verification-04" src="https://github.com/user-attachments/assets/55ee1bab-d396-4e0f-803f-21dc31a2c125" />
Impact
A tenant admin can access, reject or approve another tenant's id_documents requests.
Patches
See https://github.com/decidim/decidim/pull/16666
Workarounds
Disable the "Identity documents" verification
Reference
OWASP A01:2021 Broken Access Control
Credits
This issue was discovered in a security audit organized by the Decidim Association and made by Radically Open Security against Decidim financed by NGI.
AnalysisAI
Cross-tenant IDOR in Decidim's verification admin flow exposes government-issued identity documents belonging to participants of one organization to administrators of a different tenant on the same instance. An authenticated admin of any tenant can enumerate sequential pending_authorization_id integers in the admin URL to view, approve, or reject ID document and postal-letter verification requests that belong to entirely separate organizations. The vulnerability was confirmed through a formal security audit and detailed reproduction steps are published in the GitHub advisory; no CISA KEV listing or independent exploit code exists at time of analysis.
Technical ContextAI
Decidim is an open-source Ruby on Rails participatory democracy platform deployed in multi-tenant mode where multiple organizations share a single database. The affected package is decidim-verifications (pkg:rubygems/decidim-verifications). The root cause is CWE-200 (Exposure of Sensitive Information): the admin controllers for id_documents confirmations, id_documents rejections, and postal_letter postages all load authorization records with a global unscoped ActiveRecord call - Authorization.find(params[:pending_authorization_id]) - rather than scoping the query to current_organization. Because authorization IDs are sequential integers shared across all tenants in the same database, any admin can reference another tenant's record by ID. The fix in PR #16666 introduces a new PendingAuthorizationLoader concern that replaces the bare find with Authorizations.new(organization: current_organization, name:, granted: false).query.find(id), enforcing tenant boundary at the query layer. The OWASP classification is A01:2021 Broken Access Control.
RemediationAI
Upgrade decidim-verifications to a patched release: version 0.30.9 for deployments on the 0.30.x line, 0.31.5 for the 0.31.x line, or 0.32.0 for the 0.32.x line. The fix is tracked in PR #16666 (https://github.com/decidim/decidim/pull/16666), which introduces the scoped PendingAuthorizationLoader concern across all three affected controllers. If an immediate gem upgrade is not feasible, the vendor-documented workaround is to disable the 'Identity documents' verification method in the Decidim system admin panel; this removes the vulnerable endpoint entirely but eliminates ID-document-based participant verification for all tenants on the instance as a side effect. The postal_letter verification controller carries the same flaw and is patched in the same PR, so both verification methods should be treated together when applying the workaround.
Same weakness CWE-200 – Information Exposure
View allSame technique Information Disclosure
View allShare
External POC / Exploit Code
Leaving vuln.today
GHSA-86fh-w43w-338c