VYPR
Moderate severityNVD Advisory· Published Feb 26, 2026· Updated Feb 26, 2026

Terraform Provider Debug Logs Vulnerable to Sensitive Information Exposure

CVE-2026-27900

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.

PackageAffected versionsPatched versions
github.com/linode/terraform-provider-linode/v3Go
< 3.9.03.9.0
github.com/linode/terraform-provider-linode/v2Go
<= 2.41.2
github.com/linode/terraform-provider-linodeGo
<= 1.30.0

Affected products

1

Patches

1
43a925d826b9

Fix 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

News mentions

0

No linked articles in our index yet.