本文转自 发现Compound的第二个严重漏洞 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn)

这个漏洞原作者在2022年02月23日已经发布过,由于内容比较敏感,发布后没多久就将违章的主要内容都删除了。然而,这个漏洞还是被利用了,March-15-2022 06:28:40 PM +8 UTC,Hundred Finance遭受攻击,黑客获利2363 ETH(价值超4000万美金)。Hundred Finance代码源自Compound,文中有在rinkeby上模拟攻击的交易,可以自行核对时间。

前置条件

  1. 开通了多个代币的市场
  2. 代币市场中有ERC777

利用过程

  1. 攻击者在多个市场中存入资产,获得份额凭证。
  2. 攻击者向ERC777的代币市场发起借款,并在借款转账时,触发事先准备好的回调,在回调中退出这个发生了借款的市场。
  3. 攻击者赎回所有可以赎回的份额,由于借贷市场已经退出,因此不会在赎回时扣除用户的借款,因此可以正常退出,从而盗走借款。

攻击原理

  1. 在borrowFresh()函数中,在完成借款的各项检查和准备后,会给用户转账,并更新用户的借款账本。
  2. 给用户转账doTransferOut()在更新用户账本之前,这使得用户可以有机会通过转账触发回调。
  3. 攻击者在回调中可以调用comptroller的exitMarket()函数退出借款的市场,由于此时用户的借款账本还没有更新,因此exitMarket()中检查用户是否可以退出该市场的逻辑会验证通过,攻击者可以成功退出市场。
  4. 攻击者退出借款市场后,再进行其他资产赎回时,由于发生借款的市场已经被退出,因此不会在赎回时计算这笔借款,从而可以成功赎回资产。
  5. 通过上述方法,攻击者可以成功的将借款偷走。

相关代码

给借款人转账,然后更新用户账本
https://github.com/compound-finance/compound-protocol/blob/master/contracts/CToken.sol#L786

退出市场,检查用户是否可以退出

https://github.com/compound-finance/compound-protocol/blob/master/contracts/ComptrollerG7.sol#L175

以下是在rinkeby上模拟攻击的相关交易

https://rinkeby.etherscan.io/tx/0x944f46be4591dbed7d855e99b5707557fd074303ff9c1935b2bc35c5e61d2eda

可以看出,攻击合约按照前面描述的流程,完成攻击后,合约内的资产多了800USDT。

漏洞特性

根据上面的分析可知,只要代币市场中有ERC777存在,就具备了攻击的条件!
另外,有很多项目是fork自Compound的,如果在fork项目时,将转eth的代码改用当前应用较广泛的TransferHelper.safeTransferETH(),则会导致这种攻击的发生。因为TransferHelper.safeTransferETH()通常的实现没有限制gas。

总结

  1. 使用重入锁并不能解决所有问题,可以考虑使用checks-effects-interactions模式,另外,转账最好放在一个完整逻辑的最开始或者最结尾,避免状态不一致。
  2. 这个取名safeTransferETH()的函数,并不会给大家带来安全,相反留下了被攻击的可能。因此,应该慎用TransferHelper.safeTransferETH()方法,另外,也建议在safeTransferETH()的实现里面,将gas限制为5000,这样既可以解决往代理合约转账的问题,也会让攻击难以发生。

发现Compound的第二个严重漏洞的更多相关文章

  1. Burp Suite Pro 2021.10 Full (macOS, Linux) -- 查找、发现和利用漏洞

    申明:底层组件来自网络论坛或开源社区的分享,本站所有软件免费分享,仅供学习和测试使用,严禁用于任何商业用途!!! 请访问原文链接:https://sysin.cn/blog/burp-suite-pr ...

  2. Weblogic反序列化漏洞补丁更新解决方案

    Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...

  3. 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)

    模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书) [美]Sutton, M.Greene, A.Amini, P. 著 段念赵勇译 ISBN 978-7-121-21083-9 2013年 ...

  4. Nginx文件类型错误解析漏洞--攻击演练

    今天看书看到其中提到的一个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置里 cgi.fix_pathinfo=1 那么就会产生一个漏洞.这个配置默认是1的,设为0会导致很多MVC框架(如T ...

  5. 程序世界系列之-struts2安全漏洞引发的安全杂谈(上)

    目录: 1.讨论关于struts 安全问题. 2.黑客文化. 3.如何降低安全漏洞的出现. 4.忠告建议. 题记: 这篇文章本来很早应该和大家见面的,中间由于个人原因调整了系列文章发布时间,实属罪过. ...

  6. 《Nginx文件类型错误解析漏洞--攻击演练》 (转)

    今天看书看到其中提到的一个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置里 cgi.fix_pathinfo=1 那么就会产生一个漏洞.这个配置默认是1的,设为0会导致很多MVC框架(如T ...

  7. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  8. CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 一.前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190 ...

  9. 代码审计之XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)

    0x00 前言 这段时间就一直在搞代码审计了.针对自己的审计方法做一下总结,记录一下步骤. 审计没他,基础要牢,思路要清晰,姿势要多且正. 下面是自己审计的步骤,正在逐步调整,寻求效率最高. 0x01 ...

随机推荐

  1. MySQL 索引、事务与存储引擎

               MySQL 索引.事务与存储引擎 1.索引 2.事务 3.存储引擎 1.索引: 索引的概念 : 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 ...

  2. 二叉树的基本操作(C语言版)

    今天走进数据结构之二叉树 二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆.二叉树是链式存储结构,用的是二叉 ...

  3. linux中安装swoole框架

    简单说说如何在linux中安装swoole框架. 具体的安装步骤其实和安装php源码类似. 下载源码 => 执行configure => make => make install 安 ...

  4. sqli-labs 1-22关

    Page-1(Basic Challenges) Less 1-4 Less-(1-4)是最常规的SQL查询,分别采用单引号闭合.无引号.括号单引号闭合.括号双引号闭合,没有过滤:可以采用and '1 ...

  5. .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

  6. Python基础—编码(Day2)

    一.字符编码 1.ASCII码:包含英文.数字.特殊字符,8位=1字节byte =1个字符,如: 0010 1010 ASCII码表里的字符总共有256个,前128个为常用的字符如运算符,后128个称 ...

  7. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  8. windows痕迹清理的基本思路和思考逻辑

    1.痕迹清理的基本概念 在渗透测试的过程结束后清理自己在从开始接触到目标计算机是开始所有操作的痕迹 2.痕迹清理的目的 为下一步的渗透测试拖延时间 提高隐蔽性 所有的痕迹清理都不是绝对的,只要和计算机 ...

  9. RFC2889MAC地址学习速率——网络测试仪实操

    一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...

  10. 【C# 线程】WaitHandle类

    理论 Windows的线程同步方式可分为2种,用户模式构造和内核模式构造.内核模式构造:是由Windows系统本身使用,内核对象进行调度协助的.内核对象是系统地址空间中的一个内存块,由系统创建维护. ...