“今年5月是DeFi历史上遭受攻击和损失最多的一个月。一系列攻击的出现引发了各种加密资产的价格暴跌。攻击者最常用的手段是闪电贷款攻击,主要集中在BSC链,直接损失总计超过1.5亿美元。”成都联安公司发文称,2021年5月是DeFi行业的“黑色五月”。
欧科链新闻了解到,今年5月至少有25起与DeFi相关的安全事件,其中11起与闪电贷相关,包括PancakeBunny、BugerSwap、Julswap等项目,被闪电贷攻击者“光顾”。值得一提的是,这些项目主要集中在BSC链。
风险事件的不断发生,并不会阻止行业对“闪电贷”意义的深入思考。
闪电贷款发明时,被区块链业界视为革命性的金融创新。闪电贷用户可以以无抵押、低利率的形式在短时间内从平台贷出巨额资金,用于套利、还款等市场行为,但难点在于还款和借款操作必须写入同一块。
如果借款人不能在一个区块内(约15秒)归还资金,他的贷款申请和后续操作将被公链虚拟机视为非法,不会写入区块,这意味着借款人不能改变被调用项目的状态,系统将拒绝放款操作,这意味着借款人没有操作。
借助区块链的这一特性(交易可以回滚),闪电贷款这一金融武器可以投入运营。但是到目前为止,它的使用门槛还是比较高的,甚至没有相应的图形化操作界面,所以用户必须要有读写代码的能力才有机会实现。
一般来说,闪电贷的用户应该自己编写程序,在代码中调用闪电贷,在代码中实现后续的盈利操作和还款指令。如果代码经过区块链虚拟机验证,没有逻辑错误,可以将相关数据写入区块,记录在链中,这样闪电贷的使用才能生效。
因此,想要顺利使用闪电贷,必须了解相关项目的使用规则,具备完善的盈利逻辑,将闪电贷资金投入到盈利的DeFi项目中,及时还清本息。能满足这些要求的大多是对DeFi项目非常了解的“老手”,甚至是黑客。与普通的DeFi用户相比,这些“闪电贷极客”对DeFi的研究更透彻,对重大项目的设计漏洞也更了解。闪电贷的出现无异于让这些DeFi资深玩家成为“鲸鱼”。
闪电贷成为黑客手中的镰刀后,业界普遍对这一工具印象不佳,甚至有人将这一金融创新称为“黑客的鹰犬”。
不难发现,攻击者的方法论核心是在DeFi项目的业务逻辑或代码段中发现bug,然后利用Lightning Loan将大量资金转移到那些有bug的项目中。这样做会使被攻击的项目陷入异常,攻击者可以趁机获利。
以JulSwap平台为例,攻击者针对平台的JulB/WBNB交换池和名为“JulProtocolV2”的合约(代码段)。本合同中的addBNB函数在设计上存在缺陷,其数据源单一且可控。攻击者抓住这一缺陷,改变了JulB/WBNB池的价格和深度,以低成本套现了大量代币以获取利润。
(交易链接https://bscscan.com/tx/0x 1751268 e 620767 ff 117 C5 c 280 e 9214389 B7 c 1961 c 42 e 77 fc 704 FD 88 e 22 F4 f 77 a)
根据交易记录,黑客首先将代码部署到他们创建的智能合约中。随后,攻击合约调用闪电贷款功能,获得7万JulBs,然后从JulSwap的JulBs/WBNB池中兑换1400 WBNBs。
这次大换血造成了池内剩余JulB数量和WBNB比例严重失衡。此时WBNB对JulB的数量急剧上升,相当于提高了WBNB的价格。
然后,攻击者在“JulProtocolV2”契约中调用“addBNB”函数。该功能的作用是帮助用户为JulB/WBNB池提供流动性(流动性挖掘)。用户只需要提供WBNB,而JulB则由平台提供。
此时,addBNB函数会查询JulB/WBNB池子中WBNB兑JulB的价格,并根据用户质押的WBNB向池中注入相应的JulB。由于攻击者拉高了WBNB的价格,他只需向池子注入515个WBNB,平台方则需注入144,000个JulB。这一步相当于加大池子深度,缩小滑点,为后面的大额兑换做准备。
此时,攻击者合约还剩下1400-515=885个WBNB。
攻击者再用剩下的部分WBNB,从JulB/WBNB池子中兑换出70,310个JulB。由于池子里WBNB的价格已经被攻击者拉高,并且增加了深度,滑点缩小。最终,攻击者只需要花费363个WBNB就可以换到70,310个JulB,平均成交价远低于最初的1400 WBNB兑70,000JulB。
攻击者还完本金+利息=70,210个JulB的闪电贷,攻击合约里还剩下885-363=522个WBNB,以及100个JuLB,而这些就是他此次攻击的盈利。按照5月28日当天的价格计算,这次攻击合约至少让黑客获利160,000美元。
除了上文提到的攻击合约外,黑客还布置了其他合约对JulSwap展开攻击,这些合约的逻辑流程基本一致:
调用闪电贷获取巨额资金→从JulB/WBNB池中大量兑换WBNB,拉高其价格→通过addBNB函数增加池子深度,缩小滑点→再用WBNB兑回JuLB。
该攻击手法的关键在于,攻击者途中增加了池子的深度,第二次大额兑换产生的价格波动会小于第一次大额兑换,两次兑换之间存在差值,而差值便是利润的来源。
在已知的另一个攻击合约中,黑客用此手法套得142个WBNB,价值约44,000美元。
通过JulSwap攻击事件不难看出,隐患在于JulProtocolV2合约的addBNB函数只有单一数据来源,如果该数据源(JulB/WBNB池子的状态)被人为操纵,addBNB函数乃至JulProtocolV2合约就会做出异常判断。这便是“单点故障”,即系统中某一点失效引发整个系统的异常。如果合约设计者采用多数据源的结构,便可适当避免类似情况发生。
在近期遭遇攻击的其他DeFi项目上,类似的设计漏洞屡见不鲜。BurgerSwap攻击事件中,由于BurgerSwap采用三层级架构,且“平台”层与“兑换对”层间的交互存在单向性,数据采集方面存在漏洞。黑客抓住这点,结合重入攻击,使“兑换对”层的数据失真,进而使系统运算出错,从中获利。
与此相近的PancakeBunny、Bearn Fi攻击事件,核心在于项目中负责收集数据、计算价格的代码段有bug,黑客便利用了这些漏洞。虽然这些被攻击的项目本身存在严重bug,但闪电贷的巨额资金无异于放大了本不明显的瑕疵,让DeFi这栋完工尚早的大厦风雨飘摇。
不过技术终有其两面性,闪电贷这把双刃剑在放大既有风险的同时,也为DeFi生态系统的更新迭代提供了动力。如果没有了黑客和闪电贷,缺乏掠食者的DeFi生态链必将孕育更多缺陷,最终的结果或许是“死于安乐”。
Chainlink项目方的CMO——Adelyn Zhou曾表示:“闪电贷不会在DeFi内部产生漏洞,它只是揭示了已经存在的漏洞。”这种具有自然选择作用的机制是必须存在的,它是不可缺少的预警信号,可以淘汰掉那些不完善的DeFi产品,让资金流入更安全、更稳健的地方去。最终,DeFi系统将在黑客攻击的洗礼下茁壮成长,坚不可摧。
基于区块链及DeFi产品天生的开源、透明属性,闪电贷和攻击者的存在将使DeFi程序设计趋于完善,使其在“生于忧患”的同时迎来进化与发展,能够在未来抵御更强烈的冲击,真正成为金融领域的革命者。