查看原文
其他

Beosin | 正式推出针对Move智能合约的安全审计服务,从安全角度看Move语言(上)

专业高效审计的 Beosin 2022-11-27

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

随着新公链 Aptos、Sui 的崛起,Move 作为面向资产编程的语言也吸引了越来越多的关注,相关公链上使用Move语言编写的项目也越来越多。Beosin安全研究团队对Move语言进行了深入研究,本文就将从安全角度去介绍这一智能合约语言新贵——Move。

在本文中,我们首先将深入探讨Move语言的特性,然后从安全角度去介绍Move的设计,下一篇将通过Move与Solidity的比较来进一步加深大家对Move的理解,最后我们将介绍我们研究团队总结的Move项目可能出现的安全漏洞点和对应的审计点,为使用 Move 的项目方保驾护航。


1、基础概念


Move语言最初是由 Facebook 团队为 Diem(原名Libra)区块链而设计开发的一门新语言。而 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语言中的核心概念:资源(resource)。

如果定义的结构体(struct)不能复制(copy)也不能丢弃(drop),我们就将它们称为资源。默认情况下,结构体是线性和短暂的。它们不能复制,不能丢弃,不能存储在全局存储中。这意味着所有值都必须拥有被转移的所有权,并且值必须在程序执行结束时处理。我们可以通过赋予结构体能力(abilities)来简化这种行为,允许值被复制或删除,以及存储在全局存储中或定义全局存储的模式。

Move语言中的这个属性对于现实世界中资源(例如货币)的建模非常有用,因为货币在理论上是不希望在流通过程中被复制或丢失的。

1.4 模块


Move语言中,代码都是以模块(module)的形式进行组织的。如何理解模块呢?抽象的理解,Move 语言中的模块(module)/ 资源(resource)/ 方法(function)之间的交互与传统的面向对象语言中的类(class)/ 对象(object)/ 方法(function)之间的关系非常相似。

而与其他区块链语言相比,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安全、类型安全和内存安全。我们如何选择一个可执行的表示,以确保在区块链上执行的每个程序都满足这些属性?两种可能的方法是:


(a) 使用带有检查这些属性的编译器的高级编程语言
(b) 使用低级无类型汇编并在运行时执行这些安全检查。

Move 采取了介于这两个极端之间的方法。Move 的可执行格式是一种类型化的字节码,它比汇编高级,但比源语言低。字节码由字节码验证器在链上检查Resource、类型和内存安全性,然后由字节码解释器直接执行。这种选择允许 Move 提供通常与源语言相关的安全保证,但无需将源编译器添加到受信任的计算库或将编译成本添加到交易执行的关键路径中。

除此之外,Move在设计时内置了很多安全特性,例如算数溢出、默认可见性导致的权限泄露等等。

2.2 底层安全


2.2.1 资源

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

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

2)访问控制。系统参与者必须能够使用访问控制策略保护资产。

因此,Move引入了资源来表示资产。而在区块链应用中,代币就是一种资源,资源必须要存储在账户下面,且在交易过程中,资产必须要流向一个地方,要么转移到另一个地址,要么被销毁,代币不可被复制或被使用多次或被”悬挂(dangling)“。此处可以把资源的操作类比成c++中的唯一指针。

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

Move 在设计时就设计为一种可执行的字节码语言,其具有内置的安全算法和字节码验证器(Bytecode verifier),可以防止许多常见错误。即 Move 中的合约代码要能被执行,必须先被验证,这使得合约可以免受编译器的潜在故障和可能遭遇到的攻击。Krešimir Klas在其《Smart Contract Development — Move vs. Rust》中表示:“Move  的显著特征是可执行的字节码表示,为所有程序提供了资源安全保证。考虑到合约的开放部署模型,这一点至关重要——回想一下,任何合约都必须容忍与不可信代码进行任意交互。如果源码级线性可以被可执行级别上不受信任的代码违反,那么其价值就很有限。”

2.2.3 静态调用

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

Move 采用静态调用方式。即Move实现的合约在部署时,其执行逻辑已经被确定。那么我们可以通过静态分析字节码,得到合约所有可能路径上操作的状态,在区块浏览器或钱包里提示给用户。

因此,钱包提供商可以在钱包设计中,在预执行合约时把合约执行后的状态变更提示给用户,让用户可以知道这个交易操作了自己的哪些重要资产,以及执行后的结果。如下图,在StarMask中的实现效果:
 
图源自jolestar.eth

Move 审计服务与Move审计项


Beosin安全团队正式推出针对Move智能合约的安全审计服务,旨在提前发现并协助项目方修复项目中的安全风险,保障用户与项目方的资产安全。其主要安全审计项包括:

•溢出漏洞
•重放攻击
•不安全的随机数
•交易顺序依赖
•拒绝服务
•访问控制
•权限不当
•变量覆盖
•业务设计
•业务实现
•可操纵的代币价格
•套利攻击
•Gas优化
•第三方模块安全
•能力安全
•资源安全
•升级安全
•中心化风险

Beosin作为一家总部位于新加坡的区块链安全公司,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控、预警与阻断、虚拟货币被盗资产追回、安全合规KYT/AML等“一站式”区块链安全产品+服务,目前已为全球2000多个区块链企业提供安全技术服务,审计智能合约超过2500份,保护客户资产高达5000多亿美元。欢迎点击公众号留言框,与我们联系。

参考文献:
https://developers.diem.com/docs/technical-papers/move-paper/
https://mirror.xyz/asmp.eth/xUzqdBXewRPhLKLAYekiwU5S9uFiTnJ3f56KbkcOz-M
https://mirror.xyz/jolestar.eth/sQ0nMCO3eNig6gCzqQO7xew1mn8oUi1-rKtfZKmGlNI
https://medium.com/@kklas/smart-contract-development-move-vs-rust-4d8f84754a8f


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存