Wasm软件生态系统安全分析

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

演讲嘉宾 | 王浩宇

回顾整理 | 廖   涛

排版校对 | 李萍萍

嘉宾简介

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

内容来源

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

视频回顾

视频链接:峰会回顾第12期 | Wasm软件生态系统安全分析(王浩宇)_哔哩哔哩_bilibili

正 文 内 容

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技术干货内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/68712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt CMake 中国象棋程序实现

前驱课程 C自学精简实践教程 目录(必读) C数据结构与算法实现(目录) Qt 入门实战教程(目录) 项目初衷 为学习 Qt 的人提供一个合适的有一定难度的综合型练习项目。 在学会写代码之前,先看别人怎么写的代码。深入…

手动实现uni-app可用的new URL

使用 import URL from url const url new URL(https://www.aaa.com:8989/bbb/ccc/ddd.html?e1&f2&g#h3&i4&j?k5#l6&e4) console.log(url)结果 {"href": "https://www.aaa.com:8989/bbb/ccc/ddd.html?e1&f2&g#h3&i4&j…

Linux以系统服务的方式启动Kafka(其他服务同理)

最终效果: 先回顾命令行的启动方式: kafka的启动 进入kafka的安装目录 1、首先启动zookeeper服务: bin/zookeeper-server-start.sh config/zookeeper.properties2、再启动kafka bin/kafka-server-start.sh config/server.properties &…

Ajax模拟视频点赞功能

前台 <%--Created by IntelliJ IDEA.User: xxDate: 2023/9/4Time: 10:00To change this template use File | Settings | File Templates. --%> <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head>&l…

记录一次WMware网络问题

目录 ​编辑 一、问题描述 二、问题排查 2.1 指令ifconfig 查看ip信息 2.2 nmcli n 查看网卡状态 三、问题解决 3.1 启动 NetworkManager 网络管理器 3.2 ifup ens160 启动网卡 一、问题描述 我在我本地电脑上使用WMware虚拟机部署了k8s&#xff0c;有次正常关机后&am…

docker安装mysql、clickhouse、oracle等各种数据库汇总

1&#xff1a;docker 安装mongo数据库并使用 官网&#xff1a;https://www.mongodb.com/docs/manual/ 安装 &#xff1a;https://www.zhihu.com/question/54602953/answer/3047452434?utm_id0 安装2&#xff1a;https://www.duidaima.com/Group/Topic/ArchitecturedDesign/91…

让GPT成为您的科研加速器丨GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码:无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。​2、数据可视化…

Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)

多线程案例 一、设计模式&#xff08;单例模式工厂模式&#xff09;1、单例模式2、工厂模式 二、阻塞式队列1、生产者消费者模型2、阻塞对列在生产者消费者之间的作用3、用标准库阻塞队列实现生产者消费者模型4、模拟实现阻塞队列 三、定时器1、标准库中的定时器2、模拟实现定时…

Less的强大变量用法

less中的变量应用十分强大&#xff0c;可以灵活的应用到各种不同需求的场景。 一&#xff0c;属性值变量 声明&#xff1a;sass声明变量是用$符号&#xff0c;而less声明变量是用符号 作用域&#xff1a;也区分为全局变量和局部变量&#xff0c;如果引用的变量有定义局部变量&…

vuex_cart案例

json-server使用 在目录下新建db文件夹>里面新建index.json index.json {"cart": [{"id": 100001,"name": "低帮城市休闲户外鞋天然牛皮COOLMAX纤维","price": 128,"count": 6,"thumb": "http…

Nodejs压缩图片实现方案

安装sharp 目前选择使用sharp 0.31.2版本 npm i sharp0.31.2 并且在.npmrc里面配置镜像源 sharp_dist_base_urlhttps://npmmirror.com/mirrors/sharp-libvips/v8.13.3/ sharp_binary_hosthttps://npmmirror.com/mirrors/sharp sharp_libvips_binary_hosthttps://npmmirror.…

Java8新特性stream和parallelStream有什么区别

1 stream和parallelStream的区别 1.Stream 是在 Java8 新增的特性&#xff0c;普遍称其为流&#xff1b;它不是数据结构也不存放任何数据&#xff0c;其主要用于集合的逻辑处理。 2.Stream流是一个集合元素的函数模型&#xff0c;它并不是集合&#xff0c;也不是数据结构&…

Redis数据类型

目录 前言一、数据类型二、Redis单线程模型三、String类型四、什么是业务五、Hash类型六、List类型七、SET类型八、ZEST类型 前言 一、数据类型 Redis主要有Strings、Lists、Sets、Hashes、Sorted sets等数据类型&#xff0c;这些都是非常通用的&#xff0c;还有一些少见的可…

腾讯张乐:“反内卷”潮流已至,研发效能是软件企业必由之路

目录 Why&#xff5c;“狂飙”踩下刹车&#xff0c;“湖水岩石效应”加速显现 What&#xff5c;效能 ≠ 效率&#xff0c;效能 效率 有效性 How&#xff5c;研发效能“黄金三角” e.g.&#xff5c;软件研发效能实践中的“坑”与“解” 1. 忽视重视工程师的声音 2. “迷…

C# 按钮的AcceptButton和CancelButton属性

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代&#xff0c;跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具&#xff0c;可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

Vue3 使用 echarts

echarts 是百度基于 JavaScript 实现的一个开源可视化图表库&#xff0c;主要特点就是可视化类型丰富、动画炫酷、使用简单。 这个教程就简单演示如何在 Vue 3 项目中使用 echarts。 1、导入 echarts import * as echarts from "echarts";2、初始化 echarts 并设置…

day55 动规.p15 子序列

- 392.判断子序列 cpp class Solution { public: bool isSubsequence(string s, string t) { vector<vector<int>> dp(s.size() 1, vector<int>(t.size() 1, 0)); for (int i 1; i < s.size(); i) { for (int j 1; …

电力智能监控系统

电力智能监控系统依托电易云-智慧电力物联网&#xff0c;利用计算机、计量保护装置和总线技术&#xff0c;对中、低压配电系统的实时数据、开关状态及远程控制进行了集中管理。该电力监控系统可以为企业提供"监控一体化"的整体解决方案&#xff0c;主要包括实时历史数…

前端缓存方法有哪些?cookie有哪些属性?

这里写目录标题 前端缓存方法有哪些&#xff1a;cookie有哪些属性&#xff1f; 前端缓存方法有哪些&#xff1a; Browser Cache&#xff08;浏览器缓存&#xff09;: 当浏览器请求一个资源&#xff08;例如图片、CSS、JS 文件&#xff09;时&#xff0c;它会首先检查自己的缓存…