Page 49 - 《软件学报》2026年第7期
P. 49

2734                                                       软件学报  2026  年第  37  卷第  7  期



                                      表 6 评估的    Python-C/C++互操作程序先进漏洞检查工具

                    工具         分析方法               能够分析的问题                 支持的漏洞模式        是否开源 提出时间
                            跨语言中间表示+
                  PolyCruise  符号依赖分析+动     缓冲区越界访问、整数溢出、除零                M3.1/T1.2/N1.1    是      2022
                             态信息流追踪
                   PolyFuzz  动态模糊测试       内存泄漏、悬空引用、越界内存访问                M1.1/M1.2/M3.1    是      2023
                   PyRefcon    符号执行            内存泄漏、释放后使用                   M1.1/M1.2       是      2023
                                         缓冲区越界访问、整数溢出、格式化字符
                    Mopsa      抽象解释                                    M3.1/T1.1/T1.2/T2.1/E1.3  是  2021
                                              串不匹配、异常处理错误
                                         引用计数错误(泄漏/过早释放)、格式字符
                           基于GCC的数据流
                  CPyChecker             串不匹配、调用约定不匹配、未检查接口 M1.1/M1.2/T2.1/T2.2/E2.1        是      2012
                                分析
                                                   函数返回值
                   PyCType   静态类型推断               调用约定不匹配                     T2.2          是      2021
                    Pungi   仿射变换与分析           内存泄漏、对象过早释放                   M1.1/M1.2       否      2014
                     RID   不一致路径对检查           内存泄漏、对象过早释放                   M1.1/M1.2       否      2016

                  4.2.1    引用计数分析工具
                    基于引用计数的垃圾收集是           Python  和  C/C++在内存模型上核心的特性差异之一, 导致的互操作程序引用计
                 数错误   (M1) 被研究人员重点关注. 基于       Python/C API 增减引用计数容易引发内存泄漏、悬空引用、重复释放等
                 内存安全问题. 一系列研究工作围绕该漏洞设计实现对应的检查工具.
                    ● Pungi [11] : 采用基于静态单赋值形式的代码转换与仿射分析技术, 将             Python-C/C++互操作程序转换为仿射程
                 序, 并对引用计数行为进行建模与检测. Pungi 能够检查内存泄漏                (M1.1)、悬空引用    (M1.2) 等问题, 主要关注分析
                 精度与路径敏感的引用计数分析, 其并未开源.
                    ● RID [12] : 核心思想为不一致路径对检查, 通过基于        LLVM IR  的符号执行技术枚举路径, 提取路径摘要, 检查
                 不同路径在相同条件下引用计数的变化是否一致. RID                可以分析路径敏感的引用计数内存泄漏              (M1.1)、悬空引用
                 及对象过早释放      (M1.2) 漏洞, 适用于函数内复杂控制流结构下的引用计数错误分析. RID                 同样未开源.

                    ● PyRefcon [13] : 提出基于生命周期建模的检测方法, 构建       PyObject (互操作程序中所有     Python  对象的基类) 的
                 状态转换模型, 基于符号执行引擎对对象状态进行路径敏感追踪. PyRefcon                   对  384  个  Python/C API 接口的引用计
                 数行为进行建模, 能够检查包括内存泄漏             (M1.1) 与悬空引用   (M1.2) 在内的引用计数安全漏洞. PyRefcon      已开源,
                 具备良好的理论价值与实用性.
                    Pungi、RID  和  PyRefcon  分别和  CPyChecker (见第  4.2.2  节) 的引用计数错误检查进行了对比评估, 其中
                 PyRefcon  作为最新的工具, 宣称具有最好的效果.
                  4.2.2    类型与语义建模工具
                    相关研究将单语言的类型推断、抽象解释等程序分析技术扩展到                        Python-C/C++互操作场景. 通过跨语言类
                 型转换的语义建模和跨语言抽象域的设计, 提出通用的                  Python-C/C++互操作静态分析框架, 具有较好的扩展性,
                 能够支持类型相关跨语言安全漏洞的检查.
                    ● Mopsa [16] : 一个支持跨语言互操作抽象解释的静态分析平台. 针对             Python-C/C++互操作程序, 构建共享抽象
                 域的联合抽象解释框架. 分析过程包括互操作语义建模、边界函数抽象、数值与指针状态联合建模, 以及边界条
                 件的不变式生成. Mopsa 能够检查整数溢出           (T1.1/T1.2)、类型一致性错误中的调用约定不匹配            (T2.2)、异常处理
                 错误中的异常状态与返回值不一致            (E1.3) 等漏洞. Mopsa 支持模块化配置与扩展, 当前已开源.
                    ● PyCType [17] : 通过构建跨语言的静态类型推断系统, 基于         Python/C API 的类型转换语义对    Python  的  C/C++
                 外部函数进行类型推断, 推断结果可以增强              Python  单语言的静态类型推断工具. 作为类型推断的副产品, PyCType
                 可以检查外部函数的类型一致性漏洞             (T2.1/T2.2), 但作为类型推断系统的扩展应用示例, PyCType 只支持无参外
                 部函数标志    (表  3  中  METH_NOARGS) 的检查, 该工具已开源.
   44   45   46   47   48   49   50   51   52   53   54