1.Introduction
TWINE(Trusted Wasm in Enclave)
- 使用标准Intel工具链实现
- 允许本地执行遗留Wasm应用程序,而无需重新编译
- 动态地将WASI操作转换为系统调用或安全库函数
- 将文件操作映射到英特尔的受保护文件系统,持久的数据是透明加密的,并且永远不会以明文的形式从enclave之外访问
- 实现了完整的安全SQLite嵌入
Contributions
- 通用的Enclave内wasm运行时环境,支持文件系统加密
- 广泛评估性能和瓶颈
- 改进英特尔受保护文件系统的建议
3.Background
LLVM
- 不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
- 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
- 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
- 优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
WASI
- 让 WebAssembly 也可以运行在非浏览器环境中
- 需要实现可移植的二进制文件(.wasm)和一个跨平台的运行时(runtime)
- 实现细粒度的权限控制:
- 先定义一套标准的系统调用接口:wasi-core
- 各个平台(windows、unix)对标准接口进行平台实现
- 对于一个具体的 wasm 程序,需要把其允许调用的接口在运行的时候传入,比如对于一个 wasm 模块,我只传入“__wasi_path_open”这样一个接口,因此 wasm 中就只能用这样一个接口
- 同样的,对于文件路径也是,只允许对传入的文件路径进行操作,例如只传入 /tmp 路径,wasm 模块就没有办法对 /usr 路径下的文件进行操作
wasm代表抽象的虚拟机,wasi代表其抽象的OS
WASM运行时
使用WAMR作为底层运行时:
- 支持两种解释执行模式,一种慢但内存占用少,另一种快但内存占用多
- 支持两种二进制执行模式,AoT和JIT,都使用LLVM
- 使用C语言实现,外部依赖很少
4.Trusted Runtime for WebAssembly
TWINE由两大模块组成:Wasm运行时和WASI接口
- Wasm运行时完全在TEE中运行,而WASI作为可信环境和不可信环境之间的桥梁与OS通信(相当于OCALL)
WASI的优势在于提供三种抽象:
- 开发者可以自由选择开发语言,只要能够被LLVM等编译器编译为WASI
- TEE从应用程序中抽象出来:只要TEE能够解释或执行Wasm(由WASI支持),应用程序就可以安全执行
- WASI与系统无耦合,只要OS提供WASI需要的API就可以使用
安全性
-
WASI可以通过沙箱的方式控制安全性(权限控制)
-
SGX和WASI组成双向沙箱
- 系统(Enclave认为untrusted)不能损害enclave代码的完整性或是内存中的数据的机密性
- Wasm应用(OS认为untrusted)不能直接与OS交互,除非WASI给与权限
威胁模型
- 没有物理攻击,且TEE提供了指定的保护级别,并且标准加密不能被破坏
- 对于SGX Enclave:enclave内的代码和数据是可信的,而来自外部的任何东西都是不可信的
- 外部只能读取经过加密的enclave内存
- 侧信道攻击和拒绝服务攻击可能存在,需要enclave中的应用程序解决
- 对于OS:遵循honest-but-curious模型
WASI
WASI是Wasm应用程序与外部世界通信的接口
WAMR的工具包提供了一个预先编译器,能够在Wasm应用程序到达TWINE的enclave之前,使用LLVM将其编译为本地代码(native code)。因此,TWINE不包含Wasm解释器,只能执行预先编译的应用程序(执行本地代码比代码编译更快)
Wasm运行时比代码解释器占用的内存更小
WASI实现细节
-
大部分WASI调用被直接转换为OCALL
-
TWINE为WAMR实现了一个不同的WASI接口,更适合SGX使用:
- 保留其沙箱实现
- 将剩下部分分为两层:一层用于特定功能实现,一层用于一般调用
- 一般调用通过在enclave外调用类POSIX库来处理,同时提供额外的安全措施和健全性检查;一般调用只有某个功能没有可信实现时才会使用
- TWINE包含一个编译标志,可以全局禁用enclave中的不受信任的POSIX实现(接口可能泄漏主机调用中的敏感数据,例如使用模式和参数)
IPFS(Intel Protected File System)
IPFS分为两部分:
1.可信库,在enclave中运行,为文件管理提供了类似POSIX的API
2.不可信库,与enclave之外的POSIX函数交互,这些函数进行实际文件读写
- 写操作:先由可信库对内容加密,再由不可信库写到存储介质(加密后的文件以Merkle树的结构存在)
读操作:由可信库进行完整性校验
IPFS实现细节
IPFS自动创建用于加密文件的密钥,这些密钥由enclave签名和处理器的密钥导出
TWINE持久化的文件在enclave之外被视为密文,而在Wasm应用程序处理之前会透明地解密并进行完整性检查