Page 48 - 《软件学报》2026年第7期
P. 48
胡明哲 等: Python 软件包库中 C/C++外部语言调用的安全性分析 2733
式的误报率. PolyCruise [14] 和 Mopsa [16] 针对其分析的特定漏洞模式分别提供了测试用例, 以评估方法在特定语言特
性上的局限, 它们的数据集仅支持少数漏洞模式 (见第 4.3 节), 并且已经在归纳后包含在本文的漏洞模式分类中.
4 实验评估
4.1 C/C++单语言漏洞检测工具分析互操作程序的局限
首先说明 C/C++单语言漏洞检测工具在分析 Python-C/C++互操作程序漏洞上的局限. 考虑以下 6 个代表性的
分析工具: Clang Static Analyzer (CSA) 是基于 LLVM/Clang 编译器前端的符号执行框架; Cppcheck 采用规则驱动
的轻量数据流分析; Infer 基于抽象解释与路径推理, 分析内存与资源管理问题; Frama-C [20] 基于抽象解释, 支持函
数不变式求解与可达性分析; Splint 基于注释约定与类型检查实现接口一致性检查; Flawfinder 是基于规则匹配的
快速安全审计工具, 检测已知的危险函数模式.
从定性角度看 (表 5 中 C/C++分析工具可检测性列, △表示部分可检测), 现有 C/C++分析器的检测能力主要
聚焦于算术错误 (如整数溢出、除零)、内存错误 (如空指针解引用、资源泄漏、越界访问) 等传统 C/C++漏洞. 它
们通常通过数据流分析检查变量的取值范围与生命周期, 对 malloc/free 等标准内存操作具有较高的检测精度. 然
而, 这类工具的分析止步于 C/C++语言及 C 系统调用这一边界, 缺乏对跨语言生命周期及异常传播机制的建模和
分析, 因而在 Python-C/C++互操作场景中存在显著的检测盲区.
表 5 C/C++单语言漏洞检测工具分析 Python-C/C++互操作程序漏洞的表现
细粒度漏洞模式 测例通过率
C/C++分析工具可检测性
编号 名称 测例数量 CSA Cppcheck Infer Flawfinder
M1.1 内存泄漏 4 × - - - -
M1.2 悬空引用或对象过早释放 5 × - - - -
M2.1 构造析构不匹配 9 △ - - - -
M2.2 非法内存分配与释放 6 △ - - - -
M3.1 缓冲区越界访问 6 △ 4/6 - - 4/6
T1.1 跨语言传参溢出 3 △ - - - -
T1.2 接口层运算溢出 6 △ - 1/6 - -
T2.1 格式化字符串不匹配 12 × - - - -
T2.2 调用约定不匹配 9 × - - - -
E1.1 异常后非预期控制流 3 × - - - -
E1.2 异常重复抛出 2 × - - - -
E1.3 异常状态与返回值不一致 3 × - - - -
E2.1 未检查接口函数返回值 5 △ - - - -
C1.1 GIL引发的临界区阻塞 4 × - - - -
N1.1 接口层整数除零操作 5 △ 1/5 1/5 - -
定量实验在前文介绍的模式驱动的漏洞测例子集上进行, 4 个能够完成互操作程序分析流程的工具的评估结
果如表 5 所示, 结果基本验证了上述的定性分析. C/C++单语言漏洞检测工具在算术错误与局部内存错误上表现
出一定的检测能力, 但在涉及宿主语言对象状态和跨语言约束的测例中普遍失效.
4.2 Python-C/C++互操作程序漏洞检查工具的选择
为了全面评估已有先进工具检查 Python-C/C++互操作程序漏洞的能力, 我们系统地梳理 2010 年至今相关公
开文献与工具, 聚焦 Python 外部扩展的安全性分析与建模研究. 依据方法先进性、漏洞覆盖广度、工具可获取性
(开源/闭源)、资料完整度这 4 项标准, 遴选得到表 6 所示的 8 款代表性先进工具. 这些工具设计实现了不同的程
序分析技术 [21] , 包括数据流分析、符号执行、抽象解释、仿射分析、动态污点追踪、跨语言中间表示等, 能够识
别 Python-C/C++互操作程序的引用计数错误、类型一致性错误、缓冲区溢出、除零错误等安全漏洞.

