写点什么

Wasm 软件生态系统安全分析

  • 2023-09-05
    北京
  • 本文字数:3549 字

    阅读完需:约 12 分钟

Wasm软件生态系统安全分析

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第12期 | Wasm软件生态系统安全分析

演讲嘉宾 | 王浩宇

回顾整理 | 廖   涛

排版校对 | 李萍萍



嘉宾简介

王浩宇,华中科技大学教授,博士生导师,华中科技大学 OpenHarmony 技术俱乐部主任。研究关注于新兴软件系统中的安全、隐私和可靠性问题,近五年发表 CCF A 类和 CSRankings 顶会论文近 70 篇,在软件安全和系统测量领域的顶会论文成果在国内名列前茅。

内容来源

第一届开放原子开源基金会 OpenHarmony 技术峰会——开发者工具分论坛

视频回顾


正 文 内 容

WebAssembly(Wasm)是 W3C 标准化组织制定的一种高效、底层、可移植的字节码格式。目前,Wasm 越来越多地用于浏览器、无服务器计算、跨平台容器和区块链 DApp 等场景。Wasm 与 OpenHarmony 生态能够有哪些碰撞呢?华中科技大学网络安全学院王浩宇教授在第一届 OpenHarmony 技术峰会上,分享了当前在 Wasm 安全领域所做的探索,并展望了 Wasm 与 OpenHarmony 结合的新方向。



01Wasm 软件生态系统介绍

目前,如 C、C++、Rust、Go、Java、C#等几乎所有主流高级语言都可以被编译到 Wasm,所有的主流浏览器也均支持 Wasm。此外业界也实现了很多独立的 Wasm 虚拟机(运行时),支持解释器、AOT、JIT 等模式。


WebAssembly (Wasm) 及其运行环境


Wasm 的执行架构与设计特点有:

● 类型安全的栈指令:线性时间类型检查算法,完全确定栈上值的数量和类型;

● 结构化的控制流指令:内部指令仅能根据嵌套结构跳转,简化了编译器实现;

● 可拓展的线性内存:一页为 64KB,模块中指定初始内存页和最大内存页数量,运行时可动态增长;函数调用栈,返回地址等重要数据由外部运行时维护,保证了安全性;

● 指令和数据完全分离:函数“地址”通过下标表示,非直接跳转通过跳转表实现。


Wasm 的应用前景十分广阔。例如,Wasm 能够支持高效的 Web 计算,因此基于 Wasm 能够实现大型应用在浏览器中运行;Wasm 也支持跨平台容器技术,适用于嵌入式、可信计算以及云计算等场景。此外,Wasm 在 Web 3.0/区块链中的 DApp 和智能合约等领域也被应用广泛。


Wasm 多语言、跨平台以及高性能的特性,使其非常契合 OpenHarmony 面向万物互联新场景的开源生态,在移动设备上应用前景广泛。目前,WasmEdge 开源项⽬维护者 Michael Yuan 等人已经发起了 OpenHarmony Wasm-SIG 提案,致⼒于宣传、实施、推⼴Wasm 与 OpenHarmony 的集成,在 OpenHarmony 终端设备上可以安全高效的运行第三方开发者用 C、C++、Rust 等语言编写的 Wasm 程序,有利于扩大 OpenHarmony 生态的开发者群体。


02Wasm 安全及相关研究

Wasm 生态中也有很多安全问题得到了学术界的重视,包括前端编译器安全,代码移植安全,Wasm 二进制安全,Wasm 相关的恶意应用,Wasm 可信执行环境等等。


● 代码内存安全:由于 Wasm 生态还较不成熟,在传统二进制中已经有成熟防御措施的漏洞仍然能够被利用。例如,由于缺乏 stack canary 机制,攻击者可以轻松利用栈溢出漏洞;Wasm 也缺乏相关的堆保护机制等。

● 程序移植安全:大量的现有程序可以被“直接”编译到 Wasm,但可能会引入 bug 或安全问题;移植会导致代码行为(如指针大小、内存能力、环境变量等)不同;移植时处理不当可能导致不同的堆内存管理实现困难、缺乏安全措施等安全问题。

● 恶意 Wasm 程序:目前很大一部分 Wasm 程序被用于恶意挖矿等行为,Wasm 也可以作为混淆或者加壳方式被恶意软件利用。


Wasm (安全) 问题及学术界相关研究


然而,目前 Wasm 安全相关研究还处于初级阶段。一方面,Wasm 不断引入的新特性与新场景持续带来新的安全问题和挑战;另一方面,Wasm 几乎没有通用的程序分析框架,大部分工具都是针对特定平台的 Wasm 二进制分析(只支持部分指令集、只对平台相关库函数做建模),无法分析通用 Wasm 二进制;此外,Wasm 的二进制反编译器还处于初期阶段,Wasm 虚拟机和编译器不够成熟,Wasm 代码混淆以及代码保护技术还较为欠缺等。


针对上述安全问题,王浩宇教授所带领的学术团队在 Wasm 二进制翻译、Wasm 程序分析、Wasm 运行时/编译器 bug 检测等方面做了安全增强相关工作。例如,在区块链智能合约场景下,实现了从 EVM 字节码到 eWasm 字节码的安全 Wasm 二进制翻译;提出了 Wasm 符号执行框架 EOSafe、Wasm 模糊测试框架 WASAI、Wasm 通用二进制重写框架 BREWasm、Wasm 二进制混淆工具 Chaos 等分析技术。此外,王浩宇教授团队提出了针对 Wasm 运行时的模糊测试技术,已经在 wasmer,wasmtime,WAMR,wasm3,Wasm Edge 等运行时中发现了数十个代码缺陷。


