Skip to content

Xen PV hypercalls (event channel / shared-memory ABI)

Xen paravirtual ABI: transfer stub'lardan oluşan bir hypercall page, virtual interrupt olarak event channel'lar, shared-memory capability olarak grant table'lar ve shared-info page — her split PV driver'ın ve çoğu Xen XSA'sının üzerine inşa edildiği substrate.

Mechanism

Note

Bir Xen PV (ya da PVH/HVM-with-PV-extensions) guest'i, hypervisor ile Xen'in sağladığı bir hypercall page üzerinden çağrılan hypercall'lar aracılığıyla konuşur: Xen, hypercall number'a göre indekslenen bir guest RAM page'ine 32-byte transfer stub'ları yazar ve guest hypercall_page + N*32'yi çağırır. Page, moda özgü transfer instruction'ını soyutlar (32-bit PV INT 0x82; 64-bit PV SYSCALL; Intel HVM VMCALL; AMD HVM VMMCALL). İletişim substrate'i shared memory'dir: shared-info page (event bitmap'leri + wall clock + per-VCPU info), event channel'lar (virtual IRQ'lar) ve grant table'lar (page'leri cross-domain paylaşmak için capability'ler). Güvenlik invariant'ı şudur: Xen, eyleme geçmeden önce her hypercall argument'ini ve her grant/pagetable operasyonunu validate eder — çoğu Xen XSA'sı buradaki validation failure'larıdır.

Walkthrough

Xen public header'larından ve hypercall-ABI dokümanlarından.

Register ABI (x86-64): hypercall index RAX'te; argument'ler RDI, RSI, RDX, R10, R8'de; sonuç RAX'te. (x86-32: index EAX'te; args EBX, ECX, EDX, ESI, EDI.) xen.h'den örnek hypercall number'ları:

__HYPERVISOR_mmu_update        = 1
__HYPERVISOR_multicall         = 13
__HYPERVISOR_grant_table_op    = 20
__HYPERVISOR_mmuext_op         = 26
__HYPERVISOR_event_channel_op  = 32

Event channel'lar (HYPERVISOR_event_channel_op, event_channel.h) — "bir hardware interrupt'ın Xen karşılığı": unmasked bir channel üzerindeki 0→1 geçişi bir upcall tetikleyen tek bit'lik bir state. Sub-op'lar şunları içerir:

EVTCHNOP_alloc_unbound  = 0
EVTCHNOP_bind_interdomain = 1
EVTCHNOP_bind_virq      = 2
EVTCHNOP_bind_pirq      = 3
EVTCHNOP_bind_ipi       = 4
EVTCHNOP_send           = 5
EVTCHNOP_close          = 6
EVTCHNOP_bind_vcpu      = 8
EVTCHNOP_status         = 9

İki ABI vardır: 2-level ve FIFO (öncelikler 0 en yüksek – 15 en düşük).

shared_info / vcpu_info ve grant entry'leri

struct shared_info, vcpu_info[]'yi, event bitmap'leri evtchn_pending[] / evtchn_mask[]'i ve wall-clock alanlarını tutar. Her vcpu_info'da evtchn_upcall_pending, evtchn_upcall_mask (non-zero mask upcall teslimini bloke eder) ve evtchn_pending_sel (pending channel'ları hızlı taramak için per-VCPU selector word'ü) bulunur.

Bir grant_ref_t, bir domain'in grant table'ını indeksler ve "grantee'nin granter'ın belleği üzerinde operasyon yapmak için kullanabileceği bir capability olarak işlev görür". struct grant_entry_v1 = { flags, domid, frame }; type GTF_type_mask üzerinden (GTF_invalid, GTF_permit_access, GTF_accept_transfer, GTF_transitive), GTF_readonly grantee'yi kısıtlar. Granting sırası: domid yaz, frame yaz, barrier, sonra flags yaz. HYPERVISOR_grant_table_op altındaki op'lar: GNTTABOP_map_grant_ref (bir grant_handle_t döner), GNTTABOP_unmap_grant_ref, GNTTABOP_setup_table, GNTTABOP_copy, GNTTABOP_transfer.

Split PV driver'lar bunu kullanır: front/back uçlar grant'lar üzerinden bir ring buffer paylaşır ve event channel'lar üzerinden sinyal verir.

Detection

  • Grant reference'lar capability'lerdir; stale/aşırı geniş grant'lar ve read-only→ writable geçişleri tekrarlayan XSA temalarıdır — olağandışı grant-map/unmap ve pagetable-update örüntülerini denetle (bkz. Xen Ouroboros hypercall vulnerabilities).

Mitigation

  • Bir güvenlik açığı değil; hardening duruşu, hypervisor'da titiz hypercall-argument ve grant/pagetable validation'ı ile untrusted guest'ler için PV maruziyetini en aza indirmektir (PVH/HVM tercih et).

References