CN115659333A - 一种基于二进制插桩的沙箱、内存隔离方法及存储介质 - Google Patents

一种基于二进制插桩的沙箱、内存隔离方法及存储介质 Download PDF

Info

Publication number
CN115659333A
CN115659333A CN202211253504.5A CN202211253504A CN115659333A CN 115659333 A CN115659333 A CN 115659333A CN 202211253504 A CN202211253504 A CN 202211253504A CN 115659333 A CN115659333 A CN 115659333A
Authority
CN
China
Prior art keywords
memory
aot
wasm
instruction
sandbox
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211253504.5A
Other languages
English (en)
Inventor
张殷乾
彭维
王伟力
肖兆祺
刘晟淇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Southern University of Science and Technology
Original Assignee
Southern University of Science and Technology
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Southern University of Science and Technology filed Critical Southern University of Science and Technology
Priority to CN202211253504.5A priority Critical patent/CN115659333A/zh
Publication of CN115659333A publication Critical patent/CN115659333A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明提出了一种基于二进制插桩的沙盒、内存隔离方法及存储介质,应用于以AOT编译的方式进行WASM字节码编码时的内存隔离,所述沙盒通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上,最后执行AOT编译完成后得到的WASM本地代码,以实现对来自不受信任的AOT代码的托管。本实施例提供的沙盒及其内存隔离方法在WASM运行过程中对AOT模块进行动态检测,提取运行时的内存布局和AOT模块的保存地址和线性内存范围,限制了控制流和数据访问,从而提供了内存安全属性,因此具有很高的实用性。

Description

