如何在英特尔 SGX 中注册自定义异常?
Posted
技术标签:
【中文标题】如何在英特尔 SGX 中注册自定义异常?【英文标题】:How to register custom exception in Intel SGX? 【发布时间】:2017-03-25 15:48:22 【问题描述】:我很难让我的自定义异常处理程序工作。
这是 Enclave 代码:
#include "Enclave_DivideZero_t.h"
#include "sgx_trts_exception.h"
#include "sgx_trts.h"
#include <string>
static char buf[200] = "Handler not called";
int divide_by_zero_handler(sgx_exception_info_t* info)
buf[0] = '1';
return EXCEPTION_CONTINUE_EXECUTION;
void Enclave_DivideByZero()
Ocall_printf(buf);
if (sgx_register_exception_handler(1, divide_by_zero_handler) == NULL)
Ocall_printf("register failed");
else
Ocall_printf("register success");
int a(1);
int b(3/(a-a));
(void) a;
(void) b;
Ocall_printf(buf);
我们使用buf
作为处理程序是否已实际执行的指示。但是,输出是这样的:
Enclave created!
[Ocall printf] - Handler not called
[Ocall printf] - register success
[Ocall printf] - Handler not called <-- should be: "1andler not called" ("1andler" instead of "Handler")
另外,这里是App
代码(即不受信任的代码)
#include "stdafx.h"
#include "sgx_urts.h"
#include "Enclave_DivideZero_u.h"
#define ENCLAVE_FILE _T("Enclave_DivideZero.signed.dll")
sgx_status_t createEnclave(sgx_enclave_id_t *eid)
sgx_status_t ret = SGX_SUCCESS;
sgx_launch_token_t token = 0;
int updated = 0;
ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, eid, NULL);
return ret;
void Ocall_printf( char* str)
printf("[Ocall printf] - %s\n", str);
int _tmain(int argc, _TCHAR* argv[])
sgx_enclave_id_t eid;
sgx_status_t res = createEnclave(&eid);
if (res != SGX_SUCCESS)
printf("App: error-, failed to create enclave.\n");
return -1;
else
printf("Enclave created!\n");
Enclave_DivideByZero(eid);
return 0;
问题:从输出可以看出,handler注册成功,但是没有执行。
1- 为什么注册不起作用?
2- 我尝试使用App
代码进行注册,为此我必须在edl
中添加处理程序,问题在于传递sgx_exception_info_t *info
参数,不清楚哪个它需要的标志(即[in, .. <'flags'>]
)。那么,在 Enclave 中定义它是否正确?
附言我使用Prerelease
模式运行代码。
[编辑]我记录了我在新交所here987654321@进行的项目+代码
【问题讨论】:
@Surenthar Selvaraj 你能帮忙吗? 如果你的处理程序没有被调用,我希望你的程序终止,因为它会触发一个异常。你确定分裂真的发生了吗?编译器可以优化它。尝试在不进行任何优化的情况下编译或在 printf 中返回a
。
@fzgregor,你是对的,触发了异常,但处理程序似乎没有。执行时,由于return EXCEPTION_CONTINUE_EXECUTION
,程序似乎陷入了无限循环(当我将其更改为return EXCEPTION_CONTINUE_SEARCH
时,出现运行时错误)。根据文档,我不能在异常处理程序中使用 printf
或任何 Ocall。
【参考方案1】:
所以这个问题现在有点老了,但我被困在同一个地方,所以也许有人仍然可以使用我的洞察力。
在检查异常是否被处理的trts_veh.cpp中,它在注释中说“将再次执行触发异常的指令”。正如您自己注意到的那样,这会导致异常处理循环。
但是,您可以自己增加 rip,因为它存储在指向 sgx_exception_info_t 的指针中,方法是使用“info->cpu_context.rip += 2;”。在您的异常处理程序中添加它应该可以解决问题。
【讨论】:
以上是关于如何在英特尔 SGX 中注册自定义异常?的主要内容,如果未能解决你的问题,请参考以下文章