-
-
[原创]以太坊"伊斯坦布尔"硬分叉以及重入攻击的防护
-
发表于:
2019-11-4 14:29
27961
-
[原创]以太坊"伊斯坦布尔"硬分叉以及重入攻击的防护
首先感谢远在珠海辛勤工作的老婆的支持。
这篇文,主要是将最近所学以及实时现状进行总结和分析,全文分三个部分来写,希望路过的大佬们不吝啬指点一番,那就是获益匪浅了。
在9月30号的时候以太坊测试链上"伊斯坦布尔"已经完成分叉,有消息称"伊斯坦布尔"硬分叉在以太坊正式链上将在12月4号进行分叉。
在"伊斯坦布尔"硬分叉中EIP 1884将进行实现。
在EIP 1884中
这里的影响只提及安全影响,和我们的主题相关,重入漏洞使用的transfer以及send,被推荐的安全函数,他们的建立前提是:假设gas不改变。一旦gas改变,那么就具备了其相关的安全性。transfer以及send被限制最大只能使用2300gas,这是发送一次日志的使用量,但是由于EIP 1884导致fallback gas使用量增加,所以transfer函数以及send函数出现了问题。
"伊斯坦布尔"的前称为"君士坦丁堡"。前一次硬分叉命名为"君士坦丁堡",这一次的硬分叉命名为"伊斯坦布尔"。1923年土耳其共和国初建时为首都(独立战争期间迁都安卡拉),伊斯坦布尔才成为国际上的正式名称。
整个过程就是:
拜占庭———君士坦丁堡——伊斯坦布尔
这里将重入漏洞进行复现以及利用。
这个网上有很多,大家可以去看一下,这里简单的说一下,就是通过递归,利用call.value gas使用无限制将币进行转移。
首先准备存在漏洞的sol
在大佬的源码上我做了一些精简,只为了能更好的复现漏洞。大佬的地址之后附在文末。
这个是漏洞源码
在withdraw这个函数中出现了重入漏洞的问题。
准备一个利用代码,利用的原理就是在使用call.value进行转账的时候,如果转账的是一个合约账户的话,那么就会调用合约账户的fallback函数。
所以现在的逻辑就是需要一个有fallback函数,并且需要再fallback里做文章。
首先用户存币
然后攻击者创建合约并且给合约币
然后设置目标合约地址:
设置币值:
成功盗币
由于该漏洞的主要利用就是因为call.value的gas值没有做限制,所以之前是针对此出现了transfer以及send进行防护,而且被广为推荐。但是由于现在gas使用值改变所以这两个函数将不再适用。
除了因为call.value gas使用无限制的原因意外,出现漏洞的最主要原因是因为逻辑错误以及判断不够完整而导致的。
出现漏洞的地方一般都是先转账,然后再进行数值的减少。这里的逻辑问题就会导致先转了账,利用递归不执行数值减少的代码,从而导致盗币。那么反过来说就可以先进行数值的增减然后再进行转账操作。
但是这样子的逻辑还有一个问题就是如果转账失败的话,没有做处理就会导致数值减少但是没有真正转账。
修改之后的源码
进行重入攻击的测试:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-11-4 14:54
被王嘟嘟编辑
,原因: