Skip to content

Commit 55e3dbf

Browse files
Backport: sec: perform constant time compare for sensitive values (#22537) (#22792)
1 parent d6001f2 commit 55e3dbf

File tree

4 files changed

+10
-5
lines changed

4 files changed

+10
-5
lines changed

.changelog/22537.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:security
2+
security: perform constant time compare for sensitive values.
3+
```

agent/consul/acl.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package consul
55

66
import (
77
"context"
8+
"crypto/subtle"
89
"fmt"
910
"sort"
1011
"sync"
@@ -969,7 +970,7 @@ func (r *ACLResolver) resolveTokenToIdentityAndPolicies(token string) (structs.A
969970
lastErr = err
970971

971972
if tokenErr, ok := err.(*policyOrRoleTokenError); ok {
972-
if acl.IsErrNotFound(err) && tokenErr.token == identity.SecretToken() {
973+
if acl.IsErrNotFound(err) && subtle.ConstantTimeCompare([]byte(tokenErr.token), []byte(identity.SecretToken())) == 1 {
973974
// token was deleted while resolving policies
974975
return nil, nil, acl.ErrNotFound
975976
}
@@ -1008,8 +1009,7 @@ func (r *ACLResolver) resolveTokenToIdentityAndRoles(token string) (structs.ACLI
10081009
lastErr = err
10091010

10101011
if tokenErr, ok := err.(*policyOrRoleTokenError); ok {
1011-
if acl.IsErrNotFound(err) && tokenErr.token == identity.SecretToken() {
1012-
// token was deleted while resolving roles
1012+
if acl.IsErrNotFound(err) && subtle.ConstantTimeCompare([]byte(tokenErr.token), []byte(identity.SecretToken())) == 1 { // token was deleted while resolving roles
10131013
return nil, nil, acl.ErrNotFound
10141014
}
10151015

agent/consul/acl_endpoint.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package consul
55

66
import (
77
"context"
8+
"crypto/subtle"
89
"errors"
910
"fmt"
1011
"os"
@@ -613,7 +614,7 @@ func (a *ACL) TokenDelete(args *structs.ACLTokenDeleteRequest, reply *string) er
613614
}
614615

615616
if token != nil {
616-
if args.Token == token.SecretID {
617+
if subtle.ConstantTimeCompare([]byte(args.Token), []byte(token.SecretID)) == 1 {
617618
return fmt.Errorf("Deletion of the request's authorization token is not permitted")
618619
}
619620

agent/consul/auth/token_writer.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package auth
55

66
import (
7+
"crypto/subtle"
78
"errors"
89
"fmt"
910
"time"
@@ -185,7 +186,7 @@ func (w *TokenWriter) Update(token *structs.ACLToken) (*structs.ACLToken, error)
185186

186187
if token.SecretID == "" {
187188
token.SecretID = match.SecretID
188-
} else if match.SecretID != token.SecretID {
189+
} else if subtle.ConstantTimeCompare([]byte(match.SecretID), []byte(token.SecretID)) != 1 {
189190
return nil, errors.New("Changing a token's SecretID is not permitted")
190191
}
191192

0 commit comments

Comments
 (0)