Feb 26, 2026·6 min read·23 visits
If you enabled debug logging (`TF_LOG=DEBUG`) in the Linode Terraform Provider before version 3.9.0, your logs contain cleartext root passwords, private keys, and StackScript data. Update to 3.9.0 immediately and rotate all credentials created or managed during debug sessions.
A classic case of 'logging too much,' the Linode Terraform Provider (prior to v3.9.0) treated debug logs as a confessional booth, whispering root passwords, SSL keys, and user data to anyone listening. By dumping entire Go structs into the log stream, developers inadvertently exposed critical secrets in CI/CD environments where debug mode was enabled.
Infrastructure as Code (IaC) is the backbone of modern DevOps. We trust it to spin up servers, configure networks, and handle our secrets. But there is a dirty little secret in the world of software development: logging is often an afterthought, and usually, a lazy one.
In the heat of debugging a failing terraform apply, a developer's first instinct is to crank the verbosity up to 11. TF_LOG=DEBUG. We want to see everything. The HTTP requests, the state changes, the raw data. But in the case of the Linode Terraform Provider, 'everything' literally meant everything.
CVE-2026-27900 isn't a complex buffer overflow or a sophisticated ROP chain. It is a fundamental failure of data hygiene. It is the digital equivalent of a bank teller shouting your account balance and PIN code across the lobby because the manager asked for a status update. This vulnerability turns your CI/CD build logs—artifacts that are often stored with lax permissions in S3 buckets or Jenkins servers—into a treasure trove of administrative credentials.
To understand this bug, you have to understand a common pattern in Go development. When you are writing a provider, you have complex structs representing your resources. For example, an InstanceCreateOptions struct might hold the region, the image type, the label, and... the RootPass.
The flaw resides in the provider's interaction with the tflog package. When an operation occurred (like creating a disk or an instance), the developers wanted to log the options being sent to the API. Instead of hand-picking the safe fields (Region, Label, Size), they took the path of least resistance.
They passed the entire struct to the logger.
In Go, when you pass a struct to a logger that accepts interface{}, it often uses reflection to print every exported field. If your struct looks like this:
type InstanceDiskOptions struct {
Label string
Size int
RootPass string // <--- OOPS
}And you log it like this:
tflog.Debug(ctx, "Creating disk", map[string]any{"options": opts})The logger dutifully serializes the whole thing, creating a permanent record of your root password in plain text. This affected not just passwords, but TLS private keys (SSLKey) for NodeBalancers and sensitive StackScript user data.
Let's look at the actual code change in commit 43a925d826b999f0355de3dc7330c55f496824c0. The fix demonstrates exactly how lazy the original implementation was.
The Vulnerable Code (Before):
In linode/instance/helpers.go, the provider simply dumped the diskOpts object into the log map.
// OLD: Indiscriminate logging
tflog.Debug(ctx, "client.CreateInstanceDisk(...)", map[string]any{
"instance_id": id,
"options": diskOpts, // <--- This struct contains the plaintext password
})The Fix (After): The patch forces the developer to manually whitelist fields. It is more verbose to write, but it prevents secrets from leaking.
// NEW: Explicit field selection
tflog.Debug(ctx, "client.CreateInstanceDisk(...)", map[string]any{
"instance_id": id,
// Manually unpacking only safe fields
"label": diskOpts.Label,
"filesystem": diskOpts.Filesystem,
"size": diskOpts.Size,
"image": diskOpts.Image,
// RootPass is notably ABSENT here
})This pattern was repeated across the codebase, affecting linode_instance, linode_nodebalancer, and linode_object_storage_object. The developers had to go through and excise every instance where they were casually handing sensitive structs to the logger.
Exploiting this does not require a Kali Linux VM or Metasploit. It requires access to your build history.
Scenario: You are an insider threat or an attacker who has compromised a developer's GitHub account with read access to the repo Actions.
.github/workflows or Jenkinsfile. You notice that a recent build failed, and a developer pushed a commit adding env: TF_LOG: DEBUG to troubleshoot the flakey infrastructure.Ctrl+F for RootPass or SSLKey.2026-02-25T14:00:00Z [DEBUG] client.CreateInstanceDisk(...): {
"instance_id": 12345,
"options": {
"Label": "db-prod-01",
"Size": 50000,
"RootPass": "CorrectHorseBatteryStaple!99",
"Filesystem": "ext4"
}
}This is a "Post-Exploitation" goldmine. It allows lateral movement from the CI/CD environment (which shouldn't have direct shell access) to the actual production workload.
The severity of this vulnerability is masked by its CVSS score of 5.0. "Medium" severity implies it's annoying but not catastrophic. In reality, the impact depends entirely on who reads your logs.
If you use Terraform to provision Linode Kubernetes Engine (LKE) clusters, NodeBalancers, or compute instances, this bug potentially exposed:
PutObject logging included the content of files being uploaded if they were small enough to fit in the struct buffer.If these logs were ingested by a third-party logging service (Splunk, Datadog, SumoLogic) and retained for 30 days, that sensitive data is now replicated outside your control boundary.
Fixing the software is the easy part. Fixing the damage is the hard part.
Step 1: The Binary Fix
Upgrade to terraform-provider-linode v3.9.0. This version implements the field whitelisting discussed in the Code section. If you are pinning versions in your .tf files (and you should be), bump the version constraint:
terraform {
required_providers {
linode = {
source = "linode/linode"
version = ">= 3.9.0"
}
}
}Step 2: The cleanup (The painful part)
If you ever ran Terraform with TF_LOG=DEBUG or TF_LOG=INFO while using a vulnerable version, you must assume those credentials are compromised.
RootPass.> [!WARNING] > Merely upgrading the provider does not remove the secrets from your existing log files. You must actively hunt down and destroy the artifacts.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
terraform-provider-linode Linode | < 3.9.0 | 3.9.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-532 (Insertion of Sensitive Information into Log File) |
| CVSS v3.1 | 5.0 (Medium) |
| Attack Vector | Network (via Log Exposure) |
| Confidentiality Impact | Low (Partial, but High Value) |
| Exploit Status | None (No public exploit code) |
| EPSS Score | 0.04% (Low probability) |
| Patch Date | 2026-02-26 |
The software writes sensitive information to a log file, which can allow an attacker to obtain sensitive information by reading the log file.
A vulnerability in the Slack and Mattermost platform adapters for NousResearch hermes-agent permits an unauthenticated remote attacker to execute arbitrary mass mentions. By leveraging prompt injection, an attacker can bypass output sanitization logic and trigger workspace-wide notification exhaustion.
CVE-2026-9306 is a critical unauthenticated Insecure Direct Object Reference (IDOR) vulnerability located in the QuantumNous new-api application, affecting versions up to and including 0.12.1. The flaw is caused by improper middleware ordering combined with a lack of object-level authorization checks. This allows remote, unauthenticated attackers to retrieve sensitive Midjourney images belonging to other users by supplying a valid task identifier.
The instagrapi library prior to version 2.6.9 contains an improper input validation vulnerability within its challenge handling mechanism. Maliciously crafted server responses can manipulate the client into forwarding session cookies and credentials to an external attacker-controlled domain.
GHSA-QQQM-5547-774X is a critical path traversal vulnerability in the FileBrowser Quantum application, specifically within the Go backend package. The vulnerability resides in the HTTP handler responsible for processing bulk file modifications via the public API. Unauthenticated attackers can exploit an order-of-operations flaw in the path sanitization logic to bypass intended directory restrictions. This allows adversaries to arbitrarily read, move, and overwrite files on the underlying filesystem by supplying specially crafted HTTP PATCH requests.
The qs query string parsing and serialization library for Node.js is vulnerable to a synchronous Denial of Service (DoS) attack. The vulnerability manifests as a process-terminating TypeError when processing arrays with null or undefined elements under specific configuration parameters.
The aiosend library prior to version 3.0.6 contains a pre-authentication Denial of Service (DoS) vulnerability in its webhook handling mechanism. The software processes and deserializes incoming JSON payloads before verifying the cryptographic signature, allowing unauthenticated attackers to exhaust server CPU and memory resources by sending large, complex payloads.