“现在修复还为时不晚”,这句话在生活中大多数时候都是适用的。然而,在网络安全面前,一旦出现漏洞,就可能造成无法挽回的损失。在安全问题造成无法挽回的损失之前被发现,或者从一开始就做好充分准备,是作为区块链从业者的安全第一要务。北京时间8月14日下午,CertiK安全技术团队发现DeFi匿名挖矿项目Based官方公告称,攻击者通过调用Based智能合约中的函数冻结了Pool1,并宣布将重新部署其Pool一。官方推文称,黑客试图永久冻结“Pool1”,但尝试失败。“Pool1”将按计划继续进行。通过对智能合约的分析,CertiK认为Based项目一号矿池被冻结是智能合约漏洞导致的事故。事发后,Based团队部署了1号矿池智能合约,部署地址为0x77caF750cC58C148D47fD52DdDe43575AA179d1f。Base通过调用智能合约中的renounceOwnership函数正式声明了智能合约的所有者,但并不初始化智能合约。由于Based智能合约中的initialize函数被错误设置为外部调用,在初始化智能合约的过程中,1号矿池的智能合约被外部攻击者以错误的值初始化。错误的初始化导致Based官方无法重新初始化一号矿池的智能合约,因此一号矿池被冻结,任何质押都无法完成。Base官方决定放弃智能合约,重新部署一号矿池智能合约。智能合约技术细节(1)Based团队在部署智能合约后,没有及时调用下图中的initialize函数来初始化智能合约的设置:(2)外部调用者利用了两者之间的时间差Based团队对智能合约的部署和初始化,趁机调用了下图中第671行调用范围设置错误的initialize函数,抢占了1号矿池的智能合约:(3)上图中的两个initialize函数都是通过初始化器的修饰符修饰的。根据代码,如果调用其中一个初始化函数,则不能调用另一个初始化函数。初始化修改器代码如下图,导致官方based失去了初始化函数的机会:(4)基于以上因素,based智能合约无法被官方正常初始化,所以任何质押无法执行。交易记录质押失败:如何规避事件本次事件本质上是一个智能合约漏洞引起的,但是Based团队如果及早发现这个漏洞,提前初始化智能合约,就可以完全避免这个危险,实现No.freeze.因此,CertiK安全技术团队建议:在部署智能合约时,应准备好初始化智能合约所需的命令脚本等工具,及时初始化智能合约,防止攻击者抢先初始化或操纵智能合约。利用部署操作和初始化操作之间的时间差。了解智能合约的运行原理和技术细节,不要盲目采用其他智能合约代码。邀请专业的安全团队对其智能合约进行审计,确保智能合约的安全可靠。
