A user with the vm-admin role in XAPI-based hypervisors (XenServer, XCP-ng) can set the real-time I/O scheduling class on their VM's virtual block devices by writing sched=rt and class=highest to VBD.qos_algorithm_params. xenopsd invokes ionice -c1 -n0 on the VBD kernel threads, granting them strict priority over all best-effort and idle I/O across the host. This starves I/O for every other VM on the same host. The change takes effect immediately without VBD replug, requires no shell access, and produces no security alert.
VBD.qos_algorithm_params is a Map(String, String) field writable by vm-admin. When VBD.qos_algorithm_type is set to ionice, the sched and class keys are parsed by XAPI into a qos_scheduler struct and forwarded to xenopsd.
The code path:
vm-admin sets VBD.qos_algorithm_type = "ionice" and VBD.qos_algorithm_params = {sched: "rt", class: "highest"}xapi_xenops.ml:595-600 into Ionice.RealTime(0)ionice -c1 -n0 -p<kthread_pid> on all VBD kernel threadsThe field has zero per-key RBAC. No shell injection is possible (xenopsd uses execve), but the real-time I/O scheduling class provides strict priority that starves other tenants' I/O.
Changes to qos_algorithm_params take effect immediately. XAPI applies the new ionice settings without requiring a VBD unplug/replug cycle or VM restart.
Missing RBAC protection. VBD.qos_algorithm_params has zero map_keys_roles entries. The sched key is writable by vm-admin.
Missing value validation. The real-time scheduling class (sched=rt) is accepted without any role check. No policy limits which scheduling classes a vm-admin can request.
No per-host RT I/O budget. There is no mechanism to limit the number of VBDs in the real-time I/O class per host. A single vm-admin can consume the entire RT I/O budget.
Insufficient logging. No security alert is generated when a VBD is assigned the real-time scheduling class.
| Scenario | Impact | Pre-conditions | Status |
|---|---|---|---|
| Cross-VM I/O starvation | All other VMs on the host experience severe I/O latency | vm-admin credential, ionice QoS type | Source-traced |
| Shared storage amplification | RT scheduling starves other hosts' I/O threads competing for shared LUNs | Shared storage (iSCSI, NFS, FC) | Modeled |
| Bulk RT assignment via BOC-1 | Root access enables setting RT class on all VBDs in the pool simultaneously | BOC-1 available | Modeled (amplification chain) |
VBD.qos_algorithm_params for sched=rt with class=highest or class=0ionice -c1 in process list)disclosure/vendor-detection-guidance.mdVBD.qos_algorithm_params records for sched=rt entriesRestrict real-time scheduling. Add map_keys_roles for the sched key or validate that sched=rt requires pool-admin role.
Range-validate class values. Accept only integers in the range 0-7.
Per-host RT I/O budget. Implement a limit on the number of VBDs that can use the real-time scheduling class per host.
Upstream patches exist. They are held privately pending coordinated disclosure.
Disclosure:
xapi_xenops.ml:595-600 (scheduler parsing), Ionice.to_class_param (class parameter mapping)disclosure/advisories/bqp-security-advisory.md (BQP-1)research/investigations/vbd-qos-algorithm-params.mdDiscovered and reported by Jakob Wolffhechel, Moksha.