关键词:
智能合约
漏洞检测
符号执行
动态检测
模糊测试
摘要:
区块链是一个开放源代码的分布式数据库管理系统,它提供用户对资源的使用权限以及与用户交互时的信息保密机制,并允许第三方参与到系统开发过程之中。智能合约是区块链的重要应用,能够在确保安全的同时,通过实施特定的操作,实现例如数据加密和交易处理等特定的功能,但是,因为未经严格的验证,开发工具的支持也不得力,智能合约上已检测出多种漏洞,导致多宗合约漏洞被攻击事件,损失数千万美元。由于智能合约本身具有开放性和不可篡改性,一旦出现漏洞,将会导致大量的系统失效甚至瘫痪。综上所述,增强智能合约安全性,实现高效的智能合约漏洞检测具有十分重要的研究意义。现有智能合约漏洞检测的技术手段比较单一,大多数方法都只是对合约进行源代码静态检测,很少有对已部署智能合约的测试。随着区块链技术在互联网中的应用越来越广泛,对现有的智能合约漏洞检测工具提出了更高要求。本文旨在解决四类最为普遍的合约漏洞问题:可重入漏洞,以太币锁定漏洞、限制写入漏洞与委托调用漏洞,提出了一种基于符号执行与动态模糊测试相结合的智能合约漏洞检测方法。其中动态模糊测试是主要的检测手段,静态符号的实现作为一种辅助检测方法。进行静态符号分析检测时,本文提出了利用符号执行的方法生成关键指令的方法检测智能合约漏洞。首先采用反编译合约字节码的方法构造控制流图CFG。根据控制流图可识别出代码内部隐藏的漏洞或潜在缺陷。二是通过对漏洞特点的剖析,针对不同漏洞,定义了对应关键指令和漏洞检测规则,以及根据所述控制流图以及所述关键指令,提取关键路径。最后根据漏洞检测规则进行检测,针对关键路径,产生路径约束,以及采用约束求解算法求解约束,产生漏洞的关键路径向所述模糊测试反馈约束求解结果。进行动态模糊测试检测时,本文应用二进制接口,分析输入数据的特征,针对不同种类数据,产生不同特定输入候选值集合,并将符号执行时约束求解结果与之相结合,生成覆盖率更高的模糊测试用例,通过分析合约上下文记录和路径内编码来实现合约部署运行时的控制流观察和监控,从而确定潜在缺陷。当出现异常控制流时可以调用内部的嵌入式IDS,将智能合约状态回滚减少损失,维护合约正常运行,最终开展漏洞收集和日志分析工作。本文提出了一种动态与静态相结合的检测方法,使用符号执行过程中对约束的解算,产生模糊测试未触发的输入数据,从而提高模糊测试的覆盖率。此外,在分析和研究现有的基于静态符号测试用例集的漏洞检测工具的基础上,设计出一种适用于智能合约的动态检测策略,提高了智能合约的安全性。本文在etherscan智能合约交易网站上的实验表明,采用将静态符号执行和动态模糊测试相结合的方式,有效的提高智能合约漏洞检测效率,并且部署消耗的额外Gas平均增加了26%,是一个可以接受的范围。