智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析

智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析

7 月 30 日,因为 Vyper 部分版本中的漏洞,导致 Curve、JPEG’d 等项目陆续受到攻击,损失总计超过 5200 万美元。

Safful 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。

一、 事件分析

以 JPEG’d 被攻击为例:
攻击者地址:0x6ec21d1868743a44318c3c259a6d4953f9978538
攻击者合约:0x9420F8821aB4609Ad9FA514f8D2F5344C3c0A6Ab
攻击交易:0xa84aa065ce61dbb1eb50ab6ae67fc31a9da50dd2c74eefd561661bfce2f1620c
(1)攻击者(0x6ec21d18)创建 0x466B85B4 的合约,通过闪电贷向 [Balancer: Vault]借了 80,000 枚 WETH。
image.png
(2)攻击者(0x6ec21d18)向 pETH-ETH-f(0x9848482d)流动性池中添加了 40,000 枚 WETH,获得 32,431 枚 pETH。
image.png
(3)随后攻击者(0x6ec21d18)从 pETH-ETH-f(0x9848482d)流动性池中重复地移除流动性。
image.png
(4)最终,攻击者(0x6ec21d18)获得 86,106 枚 WETH,归还闪电贷后,获利 6,106 枚 WETH 离场。

二、漏洞分析

(1)该攻击是典型的重入攻击。对遭受攻击的项目合约进行字节码反编译,我们从下图可以发现:add_liquidity 和 remove_liquidity 两个函数在进行校验存储槽值时,所要验证的存储槽是不一样的。使用不同的存储槽,重入锁可能会失效。此时,怀疑是 Vyper 底层设计漏洞。
image.png
(2)结合 Curve 官方的推文所说。最终,定位是 Vyper 版本漏洞。该漏洞存在于 0.2.15、0.2.16、0.3.0 版本中,在重入锁设计方面存在缺陷。我们对比 0.2.15 之前的 0.2.14 以及 0.3.0 之后的 0.3.1 版本,发现这部分代码在不断更新中,老的 0.2.14 和交心的 0.3.1 版本没有这个问题。
image.png
image.png
(3)在 Vyper 对应的重入锁相关设置文件 data_positions.py 中,storage_slot 的值会被覆盖。在 ret 中,第一次获取锁的 slot 为 0,然后再次调用函数时会将锁的 slot 加 1,此时的重入锁会失效。
image.png
漏洞总结:本次攻击事件根本原因是 Vyper 的 0.2.15、0.2.16、0.3.0 版本的重入锁相关设计不合理,并且没有进行足够全面的功能测试。导致后期使用这些版本的项目中重入锁失效,最终遭受了黑客攻击。

三、安全建议

对于本次攻击事件,开发人员在日常开发中应当采取有以下的安全措施:
(1) 项目方需保障功能设计合理并对代码进行全面测试,防止遗漏某些功能的测试。
(2) 项目发版前,需要向第三方专业的审计团队寻求技术帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Brownie 中部署和调用智能合约原理,可以分为以下几个步骤: 1. 编写智能合约代码:使用 Solidity 或 Vyper 编写智能合约代码,定义智能合约的数据结构和函数。 2. 编译智能合约代码:使用 Brownie 提供的编译器,将智能合约代码编译成字节码和 ABI(Application Binary Interface)。 3. 部署智能合约:使用 Brownie 提供的部署工具,将编译好的字节码和 ABI 部署到区块链上,生成智能合约实例。 4. 调用智能合约:使用 Brownie 提供的交互工具,调用智能合约的函数,触发智能合约的逻辑。 具体来说,部署智能合约的流程如下: 1. 在项目目录下创建一个智能合约文件,比如 MyContract.sol,使用 Solidity 或 Vyper 编写智能合约代码。 2. 在项目目录下创建一个 deploy.py 文件,用于部署智能合约。 3. 在 deploy.py 文件中,导入 Brownie 和智能合约代码: ```python from brownie import MyContract ``` 4. 在 deploy.py 文件中,编写部署智能合约的代码: ```python def main(): # 部署智能合约 my_contract = MyContract.deploy({'from': accounts[0]}) ``` 5. 在命令行中执行以下命令,部署智能合约: ```shell brownie run deploy.py --network <network-name> ``` 其中,`<network-name>` 是区块链网络的名称,比如 `ropsten` 或 `mainnet`。 调用智能合约的流程如下: 1. 在项目目录下创建一个交互文件,比如 interact.py,用于调用智能合约。 2. 在 interact.py 文件中,导入 Brownie 和智能合约实例: ```python from brownie import MyContract my_contract = MyContract.at(<contract-address>) ``` 其中,`<contract-address>` 是智能合约区块链上的地址。 3. 在 interact.py 文件中,编写调用智能合约的代码: ```python def main(): # 调用智能合约 result = my_contract.my_function() ``` 4. 在命令行中执行以下命令,调用智能合约: ```shell brownie run interact.py --network <network-name> ``` 注意:在调用智能合约之前,需要先在 Brownie 中导入区块链账户,以便进行交互。可以使用以下命令导入账户: ```shell brownie accounts import <private-key> ``` 其中,`<private-key>` 是账户的私钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值