Categories:
SGX-Step SDK 移植指南
AEP 重定向
主要是 AEP 的重定向
- Refactor: abstract SDK interface for libsgxstep #28 https://github.com/jovanbulck/sgx-step/issues/28
- AEP redirection and single-stepping in SGX-LKL #27 https://github.com/jovanbulck/sgx-step/issues/27
主要的功能
- 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
- 在 host 执行
- 用
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 handlerASSERT(!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)