一种基于TEE的WebAssembly模型执行引擎的制作方法

文档序号:20777772发布日期:2020-05-19 20:56阅读:544来源:国知局
一种基于TEE的WebAssembly模型执行引擎的制作方法

本发明属于模型执行引擎设计领域,具体涉及一种基于tee的webassembly模型执行引擎。



背景技术:

目前的webassembly虚拟机直接运行在普通环境中,在没有额外保护的情况下执行webassembly模型。在云服务器等开放环境中,程序与数据运行在不可信环境,容易收到攻击,无法保证程序与数据的安全。



技术实现要素:

本发明针对现有技术的不足,提出了一种基于tee的webassembly模型执行引擎,该webassembly模型执行引擎在可信环境中执行,能有效保证程序与数据的安全。

本发明采用的技术方案如下:一种基于tee的webassembly模型执行引擎,所述webassembly模型执行引擎包括函数解析、函数执行、内存管理、函数管理功能模块和接口;所述接口包括可信层接口和不可信层接口,可信层接口由rust编译的初始化函数wasm_init、模型调用函数wasm_call、关闭函数wasm_close组成;可信层接口用于实现功能模块在sgx中执行具体的可信操作;不可信层接口由rust编译的初始化函数init、模型调用函数call、关闭函数close和c语言编译的可信层的c头文件组成。c头文件用于申明初始化函数init、模型调用函数call、关闭函数close,初始化函数init、模型调用函数call、关闭函数close用于对应可信层代码的功能封装。

进一步地,将webassembly模型执行引擎封装成sdk,便于外界的调用方便以及程序的可扩展性。

进一步地,所述初始化函数init、模型调用函数call、关闭函数close还可以用于实现功能模块中不需要在sgx中执行的功能执行。

本发明的有益效果是:本发明设计并实现了基于可信执行环境的隐私保护技术,通过采用intelsgx技术改造数据共享模型执行引擎,确保模型执行过程中数据不可被窃取。具体的,我们用intelsgx改造了webassembly虚拟机,实现了一个可信的模型执行引擎。增强了在不可信环境中数据共享的安全性和隐私性。

附图说明

图1为本发明执行引擎的整体架构设计示意图;

图2为接口结构示意图。

具体实施方式

webassembly模型执行引擎通常包括函数解析、函数执行、内存管理、函数管理功能模块和接口;目前的webassembly虚拟机直接运行在普通环境中,在没有额外保护的情况下执行webassembly模型。在云服务器等开放环境中,程序与数据运行在不可信环境,容易收到攻击,无法保证程序与数据的安全。为了赋予webassembly模型执行引擎可行性,我们用intelsgx改造了webassembly虚拟机,根据sgx设计规范将接口包括可信层接口和不可信层接口,整体架构设计如图1所示,可信层接口用于实现功能模块在sgx中执行具体的可信操作;不可信层用于实现功能模块中不需要在sgx中执行的功能执行,以及对应可信层代码的功能封装。

接口设计的难点在于跨语言调用。开发intelsgx可信应用需要用到intelsgxsdk,而intelsgxsdk是用rust开发的,因此我们需要先将rust开发的sgx可信库编译成c库,所以,该平台的开发会涉及到两种语言,先将rust实现的sgx可信应用在c语言的帮助下编译成.so动态库。

具体的接口设计如图2所示,webassembly模型执行引擎接口(wasmtrustedlibrary)由可信层接口(trusted)和不可信层接口(untrusted)两部分组成。trusted部分在sgx中实现webassembly模型执行引擎(webassemblyvm)的初始化wasm_init()、模型调用wasm_call()、关闭wasm_close(),三个函数采用rust编写。然后,unstrusted部分对这三个函数做了一层封装,分别是init(),call(),close()。并编写了adaptor.h,它是webassemblyvm可信库的c头文件,声明了webassemblyvm可信层的接口,用以辅助生成.so动态链接库。最后,将整个webassembly模型执行引擎根据应用需求通过语言封装成sdk,即可方便供其他应用调用。本实施方式中,以golang为例对整个webassembly模型执行引擎的接口进行详细阐述。在接口中,用c作为中转语言,通过用c语言编写的可信库的c头文件adapter.h即可实现在rust实现的执行引擎基础上开放golang接口。具体来说,我们定义了需要暴露给golang调用的两个虚拟机相关接口:

adapter.h

voidinit();

voidcall(char*args,intinput_len,char*result,intresult_capacity,int*result_len);

其中,close()可自动实现,无需定义。

接着,golang的函数调用到c库后,c库调用wasm虚拟机的untrusted部分接口,以间接实现对trusted部分,也即sgxwasm虚拟机的调用。

trusted部分的初始化函数的接口调用设计如下:

wasm.init()

->c.init()

->init_enclave()

->sgxwasm_init(enclave_id,retval)

trusted部分的调用合约函数的接口调用设计如下:

其中,sgxwasm_call()包括部署、加载和调用功能,具体地:

1.部署(deploy)

wasm的部署,将一个wasm文件部署到本地的bitxmesh节点上,此部分由外部应用发起调用,指定一个wasm文件的路径,经过部署过程后会将wasm文件放置的enclave的bin目录下同时加载解析得到一个abijson字符串。

sgx_enclave_wasm_deploy<p:asref<path::path>>(path:p)->result<string>

参数:pathwasm的路径。

返回值:wasmexportedcallablefunctionapi的abi,

该api是在untrusted部分执行的,该api会将指定的路径下的wasm文件加载到enclave的bin目录下,同时将wasm加载解析,得到wasmmodule导出的外部可调用函数,后续使用者可以通过该abi调用wasm的功能。

特别注意:wasm支持传入的参数只有整形(i32、i64)和浮点型(f32、f64)。

2.加载(load)

wasm的加载是将wasm二进制装载到enclave内部,该过程首先会将wasm读成bytes数组,再加载到内部,加载可以提供一个名词,后续调用通过该名称即可调用。

参数:modulewasm的bytes序列

name为该wasm指定模块名称

enclave外部initenclave返回的enclave结构

返回值:加载是否成功,以及错误消息(wasm格式错误、解释错误)

3.调用(invoke)

wasm的调用是调用已经加载到enclave的wasm函数。

参数:module名称

exported_field导出的函数名称

args调用参数

返回值:该调用返回的值runtimevalue(也是4个)

最终通过enclave内的wasmvm提供的invoke_export完成调用。

在untrusted部分的call函数,称为stub,其他功能的调用都是通过该stub函数分发,参数如下:

参数调用时将相关参数序列化成json字符串。

本发明通过用intelsgx技术改造webassembly模型执行引擎的接口,确保模型执行过程中数据不可被窃取。增强了在不可信环境中数据共享的安全性和隐私性。可用于开发可信数据共享平台等相关应用。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1