1.Introduction

TWINE(Trusted Wasm in Enclave)

  • 使用标准Intel工具链实现
  • 允许本地执行遗留Wasm应用程序,而无需重新编译
  • 动态地将WASI操作转换为系统调用或安全库函数
  • 将文件操作映射到英特尔的受保护文件系统,持久的数据是透明加密的,并且永远不会以明文的形式从enclave之外访问
  • 实现了完整的安全SQLite嵌入

image-20210411191134381

Contributions

  • 通用的Enclave内wasm运行时环境,支持文件系统加密
  • 广泛评估性能和瓶颈
  • 改进英特尔受保护文件系统的建议

3.Background

LLVM

img

  • 不同的前端后端使用统一的中间代码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运行时

image-20210412100626250

使用WAMR作为底层运行时:

  • 支持两种解释执行模式,一种慢但内存占用少,另一种快但内存占用多
  • 支持两种二进制执行模式,AoT和JIT,都使用LLVM
  • 使用C语言实现,外部依赖很少

4.Trusted Runtime for WebAssembly

TWINE由两大模块组成:Wasm运行时和WASI接口

  • Wasm运行时完全在TEE中运行,而WASI作为可信环境和不可信环境之间的桥梁与OS通信(相当于OCALL)

image-20210412124151475

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实现细节

  1. 大部分WASI调用被直接转换为OCALL

  2. TWINE为WAMR实现了一个不同的WASI接口,更适合SGX使用:

  • 保留其沙箱实现
  • 将剩下部分分为两层:一层用于特定功能实现,一层用于一般调用
    • 一般调用通过在enclave外调用类POSIX库来处理,同时提供额外的安全措施和健全性检查;一般调用只有某个功能没有可信实现时才会使用
  1. TWINE包含一个编译标志,可以全局禁用enclave中的不受信任的POSIX实现(接口可能泄漏主机调用中的敏感数据,例如使用模式和参数)

IPFS(Intel Protected File System)

IPFS分为两部分:
1.可信库,在enclave中运行,为文件管理提供了类似POSIX的API
2.不可信库,与enclave之外的POSIX函数交互,这些函数进行实际文件读写

  • 写操作:先由可信库对内容加密,再由不可信库写到存储介质(加密后的文件以Merkle树的结构存在)
    读操作:由可信库进行完整性校验

IPFS实现细节

IPFS自动创建用于加密文件的密钥,这些密钥由enclave签名和处理器的密钥导出

TWINE持久化的文件在enclave之外被视为密文,而在Wasm应用程序处理之前会透明地解密并进行完整性检查