智能合约安全漏洞挖掘技术研究

发布:2020-09-08  
  • 服务介绍
论文阅读笔记]智能合约安全漏洞挖掘技术研究
世嘉永诚管理咨询
15869174431
智能合约安全漏洞挖掘技术研究
付梦琳 吴礼发 洪征 冯文博
《计算机应用》2019年3月
8页,25个参考文献
框架
0 引言
1 智能合约概述
1.1 智能合约的概念
1.2 智能合约的工作过程
1.3 以太坊与智能合约
1.3.1 账户类型
1.3.2 交易费用
1.3.3 以太坊虚拟机
2 智能合约安全性问题
2.1 代码重入
2.2 权限控制问题
2.3 整数溢出
2.4 异常处理
2.5 短地址攻击
2.6 操纵区块时间戳
2.7 拒绝服务攻击
2.8 伪随机问题
2.9 delegatecall委托调用
2.10 竞争条件/非法预先交易
3 智能合约漏洞检测手段及相关工作
3.1 形式化验证
3.2 模糊测试
3.3 符号执行
3.4 污点分析
4 总结与展望
4.1 现有研究的不足
4.2 未来研究方向与改进思路
笔记
摘要:近年来,以智能合约为代表的第二代区块链平台及应用出现了爆发性增长,但频发的智能合约漏洞事件严重威胁着区块链生态安全。针对当前主要依靠基于专家经验的代码审计效率低下的问题,提出开发通用的自动化工具来挖掘智能合约漏洞的重要性。首先,调研并分析了智能合约面临的安全威胁问题,总结了代码重入、访问控制、整数溢出等10种出现频率最高的智能合约漏洞类型和攻击方式;其次,讨论了主流的智能合约漏洞的检测手段,并梳理了智能合约漏洞检测的研究现状;然后通过实验验证了3种现有符号执行工具的检测效果,实验表明现有研究涵盖的漏洞类型不完整,误报及漏报多,并且依赖人工复核;最后,针对这些不足展望了未来的研究方向,并提出一种符号执行辅助的模糊测试框架,能够缓解模糊测试代码覆盖率不足和符合执行路径爆炸问题,从而提高大中型规模智能合约的漏洞挖掘效率。

背景:当前尚没有通用的自动化手段来验证智能合约代码是否包含漏洞,安全保障主要依靠开发者的技能水平以及基于专家经验的代码审计,这已无法满足智能合约数量及规模不断扩大、功能日益复杂、漏洞挖掘难度提升的新形势下漏洞分析与发现的需求。

区块链不仅能够支持可编程合约,并具有去中心化、不可篡改、过程透明、可追踪等优势,为智能合约提供了一个完美的解决信任问题的机制。

简而言之,智能合约是传统合约的数字化版本,它是一种计算机程序,运行在区块链数据库上。


与传统合约相比,智能具有如下优势:

智能合约不依赖中间人进行交易,无须第三方执行合约,大幅度缩减了成本
消除了第三方供应商,用户得以直接进行交易,加速了合约验证和执行的整个过程
智能合约条款不可篡改的特性意味着它免于各种认为干预,降低了用户受骗的风险
智能合约存储于分布式账本,每个联网设备均有一份合约副本,难以出现断电、节点故障等问题

智能合约的工作过程

智能合约的构建:首先用户注册为区块链的用户,区块链会返回用户一个公私钥对,公钥作为用户在区块链上的账户地址,私钥作为操作该账户的唯一钥匙;然后由区块链内的多个用户共同商定一份承诺,以电子化的方式明确双方的权利和义务,参与者分别用各自私钥进行签名以确保合约的有效性;最后根据承诺内容将合约传入区块链网络中。
智能合约的存储:合约通过P2P的方式扩散到区块链全网中的每个节点。接收到合约后,区块链中的验证节点将它保存至内存并等待新一轮的共识时间,触发对该份合约的共识和处理。到达共识时间后,验证节点将近一段时间内保存的所有合约打包成集合并计算其Hash值,并将这个合约集合的Hash值组装成一个区块结构,扩散到全网。其他验证节点收到该区块结构后,取出Hash值,对比自己保存的合约集合,并向其他验证节点发送一份自己认可的合约集合。经过多轮发送和对比,在规定的时间内,所有的验证节点最终对最新的合约集合达成一致。最新达成的合约集合通过区块的形式扩散至全网,接收到合约集的节点对其逐条验证,只有通过验证的合约会被写入区块链,验证的内容主要是合约参与者的私钥签名是否与账户匹配。
智能合约的执行:智能合约定期对自动机状态进行检查,验证满足条件的事务,若达成共识则自动执行并通知用户。

