By:小白@慢雾安全团队
背景概述
上周写了智能合约安全审计入门篇——重入漏洞,这次我们接着来说一个同样很经典的漏洞——?溢出漏洞。
前置知识
首先我们还是先来看看溢出是什么:
算术溢出或简称为溢出分为两种:上溢和下溢。所谓上溢是指在运行单项数值计算时,当计算产生出来的结果非常大,大于寄存器或存储器所能存储或表示的能力限制就会产生上溢,例如在solidity中,uint8所能表示的范围是0-255这256个数,当使用uint8类型在实际运算中计算255+1是会出现上溢的,这样计算出来的结果为0也就是uint8类型可表示的最小值。同样的,下溢就是当计算产生出来的结果非常小,小于寄存器或存储器所能存储或表示的能力限制就会产生下溢。例如在Solidity中,当使用uint8类型计算0-1时就会产生下溢,这样计算出来的值为255也就是uint8类型可表示的最大值。
徐明星新书《趣说金融史》正式发布 科普金融发展之道:金色财经现场报道,9月23日,欧科云链创始人徐明星携手著名财经作家李霁月、行业观察者顾泽辉力作《趣说金融史》一书,跨越5000年金融历史,重读金钱故事,并预测新的金融时代。该书由中信出版社出版,将于近期正式发售。据了解,本书可以更好地呈现金融的起源与发展,帮助人们理解货币、金融与未来经济。作为区块链行业领军企业——欧科云链的创始人,徐明星深知技术探索对经济社会的重要推动作用,他曾先后出版过《图说区块链》、《区块链:重塑经济与世界》、《通证经济》、《链与未来》等行业权威著作,解读区块链等新型技术的推动下,金融与社会的升级之道,对经济社会发展做出了重大贡献。其中,《区块链:重塑经济与世界》曾作为新中国70周年重点推荐图书之一被相关书店推荐。[2021/9/23 17:00:57]
如果一个合约有溢出漏洞的话会导致计算的实际结果和预期的结果产生非常大的差异,这样轻则会影响合约的正常逻辑,重则会导致合约中的资金丢失。但是溢出漏洞是存在版本限制的,在Solidity<0
美国说唱歌手Megan Thee Stallion与Cash App合作发布比特币科普视频:美国说唱歌手Megan Thee Stallion与由Square开发的移动支付服务Cash App合作发布了一段名为“Bitcoin for Hotties”的视频。该视频从她的角度解释了什么是比特币,为什么比特币有价值等内容。Megan Thee Stallion在Instagram上拥有超过2410万粉丝,在 Twitter上拥有640万粉丝。(Bitcoin News)[2021/8/8 1:41:10]
functionincreaseLockTime(uint_secondsToIncrease)public{lockTime+=_secondsToIncrease;}
人大附中物理老师李永乐科普拜占庭将军问题和区块链:5月14日,人大附中物理老师、科普视频网红李永乐在其公众号发布视频《拜占庭将军问题是什么?区块链如何防范恶意节点?》。李永乐老师在视频中对拜占庭将军问题和区块链进行了讲解,他表示,拜占庭将军问题本质上指的是,在分布式计算机网络中,如果存在故障和恶意节点,是否能够保持正常节点的网络一致性问题。在近40年的时间里,人们提出了许多方案解决这一问题,称为拜占庭容错法。例如兰波特自己提出了口头协议、书面协议法,后来有人提出了实用拜占庭容错PBFT算法,在2008年,中本聪发明比特币后,人们又设想了通过区块链的方法解决这一问题。区块链通过算力证明来保持账本的一致性,也就是必须计算数学题,才能得到记账的权力,其他人对这个记账结果进行验证,如果是对的,就认可你的结果。与拜占庭问题比起来,就增加了叛徒的成本。[2020/5/14]
functionwithdraw()public{require(balances>0,"Insufficientfunds");require(block
声音 | CNBC主持人:加密货币最大的缺点之一就是难以向外行快速科普:CNBC主持人Ran NeuNer近期发推称,加密货币最大的缺点之一就是很难向外行快速解释。当人们要求我向他们解释比特币时,我知道他们至少需要一个小时才能真正理解。[2019/9/10]
}
漏洞分析
我们可以看到,TimeLock合约充当了时间保险库。用户可以将代币通过deposit函数存入该合约并锁定,且至少一周内不能提现。当然用户也可以通过increaseLockTime函数来增加存储时间,用户在设定的存储期限到期前是无法提取TimeLock合约中锁定的代币的。首先我们发现这个合约中的increaseLockTime函数和deposit函数具有运算功能,并且合约支持的版本是:0
fallback()externalpayable{}
functionattack()publicpayable{timeLock
}
这里我们将使用Attack攻击合约先存入以太后利用合约的溢出漏洞在存储未到期的情况下提取我们在刚刚TimeLock合约中存入并锁定的以太:
1.首先部署TimeLock合约;
2.再部署Attack合约并在构造函数中传入TimeLock合约的地址;
3.调用Attack.attack函数,Attack.attack又调用TimeLock.deposit函数向TimeLock合约中存入一个以太,之后Attack.attack又调用TimeLock.increaseLockTime函数并传入uint类型可表示的最大值加1再减去当前TimeLock合约中记录的锁定时间。此时TimeLock.increaseLockTime函数中的lockTime的计算结果为2^256这个值,在uint256类型中2^256这个数存在上溢所以计算结果为2^256=0此时我们刚刚存入TimeLock合约中的一个以太的锁定时间就变为0;
4.这时Attack.attack再调用TimeLock.withdraw函数将成功通过block.timestamp>lockTime这项检查让我们能够在存储时间未到期的情况下成功提前取出我们刚刚在TimeLock合约中存入并锁定的那个以太。
下面是攻击流程图:
修复建议
到这里相信大家对溢出漏洞都有自己的理解了,那么下面我们就以开发者和审计者的角度来分析如何预防溢出漏洞和如何快速找出溢出漏洞:
作为开发者
1.使用SafeMath来防止溢出;
2.使用Solidity0.8及以上版本来开发合约并慎用unchecked因为在unchecked修饰的代码块里面是不会对参数进行溢出检查的;
3.需要慎用变量类型强制转换,例如将uint256类型的参数强转为uint8类型由于两种类型的取值范围不同也可能会导致溢出。
作为审计者
1.首先查看合约版本是否在Solidity0.8版本以下或者是否存在unchecked修饰的代码块,如果存在则优先检查参数的溢出可能并确定影响范围;
2.如果合约版本在Solidity0.8版本以下则需要查看合约是否引用了SafeMath;
3.如果使用了SafeMath我们需要注意合约中有没有强制类型转换,如果有的话则可能会存在溢出的风险;
4.如果没有使用SafeMath且合约中存在算术运算的我们就可以认为这个合约是可能存在溢出风险的,在实际审计中还要结合实际代码来看。
12月26日-27日,2021CCF中国区块链技术大会在海南海口举办,本次会议由中国计算机学会主办,中国计算机学会区块链专业委员会、海南大学承办,中科国鼎数据科学研究院协办.
文章源自元宇宙见闻 编辑|Mamie 随着3月Roblox上市,2021年无疑成为了元宇宙元年,随着热度的飙升,12月19日,元宇宙登上了著名综艺节目《天天向上》的舞台,成为了当期的核心议题.
原文:秉烛的夜谈 原文作者:吴桐、王龙 北京时间12月8日23时,美国众议院金融服务委员会在国会山举行了“数字资产和金融的未来:了解美国金融创新的挑战和利益”为题的听证会.
——元宇宙的突然火爆引发了大众的参与和学习,于是我准备从宏观角度出发,逐步为大家分享关于这方面的内容。 元宇宙因科技的加速而崛起,却因人类的贪婪而放缓.
来源:财联社|区块链日报 记者董宇佳 B站的“元宇宙”梦有了实质性进展,其被曝正在测试元宇宙相关业务的“高能链”.
原文作者|?JustinMart,ConnorDempsey原文标题|《DAO:可以重新连接世界的社交网络》 翻译编辑|白泽研究院 互联网为通信所做,而DAO可以为资本所用.