主页 > imtoken官网下载2.0苹果 > 应用于数字馆藏的智能合约存在哪些安全风险? 如何有效预防?

应用于数字馆藏的智能合约存在哪些安全风险? 如何有效预防?

imtoken官网下载2.0苹果 2023-10-19 05:08:39

应用于数字馆藏的智能合约存在哪些安全风险? 如何有效预防?

長月零七

龙月零七

2022-05-23 09:59 湖北

国内的数字馆藏在技术上和NFT没有太大区别以太坊智能合约最广泛的应用,业务逻辑也是通过智能合约来实现的。 因此,国内的数字馆藏也会存在合约漏洞等安全问题,需要谨慎。 下面我们就来看看数字馆藏在智能合约实施过程中存在的安全问题及解决方案。

以太坊智能合约编写_以太坊智能合约最广泛的应用_图解以太坊智能合约

打开网易新闻查看精彩图片

数字馆藏和智能合约

什么是智能合约?

为什么数字馆藏的安全离不开智能合约的讨论? 因为数字馆藏在技术上是通过智能合约实现和运行的。 在讨论数字馆藏智能合约的安全问题之前,我们先了解一下什么是智能合约。

图解以太坊智能合约_以太坊智能合约最广泛的应用_以太坊智能合约编写

打开网易新闻查看精彩图片

1990 年代,Nick Szabo 首次提出智能合约的概念。 当时,他将智能合约定义为通过结合协议和用户界面来监管和保护计算机网络的工具。

在区块链领域,智能合约可以定义为运行在区块链上的应用程序或程序。 简而言之,智能合约是一种确定性程序,可在满足特定条件时执行特定规则以发挥作用。 这些规则由计算机代码预定义,由所有网络节点复制和执行。

图解以太坊智能合约_以太坊智能合约最广泛的应用_以太坊智能合约编写

目前应用最广泛的基于以太坊的智能合约具有分布式、确定性、自治性、不可变形、定制化、免信任、透明等特点。

为什么数字馆藏存在智能合约安全风险?

由于智能合约本身是由人为编写的计算机代码组成的,因此不可避免地存在缺陷和漏洞的风险。 合约一旦部署,不可修改,合约执行后不可逆,所有执行交易可追溯,区块链上的智能合约对所有用户可见。 如果有漏洞被不法分子钻空子,资产就会被盗,而且往往无法追回。 造成巨大损失。 并且存在可能无法快速修复的安全问题。

随着数字馆藏等应用的爆发式增长,区块链智能合约的数量也与日俱增,暴露的安全问题也会越来越多。

为了避免安全事件的发生,保护用户的资产安全,需要从源头上做好安全防范,提高数字馆藏开发的安全意识。

下面介绍一下由于智能合约的特性所带来的一些安全风险以及相应的安全措施。

数字馆藏智能合约的主要安全问题是什么?

据成都联安安全团队研究,数字馆藏智能合约的主要安全问题有:重入漏洞安全问题、随机数安全问题、整数溢出安全问题、动态数组越界安全问题、函数权限配置错误安全问题,忽略返回值安全问题,空指针引用安全问题,访问外部资源安全问题,输入参数检查安全问题等,具体问题分析如下。

以太坊智能合约最广泛的应用_以太坊智能合约编写_图解以太坊智能合约

打开网易新闻查看精彩图片

1.重入漏洞安全问题

在数字馆藏的业务场景中,智能合约往往需要实现合约之间的外部调用。 这种方法的主要危险是外部合约可以接管控制流并调用函数来更改一些关键数据。 特别是在solidity语言中,当用户直接向合约转账时,会产生一个隐藏的fallback()外部调用。 如果不限制调用,可能会出现重入漏洞。

重入攻击最早出现在以太坊,对应的真正的攻击是The DAO攻击,这也导致了最初的以太坊分叉为以太坊经典(ETC)和现在的以太坊(ETH)。

成都链安安全团队推荐:

以太坊智能合约编写_以太坊智能合约最广泛的应用_图解以太坊智能合约

