hypervisor kernel integrity enforcement via EPT/NPT write interception for Xen/HVM guests
14

Configure Feed

Select the types of activity you want to include in your feed.

1use std::os::raw::c_ulong; 2 3pub const HYPERVISOR_TURNSTILE: c_ulong = 50; 4 5pub const TURNSTILE_OP_SET_POLICY: u32 = 0; 6pub const TURNSTILE_OP_PROTECT_RANGE: u32 = 1; 7pub const TURNSTILE_OP_UNPROTECT_RANGE: u32 = 2; 8pub const TURNSTILE_OP_REQUEST_WRITE: u32 = 3; 9pub const TURNSTILE_OP_GET_VIOLATIONS: u32 = 4; 10pub const TURNSTILE_OP_GET_STATS: u32 = 5; 11pub const TURNSTILE_OP_UPLOAD_METADATA: u32 = 6; 12 13pub const TURNSTILE_POLICY_DISABLED: u32 = 0; 14pub const TURNSTILE_POLICY_AUDIT: u32 = 1; 15pub const TURNSTILE_POLICY_ENFORCE: u32 = 2; 16 17pub const TURNSTILE_MAX_RANGES: usize = 256; 18pub const TURNSTILE_RING_SIZE: usize = 4096; 19pub const TURNSTILE_MAX_FUNC_ENTRIES: usize = 65536; 20pub const TURNSTILE_MAX_JUMP_ENTRIES: usize = 32768; 21 22pub const TURNSTILE_META_FUNC_ENTRIES: u32 = 0; 23pub const TURNSTILE_META_JUMP_ENTRIES: u32 = 1; 24 25#[repr(C)] 26#[derive(Debug, Clone, Copy, Default)] 27pub struct TurnstileViolation { 28 pub timestamp: u64, 29 pub gpa: u64, 30 pub rip: u64, 31 pub cr3: u64, 32 pub access_flags: u32, 33 pub response: u32, 34 pub insn_bytes: [u8; 16], 35 pub seq: u32, 36 pub _pad: u32, 37} 38 39#[repr(C)] 40#[derive(Debug, Clone, Copy, Default)] 41pub struct TurnstileRange { 42 pub gpa_start: u64, 43 pub length: u64, 44 pub original_type: u32, 45 pub flags: u32, 46} 47 48#[repr(C)] 49#[derive(Debug, Clone, Copy, Default)] 50pub struct TurnstileStats { 51 pub violations_total: u64, 52 pub violations_blocked: u64, 53 pub violations_allowed: u64, 54 pub implicit_ftrace: u64, 55 pub implicit_static_key: u64, 56 pub explicit_write_grants: u64, 57 pub ring_overflows: u64, 58} 59 60#[repr(C)] 61#[derive(Debug, Clone, Copy)] 62pub struct TurnstileOpSetPolicy { 63 pub policy: u32, 64 pub _pad: u32, 65} 66 67#[repr(C)] 68#[derive(Debug, Clone, Copy)] 69pub struct TurnstileOpProtectRange { 70 pub gpa_start: u64, 71 pub length: u64, 72} 73 74#[repr(C)] 75#[derive(Debug, Clone, Copy)] 76pub struct TurnstileOpRequestWrite { 77 pub gpa_start: u64, 78 pub length: u64, 79 pub timeout_ms: u32, 80 pub _pad: u32, 81} 82 83#[repr(C)] 84#[derive(Debug, Clone, Copy)] 85pub struct TurnstileOpGetViolations { 86 pub buffer_ptr: u64, 87 pub max_entries: u32, 88 pub entries_returned: u32, 89 pub overflow_count: u32, 90 pub _pad: u32, 91} 92 93#[repr(C)] 94#[derive(Debug, Clone, Copy)] 95pub struct TurnstileOpUploadMetadata { 96 pub buffer_ptr: u64, 97 pub metadata_type: u32, 98 pub count: u32, 99} 100 101#[repr(C)] 102#[derive(Debug, Clone, Copy)] 103pub struct JumpEntryUpload { 104 pub code_addr: u64, 105 pub target_addr: u64, 106 pub key_addr: u64, 107} 108 109#[repr(C)] 110#[derive(Debug)] 111pub struct PrivcmdHypercall { 112 pub op: c_ulong, 113 pub arg: [c_ulong; 5], 114} 115 116nix::ioctl_readwrite!(privcmd_hypercall, b'P', 0, PrivcmdHypercall);