一种基于二进制插桩的沙箱、内存隔离方法及存储介质
技术领域
本发明涉及无服务器计算技术领域,尤其涉及一种基于二进制插桩的沙盒、内存隔离方法及存储介质。
背景技术
WebAssembly,简称WASM,是一个虚拟指令集体系架构,用于编译多种在网络浏览器中运行的高级语言,提供了一种可移植的二进制指令格式和强大的内存安全。
WASM字节码可以通过时间提前(AOT)编译的方式编译成本地代码。WASM代码的内存安全来自于运行时环境强制执行的沙盒,它限制了WASM的内存访问、解释器的WASM内存访问或编译器辅助的软件故障隔离(SFI)。在功能即服务云的情况下,客户被允许在云中使用AOT代码,而这些代码来自不受信任的各方,但是目前WASM的AOT编译器没有统一的规则来处理AOT文件的规则,他们的加载方法也不同,因此无法满足程序的正常安全运行。
因此,现有技术有待于进一步的改进。
发明内容
鉴于现有技术的不足,本发明目的在于提供一种基于二进制插桩的沙盒、内存隔离方法及存储介质,克服现有技术中针对不受信任的AOT二进制文件未有统一的托管方法,导致WASM执行时程序运行安全性低的缺陷。
本发明的技术方案如下:
第一方面,本实施例公开了一种基于二进制插桩的沙盒,其中,应用于以AOT编译的方式进行WASM字节码编码时的内存隔离,所述沙盒包括:分析仪器模块、检查指令模块和执行模块;
分析仪器模块,用于通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;
所述检查指令模块,用于分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上;
所述执行模块,用于执行AOT编译完成后得到的WASM本地代码。
可选的,所述分析仪器模块包括:代码段信息提取单元和函数信息提取单元;
所述代码段信息提取单元,用于通过动态插桩工具从WASM虚拟机中提取出代码段信息;其中,代码段信息为:WASM虚拟机分配加载AOT编译的WASM内存空间;
所述函数信息提取单元,用于提取WASI相关函数信息;其中,WASI相关函数信息为WASI系统调用的函数入口。
可选的,所述代码段信息提取单元还包括:图像水平仪器子单元;
所述图像水平仪器子单元,用于在图像层检测AOT实例函数的输入和输出的信息,以获取到代码段信息和所述代码段信息的线性内存边界。
可选的,所述检查指令模块包括:单条跳转指令检查单元、调用指令检查单元和返回指令检查单元;
所述单条跳转指令检查单元,用于判定接收到的单条跳转指令的目标地址是否在代码段内,若不在,则判断所述单条跳转指令的目标地址是否为与WASI相关的函数,若不是,则判定为所述单条跳转指令为非法指令;
所述调用指令检查单元,用于判断接收到的调用指令是否在预设白名单内,若不在,则为非法调用指令;
所述返回指令检查单元,用于控制返回地址在AOT编译所对应内存边界内,以及判断返回指令的地址是否与下一条返回指令的地址一致。
可选的,所述检查指令模块还包括:内存访问判断单元;
所述内存访问判断单元,用于对接收到的内存访问是否符合合法条件进行判断;所述符合合法条件包括:内存访问的目标为堆栈内存、内存访问的目标为AOT编译对应的线性内存段和内存访问的目标地址处于预设名单内。
可选的,所述沙盒还包括:寻找AOT模块;
所述寻找AOT模块,用于当AOT编译完成的WASM本地代码在虚拟机中加载完成之后,对保存WASM本地代码的内存块进行检测,以获取AOT编译的WASM本地代码在虚拟机内存中的地址信息。
可选的,所述执行模块,还用于执行引擎和执行仪器化的代码。
第二方面,本实施例还公开了一种沙盒的内存隔离方法,其中,利用所述的沙盒实现以AOT编译的方式进行WASM字节码编码时的内存隔离,所述方法包括:
通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;
分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上;
执行AOT编译完成后得到的WASM本地代码。
可选的,所述方法还包括:
当AOT编译完成的WASM本地代码在虚拟机中加载完成之后,对保存WASM本地代码的内存块进行检测,以获取AOT编译的WASM本地代码在虚拟机内存中的地址信息。
第三方面,本实施例还公开了一种计算机可读存储介质,其中,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现所述的内存隔离方法的步骤。
有益效果:本发明提出了一种基于二进制插桩的沙盒、内存隔离方法及存储介质,应用于以AOT编译的方式进行WASM字节码编码时的内存隔离,所述沙盒通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上,最后执行AOT编译完成后得到的WASM本地代码,以实现对来自不受信任的AOT代码的托管。本实施例提供的沙盒及其内存隔离方法在WASM运行过程中对AOT模块进行动态检测,提取运行时的内存布局和AOT模块的保存地址和线性内存范围,限制了控制流和数据访问,从而提供了内存安全属性,因此具有很高的实用性。
附图说明
图1是本发明所述一种基于二进制插桩的沙盒的结构原理示意图;
图2是本发明实施例中分析仪器模块的结构原理示意图;
图3是本发明实施例中检查指令模块的结构原理示意图;
图4是本发明所述内存隔离方法的步骤流程图;
图5是本发明所述基于二进制插桩的沙盒中数据的存储原理示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用于解释本发明,并不用于限定本发明。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
无服务器计算特点是功能即服务(FaaS)的编程模型,随着无服务器计算的日益盛行,越来越多的人注意到建立安全的运行时,这些运行可以托管由无服务器云客户提供的潜在恶意代码。作为一种新兴的编程语言,WebAssembly提供了强大的安全性和高度的可移植性,因此成为FaaS云最突出的候选者之一。
WebAssembly(或WASM)定义了一种可移植的汇编(或WASM),为一种可移植的二进制格式。最初设计用于编译多种高级语言(如Rust、C++),以便在网络浏览器中运行。独立的运行时间,如Wasmtime和WebAssembly微运行时(WAMR)已经被开发出来,例如:Wasmtime和WebAssembly Micro Runtime(WAMR)等,以在各种CPU架构上作为独立的程序运行WebAssembly字节码。因此,用C++或Rust语言编写的应用程序Rust语言编写的应用程序可以被编译成一个WebAssembly模块,该模块可由WASM运行时在多个平台上托管。
WebAssembly的字节码可以由解释器解释执行,或通过以下时间提前(AOT)编译的方式或时间内(JIT)编译的方式编译成本地代码。WASM代码的内存安全来自于一个运行时环境强制执行的沙盒,它限制了WASM的内存访问、解释器的WASM内存访问或编译器辅助的软件故障隔离(SFI)。在功能即服务云的情况下,用户被允许在服务云中使用AOT代码,而这些代码来自不受信任的各方。在这种情况下,由编译器工具强迫的SFI可以被完全绕过。
为了实现WASM运行时,对上传到服务云中各方不受信任的AOT代码进行内存隔离,以限制控制流和AOT模块的内存访问,本实施例提供了一种软件框架,也即是一种基于二进制插桩的沙盒,用于实现AOT编译方式下进行WASM字节码编码时的内存隔离,以提高程序运行的安全性。
需要注意的是,上述应用场景仅是为了便于理解本发明而示出,本发明的实施方式在此方面不受任何限制。相反,本发明的实施方式可以应用于适用的任何场景。
进一步,为了对发明内容作进一步说明,下面结合附图,通过对实施例进行具体描述。
示例性设备
第一方面,本实施例公开了一种基于二进制插桩的沙盒,如图1所示,应用于以AOT编译的方式进行WASM字节码编码时的内存隔离,所述沙盒包括:分析仪器模块110、检查指令模块120和执行模块130;
分析仪器模块110,用于通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息。
分析仪器模块主要用于从当前虚拟机中提取必要的信息,并根据提取到的信息分析当前虚拟机的状态,虚拟机的状态包括两个方面:第一方面为代码段信息,第二部分为与WASI相关的函数。WASI相关函数是WASI系统调用的函数入口。代码段信息为虚拟机对应AOT编译时的确切内存空间,是虚拟机分配加载AOT编译WASM的内存空间。WASI相关的函数是除了代码段之外的有效目标。
具体的,如图2所示,所述分析仪器模块110包括:代码段信息提取单元1101和函数信息提取单元1102;
所述代码段信息提取单元1101,用于通过动态插桩工具从WASM虚拟机中提取出代码段信息;其中,代码段信息为:WASM虚拟机分配加载AOT编译的WASM内存空间;
所述函数信息提取单元1102,用于提取WASI相关函数信息;其中,WASI相关函数信息为WASI系统调用的函数入口。
详细的,所述代码段信息提取单元1101还包括:图像水平仪器子单元11011;
所述图像水平仪器子单元11011,用于在图像层检测AOT实例函数的输入和输出的信息,以获取到代码段信息和所述代码段信息的线性内存边界。
分析仪器是为了获得必要的信息,这些信息只在执行时产生。分析仪器模块主要由两部分组成:(1)代码段信息和(2)WASI相关功能信息。代码段信息是准确的内存地址AOT编译的WebAssembly的准确内存地址范围。已知AOT编译的WebAssembly将被放在内存的[0x00000000,0x80000000],但是并不知道确切地址,确切地址需要加载时才能检测得到。与WASI相关的函数信息是一些函数en-在WebAssembly虚拟机中的指针。对于WAMR编译器,git标签为WAMR-01-18-2022-38-gf8ee05d,一些允许的函数是aotinvokenative()andaotenlargememory()inWAMR,所以这里的信息是WAMR中aotinvokenative()的指针。
在一种实施方式中,基于不同版本的编译器处理WASI的方式不同,为了实现指令的准确识别,具体应用时设置一个函数白名单,该白名单包含WAMR中所有允许的函数的列表。当检测到目标代码在代码段之外的JUMP指令或CALL指令时,则被检测的代码将检查目标是否属于白名单中的一个函数。为了获得这些信息,在图像层对代码进行检测。英特尔PIN中的图像级被定义为单个ELF文件,它可以是一个执行文件也可以为动态链接库或静态链接库。在映像层中,通过搜索特定的功能,并监测参数或返回值的信息,从而得到代码段信息。具体的,为了获得代码段的信息,可以使用工具aotinstantiate()函数,这个函数的一个参数是AOTModule,它包含了代码段信息的AOT编译的模块的代码段信息。通过对这个函数的入口和出口进行仪器检测分析,获取到代码段信息,因为参数信息只能在函数的入口处得到,而代码段信息只能在该函数完成后才能确定。在这个实例函数之前,被仪器化的代码将得到指向AOTMule的指针,而这个函数之后的代码将得到确切的代码段。代码段信息包含起始地址和代码段的长度。具体的,起始地址的偏移量是0xf0,代码段的长度偏移量是0xf0。
进一步的,除了代码段的信息,需要获取WebAssembly依赖的线性内存和指令内存的实例化()函数。这个函数完成后将返回一个AOTMemory Instance对象,该对象包括AOTPointer。它是关于线性内存地址的边界。然后可以得到线性内存的初始化地址。当WebAssembly运行时,将通过AOT放大内存来动态地宣布内存边界,所以具体实施时需要钩住这个函数,以便即时更新线性内存边界。
所述检查指令模块120,用于分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上。
实施例中提供的检查指令模块是用来检查分支指令的目标地址是否合法,以及分析接收到的各条分支指令是否为无效指令。
它对跳转指令、调用指令和返回指令进行检测,为了避免AOT编译的WebAssembly直接执行系统调用,禁止直接调用系统指令。
具体的,如图3所示,所述检查指令模块120包括:单条跳转指令检查单元1201、调用指令检查单元1202和返回指令检查单元1203;
所述单条跳转指令检查单元1201,用于判定接收到的单条跳转指令的目标地址是否在代码段内,若不在,则判断所述单条跳转指令的目标地址是否为与WASI相关的函数,若不是,则判定为所述单条跳转指令为非法指令;
所述调用指令检查单元1202,用于判断接收到的调用指令是否在预设白名单内,若不在,则为非法调用指令;
所述返回指令检查单元1203,用于控制返回地址在AOT编译所对应内存边界内,以及判断返回指令的地址是否与下一条返回指令的地址一致。
对于单条跳转指令,仪器化代码检查分支的目标地址是否在代码段,而这些信息是基于图像级工具中获得的。若已经从图像级工具中获得了这些信息且如果分支目标地址不在代码段内,则需要进一步对仪器化代码进行下一步额外的检查,判断分支目标地址是否是一个与WASI相关的函数。如果这两个检查结果均为否,则判定跳转指令为一个非法跳转指令。本实施例的沙盒将终止其执行并记录与此单条跳转指令有关的信息。
保护Call指令是为了确保分支目标地址的合法性,这与JUMP相同。在x86-64中,调用指令和跳转指令的区别是,调用指令用于函数调用,这意味着它将调用一些正常的功能,例如:aot放大内存、aot调用本机等等。通过设置一个白名单策略来匹配这些功能,如果不匹配的话本实施例提供的沙盒将终止其执行并记录相关的信息。
返回地址将把堆栈顶部的值弹出到PC寄存器中。基于这一特点,很多攻击者修改堆栈值并利用它来改变程序的控制流。所以在本实施例提供的解决方案中,控制返回地址在模块内存边界内。若控制返回地址在内存边界之外,则判断为返回地址被修改了。本实施例沙盒将终止执行并记录相关信息。
此外,在具体应用时,还需要在WAMR中设置另一条Ret指令。因为CPU的控制权应该由通过虚拟机中的Call指令传递给AOT编译的WebAssembly。所以需要验证在AOT编译的WebAssembly的函数中的Return指令的地址是否与下一条指令的地址一致。
对于系统调用(Syscall),另一种可能的攻击是使用系统调用(Syscall)来重定向虚拟机的控制流。理论上,AOT编译的WebAssembly不应该包含系统调用指令,因为所有的系统调用都应该通过WebAssembly系统接口来调用,所以本实施例中通过将所有的系统调用指令禁用,当沙盒内检测到syscall指令,程序的执行将被终止,相关的信息将被记录。
为了对访问指令的更准确的识别,结合图3所示,所述检查指令模块120还包括:内存访问判断单元1204;
所述内存访问判断单元1204,用于对接收到的内存访问是否符合合法条件进行判断;所述符合合法条件包括:内存访问的目标为堆栈内存、内存访问的目标为AOT编译对应的线性内存段和内存访问的目标地址处于预设名单内。
在每个内存访问指令之前,如果满足以下条件。(1)这个内存访问的目标是堆栈内存该内存访问的目标是堆栈内存,(2)该内存访问的目标2)该内存访问的目标是模块的线性内存段(3)这个内存访问的目标是一个合法的白名单内存地址,那么这个内存访问就会被认为是合法的。白名单内存地址,那么这个内存访问指令是合法的。否则,这就是一个无效的内存访问。
所述执行模块,用于执行AOT编译完成后得到的WASM本地代码。
所述执行模块用于执行引擎然后执行AOT编译的WebAssembly,以及仪器化的代码。
进一步的,所述沙盒还包括:寻找AOT模块;
所述寻找AOT模块,用于当AOT编译完成的WASM本地代码在虚拟机中加载完成之后,对保存WASM本地代码的内存块进行检测,以获取AOT编译的WASM本地代码在虚拟机内存中的地址信息。
可以想到的是,在使用仪器之前,需要确认AOT编译的WebAssembly在内存中的位置。因为它不属于WebAssembly虚拟机的文本段。当英特尔PIN检测一个程序时,它首先分析整个程序,以获得执行信息,如纹理段的位置。然而,由于AOT编译的WebAssembly不在虚拟机的文本段中,因此PIN不能直接检测这部分内容。从而导致对AOTWebAssembly进行检测也很困难因为它的格式不是标准的可扩展链接格式(ELF)。
本实施例中通过在WebAssembly虚拟机的加载时间之后对代码进行检测解决上述问题。在加载时,准确的AOT编译的WebAssembly被加载到内存中,并可以被视为一个自我修改的代码。英特尔PIN码可以对自我修改的代码进行检测。然而,需要知道这个自我修改代码在内存中的确切地址。在一种实施例中,结合图1所示,以WAMR虚拟机为例,将AOT编译的WebAssembly加载到一个内存块,它是由mmap()分配的,带有32BIT标志分配的,mmap()的32BIT标志要求mmap()在内存空间的前两个Gigabytes中映射一个内存块。因此,AOT编译的WebAssembly将被放置在地址为[0x00000000,0x80000000]。SWAM使用PIN的SetSmcSupport()函数来启用对自我修改代码的支持,且其仅对保存地址为[0x00000000,0x80000000]的内存块中的代码进行检测。
本实施例提供的沙盒,将其定义的名称为SWAM(Sandboxing WebAssembly Ahead-of-time Modules),其是基于英特尔PIN的一个动态工具。在具体应用时,SWAM提取WASM运行时的内存布局和寄存的AOT模块,包括模块的地址和线性内存的范围。然后,SWAM在AOT模块上执行对AOT模块进行动态检测,将所有的控制流传输和数据访问都要经过一个边界检查。通过这种方式,WebAssembly模块的内存安全可以被强制执行。
示例性方法
本实施例还公开了一种沙盒的内存隔离方法,如图4所示,存隔离方法步骤包括:
步骤S1、通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;该步骤由分析仪器模块执行。
步骤S2、分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上;该步骤由检查指令模块执行。
步骤S3、执行AOT编译完成后得到的WASM本地代码,该步骤由执行模块执行。
进一步的,所述方法还包括:
当AOT编译完成的WASM本地代码在虚拟机中加载完成之后,对保存WASM本地代码的内存块进行检测,以获取AOT编译的WASM本地代码在虚拟机内存中的地址信息,该步骤由寻找AOT模块执行实现。
第三方面,本实施例还公开了一种计算机可读存储介质,其中,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现所述的内存隔离方法的步骤。
存储器作为一种计算机可读存储介质,可设置为存储软件程序、计算机可执行程序,如本公开实施例中的方法对应的程序指令或模块。处理器通过运行存储在存储器中的软件程序、指令或模块,从而执行功能应用以及数据处理,即实现上述实施例中的方法。
存储器可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器。例如,U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等多种可以存储程序代码的介质,也可以是暂态存储介质。
为了评估SWAM对这些攻击的防御效果,具体验证示例中通过构建了五个恶意的WASMAOT模块,它们或者试图通过以下四条指令之一突破控制流的限制,或者在线性内存范围之外进行非法内存访问。结果表明,SWAM能够检测到所有由恶意AOT模块进行的所有攻击。
威胁模型在本实施例的验证实验中,使用WASM虚拟机作为执行后台的FaaS平台。执行后端,用户上传AOT编译的WASM代码进行快速执行并等待结果。一个WASMVM可以托管由不同用户上传的多个WASMAOT模块。用户上传的多个WASMAOT模块,而VM有责任隔离不同的模块。假设恶意的用户(即攻击者)可能会上传任意修改的AOT代码,以发起攻击。攻击者使用WASM模块在运行时逃离沙盒运行的时候,首先AOT能够在三种检测模式中实现最快的执行,第二,将AOT编译放在用户端可以减轻FaaS平台的负担,也就是说,他们不需要包括AOT编译器,而AOT编译器会大幅增加代码基数,并有更高的概率引入错误,因此本实施例提供的方法可以得到很好的执行效果。
控制流劫持攻击控制流代表了一个程序的执行路径,通常以控制流图(CFG)的形式可视化。通常被可视化为控制流图(CFG)。攻击者可以利用软件漏洞来控制间接分支指令(Ret,Jmp,andCall)并劫持控制流。在x86-64汇编语言中,Jmp指令执行一个无条件的跳转。这个转移的结构通过改变程序计数器来转移执行流程。WASM不允许任意的跳转。在执行跳转指令之前,WASMVM通过添加跳转表的基地址和跳转偏移量计算出跳转目标的地址。但是在AOT编译的代码中,本实施例提供的方法可以通过注入任意的jmp指令来跳转到无效的地址,并修改控制流。
调用指令类似于Jmp指令,不同的是调用指令将当前的IP寄存器和CS寄存器推入堆栈,以便在调用结束后返回下一条指令的地址。同样,本实施例提供的方法可以在AOT编译的代码中插入Call指令来修改控制流。Ret指令定位返回地址在堆栈中定位并跳转到它。本实施例可以使用Push或Pop指令来修改堆栈的值。此外,本实施例还可以覆盖受保护的寄存器(如rsp,rbp)来改变堆栈的边界。因此,Ret指令可以将控制流转移到目标地址。
程序进行系统调用(syscall)是为了请求操作系统服务,例如,网络通信和文件访问。在WASM沙箱中,直接调用系统调用是被禁止的,一个模块应该总是求助于WASI来获取系统服务。然而,一个AOT编译的代码可能会恶意包含不能被审查的Syscall指令,因此本实施例中通过禁止直接调用系统指令来绕过WASI,避免出现安全问题。
数据的攻击在WebAssembly中,有一些额外的局部和全局变量来存储使用的数据。变量来存储所使用的数据。这些数据可以被访问四种与"全局"和"局部"有关的指令。本地默认情况下,本地变量被初始化为零,并被存储在全局变量则被保存在全局部分。指令'local.set$vali32'将创建一个名为'$var'的局部变量,'local.get$val'将将'$val'的值推到操作数栈中。本地变量没有稳定的地址,若不使用'local.get'来将其存入操作栈,它将很快消失。指令'global.set$val'将创建一个全局变量名为'$var'的全局变量并将其保存到全局部分。'global.get$var'将把'$val'的值推到操作数栈中。WASM虚拟机将本地和全局数据存储在不同的地方。Lucet使用它自己的堆栈(VM的堆栈)进行存储,而WAMR将数据存储在它的堆(VM的堆)中。无论在哪里数据被存储的地方,可以插入与内存操作有关的指令操作的指令(Mov,Lea,Add,Sub,And,Or,Xor)到AOT编译的代码,然后修改任意内存地址的值。
攻击方法不同的WASM虚拟机支持不同的AOT二进制数据。例如,WAMR定义了自己的AOT格式和装载器(一种以'.aot'为后缀的独特格式)。WasmEdge和Wasmtime支持将编译后的代码转换成静态的库,这符合elf格式。虽然不同的WASM虚拟机采用不同的AOT二进制格式,但是所有的AOT代码是本地代码,可以直接加载和执行。因此,通过改写本机代码来发起所建议的攻击。本机代码,即AOT编译后的代码。以WAMR为例,首先,WAMR中的AOT二进制文件的开头是一个'.aot'标识符(8B),接下来是部分类型声明(8B)和部分长度(4B),总共有八种部分类型,包括目标部分(包括平台信息)、文本部分(包括可执行指令)等等。例如,代表目标部分的平台信息,初始部分的程序常量数据。初始部分包含文本部分的可执行指令。包含函数部分的每个函数偏移的信息部分的每个函数偏移信息等等。图5显示了一段C++代码如何(在内存中存储一个整数)被编译成WAMRAOT代码。C++代码首先被编译成WASM字节码使用wasi-sdk-14(LLVM),然后用wamrc(WAMR)编译成AOT然后用wamrc(WAMR的AOT编译器)编译成AOT代码。编译后的AOT代码在图5中表示为"本地代码",其中将"xor%eax,%eax"修改为"callq*(%rdx)"以发起攻击。攻击。因此,该攻击将重定向程序控制流到WASM虚拟机的".text"段。同样地,通过插入恶意的Jmp,Call,Ret,或Syscall指令来改变控制流。
通过实验验证,SWAM并没有对正常的应用程序发出错误的警报,对于在正常的应用程序不会引起错误警报。本实施例还评估了SWAM在Polybench,SPEC2017和PARSEC基准的性能。整个SWAM系统的额外过整个SWAM系统的额外超额收益范围为1.44倍到8.34倍,总体开销的几何平均值为4.76倍。SWAM的工具化代码的额外开销的额外开销只有1.28倍到3.92倍,几何平均值为2.53倍。与解释WebAssembly的性能相比,这些性能开销是可以接受的。解释WebAssembly代码的性能--SWAM比解释代码快56.69倍。
本实施例例提出了一个基于二进制插桩的沙盒方案,被称为SWAM,用于通过动态二进制工具来限制不受信任的AOT模块。使用英特尔PIN实现了SWAM的一个原型,并评估了其有效性和编译效率。本实施例中提出了应对控制流攻击和数据攻击的一般方法,以及提出了加强模块边界检查,验证控制流和提供对系统调用的安全访问等方式,解决了所有的WebAssemblyAOT编译器都没有统一的规则来处理AOT文件的规则,导致编码运行时安全性能低的缺陷。
本发明提出了一种基于二进制插桩的沙盒、内存隔离方法及存储介质,应用于以AOT编译的方式进行WASM字节码编码时的内存隔离,所述沙盒通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上,最后执行AOT编译完成后得到的WASM本地代码,以实现对来自不受信任的AOT代码的托管。本实施例提供的沙盒及其内存隔离方法在WASM运行过程中对AOT模块进行动态检测,提取运行时的内存布局和AOT模块的保存地址和线性内存范围,限制了控制流和数据访问,从而提供了内存安全属性,因此具有很高的实用性。
可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。

