CVE-2023-34236 (Go, published 2023-07-14T22:15Z)
Description: value: Weave GitOps Terraform Controller (aka Weave TF-controller) is a controller for Flux to reconcile Terraform resources in a GitOps way. A vulnerability has been identified in Weave GitOps Terraform Controller which could allow an authenticated remote attacker to view sensitive information. This vulnerability stems from Weave GitOps Terraform Runners (`tf-runner`), where sensitive data is inadvertently printed - potentially revealing sensitive user data in their pod logs. In particular, functions `tfexec.ShowPlan`, `tfexec.ShowPlanRaw`, and `tfexec.Output` are implicated when the `tfexec` object set its `Stdout` and `Stderr` to be `os.Stdout` and `os.Stderr`. An unauthorized remote attacker could exploit this vulnerability by accessing these prints of sensitive information, which may contain configurations or tokens that could be used to gain unauthorized control or access to resources managed by the Terraform controller. A successful exploit could allow the attacker to utilize this sensitive data, potentially leading to unauthorized access or control of the system. This vulnerability has been addressed in Weave GitOps Terraform Controller versions `v0.14.4` and `v0.15.0-rc.5`. Users are urged to upgrade to one of these versions to mitigate the vulnerability. As a temporary measure until the patch can be applied, users can add the environment variable `DISABLE_TF_LOGS` to the tf-runners via the runner pod template of the Terraform Custom Resource. This will prevent the logging of sensitive information and mitigate the risk of this vulnerability.
Severity: nan (CVSS v3 base score: 6.5)
Weakness: CWE-200 \u2014 Exposure of Sensitive Information to an Unauthorized Actor
The product exposes sensitive information to an actor that is not explicitly authorized to have access to that information.
Repository: https://github.com/weaveworks/tf-controller
Files changed:
runner/server.go
runner/server_plan.go
runner/server_save_tfplan.go
runner/server_show_plan.go
Commit message: fix logging in tf-runner

Signed-off-by: Chanwit Kaewkasi <chanwit@gmail.com>


Vulnerable code:
	disableTestLogging := os.Getenv("DISABLE_TF_LOGS") == "1"
	if !disableTestLogging {
		r.tf.SetStdout(os.Stdout)
		r.tf.SetStderr(os.Stderr)
		if os.Getenv("ENABLE_SENSITIVE_TF_LOGS") == "1" {
			r.tf.SetLogger(&LocalPrintfer{logger: log})
		}
	}
		plan, err := r.tf.ShowPlanFile(ctx, req.Out)
	"sigs.k8s.io/controller-runtime"
	log := controllerruntime.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
		planObj, err := r.tf.ShowPlanFile(ctx, TFPlanName)
		rawOutput, err := r.tf.ShowPlanFileRaw(ctx, TFPlanName)
	rawOutput, err := r.tf.ShowPlanFileRaw(ctx, req.Filename)
	plan, err := r.tf.ShowPlanFile(ctx, req.Filename)

Fixed code:
// initLogger sets up the logger for the terraform runner
func (r *TerraformRunnerServer) initLogger(log logr.Logger) {
	disableTestLogging := os.Getenv("DISABLE_TF_LOGS") == "1"
	if !disableTestLogging {
		r.tf.SetStdout(os.Stdout)
		r.tf.SetStderr(os.Stderr)
		if os.Getenv("ENABLE_SENSITIVE_TF_LOGS") == "1" {
			r.tf.SetLogger(&LocalPrintfer{logger: log})
		}
	}
}

	// init default logger
	r.initLogger(log)
	"io"

	tfjson "github.com/hashicorp/terraform-json"
	ctrl "sigs.k8s.io/controller-runtime"
func (r *TerraformRunnerServer) tfShowPlanFile(ctx context.Context, planPath string, opts ...tfexec.ShowOption) (*tfjson.Plan, error) {
	log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)

	// This is the only place where we disable the logger
	r.tf.SetStdout(io.Discard)
	r.tf.SetStderr(io.Discard)

	defer r.initLogger(log)

	return r.tf.ShowPlanFile(ctx, planPath, opts...)
}

func (r *TerraformRunnerServer) tfShowPlanFileRaw(ctx context.Context, planPath string, opts ...tfexec.ShowOption) (string, error) {
	log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)

	// This is the only place where we disable the logger
	r.tf.SetStdout(io.Discard)
	r.tf.SetStderr(io.Discard)

	defer r.initLogger(log)

	return r.tf.ShowPlanFileRaw(ctx, planPath, opts...)
}


		plan, err := r.tfShowPlanFile(ctx, req.Out)

	ctrl "sigs.k8s.io/controller-runtime"
	log := ctrl.LoggerFrom(ctx, "instance-id", r.InstanceID).WithName(loggerName)
		planObj, err := r.tfShowPlanFile(ctx, TFPlanName)
		rawOutput, err := r.tfShowPlanFileRaw(ctx, TFPlanName)
	rawOutput, err := r.tfShowPlanFileRaw(ctx, req.Filename)
	plan, err := r.tfShowPlanFile(ctx, req.Filename)