发现Compound的第二个严重漏洞
本文转自 发现Compound的第二个严重漏洞 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn)
这个漏洞原作者在2022年02月23日已经发布过,由于内容比较敏感,发布后没多久就将违章的主要内容都删除了。然而,这个漏洞还是被利用了,March-15-2022 06:28:40 PM +8 UTC,Hundred Finance遭受攻击,黑客获利2363 ETH(价值超4000万美金)。Hundred Finance代码源自Compound,文中有在rinkeby上模拟攻击的交易,可以自行核对时间。
前置条件
- 开通了多个代币的市场
- 代币市场中有ERC777
利用过程
- 攻击者在多个市场中存入资产,获得份额凭证。
- 攻击者向ERC777的代币市场发起借款,并在借款转账时,触发事先准备好的回调,在回调中退出这个发生了借款的市场。
- 攻击者赎回所有可以赎回的份额,由于借贷市场已经退出,因此不会在赎回时扣除用户的借款,因此可以正常退出,从而盗走借款。
攻击原理
- 在borrowFresh()函数中,在完成借款的各项检查和准备后,会给用户转账,并更新用户的借款账本。
- 给用户转账doTransferOut()在更新用户账本之前,这使得用户可以有机会通过转账触发回调。
- 攻击者在回调中可以调用comptroller的exitMarket()函数退出借款的市场,由于此时用户的借款账本还没有更新,因此exitMarket()中检查用户是否可以退出该市场的逻辑会验证通过,攻击者可以成功退出市场。
- 攻击者退出借款市场后,再进行其他资产赎回时,由于发生借款的市场已经被退出,因此不会在赎回时计算这笔借款,从而可以成功赎回资产。
- 通过上述方法,攻击者可以成功的将借款偷走。
相关代码
给借款人转账,然后更新用户账本
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。
总结
- 使用重入锁并不能解决所有问题,可以考虑使用checks-effects-interactions模式,另外,转账最好放在一个完整逻辑的最开始或者最结尾,避免状态不一致。
- 这个取名safeTransferETH()的函数,并不会给大家带来安全,相反留下了被攻击的可能。因此,应该慎用TransferHelper.safeTransferETH()方法,另外,也建议在safeTransferETH()的实现里面,将gas限制为5000,这样既可以解决往代理合约转账的问题,也会让攻击难以发生。
发现Compound的第二个严重漏洞的更多相关文章
- Burp Suite Pro 2021.10 Full (macOS, Linux) -- 查找、发现和利用漏洞
申明:底层组件来自网络论坛或开源社区的分享,本站所有软件免费分享,仅供学习和测试使用,严禁用于任何商业用途!!! 请访问原文链接:https://sysin.cn/blog/burp-suite-pr ...
- Weblogic反序列化漏洞补丁更新解决方案
Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...
- 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)
模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书) [美]Sutton, M.Greene, A.Amini, P. 著 段念赵勇译 ISBN 978-7-121-21083-9 2013年 ...
- Nginx文件类型错误解析漏洞--攻击演练
今天看书看到其中提到的一个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置里 cgi.fix_pathinfo=1 那么就会产生一个漏洞.这个配置默认是1的,设为0会导致很多MVC框架(如T ...
- 程序世界系列之-struts2安全漏洞引发的安全杂谈(上)
目录: 1.讨论关于struts 安全问题. 2.黑客文化. 3.如何降低安全漏洞的出现. 4.忠告建议. 题记: 这篇文章本来很早应该和大家见面的,中间由于个人原因调整了系列文章发布时间,实属罪过. ...
- 《Nginx文件类型错误解析漏洞--攻击演练》 (转)
今天看书看到其中提到的一个漏洞,那就是Nginx+PHP的服务器中,如果PHP的配置里 cgi.fix_pathinfo=1 那么就会产生一个漏洞.这个配置默认是1的,设为0会导致很多MVC框架(如T ...
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...
- CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 一.前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190 ...
- 代码审计之XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)
0x00 前言 这段时间就一直在搞代码审计了.针对自己的审计方法做一下总结,记录一下步骤. 审计没他,基础要牢,思路要清晰,姿势要多且正. 下面是自己审计的步骤,正在逐步调整,寻求效率最高. 0x01 ...
随机推荐
- 部署YUM仓库及NFS共享服务
部署YUM仓库及NFS共享服务 目录 部署YUM仓库及NFS共享服务 一.YUM仓库服务 1. YUM概述 2. 部署YUM软件仓库 (1)准备安装源 ①YUM仓库的种类 ②RPM软件包的来源 ③构建 ...
- Hadoop完全分布式的配置
选取机器sam01作为主节点,并进行分布式文件的配置 1.进入Hadoop配置文件路径/usr/local/hadoop/etc/hadoop(这里我把Hadoop安装在/usr/local目录下) ...
- Solution -「多校联训」数学考试
\(\mathcal{Description}\) Link. 给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...
- 记一次 .NET 某供应链WEB网站 CPU 爆高事故分析
一:背景 1. 讲故事 年前有位朋友加微信求助,说他的程序出现了偶发性CPU爆高,寻求如何解决,截图如下: 我建议朋友用 procdump 在 cpu 高的时候连抓两个dump,这样分析起来比较稳健, ...
- The POM for com.alibaba:druid:jar:1.2.6 is invalid, transitive dependencies (if any) will not be available
开发环境 IDEA2020.3, jdk1.8.0_231 问题描述 开发中引入了druid-spring-boot-starter最新版本1.2.6,项目install时的时候一直出现警告 The ...
- MyBatis分页插件PageHelper使用方法
1.导入相关依赖坐标 <!-- MyBatis分页插件 --> <dependency> <groupId>com.github.pagehelper</gr ...
- schtasks
schtasks create 创建新的计划任务. 语法 schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier ...
- 如何在win server中更改服务器密码长度最小值
转至:https://jingyan.baidu.com/article/3aed632e65c7843111809122.html windows server 2008是一种服务器的操作系统,有较 ...
- 常见三种存储方式DAS、NAS、SAN的架构及比较
转至:https://blog.csdn.net/shipeng1022/article/details/72862367 随着主机.磁盘.网络等技术的发展,数据存储的方式和架构也在一直不停改变,本文 ...
- Anaconda Navigator:this application failed to start because it could not find or load ...windows in
原因:在Anaconda的根目录下,有一个叫 qt.conf的文件,用记事本或者Notepad打开 该问题是这些路径错误导致的(比如你把Anaconda挪动了位置,导致这里边的路径还是原来的位置). ...