Claims (10)

1.一种基于二进制插桩的沙盒,其特征在于,应用于以AOT编译的方式进行WASM字节码编码时的内存隔离,所述沙盒包括:分析仪器模块、检查指令模块和执行模块;
分析仪器模块,用于通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;
所述检查指令模块,用于分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上;
所述执行模块,用于执行AOT编译完成后得到的WASM本地代码。
2.根据权利要求1所述的沙盒,其特征在于,所述分析仪器模块包括:代码段信息提取单元和函数信息提取单元;
所述代码段信息提取单元,用于通过动态插桩工具从WASM虚拟机中提取出代码段信息;其中,代码段信息为:WASM虚拟机分配加载AOT编译的WASM内存空间;
所述函数信息提取单元,用于提取WASI相关函数信息;其中,WASI相关函数信息为WASI系统调用的函数入口。
3.根据权利要求2所述的沙盒,其特征在于,所述代码段信息提取单元还包括:图像水平仪器子单元;
所述图像水平仪器子单元,用于在图像层检测AOT实例函数的输入和输出的信息,以获取到代码段信息和所述代码段信息的线性内存边界。
4.根据权利要求2所述的沙盒,其特征在于,所述检查指令模块包括:单条跳转指令检查单元、调用指令检查单元和返回指令检查单元;
所述单条跳转指令检查单元,用于判定接收到的单条跳转指令的目标地址是否在代码段内,若不在,则判断所述单条跳转指令的目标地址是否为与WASI相关的函数,若不是,则判定为所述单条跳转指令为非法指令;
所述调用指令检查单元,用于判断接收到的调用指令是否在预设白名单内,若不在,则为非法调用指令;
所述返回指令检查单元,用于控制返回地址在AOT编译所对应内存边界内,以及判断返回指令的地址是否与下一条返回指令的地址一致。
5.根据权利要求4所述的沙盒,其特征在于,所述检查指令模块还包括:内存访问判断单元;
所述内存访问判断单元,用于对接收到的内存访问是否符合合法条件进行判断;所述符合合法条件包括:内存访问的目标为堆栈内存、内存访问的目标为AOT编译对应的线性内存段和内存访问的目标地址处于预设名单内。
6.根据权利要求1-5任一项所述的沙盒,其特征在于,所述沙盒还包括:寻找AOT模块;
所述寻找AOT模块,用于当AOT编译完成的WASM本地代码在虚拟机中加载完成之后,对保存WASM本地代码的内存块进行检测,以获取AOT编译的WASM本地代码在虚拟机内存中的地址信息。
7.根据权利要求1所述的沙盒,其特征在于,所述执行模块,还用于执行引擎和执行仪器化的代码。
8.一种沙盒的内存隔离方法,其特征在于,利用如权利要求1-7任一项所述的沙盒实现以AOT编译的方式进行WASM字节码编码时的内存隔离,所述方法包括:
通过动态插桩工具从WASM虚拟机中提取出代码段信息和WASI函数信息;
分析AOT编译运行时接收到的各条分支指令,确认各条分支指令所访问的内存处于AOT编译所对应内存内或各条分支指令的调用者在预设白名单上;
执行AOT编译完成后得到的WASM本地代码。
9.根据权利要求8所述的内存隔离方法,其特征在于,所述方法还包括:
当AOT编译完成的WASM本地代码在虚拟机中加载完成之后,对保存WASM本地代码的内存块进行检测,以获取AOT编译的WASM本地代码在虚拟机内存中的地址信息。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如权利要求8或9所述的内存隔离方法的步骤。
CN202211253504.5A 2022-10-13 2022-10-13 一种基于二进制插桩的沙箱、内存隔离方法及存储介质 Pending CN115659333A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211253504.5A CN115659333A (zh) 2022-10-13 2022-10-13 一种基于二进制插桩的沙箱、内存隔离方法及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211253504.5A CN115659333A (zh) 2022-10-13 2022-10-13 一种基于二进制插桩的沙箱、内存隔离方法及存储介质

