区块链网站|NFTS Aptos(APT) 从安全角度看Move语言的特点和可能的漏洞

从安全角度看Move语言的特点和可能的漏洞

广告位

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

此前,BeoSing宣布了一项新的升级安全审计服务。现在,BeoSing安全团队正式宣布推出Move smart contract安全审计服务,旨在提前发现并协助项目方修复项目中的安全隐患,保护用户和项目方的资产。

1.基本概念

移动语言最初是一种新的语言,由脸书团队为Diem(以前称为Libra)区块链设计和开发。Libra的使命是建立一个简单的全球货币和金融基础设施,以支持数十亿人。Move language旨在提供一个安全且可编程的基础,在此基础上构建这一愿景。Move必须能够以准确、可理解和可验证的方式表达出差津贴货币和管理规则。从长远来看,Move必须能够对构成金融基础设施的各种资产以及相应的业务逻辑进行编码。

那么,如何实现这个愿景呢?在Move的白皮书中,提出了四个关键目标:一流资产、灵活性、安全性和可验证性。其中,一流的资产是实现这一愿景的基础。要了解一级资产,我们先介绍一下Move语言中一些重要的基本概念。

1.1结构

像许多其他语言一样,Move语言中的结构是由struct定义的。这是一个自定义类型,也是在Move中创建自定义类型的唯一方法。结构可以包含复杂数据,也可以不包含数据,但不允许定义递归结构。该结构由字段组成,可以简单地理解为“键-值”存储,其中键是字段的名称,值是存储的内容。

1.2能力

Move的类型系统非常灵活,每种类型都可以用四种限定符来修饰。我们把这四种限制能力称为能力,它们的功能是:

复制-修饰值可以被复制。drop-修饰值可以在作用域的末尾被丢弃。key-修饰值可以用作访问全局状态的键值。store-修饰值可以存储到全局状态。基本类型的Move默认有存储、复制和删除限制,自定义类型的结构默认没有限制。

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:coinStore0x 1:aptos _ Coin:aptos Coin就是0x 1账户下Coin模块定义的Coin store类型,记录了某个硬币在该地址的资产状态。所以你地址下的任何0x1:coin:CoinStore资产的逻辑和行为都是一样的,都是在0x1:coin模块中定义的。

2.安全性

2.1设计安全

在Move的白皮书中明确提出,Move必须拒绝不符合关键属性的程序,如资源安全、类型安全、内存安全等。我们如何选择一个可执行的表示来确保在区块链上执行的每个程序都满足这些属性?两种可能的方法是:

(a)使用带有检查这些属性的编译器的高级编程语言

(b)使用低级无类型程序集,并在运行时执行这些安全检查。

Move采取了介于这两个极端之间的方法。Move的可执行格式是类型化的字节码,高于汇编,但低于源语言。字节由字节码验证器检查链上的资源、类型和内存安全性,然后由字节码解释器直接执行。此选项允许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.动与实的比较

3.1账户模型

坚固性:

在大多数以太坊ERC-20合约中,每个地址的余额存储在一种状态变量映射(address=uint256)中,该映射存储在特定智能合约的全局存储中。其结构如下图所示:

image:3359 github . com/move-language/move/tree/main/language/documentation/tutorial

移动:

在Move中,Sergio这个类似于solidity smart contract的模块并没有自己的存储空间。相反,Move的“全局存储”是按地址索引的。在每个地址下,存储着Move模块和Move资源,资源存储就是类型到值的映射。其结构如下图所示:

image:3359 github . com/move-language/move/tree/main/language/documentation/tutorial

3.2代码存储

坚固性:

在EVM的连锁店中,所有智能合同都有一个唯一的地址,称为“合同拥有的地址”。契约帐户与部署者帐户(EOA)位于同一级别,代码哈希存储在契约帐户地址中,在部署契约后,该地址不会绑定到部署者地址。

移动:

在基于MoveVM的链中,代码存储在帐户资源的代码模块中。

3.3安全隔离

坚固性:

智能合约的运行环境是由链的节点构建的沙箱环境,多个合约程序是运行在同一进程中的不同虚拟机沙箱。智能合约之间的调用是同一进程中不同智能合约虚拟机之间的调用,安全性完全依赖于智能合约虚拟机之间的隔离。

移动:

Move的方法是通过MoveVM使使用Move语言的区块链具有确定性,将契约调用放在同一个虚拟机沙箱中,通过编程语言的内部安全隔离智能契约的状态,而不是依赖虚拟机进行隔离。

3.4合同升级

坚固性:

EVM合约升级的方法是解析合约数据和逻辑:代理负责将交易转发给逻辑合约,保存合约数据;逻辑负责实现功能逻辑。升级时,只需要重新部署逻辑契约的新版本,并将代理契约中的逻辑契约实例指向逻辑契约实例的新版本。此时,逻辑合同升级不会影响合同的原始数据。

如下图所示,编码存储字段指定代理合同被调用时委托调用的合同编码。契约升级本质上是部署新的逻辑契约,并更改代码字段以重定向委托调用。

移动:

对于Move语言的合同升级,执行的是系统模块code.move中的升级逻辑,在代码部署前检查升级策略和兼容性。在兼容性检查之后,用resource编写的代码被一个本地函数调用替换,新的逻辑将被执行。

4.MOVE程序可能存在的漏洞

1)开发者在基于Move的区块链中使用Aptos、Sui或其他独特框架进行开发时,应保持一定的安全意识,以确保供应链安全。

2)函数权限问题。有些功能调用的权限要仔细划分,因为有些关键功能会涉及到治理,严重影响资金安全。对于这样的函数调用,调用者需要被认证。

3)在业务逻辑的设计和代码实现过程中,要注意逻辑问题。

4)关于移动部门项目,升级模块时的注意事项:

根据合同升级策略,代码的所有者拥有升级权限的完全控制权。初始部署后,不能更改代码的所有者。部署者的地址总是在部署后立即升级。

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/jzb/apt/38464.html
上一篇
下一篇

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

返回顶部