# 第15章：DeFi漏洞利用

探索DeFi是有风险的，智能合约被黑客攻击一直在发生。仅在2020年，就有至少12次高调的DeFi黑客攻击，从DeFi协议中盗走了不少于1.21亿美元的资金。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsquungru7j30rj0ge76g.jpg)

就连最好的智能合约审计师都无法完全预测已部署的智能合约会发生什么风险。可以肯定的是，在智能合约中拥有数十亿美元资金的情况下，最聪明的黑客一直不断的在寻找安全弱点并期望从中获利。

DeFi的一大风险在于，随着项目利用可组合性相互构建，DeFi应用程序的复杂性呈指数级增加，这使得智能合约审计员更难发现弱点。DeFi应用程序开发人员必须确保网络安全审计员不断检查他们的代码，以减少任何被利用的可能性，因为错误的后果将是巨大的经济损失。

在本章中，我们将研究黑客攻击的原因、闪电贷、减少黑客攻击损失的潜在解决方案，以及个人避免在DeFi攻击中损失资金的一些技巧。

### 漏洞的原因

下面我们将看一些常见的漏洞原因。该清单并不完全是详尽的：

**1. 资本操纵/闪电贷（Flash Loans）** 只要借款人能在同一笔交易中偿还贷款，闪电贷允许用户利用几乎无限的资本来进行金融交易。它是一种强大的工具，可以让人们操纵过去受到资本要求限制的经济攻击。对于闪电贷，拥有正确的策略是利用漏洞机会的唯一条件。

几乎所有DeFi黑客都利用了闪电贷。我们将在下一节对其进行更详细的研究。

**2. 在生产环境中测试代码（test in prod）** 由Yearn Finance的创始人Andre Cronje带头，许多DeFi项目遵循生产中测试的精神，而不是最大限度地提高安全性和测试，以加快产品开发的速度。对每个版本进行审计将大大延长将产品更新推向市场所需的时间。

DeFi的主要竞争优势之一是开发人员可以更快地迭代，从而突破金融创新的界限。然而，并不是每个项目都能负担得起审计费用，尤其是当项目尚未取得任何进展时。尽管很多协议进行了多次审计，但黑客仍然设法利用了一些项目的漏洞，这表明进行审计可能不足以防止所有黑客攻击。

**3. 马虎的编码和不充分的审计** 在牛市中，许多项目团队感到压力，需要快速行动并走捷径以更快地发布他们的产品。 有些人可能决定完全跳过审计以获得先发优势，只在产品上线几个月后进行审计。

还有大量的"分叉"项目 -- 这些项目使用与其他成熟项目相同的代码。在没有完全了解代码如何工作的情况下启动，它们被当作快速抢钱的工具，导致许多漏洞的出现。

**4. 卷款跑路（Rug Pull）** 在 DeFi 领域，项目由匿名团队启动的情况并不少见。 有些人这样做是为了避免由于不确定的监管环境而受到监管机构的审查。 然而，有一些人选择匿名，是因为他们有不良意图。在很多情况下，匿名团队进行了内部埋伏并故意留下了一个后门，该后门被利用来窃取毫无戒心的用户。

加密社区不会疏远匿名创始人发起的项目，看看第一个加密货币比特币是如何由一个不知名的人创立的。用户根据生成的代码评估项目，而不是开发人员是谁或来自哪里。这与开放软件的去中心化精神是一致的。

撇开理想不谈，如果一个匿名团队发起的协议发生了漏洞，那么没有追索权的可能性很大，因为很难找到开发者的真实身份。

**5. 预言机攻击** DeFi协议需要知道资产价格才能正常运作。例如，一个借贷协议需要知道资产价格来决定是否清算借款人的头寸。

因此，作为DeFi基础设施不可缺少的一部分，预言机可能会受到严重的操纵。例如，我们在第12章中提到，MakerDao的金库被利用后，造成了不必要的金库清算，总价值超过800万美元的ETH损失。

**6. Metamask攻击** 作为每个以太坊应用程序的主要交互界面，Metamask也是黑客主要的攻击目标。Consensys团队在安全方面做得很彻底，到目前为止，还没有出现大范围的漏洞。

