一种用于加固智能合约安全运行的安全沙箱系统转让专利

申请号 : CN202211387071.2

文献号 : CN115438335B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 崔建军许文波朱清文黄文林阮镇南

申请人 : 上海特高信息技术有限公司

摘要 :

本发明涉及区块链技术领域,具体是一种用于加固智能合约安全运行的安全沙箱系统,包括VM API过滤器模块,用于对各种VM API接口进行过滤;不一致函数消除器模块,用于消除结果可能不一致的函数;运行时长监测器模块,通过合约VM执行的代码行数对合约的运行时长进行监测;内存分配跟踪器模块,实时跟踪合约运行时内存分配;合约调用链跟踪器模块,用于跟踪合约调用链的深度,防止因宿主环境线程的调用栈溢出,导致区块链程序的异常退出;账本存储计费器模块,用于对合约的每个存储操作收取交易费用。本系统通过将所有的合约VM都在本系统中安全运行,实现对各环节的监测与安全加固处理,可有效保护宿主系统和区块链不受到威胁破坏。

权利要求 :

1.一种用于加固智能合约安全运行的安全沙箱系统,其特征在于,包括:

VM API过滤器模块:根据安全接口白名单对合约VM提供的各种VM API接口进行过滤;

处于安全接口白名单之外的VM API接口均被屏蔽;

不一致函数消除器模块:用于对VM API接口进行改造,确保VM API接口的执行结果具有随机性或不确定性,但可得到完全一致的结果;所述不一致函数消除器模块用于消除结果不一致的函数,其中对VM API接口进行改造,具体为:对于随机函数、时间函数在不同区块链节点执行,会导致不同结果的VM API接口,进行如下改造,以保证API的执行结果具有随机性或不确定性,但是可以得到完全一致的结果:(1)对于随机函数,保证其是一个伪随机函数,不从宿主系统获取真实随机源或以系统时间作为随机源;默认情况下,通过VM时间函数获取当前时间,对随机函数进行初始化;或由合约调用者从外部提供一致的随机源,初始化随机函数;(2)对于时间函数,其当前时间由所在账本高度的时间确定,而非所在宿主系统的当前时间;

运行时长监测器模块:通过合约VM执行的代码行数对合约的运行时长进行监测;

Sandbox针对合约VM,设置相应的执行Hook,每执行一定数量的代码行数后,该执行Hook会被调用,此时运行时长监测器模块统计已经执行的代码行数;并根据其计算所需的执行交易费用,如果其超过当前剩余的执行费用,则终止合约的执行;

内存分配跟踪器模块:针对合约VM,设置相应的内存分配和释放Hook,通过调用该内存分配或释放 Hook 分别向宿主环境申请或释放内存,并对已经分配的内存空间进行跟踪;

Sandbox统计截止目前为止,已经分配的内存空间;如果其超过限制,则尝试回收已经释放但还未完全回收的空间;

合约调用链跟踪器模块:用于跟踪合约调用链的深度,防止因宿主环境线程的调用栈溢出,导致区块链程序的异常退出;每调用一个新合约时,其深度加1;而完成一个合约执行,返回时,其深度减1;在超过指定深度限制时,再次调用合约,将直接返回合约调用失败;

账本存储计费器模块:用于对合约的每个存储操作收取交易费用。

2.根据权利要求1所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述VM API过滤器模块根据安全接口白名单对合约VM提供的各种VM API进行过滤,具体为:在创建合约VM后,所述VM API过滤器模块会加载运行一段VM初始化程序,所述VM初始化程序会对所述合约VM的全局名字空间进行扫描,将处于该安全接口白名单中的VM API接口保留,其余VM API接口从所述全局名字空间中删除。

3.根据权利要求1所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述不一致函数消除器模块对VM API接口进行改造,具体为:对于随机函数,保证其是一个伪随机函数,不从宿主系统获取真实随机源或以系统时间作为随机源;

对于时间函数,其当前时间由所在账本高度的时间确定。

4.根据权利要求3所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述不从宿主系统获取真实随机源或以系统时间作为随机源,具体为:默认情况下,通过VM时间函数获取当前时间,对随机函数进行初始化;或由合约调用者从外部提供一致的随机源,初始化随机函数。

5.根据权利要求1所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述通过合约VM执行的代码行数对合约的运行时长进行监测,具体为:所述运行时长监测器模块通过调用执行Hook对合约VM执行的代码行数进行监测,并根据其计算所需的执行交易费用,若执行交易费用超出当前余额,则终止合约的执行。

