VYPR
Moderate severityNVD Advisory· Published Jul 6, 2023· Updated Nov 6, 2024

Sentry CORS misconfiguration vulnerability

CVE-2023-36829

Description

Sentry is an error tracking and performance monitoring platform. Starting in version 23.6.0 and prior to version 23.6.2, the Sentry API incorrectly returns the access-control-allow-credentials: true HTTP header if the Origin request header ends with the system.base-hostname option of Sentry installation. This only affects installations that have system.base-hostname option explicitly set, as it is empty by default. Impact is limited since recent versions of major browsers have cross-site cookie blocking enabled by default. However, this flaw could allow other multi-step attacks. The patch has been released in Sentry 23.6.2.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
sentryPyPI
>= 23.6.0, < 23.6.223.6.2

Affected products

1

Patches

2
ee44c6be35e5

Fix GHSA-4xqm-4p72-87h6 (#52276)

https://github.com/getsentry/sentryAlexander TarasovJul 5, 2023via ghsa
2 files changed · +10 9
  • src/sentry/api/base.py+1 1 modified
    @@ -121,7 +121,7 @@ def allow_cors_options_wrapper(self, request: Request, *args, **kwargs):
             # to be sent.
             basehost = options.get("system.base-hostname")
             if basehost and origin:
    -            if origin.endswith(basehost):
    +            if origin.endswith(("://" + basehost, "." + basehost)):
                     response["Access-Control-Allow-Credentials"] = "true"
     
             return response
    
  • tests/sentry/api/test_base.py+9 8 modified
    @@ -162,15 +162,16 @@ def test_allow_credentials_incorrect(self):
             org = self.create_organization()
             apikey = ApiKey.objects.create(organization_id=org.id, allowed_origins="*")
     
    -        request = self.make_request(method="GET")
    -        request.META["HTTP_ORIGIN"] = "http://acme.example.com"
    -        request.META["HTTP_AUTHORIZATION"] = b"Basic " + base64.b64encode(
    -            apikey.key.encode("utf-8")
    -        )
    +        for http_origin in ["http://acme.example.com", "http://fakeacme.com"]:
    +            request = self.make_request(method="GET")
    +            request.META["HTTP_ORIGIN"] = http_origin
    +            request.META["HTTP_AUTHORIZATION"] = b"Basic " + base64.b64encode(
    +                apikey.key.encode("utf-8")
    +            )
     
    -        response = _dummy_endpoint(request)
    -        response.render()
    -        assert "Access-Control-Allow-Credentials" not in response
    +            response = _dummy_endpoint(request)
    +            response.render()
    +            assert "Access-Control-Allow-Credentials" not in response
     
         def test_invalid_cors_without_auth(self):
             request = self.make_request(method="GET")
    
19248fb9802c

fix GHSA-4xqm-4p72-87h6

https://github.com/getsentry/sentryAlexander TarasovJul 5, 2023via ghsa
2 files changed · +10 9
  • src/sentry/api/base.py+1 1 modified
    @@ -121,7 +121,7 @@ def allow_cors_options_wrapper(self, request: Request, *args, **kwargs):
             # to be sent.
             basehost = options.get("system.base-hostname")
             if basehost and origin:
    -            if origin.endswith(basehost):
    +            if origin.endswith(("://" + basehost, "." + basehost)):
                     response["Access-Control-Allow-Credentials"] = "true"
     
             return response
    
  • tests/sentry/api/test_base.py+9 8 modified
    @@ -162,15 +162,16 @@ def test_allow_credentials_incorrect(self):
             org = self.create_organization()
             apikey = ApiKey.objects.create(organization_id=org.id, allowed_origins="*")
     
    -        request = self.make_request(method="GET")
    -        request.META["HTTP_ORIGIN"] = "http://acme.example.com"
    -        request.META["HTTP_AUTHORIZATION"] = b"Basic " + base64.b64encode(
    -            apikey.key.encode("utf-8")
    -        )
    +        for http_origin in ["http://acme.example.com", "http://fakeacme.com"]:
    +            request = self.make_request(method="GET")
    +            request.META["HTTP_ORIGIN"] = http_origin
    +            request.META["HTTP_AUTHORIZATION"] = b"Basic " + base64.b64encode(
    +                apikey.key.encode("utf-8")
    +            )
     
    -        response = _dummy_endpoint(request)
    -        response.render()
    -        assert "Access-Control-Allow-Credentials" not in response
    +            response = _dummy_endpoint(request)
    +            response.render()
    +            assert "Access-Control-Allow-Credentials" not in response
     
         def test_invalid_cors_without_auth(self):
             request = self.make_request(method="GET")
    

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

8

News mentions

0

No linked articles in our index yet.