By:小白@慢雾安全团队
背景概述
上周写了智能合约安全审计入门篇——重入漏洞,这次我们接着来说一个同样很经典的漏洞——?溢出漏洞。
前置知识
首先我们还是先来看看溢出是什么:
算术溢出或简称为溢出分为两种:上溢和下溢。所谓上溢是指在运行单项数值计算时,当计算产生出来的结果非常大,大于寄存器或存储器所能存储或表示的能力限制就会产生上溢,例如在solidity中,uint8所能表示的范围是0-255这256个数,当使用uint8类型在实际运算中计算255+1是会出现上溢的,这样计算出来的结果为0也就是uint8类型可表示的最小值。同样的,下溢就是当计算产生出来的结果非常小,小于寄存器或存储器所能存储或表示的能力限制就会产生下溢。例如在Solidity中,当使用uint8类型计算0-1时就会产生下溢,这样计算出来的值为255也就是uint8类型可表示的最大值。
民盟中央建议加速元宇宙科普和立法:3月4日消息,民盟中央已起草了《关于“元宇宙”技术发展的提案》,并将提交全国政协十三届五次会议。在提案中,民盟中央建议,在科普层面需加速知识传播,法律层面则需加快立法步伐。民盟中央拟提交的提案指出,目前,在新兴网络层面,相关政策法规相对缺失。“元宇宙”在未来将会带动形成全新的网络形态,当遇到突发舆情,全虚拟的环境、场景将更难进行源头追踪、问题疏导。因此建议应尽早加快立法研究,尽快形成与技术、市场发展相适应的治理模式和法律基础,全面提升我国社会治理的水平。建议组织相关部门,针对“元宇宙”相关需求、风险进行立法研究,并尽快发布。此前消息,民进中央拟向全国政协十三届五次会议提交《关于积极稳妥推进元宇宙技术和产业发展的提案》。建议推进元宇宙技术产业发展,建立相关监管治理体系。(华夏时报)[2022/3/4 13:37:12]
如果一个合约有溢出漏洞的话会导致计算的实际结果和预期的结果产生非常大的差异,这样轻则会影响合约的正常逻辑,重则会导致合约中的资金丢失。但是溢出漏洞是存在版本限制的,在Solidity<0
声音 | CNBC主持人:加密货币最大的缺点之一就是难以向外行快速科普:CNBC主持人Ran NeuNer近期发推称,加密货币最大的缺点之一就是很难向外行快速解释。当人们要求我向他们解释比特币时,我知道他们至少需要一个小时才能真正理解。[2019/9/10]
functionincreaseLockTime(uint_secondsToIncrease)public{lockTime+=_secondsToIncrease;}
functionwithdraw()public{require(balances>0,"Insufficientfunds");require(block
}
漏洞分析
动态 | 浙江卫视节目科普支付宝区块链防伪溯源产品:昨日,在浙江卫视播出的科普综艺栏目《智造将来》现场,支付宝首次展示了支付宝区块链防伪溯源产品,以接地气的方式公开向大众展示区块链在生活中的应用。[2019/3/4]
我们可以看到,TimeLock合约充当了时间保险库。用户可以将代币通过deposit函数存入该合约并锁定,且至少一周内不能提现。当然用户也可以通过increaseLockTime函数来增加存储时间,用户在设定的存储期限到期前是无法提取TimeLock合约中锁定的代币的。首先我们发现这个合约中的increaseLockTime函数和deposit函数具有运算功能,并且合约支持的版本是:0
fallback()externalpayable{}
科普时报:区块链与云计算长期发展目标不谋而合:据《科普时报》今日报道,区块链与云计算两项技术的结合,从宏观上来说,一方面,利用云计算已有的基础服务设施或根据实际需求做相应改变,实现开发应用流程加速,满足未来区块链生态系统中初创企业、学术机构、开源机构、联盟和金融等机构对区块链应用的需求。另一方面,对于云计算来说,“可信、可靠、可控制”被认为是云计算发展必须要翻越的“三座山”,而区块链技术以去中心化、匿名性,以及数据不可篡改为主要特征,与云计算长期发展目标不谋而合。[2018/5/4]
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且合约中存在算术运算的我们就可以认为这个合约是可能存在溢出风险的,在实际审计中还要结合实际代码来看。
DeFi之道讯,1月2日,a16z合伙人ChrisDixon发推表示,NFT让艺术、音乐、写作、游戏和其他创意内容更加丰富,而不是更加稀缺。很多NFT的批评者声称,NFT限制了对创意内容的访问.
金融巨头高盛表示,加密技术将成为虚拟世界的核心,因为它将允许人们在不同的虚拟世界中安全地拥有数字物品.
CoinbaseVentures的AroundTheBlock展示了加密货币的主要趋势。作者:JustinMart和ConnorDempsey DAO之于资本,就像互联网之于通讯.
来源:半月谈 评论员?、科幻作家:韩松我一九九六年去美国的时候,在美国科幻书店买书时,店员向我推荐《雪崩》,说这是美国最火的科幻书,描写了人类的未来.
国内首个元宇宙产品即将接受用户“考验”。12月21日,百度宣布首个国产元宇宙产品“希壤”正式开放定向内测,用户可凭邀请码可以进入希壤空间进行超前体验,首期上线的功能包括虚拟空间定制、全真人机互动.
——元宇宙的突然火爆引发了大众的参与和学习,于是我准备从宏观角度出发,逐步为大家分享关于这方面的内容。元宇宙的火爆恰逢其时,近30年迭代铸就今日辉煌.