VDB
Sign up
MEDIUM6.5

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-oauth2

Details

### 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

Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.11.0Fixed in: 3.11.1
Fix# pom.xml: bump <version>3.11.1</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.10.0Fixed in: 3.10.2
Fix# pom.xml: bump <version>3.10.2</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.9.0Fixed in: 3.9.6
Fix# pom.xml: bump <version>3.9.6</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.8.0Fixed in: 3.8.4
Fix# pom.xml: bump <version>3.8.4</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.7.0Fixed in: 3.7.4
Fix# pom.xml: bump <version>3.7.4</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.6.0Fixed in: 3.6.6
Fix# pom.xml: bump <version>3.6.6</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.5.0Fixed in: 3.5.3
Fix# pom.xml: bump <version>3.5.3</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.4.0Fixed in: 3.4.3
Fix# pom.xml: bump <version>3.4.3</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.3.0Fixed in: 3.3.2
Fix# pom.xml: bump <version>3.3.2</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.2.0Fixed in: 3.2.4
Fix# pom.xml: bump <version>3.2.4</version> for io.micronaut.security:micronaut-security-oauth2
Maven/io.micronaut.security:micronaut-security-oauth2
Introduced in: 3.1.0Fixed in: 3.1.2
Fix# pom.xml: bump <version>3.1.2</version> for io.micronaut.security:micronaut-security-oauth2

References