贝尔链

从安全角度看 Move 语言特质与可能存在的漏洞

快讯 2022-11-25 11:12180www.meitio.com未知

原文标题:《B柚子币in | 正式推出针对 Move 智能合约的安全审计服务,从安全角度看 Move 语言》

撰文:B柚子币in

图片出处:由无界版图人工智能工具生成

此前,B柚子币in 宣布了全新升级的安全审计服务,而目前,B柚子币in 安全团队正式宣布推出针对 Move 智能合约的安全审计服务,旨在提前发现并帮助项目方修复项目中的安全风险,保障用户与项目方的资产安全。

1、基础定义

Move 语言刚开始是由 Facebook 团队为 Diem区块链而设计开发的一门新语言。而 Libra 的使命是塑造一个容易的全球货币和金融基础设施,为数十亿人提供支持。Move 语言旨在提供一个安全、可编程的基础,可以在此基础上构建这一愿景。Move 需要可以以精确、可理解和可验证的方法表达 Diem 货币和治理规则。从长远来看,Move 需要可以对构成金融基础设施的各种资产和相应的业务逻辑进行编码。

那样,怎么样达成这一愿景呢?在 Move 的白皮书中提出了设计时考虑的四个重要目的:first-class 资产、灵活性、安全性和可验证性。其中 first-class 资产是达成这一愿景的基础。要理解 first-class 资产,大家先来介绍 Move 语言中的几个比较要紧的基础定义。

1.1 结构体

和其他不少语言一样,Move 语言中的结构体也是用 struct 概念。它是自概念种类,也是 Move 中创建自概念种类的唯一办法。结构体可以包括复杂数据,也可以不包括任何数据,但不允许概念递归结构体。结构体由字段组成,可以容易地理解成「key-value」存储,其中 key 是字段的名字,而 value 是存储的内容。

1.2 能力

Move 的种类系统很灵活,每类型型都可以被四种限制符所修饰。这四种限制符大家称之为 abilities,它们的功能分别是:

  • Copy - 被修饰的值可以被复制。
  • Drop - 被修饰的值在用途域结束时可以被丢弃。
  • Key - 被修饰的值可以作为键值对全局状况进行访问。
  • Store - 被修饰的值可以被存储到全局状况。

而 Move 的基本种类缺省具备 store, copy 和 drop 限制,自概念种类缺省状况下结构体不带任何限制符。

1.3 资源

介绍完了结构体和能力,下面就是 Move 语言中的核心定义:资源。

假如概念的结构体不可以复制也不可以丢弃,大家就将它们称为资源。默认状况下,结构体是线性和短暂的。它们不可以复制,不可以丢弃,不可以存储在全局存储中。这意味着所有值都需要拥有被转移的所有权,并且值需要在程序实行结束时处置。大家可以通过赋予结构体能力来简化这种行为,允许值被复制或删除,与存储在全局存储中或概念全局存储的模式。

Move 语言中的这个属性对于现实世界中资源的建模很有用,由于货币在理论上是不期望在流通过程中被复制或丢失的。

1.4 模块

Move 语言中,代码都是以模块的形式进行组织的。怎么样理解模块呢?抽象的理解,Move 语言中的模块/ 资源/ 办法之间的交互与传统的面向对象语言中的类/ 对象/ 办法之间的关系很相似。

而与其他区块链语言相比,Move 中的模块像其他区块链中的智能合约。开发者在模块中声明资源种类和办法,这类种类和办法概念了创建、销毁和更新已声明资源的规则。

1.5 泛型

Move 由于是静态语言,所以为了保证扩展性,Move 选择了泛型编程的范式。

以 Aptos 为例,只须查询你持有些资产是 0x1::coin::CoinStore 如此的种类,就能了解该资产是由标准模组 0x1::coin 所概念。譬如说 Aptos 的原生币 AptosCoin 的种类是 0x1::aptos_coin::AptosCoin ,意思是 0x1 帐号之下的 aptos_coin 模块所概念的 AptosCoin 种类,不过这个种类并没赋予 key 能力,所以不可以成为资源,他只提供一个类型,而这个种类可以作为泛型来用,像是被 0x1::coin::CoinStore 用。

那样,0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin> 就是 0x1 帐号下 coin 模块所概念的 CoinStore 种类,记录地址下某种 coin 的资产状况。所以你的地址下任何 0x1::coin::CoinStore 的资产都通用相同逻辑、有一样的行为,都是概念在 0x1::coin 这个模块里。

2. 安全性

2.1 设计安全

Move 在白皮书中明确表示,Move 需要拒绝不满足重要属性的程序,比如 Resource 安全、种类安全和内存安全。大家怎么样选择一个可实行的表示,以确保在区块链上实行的每一个程序都满足这类属性?两种可能的办法是:

用带有检查这类属性的编译器的高级编程语言

用低级无种类汇编并在运行时实行这类安全检查。

Move 采取了介于这两个极端之间的办法。Move 的可实行格式是一类型型化的字节码,它比汇编高级,但比源语言低。字节码由字节码验证器在链上检查 Resource、种类和内存安全性,然后由字节码讲解器直接实行。这种选择允许 Move 提供一般与源语言有关的安全保证,但不需要将源编译器添加到受信赖的计算库或将编译本钱添加到买卖实行的重要路径中。

此外,Move 在设计时内置了不少安全特质,比如算数溢出、默认同见性致使的权限泄露等等。

2.2 底层安全

2.2.1 资源

在现实社会中,资产有两个属性很难用数字表示:

1)稀缺性。需要控制系统中资产发行的数目。需要禁止复制现有资产,而创建新资产是一项特权操作。

