Skip to content

Commit

Permalink
Add query parameter validation for multiple parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
nckturner committed Jul 1, 2022
1 parent 0a72c12 commit 029d1dc
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 0 deletions.
15 changes: 15 additions & 0 deletions pkg/token/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,10 @@ func (v tokenVerifier) Verify(token string) (*Identity, error) {
return nil, FormatError{"malformed query parameter"}
}

if err = validateDuplicateParameters(queryParams); err != nil {
return nil, err
}

for key, values := range queryParams {
if !parameterWhitelist[strings.ToLower(key)] {
return nil, FormatError{fmt.Sprintf("non-whitelisted query parameter %q", key)}
Expand Down Expand Up @@ -576,6 +580,17 @@ func (v tokenVerifier) Verify(token string) (*Identity, error) {
return id, nil
}

func validateDuplicateParameters(queryParams url.Values) error {
duplicateCheck := make(map[string]bool)
for key, _ := range queryParams {
if _, found := duplicateCheck[strings.ToLower(key)]; found {
return FormatError{fmt.Sprintf("duplicate query parameter found: %q", key)}
}
duplicateCheck[strings.ToLower(key)] = true
}
return nil
}

func hasSignedClusterIDHeader(paramsLower *url.Values) bool {
signedHeaders := strings.Split(paramsLower.Get("x-amz-signedheaders"), ";")
for _, hdr := range signedHeaders {
Expand Down
1 change: 1 addition & 0 deletions pkg/token/token_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ func TestVerifyTokenPreSTSValidations(t *testing.T) {
validationSuccessTest(t, "aws", toToken(fmt.Sprintf("https://sts.ca-central-1.amazonaws.com/?action=GetCallerIdentity&x-amz-signedheaders=x-k8s-aws-id&x-amz-date=%s&x-amz-expires=60", timeStr)))
validationSuccessTest(t, "aws", toToken(fmt.Sprintf("https://sts.eu-west-1.amazonaws.com/?action=GetCallerIdentity&x-amz-signedheaders=x-k8s-aws-id&x-amz-date=%s&x-amz-expires=60", timeStr)))
validationSuccessTest(t, "aws", toToken(fmt.Sprintf("https://sts.sa-east-1.amazonaws.com/?action=GetCallerIdentity&x-amz-signedheaders=x-k8s-aws-id&x-amz-date=%s&x-amz-expires=60", timeStr)))
validationErrorTest(t, "aws", toToken(fmt.Sprintf("https://sts.us-west-2.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAAAAAAAAAAAAAAAAA%%2F20220601%%2Fus-west-2%%2Fsts%%2Faws4_request&X-Amz-Date=%s&X-Amz-Expires=900&X-Amz-Security-Token=XXXXXXXXXXXXX&X-Amz-SignedHeaders=host%%3Bx-k8s-aws-id&x-amz-credential=eve&X-Amz-Signature=999999999999999999", timeStr)), "input token was not properly formatted: duplicate query parameter found:")
}

func TestVerifyHTTPError(t *testing.T) {
Expand Down

0 comments on commit 029d1dc

Please sign in to comment.