MOKSHA-2026-0056: Console Access Manipulation via VM.other_config disable_pv_vnc

Advisory IDMOKSHA-2026-0056
Semantic IDVOC-6
Published2026-04-24
CVSS 3.15.3 Medium
CVSS 3.1 VectorAV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H
CVSS 4.05.3 Medium
CVSS 4.0 VectorAV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
XAPI ObjectVM
XAPI Fieldother_config:disable_pv_vnc
Entry Rolevm-admin
ResearcherJakob Wolffhechel, Moksha

Affected Products

VendorProductVersions
Citrix / Cloud Software GroupXenServer / Citrix Hypervisorall versions (shared XAPI codebase)
VatesXCP-ng8.3.0

Summary

A vm-admin in XAPI-based hypervisors (XenServer, XCP-ng) can disable the VNC console for any PV (paravirtualized) guest by setting disable_pv_vnc in VM.other_config. The key is consumed at xapi_xenops.ml:497 via a presence check - when the key exists (any value), xenopsd sets vncterm=false and the VNC terminal is not started for the domain. In multi-tenant environments, a delegated vm-admin can deny console access to VMs under their management or, via the set_other_config bypass, to VMs managed by other administrators. The key takes effect on the next VM boot without requiring operator intervention.

Vulnerability Description

VM.other_config is a Map(String, String) field writable by vm-admin. The disable_pv_vnc key controls whether the VNC terminal (vncterm) is started for PV guest domains.

The code path:

  1. vm-admin sets the key: VM.add_to_other_config(vm, "disable_pv_vnc", "true")
  2. During VM boot, XAPI builds the domain configuration at xapi_xenops.ml:497:
    vncterm= not (List.mem_assoc "disable_pv_vnc" vm.API.vM_other_config)
    
  3. When the key is present, vncterm is set to false
  4. xenopsd does not start the VNC terminal for the domain
  5. The VM boots without console access

The check is a simple presence check using List.mem_assoc. Any value (including empty string) triggers the behavior. No validation, no RBAC check, and no security logging occurs.

Root Causes

  1. Missing RBAC protection. VM.other_config has map_keys_roles entries for pci, folder, and XenCenter.CustomFields.* only. The disable_pv_vnc key is writable by vm-admin without restriction.

  2. Presence-only check. The consumption code uses List.mem_assoc (presence check) rather than value validation. Any value - including empty string, "false", or garbage - disables the VNC terminal.

  3. No operational logging. Disabling the VNC console produces no security-level log entry. Operators discover the disabled console only when they attempt to connect.

  4. set_other_config RBAC bypass. The set_other_config method replaces the entire map and bypasses per-key RBAC, enabling cross-tenant console manipulation.

Affected Systems

Directly Affected

Indirectly Affected

Exploitation Scenarios

Scenario Impact Pre-conditions Status
Console denial Disable VNC console for target PV VM, preventing operator access vm-admin, PV guest Source-traced
Multi-tenant disruption In delegated environments, disable console for VMs managed by other admins (via set_other_config) vm-admin Source-traced
Cover for other attacks Disable console before performing other attacks, preventing operator observation vm-admin Modeled
BOC-1 chain vm-admin uses BOC-1 S3 to bulk-disable consoles across all PV VMs vm-admin, BOC-1 Source-traced

Chaining Analysis

Detection

Remediation

Short-Term Mitigations

Long-Term Fix

Add map_keys_roles protection. Restrict disable_pv_vnc to _R_POOL_ADMIN in the VM field definition in datamodel.ml.

Add security logging. Log a security-level event when disable_pv_vnc is set or removed, including the session and role of the caller.

Upstream patches exist. They are held privately pending coordinated disclosure.

Disclosure

Disclosure:

References

Credits

Discovered and reported by Jakob Wolffhechel, Moksha.

Jakob Wolffhechel · Moksha · Copenhagen
jakob@wolffhechel.dk · +45 3170 7337
Published 2026-04-24 08:00 CEST · cna.moksha.dk · shittrix.moksha.dk