Page 379 - 《软件学报》2025年第12期
P. 379

5760                                                      软件学报  2025  年第  36  卷第  12  期


                 解, 将会减少安全漏洞检测的时间开销. 此外, 针对静态分析工具仅提供疑似漏洞语句位置, 但缺少测试用例而
                 难以复现漏洞的场景, 如果将漏洞语句作为目标, 可利用符号执行快速生成对应的测试用例, 以帮助开发或测
                 试人员确认漏洞.

                  4   基于目标制导符号执行的智能合约安全漏洞检测方法
                    针对现有工作中符号执行检测效率较低问题, 本文提出了基于目标制导符号执行的智能合约安全漏洞检测方
                 法. 图  2  为方法的流程图, 共包括     3  个步骤, 即目标分析、可达性分析以及目标制导符号执行. 首先进行目标分析,
                 从静态分析、人工标注等途径获取源代码中的漏洞目标信息, 包括目标语句所在的行号以及漏洞类型等, 再通过
                 目标依赖语句分析, 获得与目标语句存在数据依赖或控制依赖的其他语句. 然后进行可达性分析, 将源代码编译为
                 字节码并进一步翻译为指令, 根据指令模拟构建堆栈, 分析跳转指令并构建智能合约控制流图, 将目标分析步骤中
                 得到的目标语句以及目标依赖语句作为分析对象, 定位其所在的基本块, 对控制流图进行剪枝以生成制导信息. 最
                 后进行目标制导符号执行, 根据制导信息判断下一步跳转基本块的可达性, 制导符号执行跳过与目标语句无关的
                 基本块, 并输出漏洞检测报告以及用于复现漏洞的测试用例.


                                                  漏洞目标
                                                行号   漏洞类型          数据依赖
                                   静态分析
                                                 27    重入
                                                 35  整型溢出
                                                                   控制依赖
                                                 ...    ...
                                   人工标注
                                                                目标依赖语句分析
                                  目标获取
                                               目标分析            目标语句
                                                               目标依赖语句
                                     STOP
                                                  1               1
                    contract Owner{   ...
                     function check {  JUMPI                                      目标制导
                      ...                         2     3         2    3 目标                   漏洞检测报告
                     }                ...                                         符号执行
                   }                 0x40
                                                  4               4
                                     0x80
                   智能合约源代码
                                 指令与堆栈分析        控制流图构建           制导信息生成
                                                                                               测试用例
                                                 可达性分析
                                   图 2 基于目标制导符号执行的智能合约安全漏洞检测方法流程图

                    本节的余下部分首先给出智能合约语句、函数以及事务的符号化表示, 然后介绍智能合约目标依赖语句分析、
                 可达性分析以及目标制导符号执行.
                  4.1   智能合约语句、函数以及事务的符号化表示
                    Solidity  智能合约的代码由任意数量的状态变量、结构体、枚举、事件、函数以及函数修饰器组成. 表                             1  为
                 智能合约各代码结构的中英文名称和描述. 其中, 状态变量是用于持久存储数据的变量, 通常存储合约管理者、参
                 与者或代币价格等信息; 结构体和枚举能够定义新的数据类型或有限的数据集合; 事件能够调用                               EVM  的日志接
                 口, 将合约的运行情况反馈给调用者; 函数和函数修饰器由任意数量的语句组成, 前者定义了智能合约的执行逻
                 辑, 后者用于修饰函数的执行, 带有函数修饰器的函数需要先执行修饰器的内容, 例如在执行函数前检查执行条件
                 是否满足.
                    根据语句执行的操作不同, 可将语句分为变量操作语句、假定语句、函数调用语句以及跳转语句. 同时, 根据
                 智能合约中状态变量存储结构的长度是否固定, 可分为定长类型状态变量                         (如  uint、address 等) 和非定长类型状
                 态变量   (如动态数组、映射表等, https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html). 由于上述  2
   374   375   376   377   378   379   380   381   382   383   384