1.前言
相对于ethereum的soldity语言,move语言最近越来越火,而且由于其自身相对于soldity的强大优势,越来越受到重视。其中move语言被用于很多明星项目,比如Aptos,sui。近期我们的Web3 安全漏洞检测产品发现了一个整数溢出的漏洞。可以导致Aptos节点崩溃,造成拒绝服务。本文通过对该漏洞的介绍,希望大家对move语言以及其安全性有更多的认识和理解。作为move语言安全性研究的领导者,我们会持续关注move语言的安全性,为move的生态安全做出我们的贡献。
2.Move语言的重要概念
模块和脚本
Move 有两种不同类型的程序:模块(Modules)和脚本(Script)。模块是定义结构类型以及对这些类型进行操作的函数的库。结构类型定义了 Move 的全局存储的模式,模块函数定义了更新存储的规则。模块本身也存储在全局存储中。脚本是可执行文件的入口点,类似于传统语言中的主函数 main。脚本通常调用已发布模块的函数来更新全局存储。脚本是临时代码片段,不会发布在全局存储中。一个 Move 源文件(或编译单元)可能包含多个模块和脚本。然而,发布模块或执行脚本都是独立的虚拟机(VM)操作。
对于熟悉操作系统的人来说,move的module就类似系统的可执行文件运行的时候加载的动态库模块,而script类似主程序。用户可以通过自己编写script,来访问全局存储,包括调用module模块的代码。
全局存储
Move 程序的目的是读取和写入树形的持久全局存储。程序不能访问文件系统、网络或任何此树以外的数据。
在伪代码中,全局存储看起来像:
新加坡金融管理局:加密货币服务提供商不得在新加坡向公众营销加密货币:金色财经报道,新加坡金融管理局(MAS)今日表示,加密货币服务提供商不应向新加坡公众提供服务,因为它推出了指导方针来阻止街头的人进行加密货币交易。新指南称,数字支付代币(DPT,或更常见的加密货币)服务提供商不应在新加坡的公共区域(例如公共交通、公共交通场所、公共网站)营销或宣传 DPT 服务,也不应在社交媒体平台、广播和印刷媒体宣传,或提供实体 ATM。此外,提供商也不应该通过社交媒体影响者等第三方的参与进行营销。
据了解,指南适用于包括银行和其他金融机构、《支付服务法》下的支付机构,以及其申请目前正在由 MAS 审查的实体等 DPT 服务提供商。 但目前尚未规定对违规行为的处罚。(businesstimes)[2022/1/17 8:54:20]
从结构上讲,全局存储是一个森林(forest),这个森林由以账户地址(address)为根的树组成。每个地址可以存储资源(resource)数据和模块(module)代码。如上面的伪代码所示,每个地址(address)最多可以存储一个给定类型的资源值,最多可以存储一个给定名称的模块。
MOVE虚拟机原理
movevm 与evm虚拟机都一样,需要将源码编译成字节码,然后在虚拟机中执行,下图是整体的流程:
1.将字节码通过函数execute_script被加载进来
新加坡WBF交易所将于9月30日正式上线POLY:据官方消息显示,新加坡时间2020年9月30日,WBF交易所将正式上线POLY,并于当日15时在波卡生态区上线POLY/USDT交易对,现已开放充值和提现。
据悉,Polymath总部位于加拿大多伦多,成立于2016年。Polymath是一个证券型代币发行平台,旨在利用区块链技术,推出合规的AML/KYC开源标准,借助智能合约审计的方式,协助用户完成复杂的证券交易法律流程,高效快速地创建和发行代币。平台协议中将嵌入金融监管要求,为代币发行提供合规保障,同时能够帮助团队筛选认证投资者,连接开发者市场,为代币发行提供一站式解决方案。[2020/9/29]
2.执行load_script函数,这个函数主要用来反序列化字节码,并校验字节码是否合法,如果校验失败,就会返回失败
3.校验成功之后就会开始执行真正的字节码代码
4.执行字节码,访问或修改全局存储的状态,包括资源,modules
注:move语言还有很多特性,这里我们就不一一介绍,后续我们会从安全性角度继续分析move语言的特性。
3.漏洞描述
本漏洞主要设计验证模块,在讲具体漏洞之前先介绍下验证模块的功能以及StackUsageVerifier::verify。
验证模块
通过前面,我们知道在真正执行字节码代码之前,会有验证字节码的环节,而验证环节有可以细分为好多子过程,
分别是:
BoundsChecker,边界检查,主要是用来检查module与script的边界安全。具体包括检查signature,constants等的边界
新加坡WBF交易所将于9月24日正式上线FNS:据官方消息显示,新加坡时间2020年9月24日,WBF交易所将正式上线FNS,并于当日15时在开放区上线FNS/USDT交易对,9月26日15时开放充值和提现。
Fans Chain粉丝链是基于互联网及区块链技术为基础发行的数字通证。简称FNS,总发行量7200万枚。FNS拥有广泛的应用拓展场景,主要以社交网络平台为中心,打通流量入口,通过数字资产交易将流量转换为价值。它将为全球区块链底层技术领域、社交娱乐领域带来颠覆式的影响。
同时,为庆祝FNS上线WBF,回馈广大社区用户,WBF将联合FNS于2020年9月24日15时举行“空投福利活动。活动最终解释权归WBF所有,如有疑问请咨询官网在线客服。[2020/9/23]
DuplicationChecker, 该模块实现了一个检查器,用于验证 CompiledModule 中的每个向量是否包含不同的值
SignatureChecker,用于检查signature被用于函数参数,本地变量,结构体成员时,字段结构正确
InstructionConsistency,验证指令一致性
constants用于验证常量,常量的类型必须是原始类型,常量的数据正确的序列化为其类型
CodeUnitVerifier,验证函数体代码的正确性,分别通过stack_usage_verifier.rs与abstract_interpreter.rs来达到目的
script_signature,用于验证一个脚本或入口函数是否是一个有效的签名
新加坡WBF交易所将于8月14日正式上线KNC:据官方消息称,新加坡时间2020年8月14日,WBF交易所将正式上线KNC,并于当日15时00分在DeFi区上线KNC/USDT交易对。
KyberNetwork是一个具备高流动性的数字资产(各种加密代币,例如以太币及其ERC20代币,比特币和ZCash等)即时交易和兑换的去中心化交易平台。KyberNetwork将提供丰富的支付API以及新一代的合约钱包,来扩展KyberNetwork的整体交易能力,旨在实现所有用户在不同代币之间的无缝支付。[2020/8/14]
该漏洞发生在verify环节 CodeUnitVerifier::verify_script(config, script)?;函数中。可以看这里有许多的verify子流程。
分别是stack安全校验,类型安全校验名,本地变量安全性校验,以及引用安全校验。而漏洞产生的地方就在栈安全校验过程中。
栈安全校验(StackUsageVerifier::verify)
该模块用于验证函数的字节码指令序列中的基本块是否以平衡的方式使用。 每个基本块除了那些以 Ret(返回给调用者)操作码结尾的,必须确保离开block时候栈高度 与开头时候相同。 此外,对于任何基本块的块,栈高度不得低于开始时的栈高度。
循环校验所有代码块是否满足以上条件:
动态 | 新加坡WBF交易所第5批捐赠物资抵达上海浦东海关,即将送至武汉3所医院:2月18日,新加坡WBF交易所捐赠的第5批医疗物资已经抵达上海浦东海关,清关后将送至武汉3所医院。
2月9日,WBF“守望武汉”项目采购小组在法国采购了此批医用物资,经由CA042航班于2月17 日抵达上海浦东国际机场。其中包括:向中部战区总医院定向捐赠的医用防护服862件,向湖北省妇幼保健院定向捐赠的医用手套94500副,向武汉市中心医院定向捐赠的医用护目镜420个。
这是本次新冠疫情期间,新加坡WBF交易所向湖北省和武汉市捐赠的第5批医用物资。此前,新加坡WBF交易所已经向武汉市、孝感市等地陆续捐赠了医用酒精10吨、医用手套800箱、消液、护目镜、N95口罩等多批医用物资。
岂曰无衣,与子同袍;一约既定,山川无阻。待病魔远离,愿山河无恙,人间皆安。[2020/2/18]
即循环遍历验证所有基本块的合法性。
漏洞详情
前面已经介绍过,由于movevm是栈虚拟机,在验证指令合法性的时候,很显然,第一需要确保指令字节码是否正确,第二需要确保栈空间经过一个block代码块调用之后,栈内存合法,即栈操作之后,栈保持平衡。verify_block函数正是用来完成第二个目的的。
从verify_block代码中我们可以看到,for循环会循环解析block代码块中的所有指令,然后通过对num_pops, num_pushes加减操作来验证指令块的对栈的影响是否合法,首先通过对stack_size_increment < num_pops来判断栈空间是否合法,如果num_pops大于stack_size_increment就说明字节码pop的数目大于栈本身的大小,就返回错误,字节码校验失败。然后通过 stack_size_increment -= num_pops; stack_size_increment += num_pushes; 这两条指令来修改每个指令执行之后对栈的高度的影响,最后当循环结束之后,stack_size_increment需要等于0,即保持本block内的操作之后,需要保持栈的平衡。
看起来这里似乎没什么问题,但是由于这里在执行16行代码的时候,没有去判断是否存在整数溢出,导致可以通过构造超大num_pushes,间接控制stack_size_increment,从而产生整数溢出漏洞。那么如何构造构造这样一个巨大的push数目呢?这里首先需要介绍一下move bytecode 文件格式。
move bytecode 文件格式
如同Windows PE文件,或者linux ELF文件,move的字节码文件以.mv为结尾,文件本身也是有一定的格式的,总的来说move bytecode文件格式如图所示:
首先是macgic,值为A11CEB0B,接下来是版本信息,以及table的数目,之后是tables headers,这里可以有很多个tables,table kinds就是table的类型,总共有0x10种(如图的右边所示),更多详细信息可以去看move语言文档,接下来是table的偏移,以及table的长度。之后就是table的contents了,最后是Specific Data,有两种,对于module来说就是Module Specific Data,对于script类型来说就是Script Specific Data。
构造的恶意文件格式
这里我们与aptos交互的时候,是以script来完成的,所以我们构造了下图所示的文件格式,就可以造成stack_size_increment溢出:
首先来解释一下这个字节码文件的格式:
+0x00-0x03: 是macgic word 0xA11CEB0B
+0x04-0x7: 文件格式版本,这里为版本4
+0x8-0x8: 为table count这里为1
+0x9-0x9: 为table kind 这里是 SIGNATURES 类型
+0xa-0xa: 为table offset, 这里为0
+0xb-0xb: 为table length,这里为0x10
+0xc-0x18:为 SIGNATURES Token数据
从0x22开始为scrip的mian函数code代码部分
通过move-disassembler工具,我们可以看到指令的反汇编代码如下:
其中 0,1,2三条指令对应的代码就是红框,绿框,黄框的数据。
LdU64与漏洞本身无关,我们这里就不做过多解释,感兴趣的可以自行查看代码。这里重点解释下VecUnpack指令,VecUnpack的作用就是在代码中碰到vector对象的时候,需要将数据全部push到栈上。
在构造的这个文件中,我们构造了两次VecUnpack,其vector的num分别是3315214543476364830,18394158839224997406,
当执行函数instruction_effect的时候,实际上执行的是下面第二行代码:
执行完instruction_effect函数第一次返回(1,3315214543476364830),此时stack_size_increment为0,num_pops为1,num_pushes为3315214543476364830,执行第二次返回(1,18394158839224997406)。当再次执行 stack_size_increment += num_pushes;
stack_size_increment已经为0x2e020210021e161d(3315214543476364829),
num_pushes为0xff452e02021e161e(18394158839224997406),当两者相加之后,大于u64的最大值,产生了数据截断,stack_size_increment的值成为了0x12d473012043c2c3b,造成了整数溢出,从而造成了aptos节点崩溃,进而导致节点运行停止的严重影响(由于rust语言的安全特性,并不会向c/c++那样造成更进一步的代码安全影响)。
4.漏洞影响
本漏洞由于是发生在movevm 执行模块,所以对于链上节点,只要执行该字节码代码,就会造成DoS攻击,严重的情况下,可以使得aptos网络完全停止运行,会对其生态造成难以估量的影响,以及对节点的稳定性产生严重影响。
5.官方修复
当我们发现这个漏洞之后,第一时间报告给了官方,官方也很快修复了漏洞:
官方的修复也很简单,就是对stack_size_increment的加减分别做了溢出检测。如果有溢出就直接返回异常。
金色财经Maxwell
Bankless
金色荐读
FastDaily
中国金融杂志
巴比特资讯
元宇宙之道
最近,推特上兴起了关于NFT版税的讨论。拥有39万粉丝的大V @punk6529在推特上发表了他对版税的看法,本文整理了他的看法和观点.
原文标题:《以太坊分叉是矿工的《出埃及记》,那么能否抵达「流奶与蜜之地」?》 撰文:北辰 以太坊 Merge 的时钟在嘀嗒作响,这是整个 crypto 行业在 2022 年度的大事件.
昨晚一则新闻牵动虚拟货币相关人员的心,某知名财经类媒体爆出:“多名接近监管的知情人士告诉记者,央行《通知》下发后,公检法机关正对虚拟币交易所及挖矿等相关情况进行研究,探索定罪量刑的具体路径.
上周,NBA 球星凯文杜兰特撤销交易申请,接受布鲁克林篮网队的“招安”,球队老板蔡崇信总算松了口气,长达近两个月的一系列离队闹剧终于结束了.
随着以太坊 Merge 时间节点将至,今天我们将探讨以太坊合并之后会面临哪些监管问题和应用层问题。在我们推出“以太坊大合并”系列的第一篇文章里,主要为大家介绍了以太坊升级的原因、路线和当前进展.
8月30日,最高人民法院、最高人民检察院、部联合发布《关于办理信息网络犯罪案件适用刑事诉讼程序若干问题的意见》(法发〔2022〕23号,以下简称“信息网络犯罪新规”或“意见”).