Skip to content

Commit

Permalink
add value length check to approle createHMAC (#14746)
Browse files Browse the repository at this point in the history
* add value length check to approle createHMAC

* add changelog entry

* fix changelog entry
  • Loading branch information
ccapurso committed Mar 29, 2022
1 parent a936e08 commit 6aa9edb
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
21 changes: 21 additions & 0 deletions builtin/credential/approle/path_login_test.go
Expand Up @@ -2,6 +2,7 @@ package approle

import (
"context"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -264,6 +265,26 @@ func TestAppRole_RoleLogin(t *testing.T) {
if resp.Auth.Period != period {
t.Fatalf("expected period value of %d in the response, got: %s", period, resp.Auth.Period)
}

// Test input validation with secret_id that exceeds max length
loginData["secret_id"] = strings.Repeat("a", maxHmacInputLength+1)

loginReq = &logical.Request{
Operation: logical.UpdateOperation,
Path: "login",
Storage: storage,
Data: loginData,
Connection: &logical.Connection{
RemoteAddr: "127.0.0.1",
},
}

loginResp, err = b.HandleRequest(context.Background(), loginReq)

expectedErr := "failed to create HMAC of secret_id"
if loginResp != nil || err == nil || !strings.Contains(err.Error(), expectedErr) {
t.Fatalf("expected login test to fail with error %q, resp: %#v, err: %v", expectedErr, loginResp, err)
}
}

func generateRenewRequest(s logical.Storage, auth *logical.Auth) *logical.Request {
Expand Down
7 changes: 7 additions & 0 deletions builtin/credential/approle/validation.go
Expand Up @@ -92,12 +92,19 @@ func verifyCIDRRoleSecretIDSubset(secretIDCIDRs []string, roleBoundCIDRList []st
return nil
}

const maxHmacInputLength = 1024

// Creates a SHA256 HMAC of the given 'value' using the given 'key' and returns
// a hex encoded string.
func createHMAC(key, value string) (string, error) {
if key == "" {
return "", fmt.Errorf("invalid HMAC key")
}

if len(value) > maxHmacInputLength {
return "", fmt.Errorf("value is longer than maximum of %d bytes", maxHmacInputLength)
}

hm := hmac.New(sha256.New, []byte(key))
hm.Write([]byte(value))
return hex.EncodeToString(hm.Sum(nil)), nil
Expand Down
3 changes: 3 additions & 0 deletions changelog/14746.txt
@@ -0,0 +1,3 @@
```release-note:bug
auth/approle: Add maximum length for input values that result in SHA56 HMAC calculation
```

0 comments on commit 6aa9edb

Please sign in to comment.