Page 360 - 《软件学报》2026年第1期
P. 360

揭晚晴 等: 智能合约与      DeFi 协议漏洞检测技术综述                                                357


                  3.1.2.1    基于生成的方法
                    基于生成的模糊测试        (generation-based fuzzing) 是一种自动化测试方法, 它通过生成大量的测试用例来测试
                 智能合约的功能. 这些输入数据通常是根据智能合约的输入格式和预期行为生成的, 目的是探索合约的所有可能
                 执行路径, 通过生成大量的测试用例, 可以更全面地探索智能合约的输入空间, 以发现潜在的安全漏洞.
                    现有研究中, Wang    等人  [52] 介绍了  ContraMaster, 一个  Oracle 支持的智能合约动态漏洞生成框架. 由于现有的
                 方法只改变单个事务, 而该方法通过改变事务序列来超越这些限制. 因此此框架使用数据流、控制流和动态契约
                 状态来指导其变化. 然后监视目标合约程序的执行, 并根据通用语义测试                       Oracle 验证结果, 以发现漏洞. 作为一种
                 动态技术, 它保证每个发现的漏洞都违反了测试               Oracle, 并且能够生成攻击脚本来利用此漏洞.
                    同时  Zhou  等人  [37] 提出了一种方法  SmartGift, 它通过从现实世界智能合约的交易记录中学习, 为测试智能合
                 约生成实际输入. 该方法从现实世界智能合约的交易记录中学习, 以便为被测新智能合约生成实际测试输入. 该研
                 究进一步表明, SmartGift 能够为    77%  的智能合约函数生成相关的测试输入, 且生成的输入与通过模糊测试获得的
                 输入是互补的.
                    在此基础上, Olsthoorn  等人  [112] 针对  Solidity  智能合约提出了  SynTest-Solidity, 这是一种用于  Solidity  的自动
                 测试用例生成和模糊测试框架. 该框架通过应用先进的元启发式搜索算法, 自动化测试用例的生成过程, 帮助开发
                 人员更加有效且高效地测试          Solidity  智能合约. 文章中还使用了基于链接学习的进化算法、MOSA                和  sFuzz 扩展
                 框架, 并结合额外算法进行更广泛的评估.
                    考虑到当前智能合约模糊测试方法倾向于从合约初始状态开始进行测试, 导致在初始状态附近耗费过多能
                 量, 且难以发现其他状态下的潜在错误, Liu           等人  [38] 提出了  3  种应对方案: (1) 在生成函数调用序列时, 明确考虑函
                 数之间的数据依赖关系, 以促进对更丰富状态的探索. 通过附加新的序列                       S2  来延长原有序列     S1, 使得附加序列
                 S2  能够从不同于初始状态的状态开始模糊测试. (2) 结合基于分支距离的度量, 迭代向目标分支进化测试用例.
                 (3) 采用分支搜索算法发现稀有或脆弱分支, 并设计了一种能量分配机制以有效处理这些关键分支.
                  3.1.2.2    基于突变的方法
                    基于突变的模糊测试        (mutation-based fuzzing) 通过对已有的有效输入数据进行变异操作, 生成新的测试用例,
                 以探索智能合约在不同输入条件下的行为, 并揭示潜在的安全漏洞. 其核心思想是在一组已知的有效输入数据基
                 础上进行小幅修改       (变异), 以创建新的测试用例. 变异操作可以涉及数据值或数据结构的改变. 通过这种方式, 测
                 试能够覆盖更广的输入空间, 从而发现正常使用情况下可能未被触发的错误.
                    在突变过程中, 改变状态变量的复杂性和突变过程中对外部参数的处理给当前的智能合约模糊器带来了关键
                 的技术挑战, 阻碍了它们在复杂约束下覆盖分支的能力, 并为攻击者留下了潜在的漏洞. 为了解决这些问题, Ji 等
                 人  [39] 设计了一种结合两种新技术的引导突变策略            SeqFuzz: 动态依赖学习和动态变量分析. 动态依赖学习序列的
                 依赖性, 为处理复杂约束中的状态变量提供指导性事务序列生成, 而动态变量分析则利用变量级动态污点分析来
                 处理外部参数并引导突变.
                    Zhao  等人  [45] 提出了一种新的自适应突变调度框架         AMSFuzz. 该框架针对突变算子的随机选择, 能够自适应
                 调整突变算子的概率分布, 以优化突变算子的选择过程. 对于突变位置的顺序选择, AMSFuzz 在模糊测试过程中
                 动态地对种子进行不同大小的切片, 赋予更多种子优先突变的机会, 从而提高了模糊测试的效率. Sun                             等人  [79] 的研
                 究将突变测试应用于智能合约中的整数溢出漏洞测试, 提出了                    5  种专门用于检测整数溢出漏洞的突变操作符.
                    在上述研究的基础上, Qian       等人  [40] 通过引入序列感知突变和种子掩码引导策略, 进一步阐明了智能合约模糊
                 测试方法. 首先, 利用基于数据流的反馈机制, 以有意义的方式确定事务的执行顺序, 并引入序列感知突变技术, 以
                 探索更深层次的状态. 然后设计了一种掩码引导的种子突变策略, 使生成的事务输入更加倾向于命中目标分支. 此
                 外, 该文开发了一种动态自适应能量调整范式, 以在模糊测试期间平衡资源的分配.
                    为了将准确的分析扩展到真实世界智能合约, Rodler 等人               [53] 引入了  EFbroCF, 这是一种用于以太坊智能合约
                 的高性能模糊器. 与以往的研究相比, EFbroCF          能够高效且准确地模拟复杂的智能合约交互场景, 并且具备极高的
   355   356   357   358   359   360   361   362   363   364   365