去中心化金融安全:理解风险并降低风险
作者:Salus Insights
在去中心化金融(DeFi)领域中存在着大量的安全风险,这些风险可能对用户、平台和整个金融生态系统造成严重的危害。我们总结了三种 DeFi 安全风险,并通过分析最近发生的真实安全事件来阐述黑客攻击的过程以及相应的解决方案。
在 DeFi 中,价格操纵风险是指恶意行为者试图通过操纵资产的价格来获利或影响市场的行为。这种操纵可能会导致市场价格的不正常变动,给其他参与者带来损失。以下,我们总结了价格操纵风险在 DeFi 中可能出现的三种情况:
闪电贷攻击是一种在 DeFi 应用中出现的攻击方式。它利用了闪电贷这种无需提供抵押品即可借贷的金融操作。攻击者通过闪电贷借入大量资金,并在同一笔交易中进行一系列操作,以实施欺诈行为。
ShidoGlobal 闪电贷攻击事件
2023 年 6 月 23 日,在 BSC(币安智能链)上发生了 ShidoGlobal 闪电贷攻击事件。攻击者通过锁定和索取机制,以及两个池之间的价格差异来实现代币的套利,成功窃取了 976 个 WBNB。
Attack Tx:
https://explorer.phalcon.xyz/tx/bsc/0x72f8dd2bcfe2c9fbf0d933678170417802ac8a0d8995ff9a56bfbabe3aa712d6
攻击者如何实施闪电贷攻击?
当攻击者调用 ShidoLock 合约中的 lockTokens 函数时,他们将 10, 436, 972, 685.676390697 个 Shido Inu:SHIDO 代币锁定在合约中。这意味着这些代币无法被转移或交易,直到特定的条件满足。通过锁定代币,攻击者可以在一定程度上维持代币的价格稳定。
攻击者调用 claimTokens 函数,将锁定的代币转换成了 10, 436, 986, 704, 133, 494, 387, 000, 000, 000 个 SHIDO 代币。这一步实际上是将 SHIDO 代币的小数位数从 9 位增加到 18 位,增加了代币的总供应量。
限制闪电贷功能
限制闪电贷功能和引入闪电贷手续费是减少闪电贷攻击和操纵风险的一种常见方法。
在上述示例代码中,我们设置了一些限制条件来限制闪电贷功能的使用,例如最小借贷金额、最大借贷金额和借贷时间。在执行闪电贷操作之前,我们先计算并收取一定比例的手续费。
三明治攻击(Sandwich Attack)是一种在去中心化交易所(DEX)中利用信息不对称的攻击方式。攻击者通过在两个交易之间插入恶意交易,从而利用价格差异来获取利润。
CurveFinance 三明治攻击事件
2023 年 8 月 2 日,Hypernative systems 对 Curve Finance 发起三明治攻击。攻击者通过在添加流动性和移除流动性的两个交易之间插入恶意交易,赚取 36.8 K USDT。
Attack Tx:
https://explorer.phalcon.xyz/tx/eth/0xd493c73397952049644c531309df3dd4134bf3db1e64eb6f0b68b016ee0bffde
攻击者如何实施三明治攻击?
在这个过程中,恶意交易指的是攻击者从 Curve DAI/USDC/USDT 矿池中移除大量的 DAI 和 USDC 流动性,并销毁 3 CRV LP 代币的交易。这个交易使得该矿池变得非常不平衡,USDT 的相对数量更高,从而导致其价值更低。
另外两笔交易指的是攻击者添加流动性和提取流动性的交易。攻击者利用价格差异,通过添加自己持有的 DAI 和 USDC 流动性到 Curve DAI/USDC/USDT 矿池,并在溢价时将其提取出来,获得更高数量的 3 CRV LP 代币。
这样,攻击者通过三明治攻击将恶意交易与另外两笔交易包装在一起,低价购买 USDT 流动性,然后高价出售获取利润。
限制交易顺序
当涉及到防止三明治攻击时,代码实现可能会涉及复杂的智能合约和交易逻辑。以下是一个简化的示例,展示了如何通过限制交易顺序和引入交易延迟来预防三明治攻击。
在这个例子中,我们假设有一个智能合约 SandwichAttackPrevention,用于管理用户的余额和交易操作。为了防止三明治攻击,我们引入了两个主要的防御机制。
首先,在 allowTransaction 函数中,只有合约的拥有者才能将 isTransactionAllowed 设置为 true,从而允许用户执行交易。这样可以确保交易按照正确的顺序执行,而不允许攻击者在两个交易之间插入恶意交易。
其次,在 executeTransaction 函数中,我们引入了交易延迟的概念。只有在当前区块时间超过设定的延迟时间后,用户才能执行交易。这样可以给其他用户足够的时间来执行交易并更新价格,从而减少攻击者利用价格差异的机会。
价格预言机是一种提供加密货币实时价格信息的数据源。这些信息对于许多 DeFi 协议的正常运行至关重要。预言机攻击是指攻击者人为地改变预言机提供的数据,目的是从基于操纵价格的交易中获利。
Rodeo Finance 预言机攻击事件
Rodeo 是一个 DeFi 平台,提供价格预言机服务。2023 年 7 月 11 日,价格预言机操纵导致黑客从 Rodeo 协议中窃取了约 472 ETH(约 88.8 万美元)。
Attack Tx:
https://explorer.phalcon.xyz/tx/arbitrum/0xb1be5dee3852c818af742f5dd44def285b497ffc5c2eda0d893af542a09fb25a
价格预言机如何被操纵?
Rodeo Finance 攻击事件的关键在于 Rodeo TWAP Oracle。该预言机用于跟踪 ETH 和 unshETH 之间的价格比率。
这次攻击的一个重大漏洞是 Rodeo TWAP Oracle 的执行存在缺陷。预言机依赖于 WETH/unshETH 交易对的储备,该交易对的流动性较低,因此价格波动很大。
基于多个预言机来计算价格
确保价格查询的可靠性,一个可靠的预言机应该使用多个预言机或聚合喂价来计算价格,而不仅仅依赖代币对比率。特别是在矿池流动性较差的情况下,这种多样化的定价信息来源可以提高价格数据的准确性,并使攻击者更难操纵数据。
为了实现这一目标,一个可能的解决方案是使用去中心化预言机,例如 Chainlink。Chainlink 预言机可以从各种数据源收集数据,并使用区块链技术验证和确认数据的准确性。通过使用多个数据源,Chainlink 减少了单点故障的可能性,并且更难以被攻击者操纵数据。
以下是一个使用 Chainlink 聚合器合约获取价格数据的示例代码:
在上述代码中,我们使用了一个AggregatorV3Interface类型的数组来存储多个预言机的实例。构造函数接受一个预言机地址数组作为参数,并将每个地址实例化为一个AggregatorV3Interface对象。
getLatestPrice 函数用于获取多个数据源的最新价格数据。它遍历 priceFeeds 数组,并通过调用每个预言机的 latestRoundData 函数来获取价格数据。所有的价格数据被存储在一个 int 类型的数组中,并返回给调用者。
通过这种方式,我们可以从多个数据源获取价格数据,并确保价格查询更准确地反映资产价格。
智能合约漏洞智能合约漏洞是指在以太坊或其他智能合约平台上编写的代码中存在的安全漏洞或错误。DeFi 的核心是基于智能合约的金融协议,因此智能合约漏洞可能导致用户资金的丢失、操纵市场行为或其他恶意行为。
识别这些漏洞至关重要,我们的审计涵盖了各种潜在问题。这包括但不限于可重入漏洞、访问控制漏洞、整数溢出漏洞和业务逻辑漏洞。我们全面的审计服务旨在加强您的智能合约的安全性,并保护免受这些风险的影响。
以下,以访问控制漏洞举例,说明智能合约漏洞对 DeFi 的影响。
LeetSwap 遭受了攻击,损失超过了 340 ETH。根本原因在于 LeetSwap V2 Pair 合约存在访问控制漏洞, _transferFeesSupportingTaxTokens 函数可见性为 public。
Attack Tx:
https://dashboard.tenderly.co/tx/base/0xbb837d417b76dd237b4418e1695a50941a69259a1c4dee561ea57d982b9f10ec
Vulnerable Contract:
https://basescan.org/address/0x94dac4a3ce998143aa119c05460731da80ad90cf
攻击者调用了 _transferFeesSupportingTaxTokens 函数来操纵池子,攻击流程如下:
为了修复 _transferFeesSupportingTaxTokens 函数的访问控制漏洞,应该将函数可见性更改为 private 或 internal。将函数声明为 private,只有合约内部的其他函数能够调用它。将函数声明为 internal,可以被继承该合约的合约访问。其他合约继承 LeetSwap V2 Pair 合约时,可以通过 super 关键字调用_transferFeesSupportingTaxTokens 函数。而外部用户无法直接访问该函数,提高了合约的安全性。
需要根据具体的合约逻辑和需求来决定如何更改函数的可见性,确保在提高安全性的同时不影响合约的正常运行。
智能合约审计是识别和预防漏洞的重要步骤。在Salus,我们拥有一支由经验丰富的智能合约开发人员和审计专家组成的团队,可以帮助您增强合约的安全性。我们的专业知识使我们能够准确定位潜在的弱点,并确保您的项目的安全性和可靠性。
在 DeFi 领域中,用户操作风险是指用户在使用 DeFi 平台时,由于自身的操作失误、安全意识不足或不谨慎的行为而导致资金损失的风险。以下是一些常见的用户操作风险:
为了减少用户操作风险,以下是一些建议:
请注意,针对以上每一种攻击和漏洞的解决方案只是简单的示例,并不能完全防止相对应的攻击,或者修复相对应的漏洞。如果您对智能合约审计感兴趣,请联系我们,我们将与您合作,为您提供专业的审计服务,确保您的合约安全可靠。我们致力于为您提供优质的服务和全面的技术支持,以确保您的智能合约在安全和可靠的环境中运行。