月亮链 月亮链
Ctrl+D收藏月亮链
首页 > Fil > 正文

BSP:新加坡安全公司Numen发现Aptos公链首个高危0day漏洞_MOVE

作者:

时间:1900/1/1 0:00:00

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 程序的目的是读取和写入树形的持久全局存储。程序不能访问文件系统、网络或任何此树以外的数据。 

在伪代码中,全局存储看起来像: 

Coinbase获新加坡数字资产执照:10月11日消息,尽管在三箭资本等加密货币公司爆仓后,新加坡监管机构加强了监管力度,但加密货币交易所Coinbase Global Inc.仍在新加坡获得了数字资产许可证。

Coinbase周二表示,新加坡金融管理局已根据《支付服务法》原则上批准Coinbase Singapore在当地提供受监管的加密服务。自新加坡于2019年推出许可制度以来,约有15家公司获得了此类许可,其中包括Coinbase的竞争对手Crypto.com。(彭博社)[2022/10/11 10:30:34]

从结构上讲,全局存储是一个森林(forest),这个森林由以账户地址(address)为根的树组成。每个地址可以存储资源(resource)数据和模块(module)代码。如上面的伪代码所示,每个地址(address)最多可以存储一个给定类型的资源值,最多可以存储一个给定名称的模块。  

MOVE虚拟机原理 

movevm 与evm虚拟机都一样,需要将源码编译成字节码,然后在虚拟机中执行,下图是整体的流程: 

1.将字节码通过函数execute_script被加载进来 

2.执行load_script函数,这个函数主要用来反序列化字节码,并校验字节码是否合法,如果校验失败,就会返回失败 

3.校验成功之后就会开始执行真正的字节码代码 

新加坡WBF交易所即将上线启能币CCPC的TRC20等多种跨链通道:据Permira官方消息显示,WBF交易所即将支持启能币CCPC的TRC20和ERC20等多链转账。

此前,CCPC是一个基于以太坊智能合约技术的去中心化生态平台,旨在为投资者提供稳定的加密资产流动性、资产管理等系列生态服务。[2021/2/20 17:33:45]

4.执行字节码,访问或修改全局存储的状态,包括资源,modules 

注:move语言还有很多特性,这里我们就不一一介绍,后续我们会从安全性角度继续分析move语言的特性。 

3.漏洞描述

本漏洞主要设计验证模块,在讲具体漏洞之前先介绍下验证模块的功能以及StackUsageVerifier::verify。 

验证模块 

通过前面,我们知道在真正执行字节码代码之前,会有验证字节码的环节,而验证环节有可以细分为好多子过程, 

分别是: 

BoundsChecker,边界检查,主要是用来检查module与script的边界安全。具体包括检查signature,constants等的边界 

DuplicationChecker, 该模块实现了一个检查器,用于验证 CompiledModule 中的每个向量是否包含不同的值 

SignatureChecker,用于检查signature被用于函数参数,本地变量,结构体成员时,字段结构正确 

InstructionConsistency,验证指令一致性 

constants用于验证常量,常量的类型必须是原始类型,常量的数据正确的序列化为其类型 

动态 | 新加坡金管局就Libra问题与Facebook进行了对话:据彭博消息,新加坡金融管理局已与Facebook Inc.就其推出的新型加密货币Libra计划进行了讨论,不过监管机构仍认为这家社交媒体公司的计划存在重大障碍。MAS董事总经理Ravi Menon表示:尽管Libra有潜在好处,但人们对其运作方式的担忧“并非微不足道”。Menon说:“关键的挑战是弄清这种野兽的本性。它更像什么,我们可以把它放在哪个盒子里。目前我们还不确定。”发现Menon和其他一些全球金融体系负责人一样,对Facebook通过加密货币进入受到严格监管的金融业的计划持保留意见。然而,Menon也指出了Libra的潜在好处,它可以提供一个廉价的支付系统,并帮助把没有银行账户的人纳入主流金融体系。[2019/6/27]

CodeUnitVerifier,验证函数体代码的正确性,分别通过stack_usage_verifier.rs与abstract_interpreter.rs来达到目的 

