硬核科普:DEFI基础安全问题

在刚刚过去的这一年,比特安安全团队一直在研究关于区块链的安全问题,区块链技术为传统金融、数据隐私、供应链、跨境汇款等应用领域所做的贡献大家有目共睹。其中「去中心化金融(DEFI)」更是当前最为火热的应用之一。

DEFI作为一个金融概念,其基石就是一个个的代币,代币分为很多种类,一般都是以代币标准进行分类的,比如知名的ERC20 代币标准,以及非同质化代币(NFT)标准ERC721等等。代币作为DEFI的基石, 它安全问题是不可忽视的。

比特安审计中心作为国内最可靠的区块链监测平台之一,今天为大家科普DEFI代币层面存在的安全问题:第一大类是代币本身的问题,第二大类是代币与DEFI交互中可能会遇到的安全问题。

代币层面的问题

1.整型溢出问题

为什么整型溢出这么重要呢?最主要的原因就是因为他们一旦出现就会造成较大的资金损失。在0.8.0之前,EVM并不存在溢出检查机制,需要特别关注数值运算时的整型溢出问题;而在0.8.0之后,solidity推出了自带的溢出检查机制,从根本上避免了整型溢出问题,但是同样也要注意,当使用unchecked关键字时,其涉及的数字运算也是不检查溢出的。

整型溢出一般分为上溢和下溢,上溢是指当运算结果大于uint数据类型规定的取值上限时,会导致溢出到取值下限开始重新计算(一般即为0)。

2. 函数权限设置错误

函数权限设置错误通常都是由于合约开发者的疏忽所致,很多内部函数在运行时会直接更改合约储存数据,而不进行相关的检查(例如更改合约管理者权限、调用合约关键参数等),如果这部分函数的可见性被设置为public或者external,将产生重大的安全漏洞。今年十月份AVATerra Finance就出现过这个问题,它将铸币函数mint的可见性修饰词设置为了public,这导致任意攻击者都能够进行铸币操作。

AvaterraToken的合约代码

3. 权限过大

管理者拥有过大的合约权限,会出现用户资产量不可控和资产价值不稳定的情况。如管理员拥有随意转走和销毁用户余额的权限,则可将用户的资产随时归零;如管理员拥有无限铸币的函数权限,则可大量发行此类代币,使得代币价格迅速贬值。

4. 自我增发漏洞

这种漏洞是一种很特别的逻辑漏洞,当用户自己给自己转账时,由于转账函数中设置了多个局部变量,导致了变量之间的互相覆盖,从而引起的自我增发漏洞。

5. 未正确校验传入参数

在函数的执行中如果未验证传入参数的合理性,就可能导致函数不按照预想的结果执行,比如permit函数如果未做零地址校验,且对应的代币的销毁代币方式是将代币发送至零地址,那么攻击者可以转移零地址中被销毁的代币。还例如在一些智能合约中会存在freeze函数,用于冻结账户,但是在进行代币转账时,只验证了来源账户,未对转入地址进行验证导致转入的代币无法提出,还需注意的有transferFrom要额外验证from地址。黑名单验证也有类似问题。

6. 开发者后门

部分管理员在开发阶段会请人代为开发,这种情况下开发者如果在Token里面留下了后门,后续带着后门上线的Token会对项目和用户都造成损失。

DEFI交互中的代币问题

1.通缩型代币的差额套利

今年DEFI出现了一批以safemoon为代表的通缩型代币,用户在使用此类币交易时,会销毁部分代币,导致实际到账数量和支出数量并不一致。因此,如果类似于抵押池一类的DEFI项目根据转账数量来记录资产,一旦与此类代币进行交互,很容易出现项目实际拥有资产与记录值不一致的情况,这很容易被攻击者所利用。

2.代币接口规范问题

在DEFI与代币交互时,遵循的是统一的代币接口规范,如果代币实现时没有遵循标准的接口规范,则可能会在交互过程中导致代码的逻辑执行异常。

3.ERC721,ERC777,ERC1155可能引发的重入风险

重入漏洞算是一个比较知名的基础漏洞了,代币中当然也有这样的重入风险,比较典型的例子就比如ERC1155里面safeTransferFrom函数中会调用_doSafeTransferAcceptanceCheck函数,然而_doSafeTransferAcceptanceCheck里面会检测如果目标地址是合约的话,会调用他的onERC1155Received方法,这里如果DEFI合约编写不恰当,调用safeTransferFrom位置在重要操作(例如修改余额)之前,则会引发重入漏洞。

4.无限授权

用户在与DEFI进行代币交互时,部分DEFI项目可能会直接向用户要求无限授权,然而这其实是个很不安全的行为,一旦DEFI项目的前端或者项目内部出现了一些漏洞和问题,用户的代币安全将会无法获得保障,因此通常来说DEFI项目最好让用户有选择性的给予授权值,以免造成不必要的代币资产损失。

比特安安全团队最后总结到:DEFI项目安全问题层出不穷,建议用户重视自身财产安全,不要盲目相信项目方。项目方在开发完毕后需要对项目进行完整的测试,对各个功能点是否正常执行、对所有可调用的函数及其输入的参数进行输入测试,验证业务逻辑。比如测试极值,自我转账等一系列特殊情况是否满足逻辑。定期进行安全审计和复盘,避免让攻击者利用漏洞造成用户大量损失。

猜你喜欢

转载自blog.csdn.net/lmk714899/article/details/122308549