6.根据权利要求5所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述合约VM执行的代码行数是从初始合约开始执行时统计。

7.根据权利要求1所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述内存分配跟踪器模块对已经分配的内存空间进行跟踪,具体为:若内存空间超出预设限制,则回收已经释放但未完全回收的内存空间。

8.根据权利要求7所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述合约的运行内存统计为包含整个调用链中的所有合约VM的内存统计;若因内存限制终止合约VM时,为对合约调用链中当前合约VM的终止。

9.根据权利要求1所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述合约调用链跟踪器模块对合约调用链深度的跟踪,具体为:每调用一个新合约时,合约调用链的深度加1;而完成一个合约执行,返回时,合约调用链的深度减1;在超过指定深度限制时,再次调用合约,将直接返回合约调用失败。

10.根据权利要求1所述的一种用于加固智能合约安全运行的安全沙箱系统,其特征在于:所述账本存储计费器模块对合约的每个存储操作收取交易费用时,若交易费用大于余额时,则存储失败。

说明书 :

一种用于加固智能合约安全运行的安全沙箱系统

技术领域

[0001] 本发明涉及区块链技术领域,尤其涉及一种用于加固智能合约安全运行的安全沙箱系统。

背景技术

[0002] 区块链源于比特币,其最初只是作为数字资产流通的工具。但之后,以太坊引入了灵活的可编程智能合约机制,使得其具备了很强的二次开发能力,也使得区块链技术拥有了更加广泛应用的可能。其中,以太坊(英文Ethereum)是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币以太币(Ether,简称“ETH”)提供去中心化的以太虚拟机(Ethereum Virtual Machine)来处理点对点合约。而智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议;智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。
[0003] 但是,智能合约程序的灵活性也带来了可能的风险,可能导致程序、系统,甚至区块链遭受破坏。智能合约总是运行在智能合约VM中来同区块链进行交互。以太坊的智能合约虚拟机EVM是经过仔细设计的受限的VM,具备很高的系统安全性,其安全性主要在于用户编写合约业务逻辑上的安全性。但是,当引入更加通用的编程语言虚拟机,比如JavaScript VM、Lua VM、Python VM时,会由于其丰富的API,与宿主机的更加灵活和不受限的交互能力,导致更大的安全风险,主要表现在如下3方面:
[0004] 1、宿主环境Host的安全:通过文件IO,网络IO,环境访问,进程/线程等系统API,破坏或攻击宿主机;
[0005] 2、链的安全:以较低成本在账本上产生大量数据;通过随机或不确定代码,破坏账本的一致性;通过合约间调用,导致栈溢出;
[0006] 3、VM的安全:合约长时间运行,导致阻塞后续其它交易共识;合约无限制的分配和使用内存资源,导致大量OS(即操作系统,是管理计算机硬件与软件资源的计算机程序)内存被占用,使得系统运行缓慢或发生内存溢出(Out Of Memory,简称OOM,是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存),宿主进程被强制杀掉(OOM Killer,是当系统内存严重不足时 linux 内核采用的杀掉进程,释放内存的机制。OOM Killer 通过检查所有正在运行的进程,然后根据自己的算法给每个进程一个 badness 分数,拥有最高 badness 分数的进程将会在内存不足时被杀掉)。

发明内容

