Skip to content

Commit 072216a

Browse files
authored
Merge pull request #491 from docker/keychain/zero/out
fix(keychain): zero sensitive byte slices after use
2 parents 84c7706 + d135635 commit 072216a

3 files changed

Lines changed: 13 additions & 0 deletions

File tree

store/keychain/internal/go-keychain/secretservice/dh_ietf1024_sha256_aes128_cbc_pkcs7.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func (group *dhGroup) keygenHKDFSHA256AES128(theirPublic, myPrivate *big.Int) ([
6767
return nil, err
6868
}
6969
sharedSecretBytes := sharedSecret.Bytes()
70+
defer clear(sharedSecretBytes)
7071

7172
r := hkdf.New(sha256.New, sharedSecretBytes, nil, nil)
7273

@@ -81,6 +82,7 @@ func (group *dhGroup) keygenHKDFSHA256AES128(theirPublic, myPrivate *big.Int) ([
8182

8283
func unauthenticatedAESCBCEncrypt(unpaddedPlaintext, key []byte) (iv, ciphertext []byte, err error) {
8384
paddedPlaintext := padPKCS7(unpaddedPlaintext, aes.BlockSize)
85+
defer clear(paddedPlaintext)
8486
block, err := aes.NewCipher(key)
8587
if err != nil {
8688
return nil, nil, err

store/keychain/keychain_linux.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ func (k *keychainStore[T]) Get(ctx context.Context, id store.ID) (store.Secret,
207207
if err != nil {
208208
return nil, err
209209
}
210+
defer clear(value)
211+
210212
secret := k.factory(ctx, id)
211213
if err := secret.SetMetadata(attributes); err != nil {
212214
return nil, err
@@ -317,6 +319,7 @@ func (k *keychainStore[T]) Save(_ context.Context, id store.ID, secret store.Sec
317319
if err != nil {
318320
return err
319321
}
322+
defer clear(value)
320323

321324
sessSecret, err := session.NewSecret(value)
322325
if err != nil {
@@ -422,11 +425,14 @@ func (k *keychainStore[T]) Filter(ctx context.Context, pattern store.Pattern) (m
422425

423426
secret := k.factory(ctx, secretID)
424427
if err := secret.SetMetadata(attributes); err != nil {
428+
clear(value)
425429
return nil, err
426430
}
427431
if err := secret.Unmarshal(value); err != nil {
432+
clear(value)
428433
return nil, err
429434
}
435+
clear(value)
430436

431437
credentials[secretID] = secret
432438
}

store/keychain/keychain_windows.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ func encodeSecret(secret store.Secret) ([]byte, error) {
6060
if err != nil {
6161
return nil, err
6262
}
63+
defer clear(data)
6364

6465
encoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewEncoder()
6566
blob, _, err := transform.Bytes(encoder, data)
@@ -77,6 +78,7 @@ func decodeSecret(blob []byte, secret store.Secret) error {
7778
if err != nil {
7879
return err
7980
}
81+
defer clear(val)
8082

8183
return secret.Unmarshal(val)
8284
}
@@ -292,6 +294,7 @@ func (k *keychainStore[T]) Save(_ context.Context, id store.ID, secret store.Sec
292294
if err != nil {
293295
return err
294296
}
297+
defer clear(blob)
295298

296299
attributes := make(map[string]string)
297300
maps.Copy(attributes, secret.Metadata())
@@ -405,8 +408,10 @@ func (k *keychainStore[T]) Filter(ctx context.Context, pattern store.Pattern) (m
405408
}
406409

407410
if err := secret.Unmarshal(blob); err != nil {
411+
clear(blob)
408412
return nil, err
409413
}
414+
clear(blob)
410415
secrets[id] = secret
411416
}
412417

0 commit comments

Comments
 (0)