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

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


                    智能合约层漏洞: 智能合约是构成           DeFi 协议的基础, 其漏洞是指合约代码本身存在的缺陷. 智能合约层漏洞
                 的具体类型包括状态转换类漏洞、编码错误类漏洞、访问控制类漏洞和数值计算类漏洞.
                    DeFi 协议层漏洞: DeFi 协议由一组合约组成, 其漏洞与            DeFi 应用及其场景特性密切相关. DeFi 协议层漏洞
                 的具体类型包括价格操纵漏洞、辅助工具漏洞、权限控制漏洞和治理漏洞.
                  2.1   智能合约层漏洞类型
                    根据智能合约执行过程中不同的安全需求和常见攻击向量, 本文将智能合约层的漏洞特征归纳为                                  25  种主要
                 的漏洞类型, 并将这些漏洞类型按其表现形式分为                4  类, 包括状态转换与调用安全、编码错误、访问控制和业务
                 逻辑. 其中, 状态转换与调用安全、编码错误以及访问控制均为智能合约传统安全漏洞, 而业务逻辑则为智能合约
                 业务逻辑漏洞. 我们将漏洞分类、漏洞类型、漏洞描述和相应的检测工具整理在表                           1  中.

                                               表 1 智能合约层漏洞与检测工具

                  漏洞分类          漏洞名称                         漏洞描述                    检测工具来源于以下文献
                                            操作码定价不当, 导致智能合约在执行时消耗的Gas过低,
                             定价不当的操作码                                                暂无检测工具, 定义见[29]
                                            增加了潜在的攻击面
                                            由于编译器版本过时、本身的缺陷或误操作, 导致生成字
                               编译器错误                                                       [30–32]
                                            节码时引入缺陷
                                            当函数将区块时间戳作为执行关键操作的条件时, 攻击者
                             时间戳依赖漏洞                                                      [5,30,33–43]
                                            操控时间戳来影响合约行为
                                            合约执行过程中递归调用或深度链式调用超过了EVM允
                             调用栈溢出漏洞                                                       [44,45]
                                            许的调用栈深度限制
                                            通过消耗智能合约的资源 (如计算、存储或Gas), 使合约
                              拒绝服务漏洞                                                      [36,46–49]
                                            无法正常处理其他用户的请求
                                            直接调用未经验证或不可信的合约, 导致意外的行为或被
                  状态转换     直接调用不可信的合约                                                       [50]
                                            攻击
                                            对外部合约函数存在递归调用, 导致合约的资金被多次转
                                重入漏洞                                                  [33,34,37–43,49,51–55]
                                            出或状态被不正确地多次更改
                                            合约A可以在其当前执行环境中执行合约B的代码, 导致
                              委托调用漏洞                                                  [30,33,37,38,40,56–58]
                                            合约A的状态和权限等被恶意篡改
                             Tx.Origin验证漏洞  使用Tx.Origin作为智能合约身份验证依据, 导致授权不当          [32,36,39,40,42,47,59,60]
                                            由于状态变量之间的相互关联性, 开发者在更新一个变量
                             不一致状态更新        时可能会忘记同步更新关联变量或更新错误, 导致统计错                    [54,61,62]
                                            误或资金损失
                                            业务流程未确保必要的业务级原子性, 导致并发操作对相
                               原子性违规                                                       [54,62]
                                            同状态变量产生冲突
                                            未能正确处理执行过程中出现的异常情况, 导致合约逻辑
                              异常处理不当                                                 [30,37,39,40,46,52,63–67]
                                            中断、状态不一致或资金损失
                                            由于编码错误, 合约中的资产被意外锁定或冻结, 无法正
                             资产锁定或冻结                                                  [35,38,40,57,66,68,69]
                                            常使用
                             缺乏编码逻辑或        缺乏必要的逻辑验证或一致性检查, 导致不合理的操作或                  [59,64,65,68–70]
                               一致性检查        被攻击
                                            发送少于20字节的地址, 而合约代码没有进行长度检查,
                               短地址漏洞                                                 暂无检测工具, 定义见[71]
                                            导致交易参数错误地解析和拼接
                  编码错误
                             未知函数调用漏洞       没有正确实现fallback函数或没有妥善处理未定义的调用,                 [47,72]
                                            导致资金丢失或非预期调用
                                            存在未限制执行次数或消耗大量Gas的循环或递归操作,
                           无界或Gas费用高的操作                                               [5,42,45,54,57,69,73,74]
                                            导致交易因超出Gas限制而失败
                                            由于错误地使用或处理数据类型, 导致程序行为不符合预
                              类型混乱漏洞                                                       [47,75]
                                            期的漏洞
                                            将一种数据类型错误地转换为另一种不兼容的类型, 从而
                              类型转换错误                                                      [49,54,65]
                                            导致程序行为异常
   347   348   349   350   351   352   353   354   355   356   357