智能合约漏洞与安全审计手段浅析

admin 2021年2月6日15:31:34评论99 views字数 6221阅读20分44秒阅读模式

智能合约为区块链技术的核心,区块链的正常工作,依赖于缜密的智能合约。然而智能合约本身往往存在着漏洞,漏洞提供了攻击的可能性,将智能合约的攻击分为基本的四类,分析几种重要的攻击技术,揭示攻击防御、智能合约安全的重要性。同时分析了多种常用的智能合约检测工具,并指出各种工具的优劣。最后讨论了智能合约有关安全的建议和未来研究方向,希望能够将智能合约技术进一步融入到日常使用之中。

0  引言

中本聪提出比特币使用的区块链技术实际上是一种特殊的电子账本,账本中公开记录着从区块链建立之初的每一条转帐记录。这是一种去中心化的账本,其完全不依赖中心监管机构的工作,能够完全独立的完成交易的发生和确认,降低了由于单一节点风险引起的安全问题。事实上,由于区块链的用户、买卖双方实际是互相不信任的节点,交易双方均不信任对方能够单独正确记录交易,则衍生出了基于运算能力保证的确认机制,用户、交易、矿工三者构成了基本的加密货币交易。加密货币本质上是区块链技术的一个小的应用方面,此外,依托于区块链中记录信息的不可更改的特性,我们可以在不依赖第三方公证机构的前提下,永久性记录用户双方发生的一切交易、操作、合同等权威性文件、信息。而传统的公证技术往往依赖第三方权威机构的参与,其中第三方机构公信力决定了公正文件的可信度。而基于区块链智能合约的新一代合同、能够摆脱对第三方机构权威的依赖,在增强合约、信息可信度的同时,能够减少实际公证过程的人力物力财力的消耗。

以太坊提供给开发者和用户一套能够构建去中心化应用的完整技术平台。比特币提供了完整的端到端加密交易系统,使用者能够使用其完成完整的交易。以太坊相较于比特币来说,除了提供传统的类似于比特币的交易记录能力——以太币外,同时能够用于创建去中心化的程序、自治组织和智能合约。至今,以太坊已经在金融、物联网、智能电网、游戏开发、智能合同等多领域被广泛应用。
智能合约是以太坊应用平台的核心,本质上是以公开的形式随着区块链一同部署在应用网络之中的一段程序代码。能够根据设定的规则,完成决策、资料储存以及以太币的传输。智能合约提供验证及执行智能合约本身所设定的条件,对整个网络的公开性与透明性,允许在没有第三方的情况下完成可信交易,同时这些交易具有高度的匿名性。
尽管智能合约设计本身目的在于减少可能存在的风险问题。但是,类似于以太坊的智能合约仍存在设计上的缺陷,攻击者能够利用设计漏洞,对其进行攻击,导致大量经济损失。例如,以太坊中最大规模的一次攻击致使整个区块链进行了版本回退,降低了人们对智能合约不可逆性质的信任。
本文针对智能合约以及区块链技术的攻击进行分类与介绍,分析至今所进行的智能合约弱点检测技术,提供合约部署之前的安全检查手段,同时提出了智能合约安全研究的未来可能方向。

1  问题与挑战

