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

350                                                        软件学报  2026  年第  37  卷第  1  期


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

                  漏洞分类          漏洞名称                         漏洞描述                    检测工具来源于以下文献
                                            合约中不同部分对访问权限的控制不一致, 导致未经授权
                             不一致的访问控制                                                 [31,55,64,65,68,69,76]
                                            的用户能够访问或操作受限资源
                              可见性错误和        由于可见性设置不当或对关键操作缺少限制, 导致未授权
                  访问控制                                                                [49,53,66,68,70,77,78]
                              不受限的操作        的操作被执行
                                            未能确保ID字段唯一性, 从而允许攻击者冒充实体或创
                              ID唯一性违规                                                      [10,54]
                                            建虚假/重复资产, 进而绕过访问控制检查进行非法操作
                                            在算术运算时结果超出整数的表示范围, 导致数值环绕回               [30,31,38–40,49,52,54,56,
                             整数溢出或下溢
                                            起始值 (溢出) 或最大值 (下溢)                         58,63,65,66,69,73,79]
                                            由于底层业务模型公式的错误实现, 导致数值计算中产生
                  数值计算          会计错误                                                      [62,80,81]
                                            细微误差, 在多次执行后累积成严重的经济损失
                                            其他在执行数学运算时出现的错误, 导致计算结果不正
                              其他算术错误                                                   [31,45,63,65,76,82]
                                            确, 进而影响合约的逻辑或状态
                  2.1.1    状态转换
                    状态转换类漏洞主要涉及智能合约在执行过程中的状态管理与函数调用的安全性. 状态转换是智能合约核心
                 功能之一, 直接决定了合约内部状态的更新方式               [83] . 任何状态转换设计上的错误都可能对合约的整体行为产生影
                 响, 进而妨碍其预期功能的正确执行. 这不仅威胁到合约的完整性和安全性, 还可能导致不可预见的经济损失. 此
                 外, 智能合约在执行过程中需要与外部合约或函数进行交互. 这些外部调用如果缺乏适当的安全保障或未经过严
                 格的验证, 可能为攻击者提供可乘之机, 从而对合约实施恶意攻击.
                    具体而言, 定价不当的操作码         [29] 和拒绝服务漏洞   [36] 主要影响合约执行时的资源消耗, 可能导致状态转换无法
                 正常进行, 进而阻止合约正常处理请求. 编译器错误               [30] 、时间戳依赖漏洞   [33] 以及调用栈溢出漏洞     [44] 则可能导致合
                 约状态发生意外更改, 进而中断合约的正常服务. 直接调用不可信的合约                       [50] 、重入漏洞  [51] 、委托调用漏洞  [58] 以
                 及  Tx.Origin 验证漏洞  [59] , 则是由于函数调用中的安全隐患引发的, 可能导致合约的逻辑被篡改或权限被不当提升.
                    此外, 不一致状态更新       [61] 由于开发者在多个模块之间状态同步遗漏, 导致在一个模块中更新的状态未能及时
                 传播到其他相关模块, 这种状态不一致性可能引发连锁反应, 导致合约无法正确执行其预期功能. 例如在抵押借贷
                 合约中, 若更新用户抵押金额后未重新计算抵押率                (仅执行抵押金额却遗漏抵押率参数更新), 将造成抵押品充足
                 性误判, 引发错误清算或超额借贷等资金风险. 而原子性违规                   [62] 则是指业务流程未确保必要的原子性, 导致并发
                 操作对相同状态变量产生冲突. 具体而言, 当多个合约之间的操作依赖于同一组数据时, 若未妥善处理可能出现的
                 失败或竞争条件      (如在部分交易完成后, 另一个交易失败), 将导致整体交易处于不一致状态, 进而引发严重后果.
                 这类问题通常发生在跨合约事务或并发操作的典型场景中, 例如: 源链上的资产销毁成功, 但目标链上铸造失败,
                 导致资产永久丢失; 或在       NFT  拍卖合约中, 分步更新最高出价时, 由于交易打包顺序的差异, 导致最终状态被错误
                 覆盖, 从而错误确定获胜者. 这类漏洞通常源于未对多合约交互或并发操作设置原子化事务                            (例如哈希时间锁或状
                 态互斥锁), 从而无法消除中间态暴露所带来的风险.
                  2.1.2    编码错误
                    编码错误类漏洞指在智能合约编写过程中, 由于开发者的疏忽或对合约逻辑的误解而引发的代码逻辑错误或
                 实现缺陷. 这些错误涉及异常处理、类型转换、边界检查以及                    Gas 费用管理等多个方面, 直接影响合约的计算与
                 逻辑执行, 进而可能导致数据损坏、操作错误或资金损失等严重后果.
                    在实际应用中, 编码错误类漏洞可能引发多种安全问题. 例如, 异常处理不当                       [30] 往往会导致合约在遇到意外
                 情况时未能正确处理, 进而导致服务中断或交易失败. 类似地, 短地址漏洞                     [71] 则由于地址解析不当, 可能使攻击者
                 能够利用地址长度不足的输入数据来操纵合约逻辑, 导致安全隐患. 更为复杂的编码错误还包括类型转换错误                                   [65]
                 和未知函数调用漏洞       [72] . 这些错误可能导致合约在处理不同数据类型时产生不可预见的行为, 或者在调用未定义
                 的函数时触发异常, 最终影响合约的正常功能. 类型混乱                [47] 和无界循环操作   [74] 等问题则会使合约在执行过程中消
                 耗过多的资源     (如  Gas), 导致交易失败或合约崩溃.
   348   349   350   351   352   353   354   355   356   357   358