合约安全
NFT 和 GameFi 项目因其与 DeFi 项目不同的特性,除了常见的如整数溢出、重入等漏洞外,还有一些与其业务特性相关的特殊漏洞,比如因随机性和合约调用引起的回退漏洞。

回退漏洞
以 CryptoZoan 项目不公平孵蛋为例。

CryptoZoan 在币安智能链 (BSC)上以NFT游戏的玩法和体验为重点,旨在创建一个与区块链和游戏相结合的新金融系统,使用户在进行游戏的同事,赚取收益。该游戏通过加入随机性的机制来增强用户体验,用户可以将游戏中的“蛋”进行孵化,ZOAN 随机拥有一个稀有度等级,ZOAN 终生依附于这个稀有度等级,总共有6个等级,等级越高,价值越高。攻击者利用随机性与回退的结合,使得攻击者的孵化请求得到想要的结果(Level 6),破坏游戏的公平性,使得攻击者获得最高收益。

攻击过程如下:

(1)将待孵化的蛋部署在攻击合约;

(2)调用攻击合约触发 evolveEgg(uint256) 函数;

(3)检查稀有度,如果等级太低则进行回滚;(可能会消耗Gas费用,需要去权衡选择是否继续。)

(4)取出高等级的宠物。

根据攻击原理,我们提出以下安全建议:

对于返回值和随机性有关的函数,限制其调用者账户只能是外部账户(External Owned Account,EOA),不能是合约账户,建议使用 Openzeppelin 中的 isContract() 对调用地址是否为合约进行判断。

三明治攻击
区块链的透明度、以及执行订单的延迟(往往在网络拥堵情况下),使抢先交易更加容易,并极大降低了交易的安全性。攻击者(或者我们叫他掠夺性交易员)会找到一个待处理的受害者交易,然后试图通过前后的交易夹击该受害者。这种策略来源于买卖资产从而操作资产价格的方法。

所有区块链交易都可在内存池(mempool)中查到。一旦掠夺性交易者注意到潜在受害者的待定资产X交易被用于资产Y,他们就会在受害者之前购买资产Y。掠夺性交易者知道受害者的交易将提高资产的价格,从而计划以较低的价格购买Y资产,让受害者以较高的价格购买,最后再以较高的价格出售资产。

以 Polkamonster 为例,攻击流程如下:

(1)被攻击者发现攻击合约的 NFT 比较便宜,以正常的 gas 价格发起请求进行购买,该交易进入 mempool 中;

(2)攻击者发现有人购买他的宠物,立即以一笔更高 gas 价格的交易来更新宠物价格;

(3)在真正执行被攻击者交易时,按照更新后的高价格进行购买。

攻击导致受害者的地址余额被清空,损失很大。而对于攻击者来说,如果攻击不成功也只是付出少量的 gas 费用而已。

安全建议:更新价格的操作,需要有一个快的冷却时间;在购买时将当时的价格作为参数;用户只要 approve 本次需要的数量即可,不要每次都 approve max。

原文 https://learnblockchain.cn/article/4163