智能合约存在的安全隐患主要可以被分为四类:恶意软件传播、共识机制缺陷、智能合约漏洞和用户欺诈行为。本节针对每类安全隐患展开了具体介绍。
1.1 恶意软件传播
恶意软件为攻击者开发,通过网络传播,在用户端运行,目的是盗取用户信息或者进行诈骗,其可以伪装成正常的网页页面、邮件等形式,骗取用户下载之后,干预用于在本终端上进行的交易行为。一种常见的形式是将用户数据劫持到刚刚产生的硬分支上,要求用户与该分支进行同步,这样攻击者就能够在该分之上伪造交易记录,骗取用户的所有货币。另外攻击者还常采取加密劫持、通信攻击等技术诱导矿工处理错误分支,从而对自己伪造的数据进行区块验证。
此外还有很多恶意软件使用区块链技术帮助自身的传播,他们不对区块链本身进行攻击, 而是使用区块链的广播特性,复制、传播自己的拷贝。K-ary恶意软件是一种利用区块链技术的恶意软件,通过将恶意程序的指令分成单独的区块,每个子程序仅包括一部分代码,伪装成正常的软件,进而躲避现存的恶意软件检测技术。Glupteba利用了区块链进行自身的复制和更新,能够建立分散的将是网络。这些恶意软件还能够窃取用户的用户名、密码、Cookie 等信息,从而造成更大的用户数据泄露问题。
1.2 共识机制缺陷
比特币与以太坊最早使用的共识机制为工作量证明(Proof of Work,PoW),依赖散列值函数来确保数据的正确性,由分散在各地的计算机,通过计算找到对应区块的猜测值,获取该区块的打包权,进而获得区块奖励。攻击者可以通过对该机制的攻击获得区块链的完整控制权,可以控制交易记录的记录,甚至完全控制该加密货币的价格。常见的攻击手段包括51%攻击、自私挖矿以及34%攻击。
PoW假定整个区块链网络中至少存在50%的诚信节点,如果单一节点控制超过51%的计算能力,就能控制整个区块链网。女巫攻击通过在网络中创建大量的无效节点,消除冗余备份的作用,当攻击者创造足够多的虚假身份,其可以以多数票控制整个区块网络,实现双重花费攻击。日蚀攻击通过将区块链网络分割,进而在子网路中高于51%的计算能力,分别在两个网络中进行51%攻击。此外,BGP劫持通过英特网路由本身的特性,拦截比特币流量,通过干扰关键的比特币消息,减缓广播的传播速度,进而攻击比特币网络。
1.3 智能合约漏洞
区块链技术普遍采用智能合约作为区块自动化运行的机制,不同的区块链拥有自行设计的智能合约,尽管每个合约提出时都不同程度的强调了自身的完备性、隐私性与安全性。其中由于合约设计的问题,常常可以通过对合约本身的分析进而发现该区块链的漏洞。
智能合约应用类似于运行在区块链上的网络应用,如网络应用一样,如果没有正确处理错误或者完全没有处理意外的错误,会导致整个网络受到巨大的影响。例如,The DAO攻击利用了Solidity中的扣除与转帐的顺序错误,多次调用了转帐函数,而扣除函数始终没有调用,导致损失了六千万美元,KotET、GovernMental、Rubixi等以太坊应用均因代码设计缺陷遭受了基于智能合约漏洞的攻击。
1.4 用户欺诈行为
比特币要求至少交易在6个区块之后才能完全被确认,但是面对快速支付,如果不能在短时间内对交易进行确认,则交易者可以利用这一漏洞,欺骗卖家先支付货物,同时短时间内再次执行相同金额的操作。对于矿工来说,只会打包其中的一条记录,这样,对于卖家来说在交易最终确认之前就已经支付了双份的货物,但是最终只能收到第二条交易的交易费用。

2  研究现状分析

2.1 常见攻击手段
本节我们对可能存在的智能合约攻击技术进行了介绍,这些可能存在的攻击手段会使智能合约仍然正常运行,导致错误检测变得尤为困难,因此这些攻击手段会对区块链造成严重的损害。

2.1.1  重入攻击

以太坊智能合约设计时,提供了调用外部其他合约的能力。合约通常也是处理以太币,因此会将这一部分以太币通过外部的合约处理,以太币发送给外部用户地址,调用外部合约。这些外部调用可能被攻击者劫持,迫使合约进一步执行代码,通过回调函数再次调用回调函数本身。这一过程实现了重新进入合约,在余额检查之前重复执行回调函数。攻击者可以发起单次重入和多次重入攻击,通过攻击者设定的特殊函数完成目标任务。
以太坊中著名的The DAO事件即通过重入攻击实现,最终导致六千万美元的以太币被盗,以太坊社区最终采取硬分支以太坊区块链,所有的资金被恢复到攻击进行之前。

2.1.2  算法上下溢出

这一漏洞主要是以太坊虚拟机(EVM)为整数制定了固定大小的整数类型。当输入数据超过范围且没有进行检查时,就会导致溢出发生。攻击者可以利用这一漏洞,允许攻击者滥用代码并创建意外的逻辑流程,允许攻击者无视原本的逻辑判断,获得用户的以太币、Token等私密信息。

