High severity7.5NVD Advisory· Published Mar 26, 2026· Updated Mar 31, 2026
CVE-2026-28377
CVE-2026-28377
Description
A vulnerability in Grafana Tempo exposes the S3 SSE-C encryption key in plaintext through the /status/config endpoint, potentially allowing unauthorized users to obtain the key used to encrypt trace data stored in S3.
Thanks to william_goodfellow for reporting this vulnerability.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
github.com/grafana/tempoGo | < 2.10.3 | 2.10.3 |
Affected products
1Patches
1bb8ca663db34fix(s3): treat SSE-C encryption_key as a secret (CVE-2026-28377) (#6711)
4 files changed · +37 −7
CHANGELOG.md+1 −0 modified@@ -1,5 +1,6 @@ ## main / unreleased +* [BUGFIX] S3 SSE-C `encryption_key` is now treated as a secret to prevent it from being exposed in plaintext. Resolves CVE-2026-28377. [#6711](https://github.com/grafana/tempo/pull/6711) (@mattdurham) * [BUGFIX] Fix integer overflow in query parameters by using `strconv.ParseUint` instead of `strconv.Atoi`/`strconv.ParseInt` for unsigned integer fields. [#6612](https://github.com/grafana/tempo/pull/6612) (@bejaratommy) * [CHANGE] **BREAKING CHANGE** Centralize block and WAL config: `block_builder` and `live_store` now always use `storage.trace.block` settings; per-module block config fields are removed. [#6647](https://github.com/grafana/tempo/pull/6647) (@stoewer) * [CHANGE] **BREAKING CHANGE** Remove Opencensus receiver [#6523](https://github.com/grafana/tempo/pull/6523) (@javiermolinar)
tempodb/backend/s3/config.go+5 −5 modified@@ -37,10 +37,10 @@ var ( ) type SSEConfig struct { - Type string `yaml:"type"` - KMSKeyID string `yaml:"kms_key_id"` - KMSEncryptionContext string `yaml:"kms_encryption_context"` - CustomerEncryptionKey string `yaml:"encryption_key"` + Type string `yaml:"type"` + KMSKeyID string `yaml:"kms_key_id"` + KMSEncryptionContext string `yaml:"kms_encryption_context"` + CustomerEncryptionKey flagext.Secret `yaml:"encryption_key"` } type Config struct { @@ -85,7 +85,7 @@ func (cfg *Config) RegisterFlagsAndApplyDefaults(prefix string, f *flag.FlagSet) f.StringVar(&cfg.SSE.Type, util.PrefixConfig(prefix, "s3.sse.type"), "", fmt.Sprintf("Enable AWS Server Side Encryption. Supported values: %s.", strings.Join(supportedSSETypes, ", "))) f.StringVar(&cfg.SSE.KMSKeyID, util.PrefixConfig(prefix, "s3.sse.kms-key-id"), "", "KMS Key ID used to encrypt objects in S3") f.StringVar(&cfg.SSE.KMSEncryptionContext, util.PrefixConfig(prefix, "s3.sse.kms-encryption-context"), "", "KMS Encryption Context used for object encryption. It expects JSON formatted string.") - f.StringVar(&cfg.SSE.CustomerEncryptionKey, util.PrefixConfig(prefix, "s3.sse.encryption-key"), "", "SSE-C Encryption Key used for object encryption.") + f.Var(&cfg.SSE.CustomerEncryptionKey, util.PrefixConfig(prefix, "s3.sse.encryption-key"), "SSE-C Encryption Key used for object encryption.") cfg.HedgeRequestsUpTo = 2 }
tempodb/backend/s3/config_test.go+28 −0 added@@ -0,0 +1,28 @@ +package s3 + +import ( + "testing" + + "github.com/grafana/dskit/flagext" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" +) + +func TestSSEConfigEncryptionKeyRedacted(t *testing.T) { + const plaintext = "my-super-secret-key" + + var key flagext.Secret + require.NoError(t, key.Set(plaintext)) + + cfg := SSEConfig{ + Type: SSEC, + CustomerEncryptionKey: key, + } + + out, err := yaml.Marshal(cfg) + require.NoError(t, err) + + assert.NotContains(t, string(out), plaintext, "plaintext encryption key must not appear in YAML output") + assert.Contains(t, string(out), "********", "redacted marker must appear in YAML output") +}
tempodb/backend/s3/s3.go+3 −2 modified@@ -809,10 +809,11 @@ func buildSSEConfig(cfg *Config) (encrypt.ServerSide, error) { case SSES3: return encrypt.NewSSE(), nil case SSEC: - if cfg.SSE.CustomerEncryptionKey == "" { + key := cfg.SSE.CustomerEncryptionKey.String() + if key == "" { return nil, errors.New("SSE-C EncryptionKey is missing") } - return encrypt.NewSSEC([]byte(cfg.SSE.CustomerEncryptionKey)) + return encrypt.NewSSEC([]byte(key)) default: return nil, errUnsupportedSSEType }
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
5- github.com/advisories/GHSA-ffqx-q65f-36jfghsaADVISORY
- grafana.com/security/security-advisories/cve-2026-28377nvdVendor AdvisoryWEB
- nvd.nist.gov/vuln/detail/CVE-2026-28377ghsaADVISORY
- github.com/grafana/tempo/blob/4dc3e5b0d3463a0b67498b662b85a148698b4afd/CHANGELOG.mdghsaWEB
- github.com/grafana/tempo/commit/bb8ca663db34a0980c9758b40d918fda3b4dbec3ghsaWEB
News mentions
0No linked articles in our index yet.