以太坊的基础单元是账户,以太坊区块链上所有的状态转换皆为账户之间价值和信息的转移。

外部账户不存储代码,但可以通过创建和使用私钥签署交易向其他外部账户或合约账户发送消息
合约账户无法自动发起新的交易,只有接收到外部账户的消息,合约账户内部的代码才会被激活,允许它执行转移代币、写入内存、生成新的代币、执行计算、创建新合约等操作
NCC Group总结出智能合约中出现频率最高的10类安全问题:代码重入、访问控制、整数溢出、未严格判断不安全函数调用返回值、拒绝服务、可预测的随机处理、竞争条件/非法预先交易、时间戳依赖、短地址攻击以及其他未知漏洞类型。

安比实验室通过智能合约安全审计模型扫描,发现不同程度的安全隐患。

Low:未指明版本号、高gas消耗
Medium:整数溢出、除法、依赖时间戳、区块哈希的运算
High:代码重入、短地址攻击、强制转账、使用合约余额老做判断、高地址脏数据、tx-origin误用
代码重入

将以太币发送至外部合约时,使用内置的transfer()函数,该函数仅发送2300个gas不足够目的地址上的合约调用另一个合约
先保证所有改变状态变量的逻辑发生后,再允许以太币被从合约或任何外部调用发送出去
引入一个互斥系统,即添加一个代码执行期间锁定合约的状态变量,从而防止重新入口的调用
权限控制问题:未能明确函数的可见性或未能作充足权限检查,导致攻击者能够访问或修改到不该访问的函数或变量

正确添加函数可见性说明符或修饰符来控制函数调用的范围和权限,并对敏感操作作出严格的权限检查
整数溢出:属于高危漏洞,若被攻击者利用,很容易造成超额铸币、下溢增持、高卖低收等事故

使用或构建数学库来替代标准的数学运算符,提供了有安全检查的SafeMath数学计算库


异常处理问题

不能仅根据有无异常抛出判断合约是否成功执行,在使用底层方法时,必须通过检查返回值,对可能的异常进行处理


短地址攻击:针对基于ERC20类型的代币转发问题

对用户输入进行严格的检测,避免接受畸形地址


操纵区块时间戳

时间戳由矿工打包交易时设置,矿工很可能利用自主权对时间戳作些微的改动
以太坊未来有可能会对出块时间作出调整,因此通过块高度来预估时间存在不合理性
区块时间戳不应该用于熵或产生随机数


拒绝服务攻击:让用户在一小段时间内或在某些情况下永久无法使用合约,这可能会使合约中的以太币永远无法提取出来

通过Revert发动DoS攻击
通过区块gas limit发动DoS攻击
所有者操作发动DoS攻击


伪随机问题:Solidity无法创建随机数

合约开发者编写随机数生成函数时,往往利用区块号、区块时间戳、区块难度、区块gas限制等区块头相关的参数或其他区块信息,区块头参数可以被矿工获知的特性和链上数据公开的问题都导致生成的随机数是可预测的,攻击者可以利用这一点进行攻击
使随机数的来源不依赖于区块参数,而尽量从区块链之外


delegatecall委托调用

delegatecall函数用于实现合约之间的相互调用以及交互,它的特点是调用后内置变量msg的值不会修改为调用者,但执行环境为调用者的运行环境,不当使用delegatecall会导致非预期代码的执行
delegatecall的执行环境为调用者环境,调用者与被调用者拥有相同变量的情况下,若被调用的函数修改该变量值,则修改的是调用者中的变量
谨慎使用此类底层函数,对用户输入的调用发起地址及调用参数作出严格限定


竞争条件/非法预先交易:用户可以通过竞争代码的执行,得到非预期的状态