Publications (1)

Publication Number Publication Date
CN115659333A true CN115659333A (zh) 2023-01-31

Family

ID=84988360

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211253504.5A Pending CN115659333A (zh) 2022-10-13 2022-10-13 一种基于二进制插桩的沙箱、内存隔离方法及存储介质

Country Status (1)

Country Link
CN (1) CN115659333A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116561759A (zh) * 2023-05-06 2023-08-08 国网冀北电力有限公司信息通信分公司 一种电网智能终端设备固件的防控制流劫持方法及装置
CN116956270A (zh) * 2023-09-18 2023-10-27 星汉智能科技股份有限公司 应用程序运行方法、运行环境re、电子设备、存储介质
CN117707652A (zh) * 2023-12-14 2024-03-15 北京中电华大电子设计有限责任公司 数据编译、参数传递方法及装置

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116561759A (zh) * 2023-05-06 2023-08-08 国网冀北电力有限公司信息通信分公司 一种电网智能终端设备固件的防控制流劫持方法及装置
CN116956270A (zh) * 2023-09-18 2023-10-27 星汉智能科技股份有限公司 应用程序运行方法、运行环境re、电子设备、存储介质
CN116956270B (zh) * 2023-09-18 2024-01-12 星汉智能科技股份有限公司 应用程序运行方法、运行环境re、电子设备、存储介质
CN117707652A (zh) * 2023-12-14 2024-03-15 北京中电华大电子设计有限责任公司 数据编译、参数传递方法及装置
CN117707652B (zh) * 2023-12-14 2024-06-11 北京中电华大电子设计有限责任公司 数据编译、参数传递方法及装置

