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

杨慧文 等: 基于目标制导符号执行的智能合约安全漏洞检测                                                    5775


                 常执行. 根据第    5.1 节中对  Mythril 支持检测的漏洞类型, 我们选择重入和事务状态依赖这              2 种类型的漏洞进行实验.
                    首先, 从上述    2  种漏洞类型中分别随机选取了          10  个智能合约文件. 然后, 使用图       10  所示的提示词   (Prompt)
                 向  GPT-4o  提问, 其中#Vul#为  SCVHunter 提供的漏洞标签, #Define#为  SCVHunter 论文中对#Vul#的定义和描述,
                 #SourceCode#为待检测的智能合约源代码. 最后, 根据          GPT-4o  的回答, 标注该源代码中存在#Vul#类型漏洞的行
                 号, 从而获得可用于实验的数据集.









                                           ...
                                              图 10 用于向    GPT-4o  提问的  Prompt

                    将数据集中的漏洞语句作为          Smart-Target 的目标, 可用于检测   GPT-4o  所报出的疑似漏洞, 进而帮助开发和测
                 试人员对其进行修复. 实验结果如表           9  所示, 其中  Mythril 的  F1  值为  0.564, Smart-Target 的  F1  值为  0.579. Smart-
                 Target 在检测出相同数量的安全漏洞的同时, 其所需时间相较于                  Mythril 减少了  71.05%. 实验结果表明, Smart-
                 Target 在未减少漏洞检测能力的同时, 有效减少了测试所需的时间开销. 该实验结果与第                       5.2.1 节中基于  SB Curated
                 数据集的实验结果相同, 表明         Smart-Target 的实验评估具有泛化性.

                                     表 9 Smart-Target 和  Mythril 检测漏洞性能比较  (SCVHunter)

                  漏洞类型       工具      时间 (s)  TP  FP  FN  Recall  Precision  F1  测试用例生成数量   事务序列执行数量
                          Smart-Target  12 448.29  3  0  7  0.3  1    0.462       3             228
                   重入
                            Mythril  38 850.62  3  0  7  0.3     1    0.462       3             484
                          Smart-Target  243.54  8  0  9  0.471   1    0.640       8             24
                  权限控制
                            Mythril  4 990.93  8  1  9   0.471  0.889  0.615      9             98
                          Smart-Target  12 691.83  11  0  16  0.407  1  0.579    11             252
                   总计
                            Mythril  43 841.55  11  1  16  0.407  0.917  0.564   12             582

                  6.2   有效性威胁
                    内部有效性分析主要与影响实验正确性的因素相关. 在本文中, 内部有效性主要体现在                            Smart-Target 的实现
                 是否正确. 本文基于      Slither 获得状态变量的操作语句      (读取或赋值)、修饰器的调用关系等信息, 分析目标语句与
                 状态变量之间的依赖关系. Slither 开源并且更新频繁, 能够快速响应智能合约版本的变化, 提高了本方法的适用
                 性. 此外, 本文使用   Solidity 编译器  solc (v0.4.25) 和  Python 第三方库  crytic-compile 编译源代码并获得  Source Mappings
                 信息, 利用  evm_cfg_builder 构建控制流图, 尽可能减少内部有效性威胁. 需要注意的是, 由于                evm_cfg_builder 没
                 有完全模拟    EVM  堆栈, 因此无法分析部分        JUMP  指令的跳转地址, 导致可达性分析中构建的             CFG  不完整, 缺失
                 部分基本块的制导信息. 本文的实验表明即使制导信息存在不完整的情况, 仍能够达到与非制导符号执行方法相
                 同的安全漏洞检测能力, 未来工作可尝试在              evm_cfg_builder 的基础上完善   CFG  的构建, 从而更精确地制导符号
                 执行.
                    外部有效性分析主要关注实验结果的一般性. 本文实验中所使用的数据集为                          Durieux  等人  [20] 的实证研究中公
                 开的  SB Curated  数据集以及  Luo  等人  [45] 的  SCVHunter 数据集. SB Curated  数据集包含  10  种漏洞类型, 并且漏洞
                 信息由人工进行标注. 在实验过程中我们发现数据集在部分合约文件中不仅标记了触发漏洞的语句, 同时标记了
                 漏洞相关变量声明或其他信息, 存在冗余标记的情况. 例如时间戳类型漏洞中不仅标记了存在时间戳判断条件的
                 语句, 同时标记了获得时间戳的变量声明语句 (lottopollo, https://github.com/smartbugs/smartbugs/blob/master/
                 dataset/time_manipulation/lottopollo.sol). 对于这类标记我们没有做特殊处理, 可能导致部分漏洞能够被          Slither、
   389   390   391   392   393   394   395   396   397   398   399