|
| 1 | +--- |
| 2 | +layout: advisory |
| 3 | +title: 'CVE-2023-48220 (devise_invitable): Possibility to circumvent the invitation |
| 4 | + token expiry period' |
| 5 | +comments: false |
| 6 | +categories: |
| 7 | +- devise_invitable |
| 8 | +advisory: |
| 9 | + gem: devise_invitable |
| 10 | + cve: 2023-48220 |
| 11 | + ghsa: w3q8-m492-4pwp |
| 12 | + url: https://github.com/decidim/decidim/security/advisories/GHSA-w3q8-m492-4pwp |
| 13 | + title: Possibility to circumvent the invitation token expiry period |
| 14 | + date: 2024-02-20 |
| 15 | + description: | |
| 16 | + ### Impact |
| 17 | + The invites feature allows users to accept the invitation for an unlimited amount of time through the password reset functionality. |
| 18 | +
|
| 19 | + 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: |
| 20 | + https://github.com/scambra/devise_invitable/blob/41f58970ff76fb64382a9b9ea1bd530f7c3adab2/lib/devise_invitable/models.rb#L198 |
| 21 | +
|
| 22 | + 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: |
| 23 | + https://github.com/scambra/devise_invitable#model-configuration- |
| 24 | +
|
| 25 | + > `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. |
| 26 | +
|
| 27 | + Decidim sets this configuration to `2.weeks` so this configuration should be respected: |
| 28 | + https://github.com/decidim/decidim/blob/d2d390578050772d1bdb6d731395f1afc39dcbfc/decidim-core/config/initializers/devise.rb#L134 |
| 29 | +
|
| 30 | + 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. |
| 31 | +
|
| 32 | + ### Patches |
| 33 | + Update `devise_invitable` to version `2.0.9` or above by running the following command: |
| 34 | +
|
| 35 | + ``` |
| 36 | + $ bundle update devise_invitable |
| 37 | + ``` |
| 38 | +
|
| 39 | + ### Workarounds |
| 40 | + The invitations can be cancelled directly from the database by running the following command from the Rails console: |
| 41 | +
|
| 42 | + ``` |
| 43 | + > Decidim::User.invitation_not_accepted.update_all(invitation_token: nil) |
| 44 | + ``` |
| 45 | +
|
| 46 | + ### References |
| 47 | + OWASP ASVS V4.0.3-2.3.1 |
| 48 | +
|
| 49 | + 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: |
| 50 | + https://github.com/scambra/devise_invitable/commit/94d859c7de0829bf63f679ae5dd3cab2b866a098 |
| 51 | +
|
| 52 | + All versions since then are affected. |
| 53 | +
|
| 54 | + 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: |
| 55 | + https://github.com/decidim/decidim/commit/073e60e2e4224dd81815a784002ebba30f2ebb34 |
| 56 | +
|
| 57 | + 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: |
| 58 | + https://github.com/decidim/decidim/commit/b12800717a689c295a9ea680a38ca9f823d2c454 |
| 59 | +
|
| 60 | + ### Credits |
| 61 | + 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](https://www2.deloitte.com/fi/fi.html). |
| 62 | + cvss_v3: 5.7 |
| 63 | + unaffected_versions: |
| 64 | + - "< 0.4.rc3" |
| 65 | + patched_versions: |
| 66 | + - ">= 2.0.9" |
| 67 | + related: |
| 68 | + url: |
| 69 | + - https://github.com/decidim/decidim/security/advisories/GHSA-w3q8-m492-4pwp |
| 70 | + - https://nvd.nist.gov/vuln/detail/CVE-2023-48220 |
| 71 | + - https://github.com/decidim/decidim/commit/073e60e2e4224dd81815a784002ebba30f2ebb34 |
| 72 | + - https://github.com/decidim/decidim/commit/b12800717a689c295a9ea680a38ca9f823d2c454 |
| 73 | + - https://github.com/scambra/devise_invitable/commit/94d859c7de0829bf63f679ae5dd3cab2b866a098 |
| 74 | + - https://github.com/decidim/decidim/blob/d2d390578050772d1bdb6d731395f1afc39dcbfc/decidim-core/config/initializers/devise.rb#L134 |
| 75 | + - https://github.com/decidim/decidim/releases/tag/v0.26.9 |
| 76 | + - https://github.com/decidim/decidim/releases/tag/v0.27.5 |
| 77 | + - https://github.com/decidim/decidim/releases/tag/v0.28.0 |
| 78 | + - https://github.com/scambra/devise_invitable/blob/41f58970ff76fb64382a9b9ea1bd530f7c3adab2/lib/devise_invitable/models.rb#L198 |
| 79 | + - https://github.com/advisories/GHSA-w3q8-m492-4pwp |
| 80 | +--- |
0 commit comments