GHSA-qw22-8w9r-864h
io.micronaut.security:micronaut-security-oauth2 has invalid IdTokenClaimsValidator logic on aud
Quick fix
GHSA-qw22-8w9r-864h — io.micronaut.security:micronaut-security-oauth2: upgrade to the fixed version with the command below.
# pom.xml: bump <version>3.11.1</version> for io.micronaut.security:micronaut-security-oauth2Details
### Summary
IdTokenClaimsValidator skips `aud` claim validation if token is issued by same identity issuer/provider.
### Details
See https://github.com/micronaut-projects/micronaut-security/blob/master/security-oauth2/src/main/java/io/micronaut/security/oauth2/client/IdTokenClaimsValidator.java#L202
This logic violates point 3 of https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation.
Workaround exists by setting `micronaut.security.token.jwt.claims-validators.audience` with valid values. `micronaut.security.token.jwt.claims-validators.openid-idtoken` can be kept as default on.
### PoC
Should probably be:
```java return issuer.equalsIgnoreCase(iss) && audiences.contains(clientId) && validateAzp(claims, clientId, audiences); ```
### Impact
Any OIDC setup using Micronaut where multiple OIDC applications exists for the same issuer but token auth are not meant to be shared.
### Mitigation
Please upgrade to a patched `micronaut-security-oauth2` release as soon as possible.
If you cannot upgrade, for example, if you are still using Micronaut Framework 2, you can patch your application by creating a replacement of `IdTokenClaimsValidatorReplacement`
```java package cve;
import io.micronaut.context.annotation.Replaces; import io.micronaut.context.annotation.Requires; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.util.StringUtils; import io.micronaut.security.config.SecurityConfigurationProperties; import io.micronaut.security.oauth2.client.IdTokenClaimsValidator; import io.micronaut.security.oauth2.configuration.OauthClientConfiguration; import io.micronaut.security.oauth2.configuration.OpenIdClientConfiguration; import io.micronaut.security.token.jwt.generator.claims.JwtClaims; import io.micronaut.security.token.jwt.validator.JwtClaimsValidatorConfigurationProperties;
import javax.inject.Singleton; import java.net.URL; import java.util.Collection; import java.util.List; import java.util.Optional;
@Requires(property = SecurityConfigurationProperties.PREFIX + ".authentication", value = "idtoken") @Requires(property = JwtClaimsValidatorConfigurationProperties.PREFIX + ".openid-idtoken", notEquals = StringUtils.FALSE) @Singleton @Replaces(IdTokenClaimsValidator.class) public class IdTokenClaimsValidatorReplacement extends IdTokenClaimsValidator { public IdTokenClaimsValidatorReplacement(Collection<OauthClientConfiguration> oauthClientConfigurations) { super(oauthClientConfigurations); }
@Override protected boolean validateIssuerAudienceAndAzp(@NonNull JwtClaims claims, @NonNull String iss, @NonNull List<String> audiences, @NonNull String clientId, @NonNull OpenIdClientConfiguration openIdClientConfiguration) { if (openIdClientConfiguration.getIssuer().isPresent()) { Optional<URL> issuerOptional = openIdClientConfiguration.getIssuer(); if (issuerOptional.isPresent()) { String issuer = issuerOptional.get().toString(); return issuer.equalsIgnoreCase(iss) && audiences.contains(clientId) && validateAzp(claims, clientId, audiences); } } return false; } } ``
Are you affected?
Enter the version of the package you're using.
Affected packages
3.11.0Fixed in: 3.11.1# pom.xml: bump <version>3.11.1</version> for io.micronaut.security:micronaut-security-oauth23.10.0Fixed in: 3.10.2# pom.xml: bump <version>3.10.2</version> for io.micronaut.security:micronaut-security-oauth23.9.0Fixed in: 3.9.6# pom.xml: bump <version>3.9.6</version> for io.micronaut.security:micronaut-security-oauth23.8.0Fixed in: 3.8.4# pom.xml: bump <version>3.8.4</version> for io.micronaut.security:micronaut-security-oauth23.7.0Fixed in: 3.7.4# pom.xml: bump <version>3.7.4</version> for io.micronaut.security:micronaut-security-oauth23.6.0Fixed in: 3.6.6# pom.xml: bump <version>3.6.6</version> for io.micronaut.security:micronaut-security-oauth23.5.0Fixed in: 3.5.3# pom.xml: bump <version>3.5.3</version> for io.micronaut.security:micronaut-security-oauth23.4.0Fixed in: 3.4.3# pom.xml: bump <version>3.4.3</version> for io.micronaut.security:micronaut-security-oauth23.3.0Fixed in: 3.3.2# pom.xml: bump <version>3.3.2</version> for io.micronaut.security:micronaut-security-oauth23.2.0Fixed in: 3.2.4# pom.xml: bump <version>3.2.4</version> for io.micronaut.security:micronaut-security-oauth23.1.0Fixed in: 3.1.2# pom.xml: bump <version>3.1.2</version> for io.micronaut.security:micronaut-security-oauth2References
- https://github.com/micronaut-projects/micronaut-security/security/advisories/GHSA-qw22-8w9r-864h[WEB]
- https://nvd.nist.gov/vuln/detail/CVE-2023-36820[ADVISORY]
- https://github.com/micronaut-projects/micronaut-security/commit/9728b925221a0d87798ccf250657a3c214b7e980[WEB]
- https://github.com/micronaut-projects/micronaut-security[PACKAGE]
- https://github.com/micronaut-projects/micronaut-security/blob/master/security-oauth2/src/main/java/io/micronaut/security/oauth2/client/IdTokenClaimsValidator.java#L202[WEB]