王浩宇教授的团队 Wasm 相关研究工作


03Wasm 二进制重写及其安全应用

在本次峰会的开发者工具分论坛,王浩宇教授介绍了其团队提出的一个通用的 Wasm 二进制重写工具。Wasm 二进制重写具有无需源码、跨平台和跨语言等优点,其应用场景包括 Wasm 程序修复、测试用例生成、代码插桩、辅助动态分析、Wasm 代码漏洞检测、Wasm 模糊测试、Wasm 二进制保护与混淆等。目前,学术界已有的 Wasm 二进制重写和插桩的研究大都只局限于简单的指令级别修改,比如在某一指令前后添加一些指令,对控制流的修改也仅局限于某一特定模式的更改等。然而,一个通用的 Wasm 二进制重写框架是如上众多 Wasm 研究工作的基础。


实现一个通用的 Wasm 二进制重写框架存在一些挑战。


(1)Wasm 不同段之间的耦合性:Wasm 中,一个函数的所有信息,包括函数签名,函数指令等内容分布在不同的 Wasm 段中,这导致对单独一个段的重写不足以实现 Wasm 中的一个微小功能。而且开发者需要熟悉多个段的不同的数据结构才能实现对 Wasm 中某一功能的重写;


(2)结构化控制流与控制流修改:Wasm 没有 goto-like 的跳转指令,且只有将代码块进行嵌套才能添加跳转指令,这对实现灵活的控制流重写带来了较大挑战


(3)Wasm 栈平衡校验和修复:一个正确的 Wasm 二进制需要满足静态校验规则。例如,一个函数的所有信息都靠函数的 index 索引,且函数的指令需要满足栈平衡。在对 Wasm 二进制重写后,如果出现了 index 之间的索引不一致或某一函数指令没有栈平衡等静态校验问题,则会生成错误的 Wasm 二进制。


王浩宇教授团队针对上述挑战,分别提出了相应的解决方案。针对挑战(1),除了提供细粒度的对每个段中数据结构的重写功能外,还将各个段的结构抽象成一组语义并提供大量针对语义的重写 API,使开发者不需要关心底层对各个段的修改逻辑。


针对挑战(2),提出控制流结构原子化的方法,在加载 Wasm 模块时,对指令进行分割和构建代码块(原子化),利用原子化的控制流结构可以组合构建更复杂的控制流结构,并在修改结束后,将基于原子化代码块的控制流结构转换回 Wasm 指令。


针对挑战(3),实现两个辅助模块 indices-fixer 和 stack-calculator 以修复索引错误和栈平衡。


BREWasm 框架


基于上述解决方案,王浩宇教授带领的团队提出了一个通用的 Wasm 二进制重写框架——BREWasm。该框架主要包括以下 5 部分功能:


● Wasm Parser:给定一套简易 DSL,将 Wasm 段和数据结构抽象,并解析为一个可操作对象的列表;

● Section Rewriter:基于 Wasm 段和数据结构抽象,实现细粒度段重写 API;

● Semantics Rewriter:将段重写 API 进行组合,实现一组语义更为丰富的 Semantic API;

● Control Flow Reconstructor:实现了一组能够任意灵活修改控制流且无需关注栈平衡的 Control Flow API;

● Wasm Encoder:将重写后的可操作对象列表按照段和数据结构抽象重新编码为合法的 Wasm 二进制。


Wasm 控制流原子化示意以及 BREWasm 中提供的部分 Control Flow API


BREWasm 能够应用在 Wasm 代码混淆、Wasm 程序栈溢出保护、Wasm 程序插桩等场景。例如,在 Wasm 二进制混淆上,BREWasm 采取切分原有 Wasm 代码块来获得控制流重写的基本元素,并将这些元素构成一个 switch-case 的控制流结构,再将其插入到 while 控制流中,可以仅用几行代码实现对任意 Wasm 程序的控制流平坦化混淆;在 Wasm 程序栈溢出保护上,仅调用 BREWasm 提供的几个 API,即可实现对可能存在栈溢出问题的函数进行 hook,在函数被调用前提前在栈上插入 canary,在函数执行完成后去检测 canary 的值是否发生改变,来确定函数执行过程中是否出现了栈溢出问题;在 Wasm 程序插桩上,BREWasm 能够对 Wasm 二进制插桩,实现动态污点分析,调用图分析,内存访问分析,恶意挖矿检测等功能,也能够给定插桩规则,对每个 Wasm 指令进行自动化插桩,为 Wasm 二进制导入外部实现的分析 API。此外,BREWasm 还能够非常方便地应用于 Wasm 代码变换、Wasm 程序修复以及 Wasm 模糊测试等场景。


BREWasm 对任意 Wasm 程序实现控制流平坦化示例


04总结与展望

跨语言、跨平台、跨场景的开源软件生态是发展趋势,也引入众多新的攻击面。Wasm 的特性使其非常契合 OpenHarmony 面向万物互联新场景的开源生态,而其中的安全问题也不可忽视。期待学术界和工业界一起,为万物互联的开源生态添砖加瓦,持续为新兴软件安全赋能!



点击关注了解更多OpenHarmony TSC技术干货内容

用户头像

OpenHarmony开发者官方账号 2021-12-15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
Wasm软件生态系统安全分析_OpenHarmony_OpenHarmony开发者_InfoQ写作社区