解析 | bZx协议再遭黑客“二连击”背后的技术命门
从攻击流程上来看,这一次与上次刚好相反,但 整体上的套利手段还是一致的,根本原因主要是由于平台间共享流动性过小以及价格机制设计缺陷导致的。
Figure: Five Exploitation Steps With Oracle Manipulation
本文的初衷是希望通过分析此漏洞的一些攻击细节让大家能够更直观的了解此次攻击事件,并希望可以引起更深入的讨论。我们相信,这些讨论将对 DeFi 社区的完善和发展是十分有益的,特别是项目方在开发下一代的 DeFi 类产品时,可以有助于设计出更安全,更可靠的流动性共享模型。
漏洞的攻击细节如下:
此攻击事件发生在北京时间 2020-02-18 11:18:58(块高度#9504627 )。攻击者的交易信息可以在 etherscan 上查到。此攻击过程可以分为以下五个步骤:
Figure1: Flashloan Borrowing From bZx
本次攻击者向 bZx 平台借出 7,500 ETH,并指定攻击者的合约(此前已经部署)为资产接收方地址,这部分是基本的借贷功能,此处不做进一步解释。
当这一步操作过后,如下表中所示系统资产分布:
通过第一步闪贷获得 ETH 后,攻击者分两批共 900 ETH 通过 KyberNetwork DEX 换取成 sUSD。其中第一次 使用 540 ETH 换取,(KyberNetwork 内部查询得到 KyberUniswap 的价格是最优的)攻击者得到 92,419 枚 sUSD;第二批分 18 次,每次 20 ETH 换取,(KyberNetwork 查询之后确认 Kyber-sUSD 的价格是最合适的),攻击者获得 63,584 枚 sUSD,总共获得了 156,003 枚 sUSD。
Figure2: Pumping With Kyber (and Uniswap)
这两步骤也是正常的 DEX 币币交换的过程,在这两个批次操作之后 sUSD 对 ETH 的价格疯涨到了 0.00899,是市场价的 2.5 倍。
在这一步之后,使得 sUSD 价格被抬高了 1.5 倍,攻击者手里的资产还是正常与 KyberNetwork 交互,并没有实质性的攻击发生。然而,KybrNetwork 内部通过 Uniswap 完成 sUSD 与 ETH 转换,这使得那些将 Uniswap 作为 sUSD/ETH Oracle 的其它平台(比如说 bZx)误认为当前 sUSD 价格的确有这么高,这才触发了后面的攻击事件。此时,系统的资产如下:
Figure3:Hoarding From Synthetix
到此为止, 攻击者手里已经拥有的 sUSD 总量为 1,099,841 枚,占总发行量的 19.7%。
当前系统中的账本数据如下:
Figure4: Collateralized Borrowing From bZx
到此为止,系统的账本信息如下:
Figure5: Repay The Flashloan To bZx
完成整个闪电贷流程之后,当前资产情况:
3)攻击者手上还持有 2,378 枚 ETH。
最终攻击者手中持有的 2,378 ETH 部分为其获利,合计 $665,840 (当前 ETH 价格$280);而 bZx 平台负债为 2,868 ETH(6,796 - 1,099,841/280),即 $803,040。
总结
这一次的攻击事件中,我们能看出 DeFi 产品在设计过程中几个明显的问题点:
3)平台自身对于价格也应当设立止水阀机制。
从第一次 bZx 被攻击损失 1,271 枚 ETH,这一次又损失 2,378 枚,且这两次攻击之间只相差了 3 天时间,可见 DeFi 特别项目的安全问题非常严峻。
由于各项目由不同团队开发,对各自产品的设计与实现理解有限,集成的产品很可能在与第三方平台交互的过程中出现安全问题,进而腹背受敌。PeckShield 在此建议,DeFi 项目方在上线之前,应当尽可能寻找对 DeFi 各环节产品设计有深入研究的团队做一次完整的安全审计,以避免潜在存在的安全隐患。