[0007] 本发明的目的在于克服上述现有技术的问题,提供了一种用于加固智能合约安全运行的安全沙箱系统,该安全沙箱系统使得区块链可以以一种安全可靠的方式执行用户编写的智能合约程序,而不必依赖用户编写程序的正确性和对其的信任,来确保区块链的完整性和正常运行,可以保护宿主系统和区块链不受到威胁破坏。
[0008] 上述目的是通过以下技术方案来实现:
[0009] 一种用于加固智能合约安全运行的安全沙箱系统,包括:
[0010] VM API过滤器模块:根据安全接口白名单对合约VM提供的各种VM API接口进行过滤;处于安全接口白名单之外的VM API接口均被屏蔽;
[0011] 不一致函数消除器模块:用于对VM API接口进行改造,确保VM API接口的执行结果具有一定的随机性或不确定性,但可得到完全一致的结果;
[0012] 运行时长监测器模块:通过合约VM执行的代码行数对合约的运行时长进行监测;
[0013] 内存分配跟踪器模块:针对合约VM,设置相应的内存分配和释放Hook,通过调用该内存分配或释放 Hook 分别向宿主环境申请或释放内存,并对已经分配的内存空间进行跟踪;
[0014] 合约调用链跟踪器模块:用于跟踪合约调用链的深度,防止因宿主环境线程的调用栈溢出,导致区块链程序的异常退出;
[0015] 账本存储计费器模块:用于对合约的每个存储操作收取交易费用。
[0016] 进一步地,所述VM API过滤器模块根据安全接口白名单对合约VM提供的各种VM API进行过滤,具体为:在创建合约VM后,所述VM API过滤器模块会加载运行一段VM初始化程序,所述VM初始化程序会对所述合约VM的全局名字空间进行扫描,将处于该安全接口白名单中的VM API接口保留,其余VM API接口从所述全局名字空间中删除。
[0017] 进一步地,所述不一致函数消除器模块对VM API接口进行改造,具体为:对于随机函数,保证其是一个伪随机函数,不从宿主系统获取真实随机源或以系统时间作为随机源;对于时间函数,其当前时间由所在账本高度的时间确定。
[0018] 进一步地,所述不从宿主系统获取真实随机源或以系统时间作为随机源,具体为:默认情况下,通过VM时间函数获取当前时间,对随机函数进行初始化;或由合约调用者从外部提供一致的随机源,初始化随机函数。
[0019] 进一步地,所述通过合约VM执行的代码行数对合约的运行时长进行监测,具体为:所述运行时长监测器模块通过调用执行Hook对合约VM执行的代码行数进行监测,并根据其计算所需的执行交易费用,若执行交易费用超出当前余额,则终止合约的执行。
[0020] 进一步地,所述合约VM执行的代码行数是从初始合约开始执行时统计。
[0021] 进一步地,所述内存分配跟踪器模块对已经分配的内存空间进行跟踪,具体为:若内存空间超出预设限制,则回收已经释放但未完全回收的内存空间。
[0022] 进一步地,所述合约的运行内存统计为包含整个调用链中的所有合约VM的内存统计;若因内存限制终止合约VM时,为对合约调用链中当前合约VM的终止。
[0023] 进一步地,所述合约调用链跟踪器模块对合约调用链深度的跟踪,具体为:每调用一个新合约时,合约调用链的深度加1;而完成一个合约执行,返回时,合约调用链的深度减1;在超过指定深度限制时,再次调用合约,将直接返回合约调用失败。
[0024] 进一步地,所述账本存储计费器模块对合约的每个存储操作收取交易费用时,若交易费用大于余额时,则存储失败。
[0025] 有益效果
[0026] 本发明所提供的一种用于加固智能合约安全运行的安全沙箱系统,通过将所有的合约VM都在本系统中安全运行,实现对各环节的监测与安全加固处理,可有效保护宿主系统和区块链不受到威胁破坏。通过本系统的安全加固处理,智能合约的运行将不再依赖对合约编写者的信任,即便在不可信环境下,也可提供运行智能合约的安全运行环境,从而保证了链的健壮性。

附图说明

[0027] 图1为本发明所述一种用于加固智能合约安全运行的安全沙箱系统的示意图。

具体实施方式

