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) 的检查, 该工具已开源.

