• 智能合约漏洞,价值 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) 项目发版前,需要向第三方专业的审计团队寻求技术帮助。

  • 相关阅读:
    css中5种属性选择器
    卡码网语言基础课 | 排队取奶茶
    vim以16进制打开和编辑文件
    MySQL向Es数据同步策略
    XML文档基础
    傻白入门芯片设计,IP, MCM, SiP, SoC 和 Chiplet的区别(二)
    二分图及其衍生
    【Flask基础】九,Flask--蓝图模块划分介绍(使用蓝图+不使用蓝图)
    【HarmonyOS】解决API6 WebView跳转外部浏览器问题、本地模拟器启动黑屏
    Android studio之编译提示Could not find :umeng-asms-v1.2.1
  • 原文地址:https://blog.csdn.net/weixin_28733483/article/details/133742055