然而，有几起备受关注的攻击（利用木马篡改Metamask交易信息）： - EasyFi项目的管理员MetaMask账户损失5900万美元 - Nexus Mutual创始人的个人钱包损失800万美元

> Metamask的钓鱼网站攻击也是主要风险，它们通过模仿Metamask，让用户输入私钥，盗取用户资产。切记认清Metamask网址

### 闪电贷（Flash Loans）

**什么是闪电贷？**

闪电贷是一种用户可以在没有任何抵押品的情况下借到资金的贷款模式，只要用户在同一笔交易中偿还了贷款就行。如果用户没有在同一笔交易中偿还贷款，交易将自动失败，同时会产生交易费损失，此时闪电贷不会发生。闪电贷由各种DeFi协议提供，如Aave和dYdX。

与普通贷款相比，闪电贷款有三个主要特点：

* 没有违约风险。闪电贷在同一笔交易中得到偿还。因此，不存在违约风险。
* 无抵押品。借款人只要能在一次交易中偿还贷款，就可以在不提供任何抵押品或信用检查的情况下获得贷款。
* 无限贷款规模。用户可以从DeFi协议中借到任何金额，但不超过可利用的总流动资金。

截至2021年4月，闪电贷的执行并不友好，因为必须通过编写智能合约代码来执行它。因而，它更容易被软件程序员所使用，而不是一般的门外汉。

事实上，一些程序员经常利用这一因素，发起我们所说的"闪电贷攻击"，特别是在不需要抵押品的情况下。最著名的闪电贷攻击之一发生在Harvest Finance，造成了2400万美元的损失。

下表显示了提供闪电贷的主要协议所收取的费用：

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsqwcawrthj30e408vt97.jpg)

**闪电贷的使用**

下图显示了Aave的所有Flash贷款的使用构成：&#x20;

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsr707tqchj31cs0qqac6.jpg)

我们可以看到，闪电贷主要被用于套利目的。套利是利用市场之间的价格差异来赚取利润的行为。例如，假设我们发现WBTC在两个不同的去中心化交易所有相当大的价格差异。我们可以使用闪电贷款，在没有任何抵押的情况下借入大量的WBTC，从价格差异中获利。

闪电贷的第二个用途是贷款清算。如果借款人让协议清算他们的头寸，通常会有惩罚。当市场有较大的价格波动时，借款人可以选择使用闪电贷自行清算他们的头寸，避免罚款。

让我们用一个例子说明：我们用ETH作为抵押品向Maker借DAI。当ETH的价格大幅下跌时，ETH的抵押品价值可能会接近我们DAI贷款的清算水平。如果我们没有ETH来增加我们的抵押品，也没有DAI来偿还贷款。这时我们可以通过闪电贷借入DAI偿还部分贷款，并提取部分ETH出售，用出售所得的DAI偿还闪电贷和支付手续费。使用这种方法，我们将保留剩余的ETH，而无需支付清算罚款。

最后，闪电贷也可以用来执行抵押品互换。例如，如果我们在Compound有一笔以ETH为抵押的DAI贷款，我们可以使用闪电贷款将ETH抵押品换成WBTC抵押品。这使我们能够轻松地改变我们的风险状况，而不需要通过多次交易来实现。

执行闪电贷仍然需要了解很多技术知识，对不懂代码的人来说有很高的门槛。Furucombo是一个能让普通用户使用闪电贷的第三方应用程序。

**闪电贷协议：Furucombo**

Furucombo是一个允许任何人使用闪电贷创建套利策略的平台。它使用拖放代码模块的方式构建执行策略，极大的降低了使用门槛，使用户可以根据需要定制自己的闪电贷策略。请注意，Furucombo不会为你寻找套利机会。

要使用Furucombo，用户需要设置输入/输出和交易的顺序，它将把所有的代码模块捆绑成一个交易来执行。下面是一个如何进行套利交易的例子：&#x20;

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsr7fkamx1j31cw0lkdhe.jpg)

