当前位置: 首页 > news >正文

区块链TOP1重入漏洞之自我理解【原创】

by : 风之传说

最近在研究区块链方面的漏洞,智能合约top 1重入漏洞。在网上找了很多相关的文章,发现大部分都是通过代码进行分析。话说,我们不了解应用场景,只是了解漏洞成因,只知其原理不知其过程,不便于我们的漏洞理解。

在此之前,我们需要先了解一个东西,The DAO。"2016年6月18日被攻击前募集了$150M。攻击者 利用合约中的漏洞发动了Reentrancy攻击,获得了$60M。为了追回这部分资金,以太坊社区决定进行硬分叉,在新分支中回滚自攻击开始后的所有交易记录并修复合约漏洞,但因为此举违背了‘Code is law’精神,部分成员拒绝新分支,导致最终形成了两个分支。旧分支称为以太坊经典(Ethereum Classic/ETC),新分支为现行以太坊。攻击者最终离开以太坊经典,带走了数千万美元。"

 

以上新闻说明两个问题:

  1. 因为此漏洞,直接导致了以太坊硬分叉。(这个硬分叉什么意思呢?简单理解,就是一个树枝一分为二,你走你的,我走我的。另,你只需要了解,这个漏洞影响很大。)
  2. The DAO是一个募集资金的平台。(我们可以理解为,某某生病了,然后需要钱,然后众筹给你筹钱。这个很好理解)

技术细节

那么众筹就需要三方,付款方,公证人(平台),收款方。我们先进行简单了解。谈完了,背景,我们再来谈谈漏洞,先看一段:

 

 

大多数都没有进行注释,毕竟是新的编程语言,国内熟悉的比较少。我进行了注释。但是为了大家便于理解,我就重新解释一次。

假如账户有10个币,你要转9个出去。肯定是可以的,你要转11个,就不行。因为你没有11个。所以此处要转9个出去肯定是可以的。因为10>=9。最后一步就是减去你账户中的9个币了。此时账户里面只有1个币了。所以,各位看官肯定会说,这里没毛病啊。嗯,程序好像看似没毛病但是。看看黑客如何进行攻击的:

 

 

攻击者首先构造一个恶意合约MalloryMallory部署之后,攻击者调用withdraw函数向Mallory合约捐赠一点以太币。看似没什么问题。

withdraw函数中的msg.sender.call.value(amout)()执行之后,由于转账 操作特性 ,会在转账结束之后自动调用Mallory 的 fallback函数,于是再次调用 withdraw函数。因为此时credit中并未更新额度,所以依然可以正常取款,便陷入递 归循环,每次都提取DAO中的一部分以太币到Mallory合约中。

 

 

讲到这里,到底是哪里出了问题呢? 其实是msg.sender.call.value 这个调用出了问题。压根就不能这么调。 (所以后来出了一个什么气Gas?并且要求使用send() 和 transfer() 转币进行转账。扯远了,有空可以去了解一下)

 在这里,我们上面分析过了,我们是先进行转账再进行扣款的。那么这样有什么坏处呢?也就是说,如果在转账处一直循环卡住了,那么扣款就不会执行。也就是说,你可以一直转账下去。

 

举个流程例子:

正常情况下

 

 

不正常情况下

 

 

重复此操作,理论上能够将The DAO的以太币全部提取到Mallory。

最后肯定还有人会说,钱怎么转出来啊?别忘了,该合约是由你创建的,拿一般的众筹平台去了解,也就是说,众筹的钱最后都给你,因为是你发起的众筹。所以你还担心转不出钱来?所以,应用到实际场景,就能理解了吧。

注:由于刚接触区块链这一块,以上代码注释如果有错误欢迎指正。

转载于:https://www.cnblogs.com/w-i-n-d/p/9438385.html

相关文章:

  • 阶梯Nim问题
  • python中的函数
  • 织梦dedecms教程简单实现防采集最有效的2个方法
  • mysql清空表数据后如何让自增ID仍从1开始
  • 一、开发基础(4)
  • Vue学习笔记之Webpack介绍
  • 第一次python词云尝试
  • 论优越感
  • 【院校巡礼】em兰州大学/em - 叁研良语的文章 - 知乎
  • μC/OS-III 概述
  • centos6.5使用yum安装redis 设置开机启动
  • 初识设计模式(建造者模式)
  • 支付系统整体架构
  • Sketch 介绍
  • 简单的自创线程池
  • 「面试题」如何实现一个圣杯布局?
  • iOS | NSProxy
  • orm2 中文文档 3.1 模型属性
  • Python打包系统简单入门
  • springboot_database项目介绍
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • use Google search engine
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对象管理器(defineProperty)学习笔记
  • 二维平面内的碰撞检测【一】
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 再次简单明了总结flex布局,一看就懂...
  • No resource identifier found for attribute,RxJava之zip操作符
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Prometheus VS InfluxDB
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云ACE认证之理解CDN技术
  • 昨天1024程序员节,我故意写了个死循环~
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #AngularJS#$sce.trustAsResourceUrl
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (Java)【深基9.例1】选举学生会
  • (论文阅读11/100)Fast R-CNN
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net反混淆脱壳工具de4dot的使用
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [AIGC] Redis基础命令集详细介绍