2.1.3  默认可见性

Solidity中的函数具有可见性说明符,决定了一个函数是否能够由用户或其他的派生智能合约在外部调用、只允许内部调用或只允许外部调用。默认的函数可见默认为puliic,如果没有正确的隐藏有关合约余额更改的函数,则攻击者可以直接调用该函数窃取合约中的货币。Parity MultiSig Wallet由于没有对初始化函数制定可见性,导致攻击者能够在部署的合约上调用这些初始化函数,并将所有权重置为攻击者,这样攻击者就可以盗取钱包中的所有以太币。在Parity MultiSig Wallet受到的一次攻击中,价值约3100万美元的以太币被盗。

2.1.4  短地址攻击

短地址攻击远离同样是因为以太坊虚拟机(EVM)的设计问题。ERC20 标准中,transfer函数对于短地址会从转帐金额中取高位的0来补充,转帐金额同时会在地位补上移走的0, 等效于转帐金额左移翻倍。攻击者可以通过不填写转帐地址末尾的0完成短地址攻击,这是一种由于未检验用户输入导致的合约漏洞。

2.1.5  时间戳修改

区块链中,时间戳存在着很多的用途,包括生成随机数、锁定一段时间的资金,以及各种给予时间变更的条件语句,如果区块链中的矿工能够调整时间戳,可以发起对交易者不平等的攻击。一方面,矿工可以通过调整时间戳,产生特定需求的随机数,另外,矿工可以依靠时间的控制,在某些以太坊程序操纵获胜机制,进而损害其他玩家利益。
在GovernMental中,合约会在一轮内支付给最后一个加入的玩家,这里限制玩家至少需要加入一分钟,如果矿工能够调整时间戳,显示玩家已经加入了一分钟,则矿工可以限制快速满足游戏要求。
2.2 防御手段及其局限性
大部分以太坊智能合约出现问题的本质是智能合约本身的编写存在严重漏洞,其中包括不正确的逻辑关系、未验证的输入行为以及很多未处理的错误类型。这些都会导致智能合约在运行过程中,被攻击者利用,进而影响智能合约的正常运行。本节介绍了多种智能合约审计手段,并对其适用点以及不足进行了分析。

2.2.1  Slither

Slither是一种用于智能合约的静态分析框架,用于提供有关以太坊智能合约的有关信息。通过将Solidity智能合约转换成一种称为SlithIR的中间表示来工作,Slither能够获得智能合约的继承图、控制流图,通过预定义的分析列表来对 SlithIR 进行漏洞分析。能够自动的进行程序分析、数据流和污点追踪,主要可以应用于自动漏洞检测、自动优化检测、辅助用户理解智能合约以及协助代码审查。
但是Slither缺乏形式语义,限制了执行更详细的安全分析,不能准确的确定类似gas计算等低级信息。此外如果安全代码不能够吻合外部调用时,扫描进程会被终止。

2.2.2  Mythri

Mythri是一种开源工具,利用符号执行技术来确定智能合约中可能存在的错误。其安全分析方法为检查在以太坊虚拟机中执行的字节码。当发现程序中的缺陷时,通过输入的记录分析确定可能存在的原因。能够帮助推断存在的漏洞并帮助减少利用漏洞的可能。
尽管Mythri是一种启发式检测技术,在安全性分析中具有很高的准确度,但是其仍具有一定的局限性。在执行污点分析的时候,不能够跨越内存区域的限制,如果参数调用方式为引用式,这种限制会更加严重。

2.2.3  Oyente

Oyente是一种符号执行工具,能够直接与以太坊虚拟机一起使用,而无需访问高级语言形式。其不仅可以检测不安全的错误,同时能够分析每条代码的实际执行路径。Oyente 对19,366 个智能合约进行分析,发现其中8,833个智能合约均存在漏洞问题。
Oyente 只能够检测20.2%的Parity Wallet攻击,无法有效的记录TOD漏洞,仅能够防御诸如重入攻击和时间戳控制的漏洞。