[0028] 下面根据附图和实施例对本发明作进一步详细说明。所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0029] 如图1所示,一种用于加固智能合约安全运行的安全沙箱系统,包括:
[0030] VM API过滤器模块:根据安全接口白名单对合约VM提供的各种VM API接口进行过滤;处于安全接口白名单之外的VM API接口均被屏蔽;
[0031] 不一致函数消除器模块:用于对VM API接口进行改造,确保VM API接口的执行结果具有一定的随机性或不确定性,但可得到完全一致的结果;
[0032] 运行时长监测器模块:通过合约VM执行的代码行数对合约的运行时长进行监测;
[0033] 内存分配跟踪器模块:针对合约VM,设置相应的内存分配和释放Hook(VM Mem Hook),通过调用该内存分配或释放 Hook 分别向宿主环境申请或释放内存,并对已经分配的内存空间进行跟踪;
[0034] 合约调用链跟踪器模块:用于跟踪合约调用链的深度,防止因宿主环境线程的调用栈溢出,导致区块链程序的异常退出;
[0035] 账本存储计费器模块:用于对合约的每个存储操作收取交易费用。
[0036] 作为本实施例中各安全加固模块的具体介绍,如下:
[0037] 对于合约VM提供的各种API,所述VM API过滤器模块根据安全接口白名单进行过滤,安全接口白名单之外的所有接口都会被屏蔽。具体的实现方式是在创建合约VM后,本系统提供的Sandbox会加载并运行一段VM初始化程序,该程序对VM全局名字空间进行扫描,只将明确安全的接口保留,其余接口从全局名字空间中删除;安全接口白名单还可自行定义与添加。
[0038] 所述不一致函数消除器模块用于消除结果可能不一致的函数,其中对VM API接口进行改造,具体为:
[0039] 对于随机函数、时间函数等在不同区块链节点执行,很可能会导致不同结果的VM API接口,进行如下改造,以保证API的执行结果具有一定的随机性或不确定性,但是可以得到完全一致的结果:
[0040] (1)对于随机函数,保证其是一个伪随机函数,不从宿主系统获取真实随机源或以系统时间作为随机源。默认情况下,通过VM时间函数获取当前时间,对随机函数进行初始化。或由合约调用者从外部提供一致的随机源,初始化随机函数。
[0041] (2)对于时间函数,其当前时间由所在账本高度的时间确定,而非所在宿主系统的当前时间。
[0042] 所述运行时长监测器模块监测合约运行时长,在超过限制时,强行终止VM运行。考虑合约的运行时间会受到宿主运行环境的影响,简单的使用时间很难达成一致结果。所以,这里以VM执行的代码行数,来限制合约的运行长。Sandbox针对合约VM,设置相应的执行Hook(VM Run Hook),每执行一定数量的代码行数后,该执行Hook会被调用,此时运行时长监测器模块统计已经执行的代码行数。并根据其计算所需的执行交易费用,如果其超过当前剩余的执行费用,则终止合约的执行。
[0043] 需要说明的是:合约可能存在嵌套调用,即调用其它合约,所以,合约VM执行的代码行数,是从初始合约开始执行时统计;由于合约调用可能跨多种类型的VM,所以每种VM的代码行都有一个负载系数,在统计时使用,以使得统计更加精确。负载系数越大,表明单个代码行的执行时间越长。
[0044] 所述内存分配跟踪器模块可实时跟踪合约运行时内存分配,在其超过限制时,强行终止VM运行。Sandbox(沙箱)针对合约VM,设置相应的内存分配和释放Hook(VM Mem Hook)。当需要从宿主环境申请或释放内存时,会调用该内存分配和释放Hook。此时,Sandbox统计截止目前为止,已经分配的内存空间。如果其超过限制,则尝试回收已经释放但还未完全回收的空间。由于多数VM采取GC机制(垃圾回收机制),所以先采取GC机制操作,可实际回收部分内存,以提升合约执行的成功概率。
[0045] 需要说明的是:合约可能存在嵌套调用,即调用其它合约,所以,合约的运行内存统计,是包含整个调用链中的所有合约VM的内存统计;当因为内存限制,终止VM时,是终止合约调用链中当前VM,而非整个合约,这样合约仍然有可能继续执行完成。
[0046] 为了增加灵活性,区块链允许在一个合约中调用另一个合约,但是,每调用一次合约都会导致整个合约的执行链的延长,而这意味着宿主环境中,调用栈的增加。所以,不加限制的合约调用,将最终导致宿主环境线程的调用栈溢出,从而导致区块链程序的异常退出。为此,我们引入合约调用链跟踪器模块,用于跟踪合约调用链的深度,每调用一个新合约时,其深度加1;而完成一个合约执行,返回时,其深度减1。在超过指定深度限制时,再次调用合约,将直接返回合约调用失败。
[0047] 智能合约的核心能力在于可以与区块链进行交互,并将自定义的数据存储在账本之中,但账本的存储是需要占用节点资源。因此,没有限制的数据存储,将很快消耗或者说占用节点大量的存储资源。为此,我们引入账本存储计费器模块,对于合约的每个存储操作,都会收取一定的交易费用( 通过ledger storage API),一旦其提供的交易费用不足以支撑这个存储操作,存储将会失败,即所述账本存储计费器模块对合约的每个存储操作收取交易费用时,若交易费用大于余额时,则存储失败。
[0048] 以上所述仅为说明本发明的实施方式,并不用于限制本发明,对于本领域的技术人员来说,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。