1、改变状态变量时,采用官方推荐的校验-生效-交互方式;

2. 使用互斥量:添加一个状态变量,在代码执行期间锁定合约,防止重入调用;

3.限制自身可能的外部调用操作;

2.随机数安全问题

随机数在数字藏品中的应用非常广泛,比如为艺术数字藏品随机分配属性、为游戏藏品分配宝藏位置、保证限量版藏品空投的公平性等。

不同的区块链开发语言也有多种生成随机数的方法,例如Go使用math/rand,Java使用java.util.Random类等。在Solidity中,由于没有原生的生成伪随机数的函数,一些开发人员经常使用块参数来代替。

但是,上述随机数生成方法都存在安全漏洞。 当开发者使用一个可预测的随机数种子生成随机数时,攻击者可以根据相应的算法获取即将到来的随机数,实现随机数预测,达到攻击目的。

成都链安安全团队推荐:

随机数的来源应尽可能来自区块链外部,这可以在具有类似提交-显示的系统的对等点之间完成,或者通过将信任模型更改为一组参与者来完成。

3.整数溢出安全问题

数据存储是区块链的重要组成部分,执行合约的虚拟机(EVM)为各种整数指定固定大小的存储宽度。 这意味着一个整数变量只能由一定范围内的数字表示。

因此,在代码实现时,如果不检查用户输入就进行算术运算,可能会导致数值超出存储它们的数据类型所允许的范围,从而导致数值溢出的问题。

具体溢出类型包括乘法溢出、加法溢出、减法溢出、指数溢出等。比如Solidity中的uint8只能存储[0,255]中的值。 尝试将 256 存储到 uint8 时将溢出为 0。 但是在Go语言中使用make()进行内存分配时,如果出现溢出导致值为0或者最大值,则会导致内存分配失败。 攻击者经常利用此漏洞绕过传输条件、操纵内存和破坏堆栈。

成都链安安全团队推荐:

以太坊智能合约最广泛的应用_图解以太坊智能合约_以太坊智能合约编写

在进行整数运算之前进行验证,或使用一些算术安全的第三方库。 例如:OpenZeppelin 提供了一套不错的SafeMath 库,使用SafeMath 库函数可以有效避免四个算术溢出漏洞。

4.动态数组越界安全问题

对于数组越界等严重的内存错误,不同的区块链开发语言各有特点。

Java、Solidity、Go语言等与大多数其他编程语言类似,在编译时都会进行数组越界检查。 具体来说,在Solidity语言中,动态数组会先将数组元素的个数存储在定义变量的虚拟机的slot位置,然后根据Keccak256值和计算出具体元素值的存储位置插槽位置的下标位置。

因此,当动态数组下标是用户可控且数组长度不受限制时,攻击者可以根据虚拟机的slot深度构造相应的参数,使参数指向虚拟机中的任意内存位置,从而修改对应的槽的状态变量。

成都链安安全团队推荐:

在合约中访问数组时,需要检查参数的合法性,即是否超过数组的长度。

5.功能权限安全问题配置错误

函数是区块链智能合约的重要组成部分,函数的权限控制决定了函数是否可以被用户或其他衍生合约外部调用,或者只能内部调用。

不同的语言也有不同的函数权限声明方式。 例如,在Solidity中,可以使用public、private、internal、external四种可见性修饰符来直接指定调用权限,也可以使用修饰符来实现对某些特权函数的严格权限。 控制。 Go语言使用函数首字母的大小写来声明权限。

如果这些函数权限修饰符被开发者滥用,一些具有特殊功能的函数将被攻击者调用,造成随意更改集合数量等严重后果。

成都链安安全团队推荐:

在区块链上修改合约状态变量的操作,必须严格控制函数的调用权限。 特别是涉及到一些重要属性的修改时,需要配置只有合约所有者才能调用的权限。

6.忽略返回值安全问题

图解以太坊智能合约_以太坊智能合约编写_以太坊智能合约最广泛的应用

