Summary
The CORS middleware reflects the request's Origin header back as Access-Control-Allow-Origin when the configured allow_origin contains *, while simultaneously setting Access-Control-Allow-Credentials: true. This is a well-known CORS misconfiguration that allows any website to make authenticated cross-origin requests to the StackStorm API.
Affected File
st2common/st2common/middleware/cors.py (lines 65-69, 88, 91)
if origin:
if "*" in origins:
origin_allowed = origin # reflects whatever the browser sends
else:
origin_allowed = origin if origin in origins else list(origins)[0]
# ...
headers["Access-Control-Allow-Origin"] = origin_allowed
# ...
headers["Access-Control-Allow-Credentials"] = "true" # always set
Additionally, the middleware hardcodes localhost development origins that are always allowed:
# Default gulp development server WebUI URL
origins.add("http://127.0.0.1:3000")
# By default WebUI simple http server listens on 8080
origins.add("http://localhost:8080")
origins.add("http://127.0.0.1:8080")
Impact
When allow_origin contains *:
Any website can make authenticated, credential-bearing requests to the StackStorm API from a user's browser. If a StackStorm user visits a malicious page while logged in, the attacker can:
- Read API responses (execution results, datastore values, pack configurations)
- Trigger action executions
- Modify rules and workflows
- Exfiltrate API keys and tokens
This is because the combination of a reflected Access-Control-Allow-Origin and Access-Control-Allow-Credentials: true tells the browser to include cookies/auth headers and allow the response to be read by the requesting page.
Hardcoded localhost origins:
If an attacker can run a web server on localhost:3000 or localhost:8080 on a machine where a StackStorm user has an active session, they can exploit these hardcoded origins. These should not be present in production builds.
Recommended Fix
-
Never reflect the Origin header when Access-Control-Allow-Credentials is true. If wildcard origin is configured, either:
- Set
Access-Control-Allow-Origin: * and remove Access-Control-Allow-Credentials (allows unauthenticated CORS only)
- Or reject the configuration and log a warning
-
Remove hardcoded localhost origins from the default allowed list. These should only be present in development configurations.
-
Only set Access-Control-Allow-Credentials: true when the origin is explicitly whitelisted (not wildcarded).
if origin and origin in origins:
headers["Access-Control-Allow-Origin"] = origin
headers["Access-Control-Allow-Credentials"] = "true"
elif "*" in origins:
headers["Access-Control-Allow-Origin"] = "*"
# Do NOT set Allow-Credentials with wildcard origin
References
Summary
The CORS middleware reflects the request's
Originheader back asAccess-Control-Allow-Originwhen the configuredallow_origincontains*, while simultaneously settingAccess-Control-Allow-Credentials: true. This is a well-known CORS misconfiguration that allows any website to make authenticated cross-origin requests to the StackStorm API.Affected File
st2common/st2common/middleware/cors.py(lines 65-69, 88, 91)Additionally, the middleware hardcodes localhost development origins that are always allowed:
Impact
When
allow_origincontains*:Any website can make authenticated, credential-bearing requests to the StackStorm API from a user's browser. If a StackStorm user visits a malicious page while logged in, the attacker can:
This is because the combination of a reflected
Access-Control-Allow-OriginandAccess-Control-Allow-Credentials: truetells the browser to include cookies/auth headers and allow the response to be read by the requesting page.Hardcoded localhost origins:
If an attacker can run a web server on
localhost:3000orlocalhost:8080on a machine where a StackStorm user has an active session, they can exploit these hardcoded origins. These should not be present in production builds.Recommended Fix
Never reflect the
Originheader whenAccess-Control-Allow-Credentialsistrue. If wildcard origin is configured, either:Access-Control-Allow-Origin: *and removeAccess-Control-Allow-Credentials(allows unauthenticated CORS only)Remove hardcoded localhost origins from the default allowed list. These should only be present in development configurations.
Only set
Access-Control-Allow-Credentials: truewhen the origin is explicitly whitelisted (not wildcarded).References