木星链 木星链
Ctrl+D收藏木星链

区块链:研报丨硬核解析智能合约漏洞原理

作者:

时间:1900/1/1 0:00:00

撰文:Chen?Bo?Yu、Hsu?Tzu?Hsiu

智能合约基础介绍

在探讨智能合约漏洞解析之前,我们先从一个基本的范例来了解一个智能合约会具备哪些元素。

●?变数:即此范例中的balances,在这个合约中负责存储使用者地址在合约中对应的存款余额

●?函数:即此范例中的getBalance,使用者呼叫此函数时,会回传使用者在合约中的存款余额

●?接收函数:即此范例中的receive,这是一个内建的函数。当合约收到使用者传入ETH且无呼叫其他函示时会触发,此范例在触发接收函数时,会变更变数balances的状态,而函数中的msg.sender代表的是交易的发送者地址

●?回退函数:即此范例中的fallback,这也是一个内建的函数。当使用者呼叫了不存在的函数时触发,可以理解为例外处理函数。在此范例中,触发时把交易回退,亦即让交易失效。

常见漏洞解析

了解问题发生的原因,并且归纳问题的类别可以帮助我们更好的防范。DASP收录了十种智能合约漏洞,下面我们整理了其中最常见的合约漏洞以及新型态的攻击模式。

1.重入漏洞

研报:中国央行即将发行的央行数字货币和Libra存在本质差别:零壹智库发布研报《人民币3.0——中国央行数字货币:运行框架与技术解析》,其中提到,中国央行即将发行的央行数字货币和Libra存在本质差别。中国央行数字货币是由中国央行发行的法定货币,是中央银行的负债,由中央银行进行信用担保,具有无限法偿性(即不能拒绝接受央行数字货币)。而Libra是一种尚未得到监管许可的数字货币。虽然Libra的价值与一篮子货币挂钩,但它仍在很大程度上会对现有货币体系造成冲击,挤占现有各国法定货币的使用空间。[2020/3/2]

重入漏洞是最著名的智能合约漏洞,先前提到TheDAO事件中也是为此原因而被骇客攻击,该漏洞原理是通过循环调用一个函数而达到攻击目的。

这边展示的是一个简单的提款函数,让使用者可以根据合约里的余额取走存款。可以注意到的是,当这个函数的调用者为一智能合约的时候,提款操作将会触发该智能合约的receive函数,并把剩余的gas传入。而此时还未把使用者在原先智能合约中记录的余额归零,攻击者即可在receive函数里再次调用withdrawBalance函数,并通过余额状态尚未修改的漏洞达到重复取款的目的,直到gas耗尽或合约被掏空。

动态 | 中泰证券研报推荐区块链产业投资机会:中泰证券最新研报认为,伴随此次区块链产业生态战略的地位提高,应该从三条主线把握相关投资机会:1)区块链技术作为新一代信息技术的后进之秀,及“核心技术自主创新重要突破口”的定调下,建议近期密切关注区块链主题投资下的相关机会;2)建议关注受区块链技术应用驱动的金融创新利好的大金融板块;3)区块链、5G及AI等信息技术已经成为谋求竞争新优势的战略方向在,建议持续关注以硬科技引领的科技创新类企业。(证券时报)[2019/10/27]

攻击流程图展示

防范方式也很简单,只要先把智能合约纪录的余额做清空,再做转帐动作,即可避免攻击发生。

2.整数溢位漏洞

在以太坊智能合约中,uint256是常见的整数型别,这意味着此变数可以储存的整数范围为0~2^256-1,存储上限大约是一个78位数的值,你可能会觉得这个数已经够大了,但它仍然可被用来达成溢位,也就是说当一个变数的值为2^256-1,而对这个变数的值又再进行加一的操作时,他的值会因为超过存储上限而变为0。要避免此漏洞,我们需要在整数运算前针对整数的范围去做检查,并在侦测到溢位运算时即时抛出异常。

3.阻断服务攻击

智能合约服务中断是一个严重的问题,因为有些漏洞造成的服务中断是永久性的,无法恢复。攻击原理包括了:意外执行SELFDESTRUCT指令、访问控制权限出错、Gaslimit达到区块上限使合约无法正常运作、以及我们这边展示的利用异常抛出,造成合约永久性瘫痪。

动态 | 灰度研报:超三分之一的美国投资者会考虑投资比特币:Grayscale Investments(灰度投资)今天发布了“比特币:2019年投资者研究报告”,首次对散户投资者的兴趣、观念和关于投资比特币的误解进行调查。该研究由金融市场研究公司Q8完成。报告显示。超过三分之一(36%)的美国投资者会考虑投资比特币,这代表了一个拥有超2100万投资者的潜在市场。(Globe Newswire)[2019/7/25]