1. 从Aave获得15,000DAI闪电贷。
2. 使用1inch将DAI交换为yCRV。
3. 使用Curve将yCRV换回DAI。由于价格差异，你最终拥有15,431个DAI，比之前的DAI多。
4. 偿还包括闪电贷费用在内的15,013DAI给Aave。用户剩下的利润是418DAI。所有这些步骤都在一次交易中执行完成。

Furucombo不需要任何预付资金，也不收取费用，用户可以在平台上使用闪电贷建立"组合"并进行套利交易。你所需要的只是钱包里有足够支付gas费的ETH。

建议用户使用前自行评估交易风险，因为如果价格差异不再存在，Furucombo上的策略就不一定有套利机会，组合可能会失败，甚至亏钱。无论结果如何，用户都需要支付交易费用和gas费。

**案例：bZx被黑客用闪电贷攻击**

2020年2月15日，以太坊区块链上发生了一笔当时被认为是独一无二的交易。在不到一分钟的时间内，在一个区块和一笔交易中实现了大约36万美元的利润。

这笔交易引起了加密货币社区的注意并被广泛分析。该收益最初是通过几乎无风险的闪电贷形式实现的，随后在不同的去中心化交易所之间进行了一系列套利。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsr7t64dtgj31ea0kaju7.jpg)

1. 闪电贷借款 首先，从dYdX用闪电贷借款1万ETH。
2. 囤积 将这些ETH的一半（5500ETH）作为抵押品存在Compound，并借入112WBTC。
3. 保证金拉高价格 将1300个ETH存入bZx，使用5倍杠杆做空ETH以支持WBTC。从bZx借来的5,637个ETH被用来在KyberSwap换取51个BTC。根据KyberSwap算法，最好的价格由Uniswap提供。然而，由于流动性较低，这笔交易推动了1 WBTC的汇率上升到109.8 WETH左右，大约是该期间正常转换率的三倍。
4. 倾销 攻击者在价格上涨后在Uniswap卖出了借来的112个WBTC，获得了6,871个ETH，转换率为1WBTC=61.2WETH。
5. 闪电贷利润 用未使用的3200ETH加上出售的6871ETH，攻击者偿还了1万ETH的闪电贷后，获利71ETH。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsr90jbzh1j314e0u00vp.jpg)

1. 总利润

   Compound的仓位仍然处于盈利状态。由于1WBTC的平均市场价格为38.5WETH，攻击者可以用大约4300ETH获得112WBTC。总的来说，攻击者获得了71WETH + 5500WETH - 4300ETH = 1271 ETH，大约35.58万美元（假设ETH价格为280美元）。

上述事件不仅证明了通过操纵资产的价格获得超高收益的可能性，而且除了相对较低的协议费，借款人也没有其他费用。借款人面临的唯一要求是，贷款要在同一笔交易中偿还。因此，无抵押贷款的概念本身为该领域带来了广泛的机会。

**闪电贷总结**

闪电贷是一把双刃剑。一方面，它对智能合约的新颖使用方式，给DeFi生态系统带来了便利和进步--没有多少资本的交易者可以利用闪电贷启动套利和清算策略，而不需要提前拥有大量的资本。

另一方面，黑客可以利用闪电贷发起闪电贷攻击，由于不需要抵押品，所以极大地提高了他们的利润。就像任何工具一样，闪存贷可以用于好的和坏的目的。

在我们看来，随着项目改进其基础设施以防止未来发生攻击，用于恶意目的的闪电贷攻击加强了整个DeFi生态系统。由于闪电贷仍处于初期阶段，因此这些攻击可以被视为一线希望，可以缓解DeFi生态系统中的问题并使其更具反脆弱性。

### 解决方案

仅对智能合约进行审计是不足以防止漏洞的。项目需要做得更多，他们现在正在寻找替代方案，以确保存放在其协议中的资金安全。以下是一些可能的解决方案：

**内部保险基金** 一些项目已经决定使用他们的原生代币作为风险保障：

* Maker在黑色星期四铸造了MKR，以弥补DAI的清算缺口。
* Aave推出stAAVE，以弥补存款人抵押的任何潜在不足风险。
* YFI抵押了他们的代币并借用DAI来偿还被黑的资金。

**保险** 作为一个新生事物，Unslashed Finance向LIDO和Paraswap的用户提供了协议级的保险。这使协议为其用户购买保险提供了可能。

**漏洞赏金** 项目越来越多地利用Immunefi来列出Bug赏金，鼓励黑客因发现Bug而不是利用Bug而索取奖励。目前最高的悬赏金高达150万美元。然而，由于黑客的潜在回报较高，这是否能阻止黑客的发展还有待观察。

**其他可能的解决方案**

**全行业保险池** 可以有一个全行业的保险池，每个DeFi协议都从他们的收入中拿出一部分或支付一个固定的费用。当其中一个成员遭遇黑客攻击时，该保险池预计将支付索赔。这类似于联邦存款保险公司（FDIC）的想法。

**审计员在游戏中占有一席之地** 这个想法建议审计师在DeFi保险平台上入股，如Nexus Mutual。作为持股人，如果协议被黑，那么审计师将遭受损失。这种实施方式有望使审计师和项目的利益保持一致。

### 针对个人的提示

除了智能合约黑客，你也可能暴露在各种黑客企图之下。以下是你可以采取的一些步骤，以尽量减少风险，降低被黑客攻击的几率。

**不要给智能合约无限的授权**

与DeFi协议交互通常需要先给智能合约授权，并同意智能合约花费你钱包里的资金。通常为了方便，DeFi协议授权时会将默认的权限设置为无穷大，这意味着协议对你钱包上的被授权资产有无限的访问权。

给予无限授权来花费你钱包上的被授权资产通常是个坏主意，因为恶性的智能合约可能会利用这一点来耗费你钱包里的资金。

> 很多社区里用空投假币骗钱，或者扫二维码转账的骗局大多利用这个机制，让用户签署一个无限授权，然后转走用户钱包里的资产

2021年2月27日，一名黑客使用了一个假的智能合约，并欺骗Furuсombo认为Aave v2有了一个新的实现。这次攻击利用了无限代币授权的机制，黑客通过控制Furuсombo智能合约，将所有无限授权给Furuсombo智能合约的用户钱包中的资金盗走。

在这次攻击中，Furucombo用户的损失总额高达1500万美元。甚至借贷协议Cream Finance也犯了无限授权的错误，在这次攻击中从他们的国库钱包中被转走了110万美元。

因此，手动改变每笔交易的批准金额，是防止代币被无限授权给DeFi协议的一个好办法。尽管这将导致每个后续DeFi互动的额外交易，并产生更高的交易费用，但你可以减少钱包在智能合约漏洞攻击中被耗尽的风险。

要手动改变批准的金额，请遵循下面的步骤指南。

**不给智能合约无限授权的分步指南**

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsra03817vj30u00vxdhq.jpg)

步骤1

* 需要批准授权的最常见的情况之一是交易新代币时。
* 在本例中，我们计划在Uniswap上将15.932个SNX交换为0.0834个ETH。
* 点击 "Approve SNX"（批准SNX的授权）

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsra29u8tnj31630u00w8.jpg)

步骤2

* 左边的图片是我们将看到的默认窗口。
* 点击 “View full transaction details”（查看完整的交易细节）
* 然后我们将看到右边的图片，点击"Edit"（编辑）。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsra7g1a88j30y40qktab.jpg)

步骤3

* 选择“Custom Spend Limit”（自定义限额）。
* 很多应用程序默认是选择“Unlimited”（无限）的选项。
* 键入我们想要使用的金额，在这个例子中，是15.932 SNX。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsraanzhoaj30r60ystb1.jpg)

步骤4

* 在 “Permission”（许可）部分，我们可以看到数字已经更新。
* 点击“Confirm”（确认）并支付交易费，完成。

**撤销智能合约的无限授权**

如果你之前给了DeFi协议无限的支出授权，你有两个选择。比较容易的选择是将你的所有资金转移到一个新的以太坊地址，你将获得一个新的开始，而不承担任何与你以前的以太坊地址有关的风险。

然而，如果将资金从你现有的以太坊地址转移出去是很困难的。还有一个方法，你可以使用Etherscan提供的代币授权工具检查所有以前的审批列表。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsrafdrwq0j317e05ajru.jpg)

在这个页面，你可以看到你以前授予智能合约的所有授权。你应该撤销所有批准金额无限的授权，特别是你不再交互的协议。请注意，撤销每个授权需要智能合约本身的交互，并将产生交易费用。

**使用硬件钱包**

硬件钱包是一个专门用于存储加密货币的物理设备。硬件钱包将私钥与互联网连接的设备分开，减少你的钱包被盗的机会。

在硬件钱包中，私钥被保存在一个安全的离线环境中，即使硬件钱包被插入一台感染了恶意软件的计算机，私钥也无法被读取。虽然硬件钱包可以被物理盗窃，但如果小偷不知道你的密码，它就无法进入。如果你的硬件钱包不幸损坏或被盗，只要你之前创建过一个私钥的备份，你仍然能够恢复你的资金。

顶级硬件钱包制造商是Ledger和Trezor，尽管有更多的制造商已经进入这个行业。

**使用一个独立的浏览器配置文件**

虽然浏览器扩展是有帮助的，使你在工作中更有效率和生产力，但你应该始终担心恶意的浏览器扩展对你的加密货币体验造成威胁。

如果你不小心安装了一个恶意的浏览器扩展，它可能会窥探你的Metamask密钥，并成为你资金的攻击媒介。提高安全性的一个方法是在你的谷歌浏览器或Brave浏览器上创建一个单独的浏览器配置文件。

在这个新的浏览器配置文件中，只安装Metamask扩展。通过这样做，你可以减少恶意浏览器扩展从你的钱包抽走资金的风险。

以下是在谷歌浏览器上创建一个新的浏览器配置文件的分步指南。

**Chrome单独配置文件的分步指南**

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsran6uo73j317a0o476d.jpg)

步骤1

* 打开Chrome浏览器将进入上述页面。点击 "Add"（添加）。
* 或者你可以在右上角，点击个人资料图标。点击最下方的 "+add"。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsrapqwcbaj312u0qutal.jpg)

步骤2

* 填写名称和选择颜色，然后点击“Done”（完成）。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsrar2vxpyj316s0mcgn0.jpg)

步骤3

* 如果你有一个不同的Chrome账户，可以选择登录。如果没有，就点击“Get started”（开始）。

![](https://tva1.sinaimg.cn/large/008i3skNgy1gsrasnv69ej31240jgq4d.jpg)

步骤4

* 下载Metamask扩展，并使其成为此配置文件中唯一的扩展。

### 总结

DeFi领域在很大程度上仍然是各种金融创新的试验场。因此，事情可能会出错。请注意使用新的DeFi应用程序时的风险，特别是那些没有经过实战考验的应用程序。

在使用任何DeFi协议之前一定要做研究。在大多数情况下，一旦发生错误，对所造成的损失是无法追索的。即使在协议给予报酬的情况下，损失通常也会超过收到的赔偿金额。

也就是说，由于涉及的风险很大，参与DeFi活动的回报也很高。为了不错过DeFi提供的高回报，你可以选择通过购买保险或看跌期权来对冲一些风险。

DeFi领域仍在不断成熟。随着我们的发展，我们预计会有更多的DeFi协议推出，并在其运营模式中纳入更好的保障措施和保险基金。

### 推荐阅读

1. 让Metamask成为你的的银行

   <https://consensys.net/blog/metamask/metamask-secret-seed-phrase-and-password-management/>
2. 如何（不）获得Rekt - DeFi黑客的解释

   <https://finematics.com/defi-hacks-explained/>
3. DeFi的安全性：这么多的黑客，它能安全吗？

   <https://unchainedpodcast.com/defi-security-with-so-many-hacks-will-it-ever-be-safe/>
4. 关于黑客和漏洞的新闻

   <https://www.rekt.news/>