2.2.4  Manticore

Manticore是一种Solidity审计手段,能够对智能合约进行符号分析,自动产生用于漏洞分析的特定输入、记录指令级实现过程,并通过Python API提供对其分析引擎的访问,对二进制文件和以太坊智能合约进行分析,用户通过API自定义分析内容。
Manticore能防御重入攻击和 TX.origin 滥用, 但是不能检测时间戳控制问题。它需要针对每一种漏洞生成对应的攻击分析,因此它的运行速度较慢。

2.2.5  Secruify

Secruify是一种智能合约安全分析工具。能够自动化的分析证明给定智能合约是否是安全的。Secruity主要包括两个步骤,首先分析智能合约的依赖关系图,从中分析精确的语义信息,然后检查特定的用于计算资产拥有者的代码模式,据此给出智能合约的安全性分析结果。与Oyente和Mythril对比来说,Securify利用静态分析来分析智能合约的每条路径。
Secruify不包含数值分析,无法识别智能合约中可能存在的溢出问题。

2.2.6  SmartCheck

SmartCheck是一种能够检测Solidity代码中漏洞的一种可拓展静态分析工具。其通过将源代码转换成基于XML的中间表示形式,并根据XPath模式,分析元素之间的关联关系,进而分析程序漏洞。除了能够检测可能存在的漏洞,SmartCheck 同时能解释漏洞造成的原因并给出修改建议。
SmartCheck无法检测到一些只能由污点分析或者手动分析处理的严重程序错误,能够识别智能合约中低风险的问题包括错误编译器版本、不正确的样式、冗余代码等问题。同时,也有分析指出SmartCheck无法分析重入攻击和自杀合同等问题。

3  未来研究方向

智能合约中存在的主要问题来源均为Solidity程序语言以及智能合约开发者未能考虑到所有的漏洞情况。早期Solidity存在着很多的安全问题,包括未经检查的函数回调、溢出未检查以及时间戳修改设计等问题。实际在智能合约的设计过程中,需要设计者充分考虑可能存在于合约代码中的执行漏洞,对错误进行完善的错误处理,并对合约本身执行相关的漏洞分析处理。但根本上应该是Solidity自身进行一定的迭代,从底层对可能发生的错误进行处理,而不应该将这些错误直接暴露给合约设计者。
同时,应该有更多针对新漏洞的分析软件,通过静态、动态代码分析,捕获出现的风险问题,及时给予合约开发者调整修改的建议。另外可以考虑一种事实的合约保护处理方式,对常见的、危害大的漏洞增加新一层接口,使用这层接口首先对输入输出数据进行过滤,之后再输入给底层的智能合约进行合约的处理工作。这样可以实现动态过滤同时能够在不更改底层合约的情况下,完成对用户的保护,还可以根据新风险的出现实时调整过滤手段。
既然智能合约拥有传统合约所不具有的优点,也应对智能合约应用前景进行研究,提早对可能存在的应用场景进行分析,就可以在实际部署之前,对该应用角度进行安全性分析,最终建立安全的智能合约体系。

4  结论

智能合约给使用者提供方便记录信息的手段,这一手段具有传统协议共识手段所不具备的安全性、便捷性。越来越多的研发力量、资产投入到智能合约的应用研究中,同时也伴随着对更多攻击者的攻击技术研究,更多智能合约的漏洞问题被暴露出来。
本文首先对智能合约技术及其应用场景做了简要概述,接下来针对智能合约的组成分析了其各种攻击的基本分类,之后介绍了针对智能合约程序的各种基本攻击手段。同时分析了多个安全工具以及各自的局限性。最后对该领域可能存在的研究前景做出了展望,为了能够更好地使用智能合约技术提高信息记录的安全性,需要在智能合约技术的风险性研究上投入更多精力。


原文来源:信息安全与通信保密杂志社
智能合约漏洞与安全审计手段浅析

本文始发于微信公众号(关键基础设施安全应急响应中心):智能合约漏洞与安全审计手段浅析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年2月6日15:31:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   智能合约漏洞与安全审计手段浅析https://cn-sec.com/archives/176841.html

发表评论

匿名网友 填写信息