关键词:
区块链
智能合约
安全缺陷
知识图谱
动态测试
实证研究
摘要:
1994年,计算机科学家Nick Szabo首次提出智能合约概念,他将智能合约描述为能够在没有第三方监督下自动执行的交易协议;2013年,基于区块链技术的以太坊平台实现了智能合约概念的工程应用。在以太坊平台上,智能合约是可以部署和自动执行的程序。与传统程序相似,智能合约中的编程错误可能会影响智能合约的安全应用;不同的是,部署在区块链上的智能合约代码公开透明、不可更改,公开透明的特点使得智能合约缺陷更容易暴露。至今,以太坊平台上已发生多起由于智能合约缺陷引发的攻击事件,造成数千万美元的损失。
为了保障智能合约安全,现有研究应用静态分析或动态测试相关技术检测智能合约缺陷,例如模式匹配、符号执行、机器学习、模糊测试等。然而,我们在研究过程中发现,当前智能合约缺陷检测研究存在以下三点不足:第一,智能合约编程语言更新速度快、版本多,然而现有智能合约静态分析方法由于编译要求仅支持指定版本的智能合约检测;此外,在静态分析智能合约源代码或字节码的过程中,部分语法和语义信息丢失导致无法实现准确的缺陷定位;第二,智能合约的执行不局限于单个合约,还涉及不同合约之间的交互,现有智能合约动态测试方法仅执行目标合约,无法有效检测外部合约与目标合约交互导致的外部风险缺陷;第三,存在缺陷并不代表该缺陷可以被攻击者利用并造成危害,现有智能合约缺陷检测工具检测出的大部分缺陷无法被攻击者利用,该情况会大大降低缺陷检测工具的价值,但没有研究进一步探究缺陷可利用性低的原因,并讨论如何优化现有智能合约缺陷检测方法。本文针对上述三点不足展开研究。
首先,为了实现精确的智能合约缺陷定位,支持多版本智能合约的缺陷检测,本文提出一种基于智能合约知识图谱的静态缺陷检测方法。该方法将智能合约源代码转换为知识图谱,充分保留了智能合约的语法和语义信息;在知识图谱的基础上,通过定义缺陷模式描述细粒度的缺陷特征,并应用SPARQL查询语句进行知识推理从而实现缺陷定位。实验结果表明,针对20种具有代表性的智能合约缺陷,该方法在两个基准数据集上均取得了较好的效果。
其次,为了提升检测外部风险缺陷的能力,本文提出一种基于合约账户触发的智能合约动态测试方法。该方法结合区块链系统运行原理和智能合约的执行特征,设计代理合约模拟智能合约间的调用,代理合约包含针对三种外部风险缺陷的攻击策略,能够在调用合约的过程中触发缺陷并完成攻击。为了精准识别外部风险缺陷、降低误报率,该方法通过识别完整的缺陷触发过程来报告外部风险缺陷。实验结果表明,该方法可以有效检测不同基准数据集中的外部风险缺陷,且与其他动态缺陷检测工具相比具有更高的准确率和召回率。
最后,为了总结出一套智能合约缺陷可利用性相关的理论,优化缺陷检测方法,本文针对以太坊上的真实智能合约展开实证研究,主要围绕缺陷是否可以被攻击者利用和缺陷是否曾经被攻击者触发这两个研究问题展开。通过人工分析源码的方式确认报告的智能合约缺陷是否可利用,在源码分析过程中应用扎根理论方法总结缺陷不可利用的原因;通过收集并分析以太坊网络上的真实交易记录,判断智能合约缺陷是否被触发,针对未被触发的智能合约缺陷,应用扎根理论方法总结缺陷没有被触发的原因。最终,本文总结出11个缺陷不可利用的原因和六个降低攻击者攻击智能合约积极性的原因,并提出六条优化现有智能合约缺陷检测技术的建议。
基于上述研究,本文设计并实现了智能合约安全分析工具Soli Security。该工具包含三个核心功能功能模块,即智能合约静态缺陷检测Soli Detector、智能合约动态测试Soli Tester和智能合约日志分析Soli Tracer。Soli Detector能够实现智能合约源码知识图谱构建和静态缺陷检测,Soli Tester能够实现智能合约动态测试、判断智能合约是否存在外部依赖缺陷,Soli Tracer能够分析智能合约交易日志、检测该交易是否触发缺陷。Soli Security应用源码静态分析、动态测试和日志分析这三种方法分析智能合约是否存在安全缺陷,提高智能合约的安全性。