Terraform Provider Debug Logs Vulnerable to Sensitive Information Exposure
Description
The Terraform Provider for Linode versions prior to v3.9.0 logged sensitive information including some passwords, StackScript content, and object storage data in debug logs without redaction. Provider debug logging is not enabled by default. This issue is exposed when debug/provider logs are explicitly enabled (for example in local troubleshooting, CI/CD jobs, or centralized log collection). If enabled, sensitive values may be written to logs and then retained, shared, or exported beyond the original execution environment. An authenticated user with access to provider debug logs (through log aggregation systems, CI/CD pipelines, or debug output) would thus be able to extract these sensitive credentials. Versions 3.9.0 and later sanitize debug logs by logging only non-sensitive metadata such as labels, regions, and resource IDs while redacting credentials, tokens, keys, scripts, and other sensitive content. Some other mitigations and workarounds are available. Disable Terraform/provider debug logging or set it to WARN level or above, restrict access to existing and historical logs, purge/retention-trim logs that may contain sensitive values, and/or rotate potentially exposed secrets/credentials.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
github.com/linode/terraform-provider-linode/v3Go | < 3.9.0 | 3.9.0 |
github.com/linode/terraform-provider-linode/v2Go | <= 2.41.2 | — |
github.com/linode/terraform-provider-linodeGo | <= 1.30.0 | — |
Affected products
1- Range: < 3.9.0
Patches
143a925d826b9Fix sensitive info exposed issue (#2269)
6 files changed · +46 −16
linode/instance/helpers.go+9 −3 modified@@ -480,16 +480,22 @@ func createInstanceDisk( } tflog.Info(ctx, "Creating new instance disk", map[string]any{ - "options": diskOpts, + "label": diskOpts.Label, + "filesystem": diskOpts.Filesystem, + "size": diskOpts.Size, + "image": diskOpts.Image, }) p, err := client.NewEventPoller(ctx, instance.ID, linodego.EntityLinode, linodego.ActionDiskCreate) if err != nil { return nil, fmt.Errorf("failed to initialize event poller: %s", err) } - tflog.Debug(ctx, "client.CreateInstanceDisk(...)", map[string]any{ - "options": diskOpts, + tflog.Debug(ctx, "client.CreateInstanceDisk(...) ", map[string]any{ + "label": diskOpts.Label, + "filesystem": diskOpts.Filesystem, + "size": diskOpts.Size, + "image": diskOpts.Image, }) instanceDisk, err := client.CreateInstanceDisk(ctx, instance.ID, diskOpts)
linode/instance/resource.go+5 −2 modified@@ -324,8 +324,11 @@ func createResource(ctx context.Context, d *schema.ResourceData, meta any) diag. return diag.Errorf("failed to initialize event poller: %s", err) } - tflog.Debug(ctx, "client.CreateInstance(...)", map[string]any{ - "options": createOpts, + tflog.Debug(ctx, "client.CreateInstance(...) ", map[string]any{ + "label": createOpts.Label, + "region": createOpts.Region, + "type": createOpts.Type, + "image": createOpts.Image, }) instance, err := client.CreateInstance(ctx, createOpts)
linode/nbconfig/framework_resource.go+16 −2 modified@@ -84,7 +84,14 @@ func (r *Resource) Create( } tflog.Debug(ctx, "client.CreateNodeBalancerConfig(...)", map[string]any{ - "options": createOpts, + "port": createOpts.Port, + "protocol": createOpts.Protocol, + "algorithm": createOpts.Algorithm, + "stickiness": createOpts.Stickiness, + "check": createOpts.Check, + "check_path": createOpts.CheckPath, + "check_interval": createOpts.CheckInterval, + "proxy_protocol": createOpts.ProxyProtocol, }) config, err := client.CreateNodeBalancerConfig(ctx, nodeBalancerID, *createOpts) @@ -193,7 +200,14 @@ func (r *Resource) Update( } tflog.Debug(ctx, "client.UpdateNodeBalancerConfig(...)", map[string]any{ - "options": updateOpts, + "port": updateOpts.Port, + "protocol": updateOpts.Protocol, + "algorithm": updateOpts.Algorithm, + "stickiness": updateOpts.Stickiness, + "check": updateOpts.Check, + "check_path": updateOpts.CheckPath, + "check_interval": updateOpts.CheckInterval, + "proxy_protocol": updateOpts.ProxyProtocol, }) config, err := client.UpdateNodeBalancerConfig(ctx, nodeBalancerID, id, *updateOpts)
linode/obj/helpers.go+3 −4 modified@@ -292,16 +292,15 @@ func putObjectWithRetries( select { case <-ticker.C: tflog.Debug(ctx, "putting the object", map[string]any{ - "PutObjectInput": putInput, + "bucket": aws.ToString(putInput.Bucket), + "key": aws.ToString(putInput.Key), }) - if _, err := s3client.PutObject(ctx, putInput); err != nil { tflog.Debug(ctx, fmt.Sprintf( - "Failed to put Bucket (%v) Object (%v) with input %v: %s. Retrying...", + "Failed to put Bucket (%v) Object (%v): %s. Retrying...", aws.ToString(putInput.Bucket), aws.ToString(putInput.Key), - putInput, err.Error(), ), )
linode/producerimagesharegroupmember/framework_resource.go+2 −2 modified@@ -47,8 +47,8 @@ func (r *Resource) Create( Label: plan.Label.ValueString(), } - tflog.Debug(ctx, "client.ImageShareGroupAddMember(...)", map[string]any{ - "options": createOpts, + tflog.Debug(ctx, "client.ImageShareGroupAddMember(...) ", map[string]any{ + "label": createOpts.Label, }) shareGroupID := helper.FrameworkSafeInt64ToInt(plan.ShareGroupID.ValueInt64(), &resp.Diagnostics)
linode/stackscript/framework_resource.go+11 −3 modified@@ -109,8 +109,12 @@ func (r *Resource) Create( Images: images, } - tflog.Debug(ctx, "client.CreateStackscript(...)", map[string]any{ - "options": createOpts, + tflog.Debug(ctx, "client.CreateStackscript(...) ", map[string]any{ + "label": createOpts.Label, + "description": createOpts.Description, + "rev_note": createOpts.RevNote, + "is_public": createOpts.IsPublic, + "images": createOpts.Images, }) stackscript, err := client.CreateStackscript(ctx, createOpts) @@ -299,7 +303,11 @@ func (r *Resource) updateStackScript( } tflog.Debug(ctx, "client.UpdateStackscript(...)", map[string]any{ - "options": updateOpts, + "label": updateOpts.Label, + "description": updateOpts.Description, + "rev_note": updateOpts.RevNote, + "is_public": updateOpts.IsPublic, + "images": updateOpts.Images, }) stackscript, err := client.UpdateStackscript(ctx, stackScriptID, updateOpts)
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
7- github.com/advisories/GHSA-5rc7-2jj6-mp64ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2026-27900ghsaADVISORY
- www.openwall.com/lists/oss-security/2026/02/26/2ghsaWEB
- github.com/linode/terraform-provider-linode/commit/43a925d826b999f0355de3dc7330c55f496824c0ghsax_refsource_MISCWEB
- github.com/linode/terraform-provider-linode/pull/2269ghsax_refsource_MISCWEB
- github.com/linode/terraform-provider-linode/releases/tag/v3.9.0ghsax_refsource_MISCWEB
- github.com/linode/terraform-provider-linode/security/advisories/GHSA-5rc7-2jj6-mp64ghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.