这是一个简单的拍卖合约示例,出价高者可以成为currentLeader,并记录该次竞标出价为highestBid,同时把先前的出价金额还给前一个竞标领先者。攻击者可以部署一个智能合约,在正常出价后让该合约成为currentLeader,并在合约内负责收款的receive函数中使用revert函数来抛出异常,让交易失效。当其他使用者想出价竞标时,会因为合约无法转钱给currentLeader,而造成交易失败,拍卖合约的功能也因此永久失效,攻击者得以赢下此次的拍卖竞标。

动态 | 多伦多上市公司研报:全球哈希率与比特币价格差异显著:据消息,近日多伦多上市区块链投资公司Block One Capital Inc.发表了一篇关于加密货币采矿业的研究报告。研究显示,随着越来越多比特币矿工的加入,哈希率迅速上升,采矿收益率迅速下降,因此,当下并不是投资挖矿业的好时机。同时,研究还显示,采矿硬件在运营最初几天利润率最高,采矿设备的部署时机对收入影响极大。[2018/9/6]

攻击者合约示例

4.?Txorigin漏洞攻击

当开发者利用solidity中内建的tx.origin变数来验证权限时,会让攻击者有攻击的机会。在进入示例之前,须先了解tx.origin返回的是原始发送交易的地址,而msg.sender返回的是当前交易的发送者。以下示意图情景为:

用户A呼叫了合约B内部的函数,并在函数内又再呼叫了合约C。可以观察tx.origin与msg.sender的差异。

分析 | 加拿大央行研报:在区块链进行双花欺诈是不现实的:加拿大央行日前公布对区块链技术的激励相容研究结果,着重于通过区块链技术的工作量证明(PoW)共识机制建模,模拟诚实和不诚实矿工的行为,发现利用区块确认时间差进行双重支付的欺诈是“不现实的”。上述研究报告查看区块链这样的数字账本是否免于对双重支付——所谓双花这类欺诈,发现如果一个矿工掌握50%以上算力,具备了51%攻击的能力,理论上说,不诚实的矿工可以进行双花欺诈,但从经济角度看,为了实现这种欺诈,不诚实的矿工必须有很雄厚的财力,而且是“风险中性”,因此报告认为:“这种假设情况通常是不现实的,现实情况下,用户几乎没有经济方面的动机发起这种攻击,特别是在其他矿工的计算投资庞大时。”[2018/7/23]

接下来来看看实际的攻击场景,上图智能合约中的sendTo函数必须符合tx.origin与owner相等的条件才会被执行,但是攻击者可以通过下图的智能合约,利用上述提过tx.origin与msg.sender的差异,巧妙地绕过验证,并触发sendTo函数。具体细节是当攻击者诱导上图合约的owner去触发了下图合约的fallback函数时,若攻击合约在fallback函数内去调用sendTo函数,就可以得到owner的权限去执行。

5.未适当处理externalcall的回传值

在智能合约中,使用到低层级调用函数指令时,如:address.call()、address.callcode()、address.delegatecall()?和address.send()等等,如果调用失败并不会抛出异常,仅会回传调用结果的布林值,合约将能继续往下执行。若未对调用结果的回传值做检查,可能将会使智能合约无法正常运作。

我们以一个简单的取款函数作为示例,当使用一合约呼叫上图的withdraw函数,且若该合约不能接收ETH转入时,会造成呼叫方无法收到ETH,但因合约会继续往下执行,导致其在合约中balances的状态纪录被改变。修正写法如下:

6.?短地址攻击

此攻击手法大多出现在ERC-20智能合约中,须先了解到,当我们呼叫一个函数时,在EVM里实际上是在解析一堆ABI字符。而一般ERC-20标准的代币都会实现用来转帐的transfer函数,当我们调用transfer函数时,交易的调用内容由3个部分组成:

●4字节,函数名的哈希值,例如:a9059cbb

●32字节,以太坊地址,例如:

00000000000000000000000011223344556677889900aabbccddeeff11223344

●32字节,代表需要转送的代币数量:

0000000000000000000000000000000000000000000000000de0b6b3a7640000

若攻击者地址为:0x1234567890123456789012345678901234567800,且在呼叫transfer时刻意舍去尾数零,若合约内没有对内容格式做检查,EVM读取时会从第三个参数的高位拿00来补充,这将造成实际想要转送的代币数量缺少一个字节,即向左移位了8个比特,数值瞬间扩大256倍,攻击者成功盗取代币合约中的代币。

7.闪电贷攻击