script_signature,用于验证一个脚本或入口函数是否是一个有效的签名 

该漏洞发生在verify环节 CodeUnitVerifier::verify_script(config, script)?;函数中。可以看这里有许多的verify子流程。 

分别是stack安全校验,类型安全校验名,本地变量安全性校验,以及引用安全校验。而漏洞产生的地方就在栈安全校验过程中。 

外国人在新加坡兑换加密货币 出境时可在机场享受退税优惠:外国人可以在新加坡兑换加密货币,只要来自正规的加密货币交易所,最好是来自柜台交易方式(over the counter),并且能够获得交易收据。交易完成之后,如果金额高于20,000新加坡元的话需要在登机之前在机场申报金额。[2018/3/26]

栈安全校验(StackUsageVerifier::verify) 

该模块用于验证函数的字节码指令序列中的基本块是否以平衡的方式使用。 每个基本块除了那些以 Ret(返回给调用者)操作码结尾的,必须确保离开block时候栈高度 与开头时候相同。 此外,对于任何基本块的块,栈高度不得低于开始时的栈高度。 

循环校验所有代码块是否满足以上条件:  

即循环遍历验证所有基本块的合法性。 

漏洞详情 

前面已经介绍过,由于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内的操作之后,需要保持栈的平衡。 

新加坡商场货架出现用于挖掘比特币的电脑 普通民众加入挖矿队伍:在新加坡商场的货架上,已经出现了用于挖掘比特币和其他数字货币的电脑。在一家专注于电子产品的购物中心Sim Lim Square,最近几周至少有五家店铺在销售数字货币的挖矿设备。店主Wilson Josup每周卖出大约10台机器。他说,买家的年龄从20多岁到退休人员不等,他的大部分客户使用价值4000新元(约3062美元)的设备来开采ETH,让一台机器连续运行一个月,每月可以净赚400美元。[2018/1/28]

看起来这里似乎没什么问题,但是由于这里在执行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

中国金融杂志

巴比特资讯

元宇宙之道

标签:BSPNBSMOVMOVEBSPNetworkNBS币MOVD价格movez币天天跌

Fil热门资讯
NOM:Nomad Bridge 被盗 过亿美元资产如今在哪?_OMA

原文标题:《Nomad Bridge 被盗,逾十亿资产如今在哪?》撰文:郭景怡,陈森茂2022 年 8 月 2 日,Nomad Bridge 受到攻击.

1900/1/1 0:00:00
加密货币:去世后 比特币怎么继承给下一代?_MCAFEE

越来越多的财务顾问和遗产规划师已经意识到转移加密货币并不是那么容易——彭博社像许多美国人一样,Sandy Carter一直在涉足加密货币.

1900/1/1 0:00:00
Aptos:如何捕获Move语言的早期红利?_AAPT币

作者:小牛原文:《Move语言的机会》1.Move语言具有将资产作为一等公民编程、安全性、灵活性、可组合性等特点;2.采用Move语言的公链生态发展尚处初期.

1900/1/1 0:00:00
BNB:金色观察 | BNB链惊魂12小时 七个问题读懂_PlugChain

BNB Chian是如何被攻击的?黑客盗取金额具体有多少?黑客为何又是选取跨链桥攻击?币安链本身安全吗?怎么看黑客攻击后币安链被暂停?被盗资产结局会如何?对社区有何新启示?上述问题用户迫切想知道.

1900/1/1 0:00:00
ANC:熊市造就精品?盘点 20 个有趣的新 DeFi 项目_Yearn Loans Finance

原文作者:@GarrettZ,由 DeFi 之道翻译编辑。加密领域有一个现象,即在熊市期间推出的产品更有可能成功.

1900/1/1 0:00:00
以太坊:软着陆后 加密市场下阶段趋势与核心叙事_NFT

撰文:Ansem编译:Amber在过去的一周多的时间里,传统金融市场在美国通胀压力有所减轻的背景下出现了一些积极的信号,而加密货币市场也「追随」其迎来了阶段性的复苏.

1900/1/1 0:00:00