Skip to content

GHSA-w3q8-m492-4pwp CVE-2023-48220

Possibility to circumvent the invitation token expiry period

High RubyGems
Severity
5.7 / 10
High · CVSS 3.1
Exploit chance (EPSS)
0.79%
Chance of exploitation in the next 30 days. Higher than 56.30% of scored vulnerabilities.
Known exploited
No
Not in CISA's catalog
Weakness
CWE-672 Operation on a Resource after Expiration or Release
Fix
Available
4 packages have a fixed version

Description

Impact

The invites feature allows users to accept the invitation for an unlimited amount of time through the password reset functionality.

When using the password reset functionality, the devise_invitable gem always accepts the pending invitation if the user has been invited as shown in this piece of code within the devise_invitable gem: https://github.com/scambra/devise_invitable/blob/41f58970ff76fb64382a9b9ea1bd530f7c3adab2/lib/devise_invitable/models.rb#L198

The only check done here is if the user has been invited but the code does not ensure that the pending invitation is still valid as defined by the invite_for expiry period as explained in the gem's documentation: https://github.com/scambra/devise_invitable#model-configuration-

invite_for: The period the generated invitation token is valid. After this period, the invited resource won’t be able to accept the invitation. When invite_for is 0 (the default), the invitation won’t expire.

Decidim sets this configuration to 2.weeks so this configuration should be respected: https://github.com/decidim/decidim/blob/d2d390578050772d1bdb6d731395f1afc39dcbfc/decidim-core/config/initializers/devise.rb#L134

The bug is in the devise_invitable gem and should be fixed there and the dependency should be upgraded in Decidim once the fix becomes available.

Patches

Update devise_invitable to version 2.0.9 or above by running the following command:

$ bundle update devise_invitable

Workarounds

The invitations can be cancelled directly from the database by running the following command from the Rails console:

> Decidim::User.invitation_not_accepted.update_all(invitation_token: nil)

References

OWASP ASVS V4.0.3-2.3.1

This bug has existed in the devise_invitable gem since this commit which was first included in the v0.4.rc3 release of this gem: https://github.com/scambra/devise_invitable/commit/94d859c7de0829bf63f679ae5dd3cab2b866a098

All versions since then are affected.

This gem was first introduced at its version ~> 1.7.0 to the decidim-admin gem in this commit which was first included in the v0.0.1.alpha3 release of Decidim: https://github.com/decidim/decidim/commit/073e60e2e4224dd81815a784002ebba30f2ebb34

It was first introduced at its version ~> 1.7.0 to the decidim-system gem in this commit which was also first included in the v0.0.1.alpha3 release of Decidim: https://github.com/decidim/decidim/commit/b12800717a689c295a9ea680a38ca9f823d2c454

Credits

This issue was discovered in City of Helsinki's security audit against Decidim 0.27 done during September 2023. The security audit was implemented by Deloitte Finland.

Affected versions

RubyGems

PackageVulnerableFixed in
decidim
>= 0.0.1.alpha3, < 0.26.9
0.26.9
decidim
>= 0.27.0, < 0.27.5
0.27.5
decidim-admin
>= 0.0.1.alpha3, < 0.26.9
0.26.9
decidim-admin
>= 0.27.0, < 0.27.5
0.27.5
decidim-system
>= 0.0.1.alpha3, < 0.26.9
0.26.9
decidim-system
>= 0.27.0, < 0.27.5
0.27.5
devise_invitable
>= 0.4.rc3, < 2.0.9
2.0.9

How to fix

Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.

decidim RubyGems → 0.26.9

bundler
bundle update decidim # Gemfile: gem "decidim", ">= 0.26.9"

decidim-admin RubyGems → 0.26.9

bundler
bundle update decidim-admin # Gemfile: gem "decidim-admin", ">= 0.26.9"

decidim-system RubyGems → 0.26.9

bundler
bundle update decidim-system # Gemfile: gem "decidim-system", ">= 0.26.9"

devise_invitable RubyGems → 2.0.9

bundler
bundle update devise_invitable # Gemfile: gem "devise_invitable", ">= 2.0.9"

Severity breakdown

CVSS 3.1 5.7

CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:U/C:H/I:H/A:N

Attack vector
Network
Attack complexity
High
Privileges required
High
User interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
None

Weakness

CWE-672: Operation on a Resource after Expiration or Release

The product uses, accesses, or otherwise operates on a resource after that resource has been expired, released, or revoked.

References

Timeline

  1. Published
  2. Last updated by the source
  3. Latest EPSS score
AdvisorySeverityWhy it's related
GHSA-r3v7-5x4c-c69q
Decidim: JWT-backed authentication can be replayed across organizations
High Also affects decidim
GHSA-3cx6-j9j4-54mp
Decidim's private data exports can lead to data leaks
Medium Also affects decidim
GHSA-cc4g-m3g7-xmw8
Decidim has a cross-site scripting vulnerability in the version control page
High Also affects decidim
GHSA-vvqw-fqwx-mqmm
Decidim::Admin vulnerable to cross-site scripting (XSS) in the admin panel with QuillJS WYSWYG editor
Medium Also affects decidim
GHSA-7cx8-44pc-xv3q
Decidim cross-site scripting (XSS) in the pagination
High Also affects decidim
GHSA-qcj6-vxwx-4rqv
Decidim vulnerable to data disclosure through the embed feature
Medium Also affects decidim
GHSA-9w99-78rj-hmxq
Cross-site scripting (XSS) in the dynamic file uploads
Medium Also affects decidim
GHSA-r275-j57c-7mf2
Race condition in Endorsements
Low Also affects decidim
Is this in your code?

MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.

Check your repos with MergeHarbor