MOKSHA-2026-0081: I/O Polling Parameter Manipulation via VBD.other_config polling-duration

Advisory IDMOKSHA-2026-0081
Semantic IDBOC-3
Published2026-04-24
CVSS 3.13.1 Low
CVSS 3.1 VectorAV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L
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 ObjectVBD
XAPI Fieldother_config:polling-duration
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 set the polling-duration and related polling keys (polling-idle-threshold) in VBD.other_config to extreme values within the partially validated range. While in_range validation exists in xenopsd, the accepted range still includes values that alter I/O polling behavior, leading to suboptimal polling configuration and performance degradation on affected VBDs. The VBD.other_config field has zero map_keys_roles entries, leaving all infrastructure keys writable by vm-admin.

Vulnerability Description

VBD.other_config is a Map(String, String) field defined in datamodel.ml with zero map_keys_roles entries - the only other_config field in the audit with absolutely no per-key RBAC protection.

The polling-duration and polling-idle-threshold keys flow from XAPI to xenopsd as extra backend keys:

vm-admin writes VBD.other_config:polling-duration = VALUE
    |
    v
XAPI stores to database (zero write-time validation)
    |
    v
xapi_xenops.ml:663 reads polling-duration from other_config
    |
    v
extra_backend_keys passed to xenopsd
    |
    v
xenopsd writes to xenstore backend path
    |
    v
blkback driver reads polling parameters from xenstore

At xapi_xenops.ml:663, the polling-duration value is read from VBD.other_config and included in extra_backend_keys that are forwarded to xenopsd. Similarly, polling-idle-threshold is read at xapi_xenops.ml:671. xenopsd applies partial validation via in_range bounds checking, accepting values from 0 to max_int. Values within this range are written to the VBD's xenstore backend path and consumed by the blkback kernel driver to configure I/O polling behavior.

The issue is that extreme values within the accepted range (e.g., polling-duration=2147483647) produce suboptimal polling configurations that degrade VBD I/O performance without triggering any validation rejection.

Root Causes

  1. Missing RBAC protection. VBD.other_config has zero map_keys_roles entries in datamodel.ml. The polling-duration key is writable by vm-admin via add_to_other_config.

  2. Insufficient range validation. While in_range bounds checking exists in xenopsd, the accepted range (0 to max_int) is too broad. Values at the extremes of the range produce valid but suboptimal polling configurations.

  3. No resource impact assessment. xenopsd applies the polling parameters without evaluating whether the values are reasonable for the underlying storage device.

  4. set_other_config RBAC bypass. The set_other_config method replaces the entire map atomically and bypasses map_keys_roles per-key checks.

Affected Systems

Directly Affected

Indirectly Affected

Exploitation Scenarios

Scenario Impact Pre-conditions Status
Extreme polling-duration VBD I/O performance degradation from excessive or insufficient polling vm-admin, running VM with VBD Live-tested
Extreme polling-idle-threshold Polling behavior anomaly affecting I/O latency vm-admin, running VM with VBD Source-traced
BOC-1 chain vm-admin sets polling parameters on all VBDs in pool via RBAC collapse vm-admin, BOC-1 Source-traced

Chaining Analysis

Detection

Remediation

Short-Term Mitigations

Long-Term Fix

Add map_keys_roles protection. Restrict polling-duration and polling-idle-threshold to _R_POOL_ADMIN in datamodel.ml. I/O polling configuration is a host-level resource management decision that should not be writable by delegated VM administrators.

Tighten range validation. Replace the broad (0, max_int) range with device-appropriate bounds (e.g., (0, 10000) for polling-duration in microseconds).

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