VYPR
High severityNVD Advisory· Published Oct 20, 2020· Updated Aug 4, 2024

Expired token reuse in Spree

CVE-2020-15269

Description

In Spree before versions 3.7.11, 4.0.4, or 4.1.11, expired user tokens could be used to access Storefront API v2 endpoints. The issue is patched in versions 3.7.11, 4.0.4 and 4.1.11. A workaround without upgrading is described in the linked advisory.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
spreeRubyGems
< 3.7.113.7.11
spreeRubyGems
>= 4.0.0, < 4.0.44.0.4
spreeRubyGems
>= 4.1.0, < 4.1.114.1.11

Affected products

1

Patches

1
e43643abfe51

ensure doorkeeper_token is valid when authenticating requests in v2

https://github.com/spree/spreeJorge MoranteOct 12, 2020via ghsa
3 files changed · +22 2
  • api/app/controllers/spree/api/v2/base_controller.rb+6 1 modified
    @@ -53,7 +53,12 @@ def render_error_payload(error, status = 422)
             end
     
             def spree_current_user
    -          @spree_current_user ||= Spree.user_class.find_by(id: doorkeeper_token.resource_owner_id) if doorkeeper_token
    +          return nil unless doorkeeper_token
    +          return @spree_current_user if @spree_current_user
    +
    +          doorkeeper_authorize!
    +
    +          @spree_current_user ||= Spree.user_class.find_by(id: doorkeeper_token.resource_owner_id)
             end
     
             def spree_authorize!(action, subject, *args)
    
  • api/lib/spree/api/testing_support/v2/base.rb+1 1 modified
    @@ -4,7 +4,7 @@
       let(:headers_order_token) { { 'X-Spree-Order-Token' => order.token } }
     end
     
    -[200, 201, 400, 404, 403, 422].each do |status_code|
    +[200, 201, 400, 401, 404, 403, 422].each do |status_code|
       shared_examples "returns #{status_code} HTTP status" do
         it "returns #{status_code}" do
           expect(response.status).to eq(status_code)
    
  • api/spec/requests/spree/api/v2/errors_spec.rb+15 0 modified
    @@ -29,4 +29,19 @@
           expect(json_response['error']).to eq('You are not authorized to access this page.')
         end
       end
    +
    +  context 'expired token failure' do
    +    let(:user) { create(:user) }
    +    let(:headers) { headers_bearer }
    +
    +    include_context 'API v2 tokens'
    +
    +    before do
    +      token.expires_in = -1
    +      token.save
    +      get '/api/v2/storefront/account', headers: headers
    +    end
    +
    +    it_behaves_like 'returns 401 HTTP status'
    +  end
     end
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.