闪电贷,顾名思义就是快速贷款,那这个速度有多快呢?官方的解释是,贷款发行和偿还的交易必须在以太坊上同一个区块内完成。可以说闪电贷是一种借助于区块链技术的颠覆式创新,它与传统的借贷有两个主要的差别,一个是它无需抵押品,第二个是它要求要在执行借出的同一笔交易中执行还款操作,因此对于出借资金的那方来说是不用承担违约风险的,因为只有当区块链上借贷方执行的借出与还款操作都确实被执行了,这笔交易才有效。也就是说我们可以设计一个智能合约来借出资金,接着执行一些资金操作,最后在将资金归还,而这些操作都会在同一笔交易中完成。这就给黑客们带来了利用闪电贷发动攻击的机会,因为它大大的降低了黑客的攻击成本,近期在DeFi领域的多数攻击都是使用闪电贷来实现,主要都是黑客通过借出的巨额资金来对协议制造价差并从中套利,还款后再带着不当获利逃之夭夭。我们从bZx攻击事件来了解黑客的攻击思路:

1.?黑客通过闪电贷从去中心化数字资产衍生交易平台dYdX借出了一万枚ETH

2.?使用其中的5000枚ETH抵押在去中心化借贷平台Compound以借出112枚wBTC

3.?剩下的的5000枚ETH到去中心化借贷平台bZx上开了wBTC的空单

4.?用借出的112枚wBTC到去中心化交易所Uniswap砸盘,让wBTC价格快速下跌

这一系列操作让黑客在bZx上开的空单仓位大赚,接着归还闪电贷借出的一万枚ETH,并在这个过程中获得了价值35万美元的收益。此次攻击的主要原因是因为Uniswap的价格的剧烈变化最终导致资产的损失,这本该是正常的市场行为,但是黑客通过恶意操纵市场,使项目方造成损失。bZx合约被操纵一事,开始让闪电贷进入了更多开发者的视线,一方面许多聪明的开发者开发出了全新的去中心化金融应用,同时也让开发者更为警惕可能的逻辑攻击。

结论

智能合约的运作为被动的,所有的合约动作均须由使用者发起交易、呼叫合约中的函数函数才会执行动作,而合约执行基于区块链的特性是不可逆的,且当合约部署上区块链后,所有资料都是公开透明的,即便代码不开源,也可利用反组译工具回推合约内容。因此,开发者需熟悉漏洞原理并避免之,使用者也应了解合约安全议题,维护自身权益。

标签:区块链ENDSENETH区块链专业是什么意思FULLSENDSENSO价格ETHMAXY价格

比特币价格今日行情热门资讯
ETF:2020年全球金融品种表现回顾:比特币最能打!

本文来源:证券时报,原题《2020年全球金融:渡劫与重生》作者:张锐经受住新冠肺炎的撕咬,得益于宽松货币政策的托举,吸收着积极财政政策的营养,合应着经济复苏的节奏.

1900/1/1 0:00:00
加密货币:盘点 | 2020年影响加密行业的50大关键词

跌宕起伏的2020年即将结束,在这一年中,国际形势风云变幻,新冠疫情席卷全球。区块链和加密行业见证了“黑色星期四”的恐惧,也见证了创下历史新高的酣畅,见证了DeFi热潮时的疯狂,也见证了机构资本.

1900/1/1 0:00:00
ABS:用100美金投资全球房地产?Labs Group试图用区块链重塑房产投资生态

比特币的总市值大概是4400亿美元,黄金大概是9万亿美元。全球的房地产是多少?大概是228万亿美元。如何投资全球房地产?这是相当困难的.

1900/1/1 0:00:00
瑞波币:以Ripple为例:加密行业如何应对监管风险?

也许,这次Ripple事件给交易所带来的一个经验教训是:如果市值第四大的瑞波币都能被起诉,那么市场里除了比特币和以太坊,其他加密货币都有可能被监管机构认定为“证券”.

1900/1/1 0:00:00
以太坊:盘点今年影响矿圈的10件大事:比特币创历史新高,矿工们赚翻了!

转眼间,又到了年终总结的月份。牛津词典,当代最全面、最权威的英语词典之一,每年都会公布年度词汇,但今年却史无前例地表示选不出一个合适的词来描述2020年.

1900/1/1 0:00:00
区块链:深度解读丨美国允许银行使用稳定币支付,能否掀起数字货币应用创新潮?

游戏开始了!1月4日,美国货币监理署发布的一封解释性信中说,美国国家银行和联邦储蓄协会可以使用公有区块链和稳定币进行结算。这绝对是重磅新闻,一个新时代大门在悄然打开.

1900/1/1 0:00:00