出于“代码即规则”,智能合约一旦被部署便不可更改,即便有恶意交易被记录下来,也不可以将其从区块链中删除。回滚交易的唯一方法是执行硬分叉,即通过修改区块链中的共识协议把区块链中的数据恢复到过去某一状态,而这无法回避开发者客观上存在滥用“专业垄断”的质疑,一定程度上冲击了区块链系统去中心化的理念,所以必须在智能合约上线之前,对其进行全面深入的代码安全审计与测试,充分分析潜在的安全威胁,尽可能规避漏洞。



从开发人员使用安全库进行开发、安全团队开展合约测试、合约审计这三个角度采取措施。

合约测试指用大量的测试用例引导合约的执行,验证其是否符合预期行为,但测试用例无法确保覆盖所有可能的路径,所以即便测试结果没有发现问题,也不能排除漏洞存在的可能性
合约审计是安全团队通过专业的手段,检查出合约的代码实现和业务逻辑中存在的漏洞和隐患,并向项目方提出业务逻辑上的指导和建议。这虽能发现大部分常见的漏洞和风险,但由于现有的审计工作在一定程度上依赖于审计人员的主观判断和经验,无法根除安全风险和漏洞。


形式化验证

形式化验证用逻辑语言对智能合约文档和代码进行形式化建模,通过严密的数学推理逻辑和证明,检查智能合约的功能正确性和安全属性,克服了用传统测试手段无法穷举所有可能输入的缺陷,能完全覆盖代码的运行期行为,可以确保在一定范围内的绝对正确,弥补了合约测试和合约审计工作的局限性
对于规模较小但功能设计复杂的智能合约来说,形式化验证必定是维护其安全性的有效方法之一
形式化验证方法包括模型检验和定理证明两种。
模型检验是列举出系统所有可能的状态并逐一进行检验,这种方法全自动化却只适用于小型系统
定理证明首先把系统代码提取成抽象的数学模型,然后对定理进行证明,这种方法能够适应大规模系统,但需要首先将系统的运作方法转换成验证系统能够理解的语言
Vaas是全球首个同时支持EOS、以太坊区块链智能合约的自动形式化验证平台,支持多种合约开发语言,可以对整型溢出、可重入攻击、异常可达状态、多签名钱包、Tx.origin漏洞等10多种常规安全漏洞进行“一键式”自动化检查
Certik是一个形式化验证框架,经过Certik验证的智能合约、DApp以及区块链会被附上证书形式的标志,来表示其正确性和安全性
Bhargavan等提出了一个智能合约分析和验证框架,该框架通过Solidity*和EVM*工具将智能合约源码和字节码转化成函数编程语言F*,以便分析和验证合约运行时安全性和功能正确性
Coq、Isabelle/HOL、Why3等工具也实现了EVM的语义表示,并做了一些形式化验证智能合约的工作


模糊测试

模糊测试是一种通过构造非预期的输入数据并监视目标软件在运行过程中的异常结果来发现软件故障的方法
自动化工具Echidna采用了模糊测试技术来对EVM字节码进行检测,但是不能保证API功能的稳定性
ContractFuzzer是第一个基于Ethereum平台的智能合约安全漏洞模糊测试框架,支持gas耗尽终止、异常处理混乱、重入、时间戳依赖、区块号依赖、危险的delegatecall调用和以 太币冻结7种漏洞的检测。和其他智能合约漏洞检测工具相比,ContractFuzzer支持更多的漏洞类型,有效降低了误报率。但由于测试用例生成的随机性,所能涵盖的系统行为有限,无法达到理想的路径覆盖率,很难找出所有的潜在错误。


符号执行

