Wasm软件生态系统安全分析
演讲嘉宾 | 王浩宇
回顾整理 | 廖 涛
排版校对 | 李萍萍

嘉宾简介
王浩宇,华中科技大学教授,博士生导师,华中科技大学OpenHarmony技术俱乐部主任。研究关注于新兴软件系统中的安全、隐私和可靠性问题,近五年发表CCF A类和CSRankings顶会论文近70篇,在软件安全和系统测量领域的顶会论文成果在国内名列前茅。
内容来源
第一届开放原子开源基金会OpenHarmony技术峰会——开发者工具分论坛
视频回顾
视频链接:https://www.bilibili.com/video/BV1UX4y1879e/?spm_id_from=333.999.0.0
正 文 内 容
WebAssembly(Wasm)是W3C标准化组织制定的一种高效、底层、可移植的字节码格式。目前,Wasm越来越多地用于浏览器、无服务器计算、跨平台容器和区块链DApp等场景。Wasm与OpenHarmony生态能够有哪些碰撞呢?华中科技大学网络安全学院王浩宇教授在第一届OpenHarmony技术峰会上,分享了当前在Wasm安全领域所做的探索,并展望了Wasm与OpenHarmony结合的新方向。

01►Wasm软件生态系统介绍
目前,如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生态的开发者群体。
02►Wasm安全及相关研究
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相关研究工作
03►Wasm二进制重写及其安全应用
在本次峰会的开发者工具分论坛,王浩宇教授介绍了其团队提出的一个通用的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面向万物互联新场景的开源生态,而其中的安全问题也不可忽视。期待学术界和工业界一起,为万物互联的开源生态添砖加瓦,持续为新兴软件安全赋能!

Wasm软件生态系统安全分析的更多相关文章
- ocky勒索软件恶意样本分析1
locky勒索软件恶意样本分析1 1 locky勒索软件构成概述 前些时期爆发的Locky勒索软件病毒这边也拿到了一个样本,简要做如下分析.样本主要包含三个程序: A xx.js文件:Jscript脚 ...
- ocky勒索软件恶意样本分析2
locky勒索软件恶意样本分析2 阿尔法实验室陈峰峰.胡进 前言 随着安全知识的普及,公民安全意识普遍提高了,恶意代码传播已经不局限于exe程序了,Locky敲诈者病毒就是其中之一,Locky敲诈者使 ...
- 对魔兽世界、支付宝、Linux三类软件的简单分析
软工第一次作业: 软件有很多种,如工具类软件.游戏类软件.系统类软件,它们的运行方式也各种各样,如以单机方式运行.以网站方式运行或者以APP方式运行在手机端等,请选取三种软件,分析它们各自的特点. 这 ...
- Joomla及其类似软件的说明分析
Joomla不单单是一款免费的软件,还是在国外相当知名的及内容管理.web开发及手机应用开发等为一体的一套系统.Joomla是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux. W ...
- 基于web的IM软件通信原理分析
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- 面向对象的软件project——面向对象分析
为了解决软件危机.一些IT前辈国产软件project这个词汇,软件project它被引入到整个软件开发过程的维护. 软件project从程序的设计角度能够分为两类.一类是面向结构的软件project. ...
- 软件测试之BUG分析定位概述(QA如何分析定位BUG)
你是否遇到这样的场景? QA发现问题后找到DEV说: 不好了,你的程序出问题了! DEV(追查半小时之后): 唉,是你们测试环境配置的问题 唉,是你们数据不一致 唉,是你们**程序版本不对 唉,是** ...
- R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲
这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...
- 41、OrthoMCL和mcl软件进行基因家族分析
转载:http://www.realbio.cn/news/124.html https://blog.csdn.net/seallama/article/details/43820763 http: ...
- 软件测试之BUG分析定位概述(QA如何分析定位BUG)【转自 https://blog.csdn.net/kaka1121/article/details/51538979】
你是否遇到这样的场景? QA发现问题后找到DEV说: 不好了,你的程序出问题了! DEV(追查半小时之后): 唉,是你们测试环境配置的问题 唉,是你们数据不一致 唉,是你们**程序版本不对 唉,是** ...
随机推荐
- Celey异步发送邮件时报django.core.exceptions.ImproperlyConfigured的解决办法
原main.py入口文件 #Celery的入口 from celery import Celery #创建Celery实例 生产者 celery_app = Celery('meiduo') #加载配 ...
- 深入解析Python并发编程的多线程和异步编程
本文分享自华为云社区<Python并发编程探秘:多线程与异步编程的深入解析>,作者:柠檬味拥抱. 在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别 ...
- 【LeetCode回溯算法#01】图解组合问题
组合问题 力扣题目链接(opens new window) 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2 ...
- 【Azure Key Vault】Key Vault能不能生成DigiCert证书?能不能自动 Rotate 证书呢?
问题描述 因为Azure Key Vault服务上保管的证书可以轻松的与其他Azure服务集成使用,所以需要知道 Key Vault 能不能生成 DigiCert 证书?能不能自动 Rotate 证书 ...
- 【Azure Redis 缓存】使用Azure Redis服务时候,如突然遇见异常,遇见命令Timeout performing SET xxxxxx等情况,如何第一时间查看是否有Failover存在呢?
问题描述 使用Azure Redis服务时,如突然遇见异常,命令Timeout performing SET xxxxxx等情况,如何第一时间查看是否有Failover存在呢?看是否有进行平台的维护呢 ...
- 图数据库 Nebula Graph 的代码变更测试覆盖率实践
对于一个持续开发的大型工程而言,足够的测试是保证软件行为符合预期的有效手段,而不是仅仅依靠 code review 或者开发者自己的技术素质.测试的编写理想情况下应该完全定义软件的行为,但是通常情况都 ...
- gitlab推送代码触发jenkins构建
预期:推送devloop或者master分支的代码, 自动执行jenkins 发布测试环境 首先,jenkins中需要安装如下插件 打开一个任务配置,构建触发器中勾选"Build when ...
- Java 程序员第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片
人工智能时代,最需要学习的编程语言是:python .笔者是个 python 小白,昨天花了两个小时,第一次成功运行起来 python 项目 . 项目是 powerpoint-extractor ,可 ...
- Git 系列:简介安装以及配置管理
目录 简介安装 简介 Centos安装 配置管理 git help 概要 选项 示例 git-doc git config 概要 选项 变量 示例 初始化配置 简介安装 简介 https://git- ...
- 我的电脑 属性 代理 win10 不用的时候记得关闭,git python node 等