MOKSHA-2026-0048: Storage Availability Disruption via Host.other_config multipathing

Advisory IDMOKSHA-2026-0048
Semantic IDHOC-3
Published2026-04-24
CVSS 3.15.5 Medium
CVSS 3.1 VectorAV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
CVSS 4.07.0 High
CVSS 4.0 VectorAV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:H/VA:L/SC:N/SI:L/SA:N
XAPI ObjectHost
XAPI Fieldother_config:multipathing
Entry Rolepool-operator
ResearcherJakob Wolffhechel, Moksha

Affected Products

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

Summary

A pool-operator in XAPI-based hypervisors (XenServer, XCP-ng) can disable multipath I/O redundancy on a host by writing multipathing=false to Host.other_config. The SM drivers read this key during initialization at SR.py:456-467 and switch to single-path I/O when the value is "false". Setting multipathhandle to null loads the no-op mpath_null.py module, achieving the same effect. If the single remaining storage path fails, all VMs on that storage become unavailable. The field has only UI keys protected via map_keys_roles - all infrastructure keys including multipathing are writable by pool-operator.

Vulnerability Description

Host.other_config is a Map(String, String) field writable by pool-operator. The multipathing and multipathhandle keys control the host's multipath I/O configuration for storage access.

The code path:

  1. pool-operator calls Host.add_to_other_config(host, "multipathing", "false")
  2. XAPI stores the value without validation
  3. The event watcher thread at xapi_host_helpers.ml:601-611 detects the change and syncs to the first-class Host.multipathing field
  4. On the next SR operation, SR._mpathinit() at SR.py:456-467 reads the value
  5. SR.py:462 checks: if hconf.get('multipathing') == "true" - the value is now "false"
  6. SR.py:465-467: multipathing is disabled, mpathhandle is set to "null"
  7. The no-op mpath_null.py module is loaded, which has empty implementations of all multipath methods
  8. All subsequent storage operations use single-path I/O
  9. If the single path fails, storage becomes unreachable

Additionally, the multipathing key is consumed by:

Root Causes

  1. Missing RBAC protection. Host.other_config only protects UI keys (folder, XenCenter.CustomFields.*) via map_keys_roles. The multipathing key inherits the class default _R_POOL_OP.

  2. Missing write-time validation. No validation verifies that disabling multipathing is safe (e.g., whether multipath-dependent SRs exist on the host).

  3. Silent degradation. Disabling multipathing produces no warning, no alert, and no operator notification. The storage continues to function on a single path until that path fails.

  4. No operational safeguard. No check prevents disabling multipathing when the host has active SRs that depend on multiple paths for redundancy.

Affected Systems

Directly Affected

Indirectly Affected

Exploitation Scenarios

Scenario Impact Pre-conditions Status
Multipath disable Single-path I/O, loss of storage redundancy pool-operator, multipath-configured host Source-traced
Path failure cascade After multipath disable, single path failure causes complete storage outage pool-operator, multipath host with path degradation Modeled
Monitoring blind spot mpathcount monitoring disabled, path failures not detected pool-operator Source-traced
BOC-1 chain vm-admin uses BOC-1 S3 to self-grant pool-operator, then disables multipathing vm-admin, BOC-1 Source-traced

Chaining Analysis

Detection

Remediation

Short-Term Mitigations

Long-Term Fix

Protect the key via map_keys_roles. Add multipathing and multipathhandle to Host.other_config map_keys_roles at _R_POOL_ADMIN in datamodel_host.ml.

Add operational guard. Prevent disabling multipathing when the host has active SRs that require multipath I/O. Require explicit confirmation or pool-admin role for the change.

Add monitoring alert. Generate a pool-wide alert when multipathing is disabled on any host.

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