合约中的重要函数通常都有一个返回值,用于判断函数操作是否执行成功,并对执行失败进行错误处理。

区块链上合约的调用是通过交易实现的,交易产生的收据中的status字段有两种结果:0x1(真),0x0(假)。 但是事务是否成功只取决于事务执行过程中是否抛出异常,所以可能会出现函数执行失败返回false,但是事务仍然执行成功的情况。

因此,如果区块链开发者使用链上交易回执代替函数返回值,并将其作为判断业务逻辑是否成功执行的依据,可能会出现意想不到的安全问题。

成都链安安全团队推荐:

在区块链上判断一个函数的返回值时,除了要判断交易收据外,还要判断涉及到的状态变量是否发生了变化。

7.空指针引用安全问题

指针是区块链开发中的一种重要数据类型,用于表示复杂的数据结构、动态分配内存等。其中,空指针是已经声明但未指向任何有效对象的指针。

因此,在Go和Java等语言中,当试图对空指针进行解引用时,可能会导致拒绝服务攻击或程序异常中断。 具体来说,Solidity中EVM的数据存储位置有两个,分别是Storage和Memory。 未初始化的 Storage 类型局部变量的默认值为 0x0,因此这可能指向合约中的其他状态变量。

如果未初始化的变量是可控的,攻击者可以利用这个变量修改合约中对应槽的状态变量,造成严重的后果。

成都链安安全团队推荐:

Remix-ide等编译器会对未初始化的内存局部变量发出警告,这些内存局部变量应该在声明变量时进行初始化,以避免安全漏洞。

8. 访问外部资源安全问题

为了提高开发效率和保证安全性,区块链开发者还会引入第三方库等外部资源。 这些第三方库代码可能存在安全漏洞,导致合约出现意想不到的问题。 即使第三方库本身没有安全问题,也有可能造成安全隐患。

例如在Solidity中,如果导入的合约代码中包含状态变量,调用方采用delegatecall的方式调用以太坊智能合约最广泛的应用,会因为参数存储位置不一致导致变量覆盖或者异常终止的问题,从而影响正常的业务逻辑。 同时,非漏洞合约在某些情况下也可能被恶意部署,造成严重的安全问题。

以太坊智能合约编写_以太坊智能合约最广泛的应用_图解以太坊智能合约

成都链安安全团队推荐:

1、开发者慎用第三方库代码。 还使用无状态库代码并避免使用代理调用。

2.如果引用的外部合约地址已知,则可以硬编码引用合约的地址。

9. 输入参数检查安全问题

虽然编译器在区块链开发中会检查参数的合法性,但开发者也需要检查每个函数预期的输入参数,使其符合业务逻辑。 尤其是涉及到包含特权操作的函数,比如solidity中的call()函数,当函数参数中的方法选择器是用户可控的,EVM有不检查参数个数的特性时,可能会导致代码执行漏洞等严重后果。

成都链安安全团队推荐:

开发者应该检查特殊函数的权限,包括函数调用者的身份验证,或者使用private、internal等函数修饰符来控制函数本身的权限。

如何保护数字馆藏智能合约的安全?

以上仅列举了基于区块链的数字馆藏智能合约、开发过程中存在的主要问题以及成都联安安全团队的建议。 数字馆藏开发者在开发过程中需要注意以上问题。

但是,为了保证数字馆藏的安全,在为数字馆藏部署智能合约之前,最好先寻求第三方专业的安全公司进行合约安全审计,让专业的人做专业的事。

为了保护Web3.0的安全生态,我们近期使用链比眼-智能合约形式化验证平台对上千个NFT项目进行漏洞扫描,发现很多NFT项目存在安全漏洞风险,例如:业务逻辑相关问题,代码规范相关问题等。而且,大多数NFT项目都没有经过安全审计,存在很大的安全隐患,容易导致攻击和资产损失。

以太坊智能合约最广泛的应用_以太坊智能合约编写_图解以太坊智能合约

打开网易新闻查看精彩图片

本文链接: