Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions kb/2026-08-17/cve-2026-13622.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
title: "[CVE-2026-13622]: virt-handler migration proxy follows symlinks, allowing container escape to host"
description: This article provides information and mitigation steps for CVE-2026-13622 in Harvester.
slug: cve-2026-13622
authors:
- name: Po-Han Huang
title: Senior Software Engineer
url: https://github.com/pohanhuang
image_url: https://github.com/pohanhuang.png
tags: [security, cve]
hide_table_of_contents: false
---

A symlink-following vulnerability was found in KubeVirt's `virt-handler` migration proxy.

During live migration, `virt-handler` dials Unix sockets inside the target `virt-launcher` pod using `/proc/<pid>/root/<path>` via `net.Dial()`, without symlink protection. These socket paths reside in QEMU-owned directories that are writable by the `virt-launcher` user.

An attacker with namespace `edit` and `pods/exec` permissions can replace a migration proxy socket with a symlink pointing to the host CRI-O socket. Because `virt-handler` runs as root in the host mount namespace, absolute symlink targets resolve against the host filesystem. The bidirectional `io.Copy` proxy then relays attacker-controlled bytes to the container runtime, enabling full node compromise.

## Affected Versions

All currently supported Harvester versions are affected, including 1.6.1 and earlier, 1.7.3 and earlier, and 1.8.2 and earlier.

Your cluster is affected by this vulnerability, if the following command returns at least one `virt-launcher` pods:

```sh
kubectl get po -lkubevirt.io=virt-launcher -A
```

## Fixed Versions

A fix is not yet available. SUSE is actively working on a resolution, targeting Harvester 1.9.

Meanwhile, you can use the following workaround to protect your clusters' `virt-launcher` pods against exploitation.

## Workaround

Use a [ValidatingAdmissionPolicy](https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/) to deny `pods/exec` and `pods/attach` operations targeting `virt-launcher` pods.

Apply the following resources to your Harvester cluster:

````yaml
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: deny-virt-launcher-exec
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CONNECT"]
resources: ["pods/exec", "pods/attach"]
matchConditions:
- name: is-virt-launcher
expression: >
request.name.startsWith("virt-launcher-")
validations:
- expression: >
request.userInfo.username == "system:admin" ||
request.userInfo.username.startsWith("system:serviceaccount:harvester-system")
messageExpression: "'CVE-2026-13622 mitigation. Rejected exec/attach request from ' + request.userInfo.username"
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
name: deny-virt-launcher-exec-binding
spec:
policyName: deny-virt-launcher-exec
validationActions: [Deny]
```

This policy blocks `exec` and `attach` requests to `virt-launcher` pods from non-admin and non-Harvester service accounts, to prevent an attacker from replacing the migration proxy sockets with symlinks.

:::note
Once you have upgraded to a fixed version of Harvester, remove this policy and binding:

```sh
kubectl delete validatingadmissionpolicybinding deny-virt-launcher-exec-binding
kubectl delete validatingadmissionpolicy deny-virt-launcher-exec
```
:::

## References

- https://github.com/advisories/GHSA-4336-pf6g-hp94
- https://www.suse.com/security/cve/CVE-2026-13622.html
Loading