在 Intel SGX 中构建、移植与嵌入 WAMR(iwasm):完整实战指南

发布时间:2026/9/17 12:40:58
在 Intel SGX 中构建、移植与嵌入 WAMR(iwasm):完整实战指南 在 Intel SGX 中构建、移植与嵌入 WAMRiwasm完整实战指南【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bitWAMRWebAssembly Micro Runtime是可以在 Linux SGX 可信执行环境中运行的轻量级 WebAssembly 运行时。本文以仓库中 linux_sgx.md 为核心脉络系统讲解如何在 Intel SGX 环境下构建 WAMR vmcoreiwasm、如何将 vmlib 移植进自定义 SGX Enclave、如何通过 ecall 命令封装嵌入 WAMR并深入剖析 SGX Intel Protected File SystemIPFS的 WASI 文件系统映射与实战验证。读完本文你将掌握从零搭建 WAMRSGX 环境、配置 Fast JIT/AOT、移植 vmlib 到 Enclave、实现 ocall 日志输出以及启用 IPFS 持久化加密文件的完整技术方案。背景为什么要在 SGX 中运行 WebAssemblyIntel SGXSoftware Guard Extensions通过 Enclave 机制在硬件层面为运行中的代码和数据提供机密性与完整性保护——即使操作系统或 Hypervisor 被攻破Enclave 内的内存也无法被外部读取或篡改。而 WAMR 的 vmcore 可以完全运行在 Enclave 内部让开发者在可信边界内执行不可信或敏感业务的 WebAssembly 模块。WAMR 的 Linux SGX 平台实现位于仓库的 product-mini/platforms/linux-sgx底层平台抽象ocall、EDL 定义、线程/时间/文件封装位于 core/shared/platform/linux-sgx。整个方案遵循 SGX 的经典双层结构App不可信区运行在普通用户态负责加载 Enclave、传入 WASM 文件数据Enclave可信区运行 WAMR vmcore实际执行 WASM 字节码/AOT 代码ocallEnclave 内部需要操作系统服务文件、网络、时钟时通过 EDL 声明的 ocall 桥接到 App 侧实现。从 CMakeLists.txt 可以看出该平台默认启用 fast interpreter、AOT、libc-builtin、libc-WASI 和 lib-pthread并默认将 WAMR_BUILD_TARGET 设为 X86_6464 位平台。构建 WAMR vmcoreiwasmfor Linux SGX前置依赖安装 Intel SGX SDK要求 v2.8 或更高版本AOT 支持依赖新版 SDK官方推荐将 SDK 安装到/opt/intel/sgxsdkenclave-sample 的 Makefile 中SGX_SDK ? /opt/intel/sgxsdk也印证了这一点可通过命令行变量覆盖。标准构建流程source SGX_SDK dir/environment cd product-mini/platforms/linux-sgx/ mkdir build cd build cmake .. make构建会产出两个 SGX 应用所需的静态库libvmlib.a供 Enclave可信部分链接libvmlib_untrusted.a供 App不可信部分链接。从 CMakeLists.txt 的源码可以看到libvmlib.a由runtime_lib.cmake收集的运行时源文件编译而成而libvmlib_untrusted.a则是通过自定义命令将PLATFORM_SHARED_SOURCE_UNTRUSTED指定的 untrusted 目录下的文件file.c、pthread.c、signal.c、socket.c、time.c单独编译打包专门用于 App 侧 ocall 实现。启用 Fast JIT默认构建只开启 fast interpreter 与 AOT。如果需要 Fast JIT在 SGX 内直接生成并执行本地代码进一步提升热点代码执行性能使用mkdir build cd build cmake .. -DWAMR_BUILD_FAST_JIT1 makevmcore 的 cmake 构建配置项WAMR 的 vmcore 提供了大量可通过 cmake 开关配置的特性详细说明见 build_wamr.md。在 Linux SGX 平台默认启用的关键开关如下可在 CMakeLists.txt 中逐项核对默认值cmake 开关默认值作用WAMR_BUILD_INTERP1启用 WASM 解释器WAMR_BUILD_FAST_INTERP1启用 fast interpreter比经典解释器快约 2 倍但为容纳预编译代码多占约 2 倍内存见 build_wamr.mdWAMR_BUILD_AOT1启用 AOTAhead-Of-Time 编译执行WAMR_BUILD_JIT0LLVM JIT默认关闭WAMR_BUILD_FAST_JIT0Fast JIT默认关闭需显式-DWAMR_BUILD_FAST_JIT1WAMR_BUILD_LIBC_BUILTIN1内置精简 libc 子集WAMR_BUILD_LIBC_WASI1WASI libc 子集WAMR_BUILD_LIB_PTHREAD1lib-pthread 支持多线程WAMR_BUILD_MULTI_MODULE0多模块依赖WAMR_BUILD_SIMD064 位下默认 1SIMD 支持WAMR_BUILD_SGX_IPFS0SGX Intel Protected File System可选启用构建并运行 enclave-samplevmcore 构建完成后进入示例工程编译 SGX 应用source SGX_SDK dir/environment cd enclave-sample make默认生成的 SGX 应用假定使用production key 签名并在 simulation模拟模式下运行可通过 make 变量覆盖默认设置make SGX_DEBUG1构建带调试信息的 Enclave对应SGX_COMMON_CFLAGS -O0 -gmake SGX_MODEHW构建运行在硬件 SGX 平台上的 Enclave。这些变量定义在 Makefile 顶部SGX_MODE ? SIM、SGX_ARCH ? x64、SGX_DEBUG ? 0。注意SGX_DEBUG与SGX_PRERELEASE不能同时为 1在SGX_MODEHW且非 debug 的 Release 模式下make 会要求你先用sgx_sign用自己的签名密钥对enclave.so签名后才能运行。构建完成后生成二进制iwasm运行方式source SGX_SDK dir/environment iwasm [-options] wasm_file [args...] # 或 AOT 文件 iwasm [-options] aot_file [args...]Minimal 构建精简 ocall 的轻量版本libc-WASI 与 lib-pthread 特性需要大量的 ocall可从 sgx_wamr.edl 中看到一长串ocall_*声明。如果你的应用不需要这么多 ocall可以使用 minimal 版本# 用 minimal 版本替换构建文件 cd product-mini/platforms/linux-sgx/ cp CMakeLists_minimal.txt CMakeLists.txt cp enclave-sample/Makefile_minimal enclave-sample/Makefile cp enclave-sample/Enclave/Enclave_minimal.edl enclave-sample/Enclave/Enclave.edl # 然后按上面的构建流程继续对比 CMakeLists_minimal.txt 与完整版 CMakeLists.txt 可以发现minimal 版默认关闭了WAMR_BUILD_LIBC_WASI置 0与WAMR_BUILD_LIB_PTHREAD置 0其余解释器、AOT、libc-builtin 保持默认启用从而大幅减少 ocall 面与攻击面。将 WAMR vmcore 移植到自定义 SGX 应用enclave-sample 演示了如何把 vmlib 的 Enclave 部分与 App 部分嵌入一个 SGX 应用。要将 WAMR vmcore 移植到自己的 SGX 应用需要完成以下步骤Step 1在 EDL 文件中导入 sgx_wamr.edl 与 sgx_pthread.edl在Enclave.edl中加入from sgx_pthread.edl import *; from sgx_wamr.edl import *;此步骤在 minimal 版本中不需要。sgx_wamr.edl位于${WAMR_ROOT}/core/shared/platform/linux-sgx因此在用sgx_edger8r从Enclave.edl生成Enclave_u.c与Enclave_t.c时必须把它加入搜索路径cd App $(SGX_EDGER8R) --untrusted ../Enclave/Enclave.edl \ --search-path ../Enclave \ --search-path $(SGX_SDK)/include \ --search-path $(WAMR_ROOT)/core/shared/platform/linux-sgxcd Enclave $(SGX_EDGER8R) --trusted ../Enclave/Enclave.edl \ --search-path ../Enclave \ --search-path $(SGX_SDK)/include \ --search-path $(WAMR_ROOT)/core/shared/platform/linux-sgx在 enclave-sample 的 Makefile 中Enclave_Edl_Search_Path正是这样配置的。sgx_wamr.edl内部声明了文件、时钟、线程、socket 等全部 ocall 接口这些接口的 App 侧实现由libvmlib_untrusted.a对应 untrusted 目录提供。Step 2链接静态库与 SGX pthread 库将libvmlib.a链接进 Enclave 部分libvmlib_untrusted.a链接进 App 部分Enclave_Link_Flags : ... libvmlib.a ...App_Link_Flags : ... libvmlib_untrusted.a ...同时将 SGX pthread 库链接到 Enclave 部分多线程支持Enclave_Link_Flags : ... -lsgx_pthread ...libvmlib_untrusted.a与 SGX pthread 库在 minimal 版本中均不需要。enclave-sample 的 Makefile 中App_Link_Flags : $(SGX_COMMON_CFLAGS) libvmlib_untrusted.a -L$(SGX_LIBRARY_PATH) -l$(Urts_Library_Name) -lpthread即为此处示例而 Enclave 的-lsgx_pthread位于其链接组内。Step 3配置 Enclave 头文件搜索路径将 WAMR 头文件目录与 SGX SDK 头文件目录加入Enclave_Include_PathsEnclave_Include_Paths : ... -I$(WAMR_ROOT)/core/iwasm/include \ -I$(WAMR_ROOT)/core/shared/utils \ -I$(WAMR_ROOT)/core/shared/platform/linux-sgx \ -I$(SGX_SDK)/include \ -I$(SGX_SDK)/include/tlibc \ -I$(SGX_SDK)/include/stlport这与 enclave-sample 中 Enclave_Include_Paths 的写法一致其中core/iwasm/include提供wasm_export.h等公共 API 头文件。Step 4在 Enclave 配置文件中预留 AOT 与多线程所需资源在Enclave.config.xml中配置保留内存与线程槽以支持 WAMR AOT 和多线程ReservedMemMaxSize0x400000/ReservedMemMaxSize ReservedMemExecutable1/ReservedMemExecutable TCSNum10/TCSNumReservedMemMaxSizeEnclave 保留内存最大值AOT/JIT 生成的代码需要可执行保留内存ReservedMemExecutable设为 1 使保留内存可执行TCSNum线程控制结构Thread Control Structure数量决定 Enclave 并发线程上限多线程 WASM 应用需要调大。Step 5实现 ocall_print 以支持日志输出Enclave 内的os_printf()需要输出到宿主终端因此在Enclave.edl中声明 untrusted 接口untrusted { void ocall_print([in, string]const char* str); };在 App 侧实现void ocall_print(const char* str) { printf(%s, str); }在 Enclave 侧注册打印函数在 Enclave 初始化时调用#include wasm_export.h #include bh_platform.h extern C { typedef void (*os_print_function_t)(const char* message); extern void os_set_print_function(os_print_function_t pf); void enclave_print(const char *message) { ocall_print(message); } } // 在 Enclave 初始化开始处 os_set_print_function(enclave_print);其中os_set_print_function声明于bh_platform.hWAMR 平台抽象层其定义位于 core/shared/platform/linux-sgx/sgx_platform.c。在 SGX 中嵌入 WAMR vmcore嵌入 WAMR vmcore 的标准方式是直接调用 vmcore 导出的 API详见 embed_wamr.md。enclave-sample 的Enclave.cpp提供了ecall_iwasm_main()示例演示如何用 wasm 文件缓冲区调用 wasm 应用的 main 函数void ecall_iwasm_main(uint8_t *wasm_file_buf, uint32_t wasm_file_size);此外enclave-sample 还封装了一个 ecall 函数用于接收 App 发往 Enclave 的命令并在 Enclave 内调用对应的 WAMR vmcore API 处理。命令枚举与对应 API 如下typedef enum EcallCmd { CMD_INIT_RUNTIME 0, /* wasm_runtime_init/full_init() */ CMD_LOAD_MODULE, /* wasm_runtime_load() */ CMD_INSTANTIATE_MODULE, /* wasm_runtime_instantiate() */ CMD_LOOKUP_FUNCTION, /* wasm_runtime_lookup_function() */ CMD_CREATE_EXEC_ENV, /* wasm_runtime_create_exec_env() */ CMD_CALL_WASM, /* wasm_runtime_call_wasm */ CMD_EXEC_APP_FUNC, /* wasm_application_execute_func() */ CMD_EXEC_APP_MAIN, /* wasm_application_execute_main() */ CMD_GET_EXCEPTION, /* wasm_runtime_get_exception() */ CMD_DEINSTANTIATE_MODULE, /* wasm_runtime_deinstantiate() */ CMD_UNLOAD_MODULE, /* wasm_runtime_unload() */ CMD_DESTROY_RUNTIME, /* wasm_runtime_destroy() */ CMD_SET_WASI_ARGS, /* wasm_runtime_set_wasi_args() */ CMD_SET_LOG_LEVEL, /* bh_log_set_verbose_level() */ };这套命令封装覆盖了一个 WASM 模块从初始化、加载、实例化、查找函数、执行、异常获取到销毁的完整生命周期对应关系可以直接在wasm_export.h中查到同名 API。这种App 通过 ecall 发命令、Enclave 内调用 vmcore API的架构把不可信的 App 与可信的运行时执行彻底隔离。SGX Intel Protected File SystemIPFS支持Intel SGX 提供了 Intel Protected File System LibraryIPFS用于在 Enclave 内部创建、操作和删除文件。WAMR 将 IPFS 映射到与文件交互相关的 WASI 函数上为 Enclave 中托管的 WebAssembly 应用提供具备机密性与完整性的无缝持久化能力。SGX IPFS 是可选特性启用它需要满足以下条件执行cmake时设置标志WAMR_BUILD_SGX_IPFS1Enclave 必须链接可信 IPFS 库-lsgx_tprotected_fsEnclave 外的应用必须链接不可信 IPFS 库-lsgx_uprotected_fsEDL 文件必须包含导入语句from sgx_tprotected_fs.edl import *;在 enclave-sample 工程中设置WAMR_BUILD_SGX_IPFS1后cmake 会自动完成这些改动——从 CMakeLists.txt 可以看到它通过 sed 将Enclave.edl中的WASM_ENABLE_SGX_IPFS宏和 Makefile 中的WAMR_BUILD_SGX_IPFS变量置为 1进而启用-lsgx_tprotected_fs与-lsgx_uprotected_fs链接。验证 IPFS 生效运行 samples/file 中的 file WebAssembly 应用即可观察 IPFS 的使用。启用 SGX IPFS 后该示例会生成一个加密的文本文件而 Linux/POSIX 下是明文文件。注意运行 file 示例时需要传--dir.参数允许访问当前目录。WASI/POSIX 到 IPFS 的映射由于 IPFS 是 WASI/POSIX 的子集缺失的实现需要模拟。下表总结了 WASI 到 POSIX 和 IPFS 的映射关系WASIPOSIXIPFSfd_readreadvsgx_freadfd_writewritevsgx_fwritefd_closeclosesgx_fclosepath_openopenatsgx_fopenfd_datasyncfsyncsgx_fflushfd_telllseeksgx_ftellfd_filestat_set_sizeftruncate不支持收缩文件也不模拟扩展文件用sgx_fseek/sgx_ftell/sgx_fwrite模拟fd_seeklseekPOSIX 与 IPFS 行为不同用sgx_fseek/sgx_ftell/sgx_fwrite模拟fd_pwritepwrite不支持用sgx_fseek/sgx_ftell/sgx_fwrite模拟fd_preadpread不支持用sgx_fseek/sgx_ftell/sgx_fread模拟fd_allocateposix_fallocate不支持用sgx_fseek/sgx_ftell/sgx_fwrite/sgx_fflush模拟这些模拟逻辑在 sgx_ipfs.c 中实现文件通过HashMapipfs_file_list维护 fd 与 IPFS 文件指针的映射fd2fileSGX 错误码通过convert_sgx_errno转换为 POSIX errno例如文件名被篡改的SGX_ERROR_FILE_NAME_MISMATCH映射为EIO替换攻击防护可见一斑扩展文件时使用 32KB 的zeroes_padding零填充缓冲。性能开销与限制TwineWAMR 在 Intel SGX 上支持 WASI 的早期学术适配通过多个基准评估了 IPFS 经 WASI 函数带来的性能开销。SGX IPFS 的威胁模型与局限性可参考 Intel 官方文档可在 SGX SDK 安装目录的文档中查阅。其他注意事项AOT 文件需加 -sgx 标志生成为 SGX 平台生成 AOT 文件时必须使用-sgx选项wamrc -sgx -o test.aot test.wasm没有该标志生成的 AOT 文件无法在 SGX Enclave 内运行。Enclave 堆大小与内存不足异常Enclave 的默认最大堆大小为 16 MB执行某些负载时可能不够。当抛出以下异常时Exception: fail to enlarge memory. 或 Exception: allocate memory failed.需要修改 Enclave/Enclave.config.xml 中默认的 16 MB 堆大小配置HeapMaxSize0x1000000/HeapMaxSize将0x1000000调大例如0x4000000对应 64 MB即可容纳更大工作负载。另外在 CMakeLists.txt 中还可以看到启用WAMR_BUILD_SPEC_TEST时cmake 会自动把ReservedMemMaxSize从0x1000000提升到0x8000000用于规格测试的大内存场景。小结本文完整梳理了 WAMR 在 Linux SGX 上的三条主线构建cmake 配置 fast interpreter/AOT/Fast JIT产出libvmlib.a与libvmlib_untrusted.a、移植EDL 导入、静态库链接、头文件路径、Enclave 资源预留、ocall_print 日志桥接与嵌入ecall 命令封装驱动 vmcore API 生命周期。SGX IPFS 则让 WASI 文件操作在 Enclave 中获得加密持久化能力为机密计算场景下的数据落盘提供了可落地的方案。相关示例与源码均可继续在仓库的 product-mini/platforms/linux-sgx、core/shared/platform/linux-sgx 与 samples/file 目录中深入研读。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询