2)访问控制。系统参与者需要可以用访问控制方案保护资产。

因此,Move 引入了资源来表示资产。而在区块链应用中,代币就是一种资源,资源需要要存储在竞价推广账户下面,且在买卖过程中,资产需要要流向一个地方,要么转移到另一个地址,要么被销毁,代币不可被复制或被用多次或被「悬挂」。此处可以把资源的操作类比成 c++ 中的唯一指针。

2.2.2 先字节验证,后合约实行

Move 在设计时就设计为一种可实行的字节码语言,其具备内置的安全算法和字节码验证器,可以预防很多常见问题。即 Move 中的合约代码要能被实行,需要先被验证,这使得合约可以免受编译器的潜在问题和可能遭遇见的攻击。Krešimir Klas 在其《Smart Contract Development — Move vs. Rust》中表示:「Move 的显著特点是可实行的字节码表示,为所有程序提供了资源安全保证。考虑到合约的开放部署模型,这一点至关要紧——回想一下,任何合约都需要容忍与不可信代码进行任意交互。假如网站源码级线性可以被可实行级别上不受信赖的代码违反,那样其价值就非常有限。」

2.2.3 静态调用

在区块链中,合约的调用方法可以分为静态调用和动态调用。若程序调用需要在运行时才能确定被调用的目的,则称该调用为动态调用;反之,在运行前即可确定被调用目的,且在运行时没办法变更该目的,则称该调用为静态调用。

Move 使用静态调用方法。即 Move 达成的合约在部署时,其实行逻辑已经被确定。那样大家可以通过静态剖析字节码,得到合约所大概路径上操作的状况,在区块浏览器或钱包里提示给用户。

因此,钱包提供商可以在钱包设计中,在预实行合约时把合约实行后的状况变更提示给用户,让用户可以了解这个买卖操作了我们的什么要紧资产,与实行后的结果。如下图,在 StarMask 中的达成成效:

图来源于 jolestar.eth

3. Move 与 Solidity 的比较

3.1 竞价推广账户模型

Solidity:

在大部分ETH ERC-20 合约中,每一个地址的余额都存储在一个种类的状况变量 mapping 中,该状况变量存储在特定智能合约的全局存储中。其结构如下图所示:

图源:https://github.com/move-language/move/tree/main/language/documentation/tutorial

Move:

Move 中,类比 solidity 智能合约的模块瑟吉欧没自己存储空间的。相反,Move 的「全局存储」是由地址索引的,每一个地址下存储了 Move 模块和 Move 资源,而资源存储是种类到值的映射。其结构如下图所示:

图源:https://github.com/move-language/move/tree/main/language/documentation/tutorial

3.2 代码存储

Solidity: 

在基于 EVM 的链中,所有智能合约都有一个独特的地址,称为「合约拥有地址」。合约竞价推广账户与部署者竞价推广账户存在于在同一级别,代码 hash 存储在合约竞价推广账户地址中,合约部署后不与部署者地址绑定。

Move:

在基于 MoveVM 的链中,代码存储在 Account resource 的 code module 里面。

3.3 安全隔离

Solidity:

智能合约的运行环境是链的节点给架构出的沙箱环境,多个合约程序是运行在同一个进程内的不一样的虚拟机沙箱。智能合约之间的调用是同一个进程内不一样的智能合约虚拟机之间的调用,安全完全依靠于智能合约虚拟机之间的隔离。

Move:

Move 的做法则是通过 MoveVM 让使用 Move 语言的区块链拥有确定性,将合约调用放在同一个虚拟机沙盒中,通过编程语言内部的安全性对智能合约的状况进行隔离,而非依靠虚拟机进行隔离。

3.4 合约升级

Solidity:

EVM 中合约升级的办法是将合约数据和逻辑剖析:代理合约负责转发买卖到逻辑合约,并保存合约数据;逻辑合约负责达成功能逻辑。升级时,仅需重新部署新版本的逻辑合约,并将代理合约中的逻辑合约实例指向新版本逻辑合约实例即可。此时,逻辑合约升级并不会干扰合约原来已有些数据。 

如下图,代码存储字段指定的是代理能合约被调用时做 delegate call 的合约代码,合约升级本质上是部署一个新的逻辑合约,并改变 code 字段以重定向 delegate call。

Move:

Move 语言中对于合约升级,其达成是在系统模块 code.move 中实行升级逻辑,在代码部署前检查升级方案和兼容性。在兼容性检查后,写在 resource 中的代码通过一个原生函数调用被替换,并将实行新的逻辑。

图片截取自:https://github.com/aptos-labs/aptos-core/blob/main/aptos-move/framework/aptos-framework/sources/code.move#L132

4. Move 程序可能出现的漏洞点

1) 开发者在用 Aptos、Sui,或者其他基于 Move 的 blockchain 中独特的 Framework 进行开发时,应维持一定量的安全意识,确保Supply chain安全。

2) 函数权限问题。对于一些函数调用的权限要仔细划分,由于一些重要函数会涉及到治理,紧急的会干扰到资金安全,针对这种函数调用需要对调用者进行鉴权。

3) 业务逻辑在设计和代码达成时,均应该注意其中的逻辑问题。

4) 关于 Move 系项目,在模块升级时应该注意的点:

  • 依据合约升级政策,代码的所有者对升级权限有完全的控制权。
  • 代码的 owner 在初始部署后是不可改变的。
  • 部署者的地址在部署后永远拥有升级权限。

贝尔链-Baer Chain (BRC)最新价格,行情走势图,币值分析 Copyright © 2002-2021 贝尔链 (http://www.yebogroup.cn/) 网站地图 TAG标签 备案号