CVE-2025-25182: Understanding the Critical Authentication Bypass in Stroom
Executive Summary
CVE-2025-25182 is a critical security vulnerability affecting Stroom, a data processing, storage, and analysis platform widely used in enterprise environments. Classified as CWE-290: Authentication Bypass by Spoofing, this flaw occurs when Stroom is misconfigured with AWS Application Load Balancer (ALB) Authentication Integration. It permits attackers to bypass authentication, which may also lead to Server-Side Request Forgery (SSRF) attacks. Furthermore, SSRF abuse can result in Remote Code Execution (RCE) or privilege escalation by accessing the AWS metadata endpoint. The vulnerability has been assigned a CVSS score of 9.4 (Critical) and poses a high risk to data confidentiality, integrity, and availability.
Affected setups include Stroom installations starting from versions 7.2-beta.53 and prior to 7.2.24, 7.3-beta.22, 7.4.4, and 7.5-beta.2. If the application is exposed directly instead of through an ALB, the vulnerability may be exploited. Critical patches have been released and must be applied to secure systems against exploitation.
Technical Details
The vulnerability resides in the AWS ALB Authentication Integration within Stroom's OpenID configuration module, which is responsible for delegating identity verification to AWS ALBs using signed JWT tokens. Exploitation of this issue is possible under the following conditions:
- Misconfiguration: The Stroom application is exposed directly to a network without strictly routing requests via an authenticated ALB.
- ALB Signature Validation Flaw: When a JWT signed by AWS ALB is received, the system does not validate the "signer" field of the token properly to verify that it originates from an expected AWS resource.
Affected Components
- OpenID Configuration: The flaw lies in how expected AWS ALB signer ARNs are validated during token verification.
- Versions Impacted:
- Stroom 7.2-beta.53 and earlier.
- Versions prior to 7.2.24, 7.3-beta.22, 7.4.4, and 7.5-beta.2.
Evidence of Exploitation
Exposed Stroom systems may display the following characteristics if exploited:
- Unexpected Authentication Successes: Requests authenticated successfully despite invalid or manipulated JWTs crafted by attackers.
- Internal SSRF Attempts: The application connects to sensitive endpoints, such as
http://169.254.169.254
(AWS Instance Metadata Service), which attackers can exploit for token extraction or privilege escalation.
Root Cause Analysis
The core issue arises due to improper validation of the JWT signer
claim during authentication with AWS ALB. Specifically:
- JWT Header Weakness: The
signer
property in the JWT header is supposed to denote the ARN of the AWS ALB performing token signing. However, older versions of Stroom lacked a mechanism to validate that the provided value adhered to pre-configured allowed ARNs. - Absence of Expected Signer Prefix Check: Without verifying signer prefixes, an attacker could supply arbitrary values, bypassing authentication safeguards.
Below is an annotated example of the issue:
Vulnerable Code Snippet
In the getAwsPublicKeyUri
function, JWT signer validation was incomplete:
static String getAwsPublicKeyUri(final JwsParts jwsParts) {
final Map<String, String> headerValues = jwsParts.getHeaderValues(
SIGNER_HEADER_KEY,
OpenId.KEY_ID,
null);
final String signer = headerValues.get(SIGNER_HEADER_KEY);
// Signer validation omitted!
final String keyId = headerValues.get(OpenId.KEY_ID);
return LogUtil.message(
"https://public-keys.auth.elb.{}.amazonaws.com/{}",
signer.split(":")[3], keyId
);
}
The above implementation makes no effort to validate that signer
begins with a pre-configured ARN prefix. This omission allows untrusted, attacker-crafted signers to proceed unchecked.
Mitigation in Root Cause (Post-Patch)
The patched implementation explicitly checks signer
values against a whitelist of allowed prefixes included in the configuration. See the Patch Analysis section for details.
Patch Analysis
The critical patches released in versions 7.2.24, 7.3-beta.22, 7.4.4, and 7.5-beta.2 fix the flaw by introducing rigorous signer validation logic. The following is an overview and detailed breakdown of the patch, derived from the source code diff:
Key Changes
Validation of ALB Signer Prefixes
The patch introduces a new configuration property, expectedSignerPrefixes
, to define allowed ALB ARNs. During token parsing, signers are verified against this list.
File: StandardJwtContextFactory.java
+ private static final Pattern AMZN_REGION_PATTERN = Pattern.compile("^[a-z0-9-]+$");
static String getAwsPublicKeyUri(final JwsParts jwsParts, final Set<String> expectedSignerPrefixes) {
final String signer = jwsParts.getHeaderValue(SIGNER_HEADER_KEY);
+ // Ensure signer starts with an allowed prefix
+ final boolean isAllowedSigner = expectedSignerPrefixes.stream()
+ .anyMatch(prefix -> signer != null && signer.startsWith(prefix));
+ if (!isAllowedSigner) {
+ throw new RuntimeException("Invalid ALB JWT signer detected.");
+ }
return LogUtil.message("https://public-keys.auth.elb.{}.amazonaws.com/{}",
extractAwsRegionFromSigner(signer), keyId);
}
Configuration Property Introduced
A new field expectedSignerPrefixes
is added to the OpenID configuration to store a whitelist of trusted ARNs.
File: AbstractOpenIdConfig.java
+ @JsonProperty("expectedSignerPrefixes")
+ private final Set<String> expectedSignerPrefixes;
public Set<String> getExpectedSignerPrefixes() {
return expectedSignerPrefixes;
}
Exploitation Techniques
Attack Vector
An attacker with network visibility to a misconfigured Stroom instance can bypass authentication by:
- Crafting a JWT with an invalid
signer
value. - The application does not validate the
signer
, accepting the JWT as legitimate. - Gaining unauthorized access, which may extend to command execution if SSRF attacks are feasible.
Proof-of-Concept (PoC)
Below is a simplified example:
-
Craft JWT:
Use a tool likejwt.io
to create a JWT with an arbitrarysigner
such asarn:malicious:loadbalancer
. -
Simulating a Direct Request:
curl -X GET "http://stroom-vulnerable.com/api" \ -H "Authorization: Bearer <jwt>"
-
Results:
If unpatched, the above request will bypass authentication.
Real-World Scenarios
- SSRF & Metadata Access: Redirecting Stroom to AWS metadata service to retrieve sensitive environment credentials.
- Privilege Escalation: Compromise of user tokens to escalate privileges within a cloud environment.
Mitigation Strategies
1. Apply Patches
Upgrade to one of the following safe versions:
- 7.2.24
- 7.3-beta.22
- 7.4.4
- 7.5-beta.2
2. Implement Configuration Best Practices
- Ensure all Stroom traffic passes through an authenticated ALB.
- Configure the
expectedSignerPrefixes
property to explicitly whitelist trusted ALB ARNs:security.authentication.openId.expectedSignerPrefixes: - "arn:aws:elasticloadbalancing:<region>:<account_id>:"
3. Block Metadata Access
Restrict access to http://169.254.169.254
using firewall rules or equivalent network controls.
Timeline of Discovery and Disclosure
Date | Event |
---|---|
2025-01-20 | Vulnerability initially discovered |
2025-02-12 | Public disclosure via GitHub advisory |
2025-06-14 | Release of patch addressing the flaw |
References
Secure your systems today and stay safe from CVE-2025-25182!