符号执行的核心思想是使用符号值代替具体值执行程序,对于程序分析过程中任意不确定值的变量,包括环境变量和输入等,都可以用符号值代替。符号执行中的“执行”是指解析程序可执行路径上的指令,根据其语义更新程序执行状态,等同于解释执行。
Oyente是一种基于符号执行的静态分析工具,可以直接运行在EVM字节码上,而无需访问 Solidity或 Serpent 等高级语言。Oyente支持检测交易顺序依赖、时间戳依赖、代码重入、错误处理异常等漏洞。Oyente覆盖了大部分的EVM操作码,但由于缺失类型、不同函数调用对相同字节码的重用等上下文信息,仅从EVM字节码很难重建开发意图,因此Oyente无法验证一些公平性和正确性问题(包括整数溢出等)。Oyente简化地处理循环,通过限制循环次数防止路径爆炸,这导致了部分缺陷的漏报。
Manticore是一款基于符号执行且支持EVM的动态二进制分析工具,可以枚举出合约的所有可到达执行状态以及触发这些路径的输出参数,并验证关键功能的安全性,标记出整数溢出、未初始化内存等安全问题的类型。
上述两个工具只对单个调用行为进行建模,均没有对合同执行流进行推理。
Oyente和 Manticore在处理智能合约中较多的不定常数组时,或是合约规模庞大、跳转指令较多时,容易产生路径爆炸,导致测试效率不高。
基于符号执行的MAIAN工具针对贪婪合约、浪子合约、自杀合约,精确定义这三类漏洞合约可核查的trace特性,着重分析对合约的调用序列,测试了近100万个合约,以较快的速率发现大量真阳性漏洞。
Securify是一种基于符号抽象的合约静态分析工具,改进了其他工具无法确切判定合约是
否包含漏洞的缺陷,针对各安全属性定义了遵从模式和违反模式两种模式。Securify从合约的字节码(或者源代码,可以编译为字节码)开始,符号化地分析合约的依赖关系图,提取出精确的语义事实,并使用这些事实匹配遵从和违反模式。
TEETHER工具在仅提供EVM字节码的情况下支持智能合约的自动漏洞识别和漏洞利用。相比其他工具,TEETHER不仅实现了漏洞检测,还实现了漏洞的自动利用,但其局限性在于只支持检测单个合约内的漏洞,而不能发现调用其他合约产生的漏洞。


污点分析

是针对污点变量的数据流分析技术
污点分析的一般流程为:首先识别污点信息在智能合约中的产生点并对其进行标记;然后按照实际需求和污点传播规则进行前向或后向数据依赖分析,得到污点的数据依赖和被依赖关系的指令集合;最终在一些关键的程序点检查关键的操作是否会受到污点信息的影响。
Mythril集成了混合符号执行、污点分析和控制流检查,可以检测出整数溢出、不可信合约的外部调用等一系列的常见安全问题;但它无法检测出智能合约的业务逻辑问题,且极易产生误报。


现有研究的不足

各工具检测手段单一,涵盖的漏洞类型不完整,大多只能检测低级别的安全违规行为和漏洞,缺乏对合约执行流的推理,难以发现不同合约间调用产生的安全问题且无法有效检测公平性等逻辑缺陷。使用单个工具对合约进行更全面的安全验证是一个待解决的技术难题。

代码覆盖率低,漏报和误报率高。与 Oyente 和 Mythril 相比,Securify 在判定真阳性漏洞上具有显著优势,但三种工具均有较多的错误警告以及漏报的漏洞。
不能做到完全自动化,无法明确报告合约行为是否违规,对于检测出来的所有疑似漏洞,需要用户手动将其分类为真阳性或假阳性,这大幅度增加了智能合约安全检测的工作量,因此,下一步研究需要对于挖掘出的疑似漏洞,使用工具直接验证其是否能实际造成安全威胁,减少人工验证环节工作量,并尽可能地提供漏洞利用方案,提出漏洞修补措施和智能合约安全编程建议。
审计时间长,漏洞挖掘效率低。面对数目和规模与日俱增的智能合约,提高漏洞发现效率也是亟需解决的重难点。


未来研究方向与改进思路

扩展形式化验证的应用范围
提取重点路径,缩减路径空间
符号执行辅助的模糊测试:未来可以研究动态符号执行辅助的模糊测试技术
完善智能合约漏洞库,建立漏洞挖掘工具效率评价方法

以上希望能帮到大家,有问题可以私信【15869174431微信】探讨哦,关注我,后期持续发送相关知识。
联系我时,请说是在老客网上看到的,谢谢!
同类信息推荐
发布者信息
联  系  人:世嘉永诚(商家)
注册日期:2020年08月17日
用户认证:
声明:以上内容(如有图片或视频,也包括在内)为平台注册用户上传并发布,本平台仅提供信息存储服务。任何权利(如著作权、肖像权、名誉权等)的主张者,可提供权属证明后,经本平台审核后做出处理。
关于老客 | 服务条款 | 常见问题 | 法律声明 | 联系我们
2005-2025 laoke.com 京ICP备06019010号 京ICP证050484号  京公网安备 11010502036214号