Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2025-64435

CVE-2025-64435: KubeVirt Virtual Machine DoS Vulnerability

CVE-2025-64435 is a denial-of-service flaw in KubeVirt that lets attackers disrupt virtual machine control by creating malicious pods. This post explains its impact, affected versions, and mitigation steps.

Published:

CVE-2025-64435 Overview

CVE-2025-64435 is a logic flaw in the KubeVirt virt-controller that allows an attacker with limited Kubernetes privileges to disrupt control over a running Virtual Machine Instance (VMI). By creating a pod with the same labels as the legitimate virt-launcher pod associated with a VMI, an attacker can mislead the controller into associating the fake pod with the VMI. This causes incorrect status updates and can result in denial-of-service against the affected VMI. The vulnerability affects KubeVirt versions prior to 1.7.0-beta.0 and is tracked under [CWE-703] (Improper Check or Handling of Exceptional Conditions).

Critical Impact

An authenticated Kubernetes user able to create pods in a VMI's namespace can hijack controller reconciliation logic and induce denial-of-service on running virtual machines.

Affected Products

  • KubeVirt versions prior to 1.7.0-beta.0
  • KubeVirt 1.7.0-alpha0
  • KubeVirt add-on deployments on Kubernetes clusters

Discovery Timeline

  • 2025-11-07 - CVE-2025-64435 published to NVD
  • 2026-06-17 - Last updated in NVD database

Technical Details for CVE-2025-64435

Vulnerability Analysis

KubeVirt extends Kubernetes with custom controllers that reconcile VirtualMachineInstance (VMI) resources against underlying virt-launcher pods. The virt-controller component tracks each VMI's pod by matching Kubernetes labels. The flaw lies in how the controller identifies the pod belonging to a VMI: it relies on label matching rather than authoritative ownership metadata.

An attacker who can create pods in the same namespace can craft a pod carrying the same labels as the legitimate virt-launcher. The controller then treats the attacker's pod as authoritative for that VMI. Subsequent reconciliation propagates incorrect phase and status information back to the VMI object, disrupting orchestration and producing a denial-of-service condition against the running workload.

Root Cause

The root cause is the use of label-only selection inside the controller's pod-lookup path. The pre-patch helper IsControlledBy in pkg/controller/controller_ref.go did not enforce a strict owner-reference check. Because Kubernetes labels are non-unique and mutable by any user with pod-create permissions, this design allowed impersonation of the controller-managed virt-launcher pod.

Attack Vector

Exploitation requires network access to the Kubernetes API and low-privilege credentials with pod-create rights in the target namespace. The attack complexity is high because the attacker must time pod creation and label crafting to align with the target VMI's reconciliation cycle. No user interaction is required, and the impact is limited to availability of the affected VMI.

go
// Security patch in pkg/controller/controller.go
// The fix replaces custom label-based ownership checks
// with the upstream metav1.IsControlledBy owner-reference check.

	var curPod *k8sv1.Pod = nil
	for _, pod := range pods {
-		if !IsControlledBy(pod, vmi) {
+		if !metav1.IsControlledBy(pod, vmi) {
 			continue
 		}

Source: KubeVirt commit 9a6f4a3a

Detection Methods for CVE-2025-64435

Indicators of Compromise

  • Pods in VMI namespaces carrying virt-launcher labels but lacking a valid ownerReferences entry pointing to a legitimate VMI resource.
  • Unexpected VMI status transitions (Failed, Unknown, or Scheduling) that do not correlate with node-level virt-handler events.
  • Duplicate pods sharing the same VMI label set (kubevirt.io=virt-launcher, kubevirt.io/created-by=<uid>) in a single namespace.

Detection Strategies

  • Audit Kubernetes API server logs for CREATE pod requests where labels match virt-launcher patterns but the requesting ServiceAccount is not the KubeVirt controller.
  • Compare pod ownerReferences.uid against the target VMI UID during reconciliation drift investigations.
  • Alert on VMI phase oscillation in short time windows, which indicates conflicting status writes from mismatched pods.

Monitoring Recommendations

  • Enable Kubernetes audit logging at RequestResponse level for pod and VMI resources across KubeVirt namespaces.
  • Stream cluster audit events and KubeVirt controller logs into a centralized analytics pipeline for correlation of pod-creation events with VMI status changes.
  • Track RBAC bindings that grant pods/create in namespaces hosting production VMIs and review them regularly.

How to Mitigate CVE-2025-64435

Immediate Actions Required

  • Upgrade KubeVirt to 1.7.0-beta.0 or later, which introduces owner-reference validation via metav1.IsControlledBy.
  • Restrict pods/create permissions in namespaces where VMIs run to trusted service accounts only.
  • Review existing pods in VMI namespaces for anomalous labels matching the virt-launcher schema.

Patch Information

The fix is included in KubeVirt 1.7.0-beta.0. The commit 9a6f4a3a removes the custom controller_ref.go helper and replaces label-based association with Kubernetes' standard metav1.IsControlledBy owner-reference check. See the GitHub Security Advisory GHSA-9m94-w2vq-hcf9 for full remediation guidance.

Workarounds

  • Apply Kubernetes RBAC policies that deny pod creation with kubevirt.io reserved labels from non-system accounts.
  • Deploy an admission controller (OPA Gatekeeper or Kyverno) to reject user-created pods that carry virt-launcher labels or spoof KubeVirt owner references.
  • Isolate VMI workloads into dedicated namespaces with strict NetworkPolicy and RBAC boundaries until the patch is applied.
bash
# Example Kyverno policy: block user-created pods using virt-launcher labels
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: block-virt-launcher-label-spoofing
spec:
  validationFailureAction: Enforce
  rules:
    - name: deny-virt-launcher-label
      match:
        any:
          - resources:
              kinds:
                - Pod
      exclude:
        any:
          - subjects:
              - kind: ServiceAccount
                name: kubevirt-controller
                namespace: kubevirt
      validate:
        message: "Pods with kubevirt.io=virt-launcher labels may only be created by the KubeVirt controller."
        pattern:
          metadata:
            =(labels):
              X(kubevirt.io): "!virt-launcher"

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.