Skip to content

Commit a1c69ba

Browse files
authored
fix(cognitoidentityprovider): Fix UserPoolId validation ReDoS (#2644)
* add regex check for user pool id * change hard coded user pool id in unit test * set pattern as constant * fix extra indent
1 parent ed1591f commit a1c69ba

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

aws-android-sdk-cognitoidentityprovider/src/main/java/com/amazonaws/mobileconnectors/cognitoidentityprovider/CognitoUserPool.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.Collections;
5050
import java.util.List;
5151
import java.util.Map;
52+
import java.util.regex.Pattern;
5253

5354
/**
5455
* This represents a user-pool in a Cognito identity provider account. The user-pools are called as
@@ -75,6 +76,10 @@
7576
public class CognitoUserPool {
7677

7778
private static final Log logger = LogFactory.getLog(CognitoUserPool.class);
79+
80+
private static final int USER_POOL_ID_MAX_LENGTH = 55;
81+
private static final String USER_POOL_ID_PATTERN = "^[\\w-]+_[0-9a-zA-Z]+$";
82+
7883
/**
7984
* Cognito Your Identity Pool ID
8085
*/
@@ -268,6 +273,12 @@ public CognitoUserPool(Context context, String userPoolId, String clientId, Stri
268273
public CognitoUserPool(Context context, String userPoolId, String clientId, String clientSecret, ClientConfiguration clientConfiguration, Regions region, String pinpointAppId) {
269274
initialize(context);
270275
this.context = context;
276+
if (userPoolId.isEmpty() || clientId.isEmpty()) {
277+
throw new IllegalArgumentException("Both UserPoolId and ClientId are required.");
278+
}
279+
if (userPoolId.length() > USER_POOL_ID_MAX_LENGTH || !Pattern.matches(USER_POOL_ID_PATTERN, userPoolId)) {
280+
throw new IllegalArgumentException("Invalid userPoolId format.");
281+
}
271282
this.userPoolId = userPoolId;
272283
this.clientId = clientId;
273284
this.clientSecret = clientSecret;
@@ -322,6 +333,12 @@ public CognitoUserPool(Context context, String userPoolId, String clientId, Stri
322333
public CognitoUserPool(Context context, String userPoolId, String clientId, String clientSecret, AmazonCognitoIdentityProvider client, String pinpointAppId, String cognitoUserPoolCustomEndpoint) {
323334
initialize(context);
324335
this.context = context;
336+
if (userPoolId.isEmpty() || clientId.isEmpty()) {
337+
throw new IllegalArgumentException("Both UserPoolId and ClientId are required.");
338+
}
339+
if (userPoolId.length() > USER_POOL_ID_MAX_LENGTH || !Pattern.matches(USER_POOL_ID_PATTERN, userPoolId)) {
340+
throw new IllegalArgumentException("Invalid userPoolId format.");
341+
}
325342
this.userPoolId = userPoolId;
326343
this.clientId = clientId;
327344
this.clientSecret = clientSecret;

aws-android-sdk-cognitoidentityprovider/src/test/java/CognitoIdentityProviderCustomEndPointTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
public class CognitoIdentityProviderCustomEndPointTest {
3434

3535
private CognitoUserPool testPool;
36-
public static final String TEST_USER_POOL = "DummyUserPool";
36+
public static final String TEST_USER_POOL = "us-east-1_xxxxx";
3737
public static final String TEST_CLIENT_ID = "DummyClientId";
3838
public static final String TEST_CLIENT_SECRET = "DummyClientSecret";
3939
public static final String TEST_PINPOINT_APP_ID = "DummyPinpointAppId";

aws-android-sdk-cognitoidentityprovider/src/test/java/com/amazonaws/mobileconnectors/cognitoidentityprovider/CognitoUserPoolTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public class CognitoUserPoolTest {
6161
public void setup() {
6262
ShadowLog.stream = System.out;
6363
mockProvider = mock(AmazonCognitoIdentityProvider.class);
64-
cognitoUserPool = new CognitoUserPool(getApplicationContext(), "us_east_1_xxxxx", "dummyclientid", "dummysecret", Regions.US_EAST_1);
64+
cognitoUserPool = new CognitoUserPool(getApplicationContext(), "us-east-1_xxxxx", "dummyclientid", "dummysecret", Regions.US_EAST_1);
6565
cognitoUserPool.setAdvancedSecurityDataCollectionFlag(false);
6666
cognitoUserPool.setIdentityProvider(mockProvider);
6767
}

0 commit comments

Comments
 (0)