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¶
- "Hypercall ABI" (Xen documentation), https://xenbits.xen.org/docs/unstable/guest-guide/x86/hypercall-abi.html
- Xen public header
event_channel.h, https://xenbits.xen.org/docs/4.18-testing/hypercall/x86_64/include,public,event_channel.h.html - Xen public header
grant_table.h, https://xenbits.xen.org/docs/4.18-testing/hypercall/x86_64/include,public,grant_table.h.html - Xen public header
xen.h, https://xenbits.xen.org/docs/4.18-testing/hypercall/x86_64/include,public,xen.h.html