AEP 重定向

主要是 AEP 的重定向

主要的功能

  • v 1.0.0 (sgx-step)
    • user-space page table entry (PTE)
    • APIC single-stepping
  • v 1.1.0 (I32 support)
  • v 1.2.0 (Nemesis)
    • user-space interrupt handling
    • deterministic zero-stepping
  • v 1.3.0 (Foreshadow)
    • Transient-execution support
  • v 1.4.0 (Plundervolt)
    • Privileged interrupt/call gates

比较容易读懂的是 v1.1.0 的版本

APP 介绍

aep-redirect

  • register_aep_cb(aep_cb_func) 完成了 AEP 的重定向
    • 在 host 执行 get_a_addr(edi)enclave_dummy_call(eid)
    • 可以在 Enclave/encl.c 看到 enclave 里面的函数
    • Enclave/encl.edl 也可以看到 enclave 的 ECALL
  • mprotect(a_pt, 4096, PROT_NONE) 引发页错误
    • 故意引发页错误是经典的攻击方法
    • __attribute__((aligned(4096))) int array[4096] = {0xaa};#define a array[0]a 占刚好一个页
    • SGX_ASSERT( get_a_addr(eid, &a_pt) ); 获得页的内存位置
    • ASSERT(signal(SIGSEGV, fault_handler) != SIG_ERR); 安装 fault handler
    • ASSERT(!mprotect(a_pt, 4096, PROT_NONE)); 把这个页设置为只读 (revoke access rights)
    • SGX_ASSERT( enclave_dummy_call(eid) ); 访问了只读页 a++ , 故会引发错误。
    • 在引发页错误后,能够进入 fault_handler() 处理。
    • fault_handler() 能够处理错误 (restore access rights)
  • 疑问: enclave部分 的地址管理是否跟 host部分 是一样的? (共享同一个 page table)
    • https://github.com/jovanbulck/sgx-step/blob/v1.4.0/app/aep-redirect/main.c
    • 因为 SGX_ASSERT( get_a_addr(eid, &a_pt) ) 能够返回 a 的地址
    • 下一步就是 ASSERT(!mprotect(a_pt, 4096, PROT_NONE)); 直接禁止访问 page
    • 然后 SGX_ASSERT( enclave_dummy_call(eid, &retval) ); 会发生错误
    • 这只能证明 enclave 和 host 是使用同一套的地址映射 (Page Table)

bench