Similar Documents

Publication Publication Date Title
CN108090346B (zh) 一种基于数据流监控的代码复用攻击防御方法及系统
Zhang et al. Dexhunter: toward extracting hidden code from packed android applications
US11507669B1 (en) Characterizing, detecting and healing vulnerabilities in computer code
Octeau et al. Effective {Inter-Component} communication mapping in android: An essential step towards holistic security analysis
Gawlik et al. Towards automated integrity protection of C++ virtual function tables in binary programs
US8904537B2 (en) Malware detection
US8745740B2 (en) Apparatus and method for detecting malicious sites
CN115659333A (zh) 一种基于二进制插桩的沙箱、内存隔离方法及存储介质
US9223964B2 (en) Detecting JAVA sandbox escaping attacks based on JAVA bytecode instrumentation and JAVA method hooking
US20090271867A1 (en) Virtual machine to detect malicious code
US10242190B2 (en) System and method for detection of malicious code by iterative emulation of microcode
Linn et al. Protecting Against Unexpected System Calls.
US20170372068A1 (en) Method to identify known compilers functions, libraries and objects inside files and data items containing an executable code
CN109271789B (zh) 恶意进程检测方法、装置、电子设备及存储介质
CN109388946B (zh) 恶意进程检测方法、装置、电子设备及存储介质
EP3495978B1 (en) Method for detecting vulnerabilities in software
Arthur et al. Getting in control of your control flow with control-data isolation
Kirsch et al. PwIN–Pwning Intel piN: Why DBI is unsuitable for security applications
Zhan et al. Shrinking the kernel attack surface through static and dynamic syscall limitation
Stepan Defeating polymorphism: beyond emulation
Xu et al. SWAT4J: Generating System Call Allowlist for Java Container Attack Surface Reduction
Durães et al. A methodology for the automated identification of buffer overflow vulnerabilities in executable software without source-code
Kawakoya et al. Taint-assisted IAT Reconstruction against Position Obfuscation
Si et al. ROP-Hunt: Detecting return-oriented programming attacks in applications
Bouffard et al. Heap Hop! Heap Is Also Vulnerable

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination