Curve资金池重入漏洞利用事后分析,2023年7月30日

  • LlamaRisk
  • 发布于 2023-08-03 18:50
  • 阅读 8

由于 Vyper 编译器旧版本中的一个漏洞,Curve 上的多个资金池遭到攻击,攻击者利用重入锁的缺陷耗尽了受影响池中的代币。Curve 正在尝试联系攻击者并追回资金,部分资金已被白帽找回。Curve 建议 LPs 退出有风险的 Arbitrum Tricrypto pool,并计划停止对受影响池的 CRV 激励。

概要

  • Vyper 编译器旧版本中的一个错误导致了部分 Curve 池使用的一个安全功能失效(见下方受影响的池)。
  • 因此,攻击者能够耗尽受影响池中的代币。
  • 此次攻击直接损害了这些受影响池的 Curve 流动性提供者,尽管 Curve 正在尝试联系攻击者并追回用户资金。
  • 感谢一位白帽,DAO 已经追回了一个受影响池中的部分代币。
  • Curve eDAO 无法暂停 Curve 池或以任何方式处理用户资金。但是,它可以停止 CRV gauge 向 Curve 池的排放。预计 eDAO 将停止向所有受影响池的 gauge 排放。
  • 更多信息:

漏洞利用概述

7 月 30 日 UTC 时间 13:10 至 22:00 之间,一系列攻击导致了多个 Curve 池资金的损失。在每种情况下,漏洞的来源都是某些 Vyper 版本中发生故障的重入锁。

受影响的池以及每次攻击提取的金额:

  • pETH/ETH | 6,106.65 WETH(约 1100 万美元)
  • msETH/ETH | 866.55 WETH(约 160 万美元)和 959.71 msETH(约 180 万美元)
  • alETH/ETH | 7,258.70 WETH(约 1360 万美元)和 4,821.55 alETH(约 900 万美元)
  • CRV/ETH | 7,193,401.77 CRV(攻击时约 510 万美元),7,680.49 WETH(约 1420 万美元)和 2,879.65 ETH(约 540 万美元)

另一个可能受影响的池是 Arbitrum 的 Tricrypto 池。审计人员和 Vyper 开发人员未能找到有利可图的漏洞,但 Curve 建议 LP 退出该池以作为预防措施。

7 月 30 日 UTC 时间 16:44,Vyper 官方 Twitter 承认了一个影响 Vyper 版本 0.2.15、0.2.16 和 0.3.0 的错误。编译器存在一个错误,该错误否定了重入保护。此错误已在 0.3.1 版本中修复(偶然地,因为该错误直到 7 月 30 日才为人所知)。通常,0.3.1 之后的所有合约都没有此重入保护错误。

来源: Twitter

该错误是在此 PR 中引入的:#2391

该错误已在 PR 中修复:#2439#2514

当 Curve 的合约进行 raw_call 以发送原生代币时,它们会变得容易受到攻击。受影响的 Curve 池都使用上述 Vyper 版本之一,并且与原生 ETH 配对。使用 ERC-777 标准的代币也受到了影响,尽管涉及这些代币的 Curve 池已基本被弃用(例如,pBTCHOME)。ERC-777 添加了回调,使这些池容易受到相同的重入问题的影响。与 WETH 配对的池受到影响。

似乎有多个参与者参与了这些攻击,并且至少有一人正在与 Curve 团队合作以追回资金。c0ffeebabe.eth 从 CRV/ETH 池中提取的 2,879.65 ETH(约 540 万美元)已返还给 Curve 团队。

Arbitrum Tricrypto 警报

Arbitrum Tricrypto 池 可能存在被利用的风险。尽管安全研究人员尚未发现有利可图的漏洞,但 Curve 建议用户出于谨慎考虑退出该池。

来源: Twitter

pETH/ETH 池漏洞

漏洞交易

7 月 30 日 UTC 时间 13:10,发生了一次攻击,从 Curve 池中耗尽了 pETH。攻击者将 pETH 兑换为 WETH,获得了 6,106.65 WETH(约 1100 万美元)的利润。

来源: Phalcon Explorer

漏洞利用逻辑如下:

  • 攻击者从 Balancer 开设了一个 80,000 WETH 的闪电贷,并将所有 WETH 解包为 ETH。
  • 他们向 Curve pETH/ETH 池 提供了 40,000 ETH 作为流动性,并收到了 32,431.41 个 pETH-ETH LP 代币。
  • 通过销毁 32,431.41 个 pETH/ETH 池 LP 代币,从池中移除了 3,740 pETH 和 34,316 ETH。
  • 他们再次向 Curve pETH/ETH 池 提供了 40,000 ETH 作为流动性,铸造了 82,182 个 LP 代币。
  • 通过销毁 10,272.84 个 Curve LP 代币,又提取了 1,184.73 pETH 和 47,506.53 ETH。
  • 在 Curve 池中将 4,924 pETH 兑换为 4,285 ETH。
  • 将 86,106.65 ETH 封装为 WETH。
  • Balancer 偿还 80,000 WETH 以返还闪电贷。
  • 保留了 6,106.65 WETH(约 1100 万美元)作为利润。

重入发生在移除流动性和添加流动性操作之间。通常,池存款人应有权获得等于池代币总供应量与存款人提供的流动性所占分数之积的池代币。但是,由于重入错误,分配的池代币是使用燃烧前的余额计算的。这使得攻击者可以无限铸造池代币,从而对池的全部内容提出欺诈性索赔。

在撰写本文时,资金保存在 JPEGd_69 Exploit 钱包地址中。

pETH/ETH Curve 池在事件发生时包含约 2100 万美元的 TVL,并且所有资金此后已被耗尽或以其他方式被用户移除。虽然紧急 DAO 无法采取任何行动来暂停池或影响用户资金,但它可以冻结对池的 CRV gauge 排放。预计很快会采取此操作。

msETH/ETH 池漏洞

漏洞交易

7 月 30 日 UTC 时间 14:50,发生了一次漏洞,从 Curve 池中耗尽了 msETH。攻击者保留了 866.55 ETH(约 160 万美元)和 959.71 msETH(约 180 万美元)的利润。

来源: Phalcon Explorer

漏洞利用逻辑如下:

  • 攻击者从 Balancer 开设了一个 10,000 WETH 的闪电贷,并将所有 WETH 解包为 ETH。
  • 他们向 Curve msETH/ETH 池 提供了 5,000 ETH 作为流动性,并收到了 4,984.26 个 alETH-ETH LP 代币。
  • 通过销毁 4,984.26 个 msETH/ETH 池 LP 代币,从池中移除了 959.71 msETH 和 4,036.22 ETH。
  • 他们再次向 Curve msETH/ETH 池 提供了 5,000 ETH 作为流动性,铸造了 11,192.69 个 LP 代币。
  • 销毁了 2,260.72 个 msETH/ETH LP 代币,以提取 6,830.50 ETH(这是一个 removeLiquidityOne 调用)。
  • 将 10,866.72 ETH 封装为 WETH。
  • Balancer 偿还 10,000 WETH 以返还闪电贷。
  • 保留了 866.55 WETH(约 160 万美元)和 959.71 msETH(约 180 万美元)作为利润。

重入发生在移除流动性和添加流动性操作之间。通常,池存款人应有权获得等于池代币总供应量与存款人提供的流动性所占分数之积的池代币。但是,由于重入错误,分配的池代币是使用燃烧前的余额计算的。这使得攻击者可以无限铸造池代币,从而对池的全部内容提出欺诈性索赔。

在撰写本文时,c0ffeebabe.eth 地址似乎是一位白帽,并且正在与 Curve 团队合作以追回资金(如链上消息中所示 此处此处)。该地址还参与了下面描述的 CRV/ETH 池漏洞,并且已返还了从中获得的收益。但是,该地址仍拥有从 msETH/ETH 池漏洞中获得的 msETH 和 ETH。

msETH/ETH Curve 池在事件发生时包含约 410 万美元的 TVL,并且基本上所有资金此后已被耗尽或以其他方式被用户移除。虽然紧急 DAO 无法采取任何行动来暂停池或影响用户资金,但它可以冻结对池的 CRV gauge 排放。预计很快会采取此操作。

alETH/ETH 池漏洞

漏洞交易

7 月 30 日 UTC 时间 15:34,发生了一次漏洞,从 Curve 池中耗尽了 alETH。攻击者保留了 7,258.70 ETH(约 1360 万美元)和 4,821.55 alETH(约 900 万美元)的利润。

来源: Phalcon Explorer

漏洞利用逻辑如下:

  • 攻击者从 Balancer 开设了一个 40,000 WETH 的闪电贷,并将所有 WETH 解包为 ETH。
  • 他们向 Curve alETH/ETH 池 提供了 20,000 ETH 作为流动性,并收到了 19,895.21 个 alETH-ETH LP 代币。
  • 通过销毁 19,895.21 个 alETH/ETH 池 LP 代币,从池中移除了 4,821.55 alETH 和 15,146.77 ETH。
  • 他们再次向 Curve alETH/ETH 池 提供了 20,000 ETH 作为流动性,铸造了 34,277.05 个 LP 代币。
  • 销毁了 15,910.04 个 alETH/ETH LP 代币,以提取 32,111.92 ETH(这是一个 removeLiquidityOne 调用)。
  • 将 47,258.70 ETH 封装为 WETH。
  • Balancer 偿还 40,000 WETH 以返还闪电贷。
  • 保留了 7,258.70 WETH(约 1360 万美元)和 4,821.55 alETH(约 900 万美元)作为利润。

重入发生在移除流动性和添加流动性操作之间。通常,池存款人应有权获得等于池代币总供应量与存款人提供的流动性所占分数之积的池代币。但是,由于重入错误,分配的池代币是使用燃烧前的余额计算的。这使得攻击者可以无限铸造池代币,从而对池的全部内容提出欺诈性索赔。

在撰写本文时,资金保存在 alETH Exploit 钱包地址中。

在漏洞利用之前,Alchemix 能够从池中提取 8,027.35 alETH(交易)。正如这篇 Twitter 帖子 中披露的那样,Alchemix 正在从其 AMO 中移除 5,000 ETH,但被攻击者抢先交易。这导致 alETH 的部分支持损失。

alETH/ETH Curve 池在事件发生时包含约 4600 万美元的 TVL,并且基本上所有资金此后已被耗尽或以其他方式被用户移除。虽然紧急 DAO 无法采取任何行动来暂停池或影响用户资金,但它可以冻结对池的 CRV gauge 排放。预计很快会采取此操作。

CRV/ETH 池漏洞

CRV/ETH 池涉及 2 笔漏洞利用交易(第二笔是白帽)。

漏洞交易 1

漏洞交易 2

漏洞利用 1

7 月 30 日 UTC 时间 19:08,发生了一次漏洞,从 Curve 池中耗尽了 CRV 和 ETH。攻击者保留了 7,193,401.77 CRV(攻击时约 510 万美元)和 7,680.49 WETH(约 1420 万美元)作为利润。

来源: Phalcon Explorer

漏洞利用逻辑如下:

  • 攻击者从 Balancer 开设了一个 10,000 WETH 的闪电贷,并将所有 WETH 解包为 ETH。
  • 他们向 Curve CRV/ETH 池提供了 400 ETH 作为流动性,并收到了 9,804.78 个 CRV/ETH LP 代币。
  • 将 500 ETH 兑换为 1,212,778.28 CRV。
  • 通过销毁 4,674.13 个 CRV/ETH LP 代币,从池中提取 517,589.04 CRV 和 203.26 ETH。
  • 提取 1,730,367.33 CRV,销毁 4,674.13 个 CRV/ETH LP 代币。
  • 将 1,730,367.33 CRV 兑换为 639.89 ETH。
  • 重复该过程,直到 CRV 从池中耗尽。
  • 保留了 7,193,401.77 CRV(攻击时约 510 万美元)和 7,680.49 WETH(约 1420 万美元)作为利润。

重入发生在移除流动性和添加流动性操作之间。通常,池存款人应有权获得等于池代币总供应量与存款人提供的流动性所占分数之积的池代币。但是,由于重入错误,分配的池代币是使用燃烧前的余额计算的。这使得攻击者可以无限铸造池代币,从而对池的全部内容提出欺诈性索赔。

此漏洞是独一无二的,因为除了“重入保护错误”漏洞(影响所有四个池)之外,还进行了套利漏洞利用。原因是 CRV-ETH 池是此事件中唯一被利用的非稳定池。

在撰写本文时,资金已转移到 CRV/ETH Exploit 钱包地址。

漏洞利用 2

7 月 30 日 UTC 时间 22:00,发生了第二次漏洞,耗尽了池中剩余的 2,879.65 ETH。这是 c0ffeebabe.eth 的白帽行为,所得款项此后不久已返还给 Curve 团队(交易)。

来源: Phalcon Explorer

漏洞利用逻辑如下:

  • 攻击者从 Balancer 开设了一个 100 WETH 的闪电贷。
  • 他们在 Uniswap 上将 70 WETH 兑换为 190,388.61 CRV。
  • 向池中存入 30,000 CRV。
  • 向 Curve 池所有者索取 1,493.16 CRV/ETH LP 代币的管理费。
  • 在池中将 160,388.61 CRV 兑换为 2,949.65 WETH。
  • 向 Curve 池所有者索取 83,647.01 CRV/ETH LP 代币的管理费。
  • Balancer 偿还 100 WETH 以返还闪电贷。
  • 从漏洞中保留了 2,879.65 ETH(约 540 万美元)。

在第一次漏洞利用之后,池的余额已损坏。它认为它包含 CRV 余额,而实际上所有 CRV 都在第一次攻击中被耗尽。通过存入一些 CRV 并调用 claim_admin_fees,可以同步池余额。黑客向池中捐赠了 CRV,同步了余额,然后将一些 CRV 兑换为大部分 ETH。

在撰写本文时,资金已在此 交易 中返还给 Curve 部署者地址。

CRV/ETH Curve 池在事件发生时包含约 4700 万美元的 TVL,并且大部分资金此后已被耗尽或用户移除。该池仍然包含一些 ETH,现有 LP 可以通过调用 remove_liquidity_one_coin 来提取。

虽然紧急 DAO 无法采取任何行动来暂停池或处理用户资金,但它可以冻结对池的 CRV gauge 排放。预计很快会采取此操作。

后续步骤

当前的后续步骤是停止向受影响池的 gauge 排放,并为 alETH、msETH 和 pETH 创建新的简单池。新池应与 WETH 或新的 ETH 池实现配对。CRV 已经有一个新的 Tricrypto 池 与 crvUSD 和 ETH 配对,该池不受重入错误的影响。

Curve 团队将继续探索所有途径以追回用户资金,并且有关情况的更新将在社交渠道(Twitter、Telegram 和 Discord)上发布。

  • 原文链接: hackmd.io/@LlamaRisk/BJz...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
LlamaRisk
LlamaRisk
江湖只有他的大名,没有他的介绍。