By:小白@慢雾安全团队
背景概述
上周写了智能合约安全审计入门篇——重入漏洞,这次我们接着来说一个同样很经典的漏洞——?溢出漏洞。
前置知识
首先我们还是先来看看溢出是什么:
算术溢出或简称为溢出分为两种:上溢和下溢。所谓上溢是指在运行单项数值计算时,当计算产生出来的结果非常大,大于寄存器或存储器所能存储或表示的能力限制就会产生上溢,例如在solidity中,uint8所能表示的范围是0-255这256个数,当使用uint8类型在实际运算中计算255+1是会出现上溢的,这样计算出来的结果为0也就是uint8类型可表示的最小值。同样的,下溢就是当计算产生出来的结果非常小,小于寄存器或存储器所能存储或表示的能力限制就会产生下溢。例如在Solidity中,当使用uint8类型计算0-1时就会产生下溢,这样计算出来的值为255也就是uint8类型可表示的最大值。
国务院:推进科普与区块链技术深度融合:为贯彻落实党中央、国务院关于科普和科学素质建设的重要部署,依据《中华人民共和国科学技术进步法》、《中华人民共和国科学技术普及法》制定《全民科学素质行动规划纲要(2021-2035年)》,其中要求实施智慧科普建设工程。推进科普与区块链等技术深度融合,强化需求感知、用户分层、情景应用理念,推动传播方式、组织动员、运营服务等创新升级,加强“科普中国”建设,强化科普信息落地应用,与智慧教育、智慧城市、智慧社区等深度融合。(新华社)[2021/7/10 0:40:52]
如果一个合约有溢出漏洞的话会导致计算的实际结果和预期的结果产生非常大的差异,这样轻则会影响合约的正常逻辑,重则会导致合约中的资金丢失。但是溢出漏洞是存在版本限制的,在Solidity<0
IMF今日发布的加密货币科普视频实为两年前旧闻,且存在诸多疏漏:国际货币基金组织IMF今日在推特上发布了一条关于加密货币的科普视频,这段时长两分钟的视频最初发布于2018年6月。该视频称加密货币是“货币进化的下一步”,但没有特别提到DLT、区块链,甚至是代币名称等术语。BTC、XRP和ETH只出现在说明加密交易的图形中。尽管这段视频到目前为止已经获得了超过13.7万的点击量和2900个赞,但来自加密社区的许多反应都是批评的,他们指出了信息中的漏洞和似乎具有误导性的措辞。
Reddit用户nanooverbtc称:“他们犯了很多错误,比如把私钥称为密码。”该视频也没有讨论挖矿或加密货币供应。Kraken策略师Pierre Rochard等知名人士表示:“可证明的稀缺性是比特币有趣的原因,你忘了提这一点。”(Cointelegraph)[2020/8/24]
functionincreaseLockTime(uint_secondsToIncrease)public{lockTime+=_secondsToIncrease;}
TRON数字钱包科普资料《波场钱包的现在过去与未来》已上线:据最新消息显示,由TokenPocket联合波场TRON官方,以及 TokenPocket 社区志愿者共同撰写的《波场钱包的现在过去与未来》已正式上线。《波场钱包的现在过去与未来》又称为波场钱包小白书,详细介绍了当前TRON钱包与TRON生态密切结合的实例,是目前市面上最为详细的TRON数字钱包科普资料。波场钱包作为波场公链生态中极为重要的入口,是波场生态的重要构成要素。波场钱包从一开始只提供权限管理、转账收款、节点投票等基础功能,到如今不仅可以为用户提供法币交易、闪兑和去中心化交易所等方便快捷的交易服务,还能让用户直接在钱包上体验波场上DApp,挖矿、DeFi、Staking等资产增值服务。详情见原文链接。[2020/8/20]
functionwithdraw()public{require(balances>0,"Insufficientfunds");require(block
动态 | 链客社区联合北京交通广播推出区块链技术科普节目:12月11日15:15—16:00,区块链技术社区——链客区块链技术社区将联合北京交通广播FM103.9从零开始为大众科普解码区块链技术,蜻蜓FM及北京广播网同期进行全球直播。首期做客嘉宾为链客区块链技术社区创始人郄建军和百度区块链产品负责人于雅楠。[2019/12/11]
}
漏洞分析
我们可以看到,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且合约中存在算术运算的我们就可以认为这个合约是可能存在溢出风险的,在实际审计中还要结合实际代码来看。
标签:LOCLOCKIMETIMLendingblockPay BlockRegiment Financetimi币官方网站
1.法国手游开发商Voodoo将向区块链游戏投资2亿美元2.Coinbase计划为用户提供进入元宇宙的基于NFT的身份工具Fantom基金会与AWS合作推进区块链游戏开发:8月10日消息.
1900/1/1 0:00:00文章作者:LiJin、KatieParrot文章翻译:Blockunicorn原标题:《Web3复兴:内容的黄金时代》法国二月革命1996年1月.
1900/1/1 0:00:00元宇宙已成为近期资本市场最热的概念之一。本月内涨幅排在前十位的股票中,元宇宙概念股占了两个席位。11月24日,元宇宙指数创出历史新高。元宇宙概念股持续火爆,监管问询也在增多.
1900/1/1 0:00:00据CoinDesk12月23日消息,加拿大安大略省的一名法官周三对19岁的数学神童Andean“Andy”Medjedovic发出了逮捕令.
1900/1/1 0:00:00据Finbold援引印度《经济时报》报道,知情人士表示,印度内阁可能会在本周晚些时候召开会议,讨论2021年《加密货币和官方数字货币法案监管条例》下的数字资产法律框架.
1900/1/1 0:00:002020年年初以来,全球疫情已经造成了广泛的经济问题,整个2020年除中国外,全球几乎所有的主要经济体全部为负增长.
1900/1/1 0:00:00