Page 45 - 《软件学报》2026年第7期
P. 45
2730 软件学报 2026 年第 37 卷第 7 期
//Py_END_ALLOW_THREADS
Py_RETURN_NONE;
}
2.5 数值计算
Python 对于数值计算中的非法操作 (如除零) 会自动抛出异常, 以保障控制流的可预测性与错误的可追踪性.
而在 C/C++中, 整数除零、浮点除零、空指针解引用等运行时错误属于未定义行为, 不会自动抛出异常, 执行结果
取决于编译器、平台甚至硬件指令集, 可能导致程序崩溃或产生不符合预期的返回值. 当外部函数的数值型参数
参与数值计算时, 接口层整数除零操作 (N1.1) 等漏洞也可能存在, 如代码 11 所示.
代码 11. 接口层整数除零操作 (N1.1) 测例.
//a 和 b 是来自 Python 侧的整型参数, a 除以 b, 未检查 b 是否为零
static PyObject* do_division(PyObject *self, PyObject *args) {
int a, b;
if (!PyArg_ParseTuple(args, “ii”, &a, &b)) return NULL;
double result = a/b;
return PyFloat_FromDouble(result);
}
3 漏洞基准套件构建
为了系统地评估 Python-C/C++互操作程序的漏洞检查工具, 本文构建了一套覆盖性强、结构清晰的漏洞基
准套件. 该套件由两大部分组成, 分别是基于上述漏洞模式分类构建的漏洞基准测例, 以及面向真实工程实践的来
自 Python 软件包库 PyPI 的高安装库中存在漏洞的互操作程序.
作为漏洞基准套件的两部分, 模式驱动的漏洞测例子集与软件供应链真实漏洞子集两者相互补充并承担不同
的评估职责: 模式驱动的漏洞测例子集主要用于准确评估工具对完整漏洞模式的检出能力 (漏报率); 软件供应链
真实漏洞子集则侧重反映工具在复杂工程项目中的实际表现, 包括误报率和可扩展性. 其中软件供应链真实漏洞
子集的构建是一个同步进行工具评估和漏洞标注的过程, 考察复杂软件环境下的误报率, 收集软件供应链中的真
实漏洞, 不作为漏报率的评估基准.
该漏洞基准套件具有覆盖全面、结构清晰、易于扩展等优点. 不仅涵盖真实 Python 软件包中广泛使用的
Python-C/C++互操作场景, 体现出良好的代表性与多样性; 同时依托系统的漏洞模式分类, 为每类典型漏洞设计实
现可控、可复现的标准化测例, 支持静态与动态分析工具的统一评估. 该漏洞基准套件具备统一接口、版本兼容、
源汇点标注、支持先进安全性分析技术等优势, 为 Python-C/C++互操作程序的安全性分析研究提供高质量、可
持续演进的评估测试平台. 漏洞基准套件构建的总体流程如后文图 4 所示.
3.1 模式驱动的漏洞测例子集构建
为了提高漏洞模式的代表性, 构建表 1 所示漏洞测例子集时混合了以下 4 个来源: (1) Python 3.13 版本
Python/C API 官方文档; (2) 已有的 Python-C/C++跨语言互操作安全性分析研究和工具 [9−17] ; (3) 已有的其他语言
互操作安全性研究 [8,18] ; (4) CVE 库及 Python-C/C++互操作软件开源漏洞列表. 对来源 (1)–(3) 中的文档和文献进
行通读, 对来源 (4) 进行以表 1 细粒度漏洞模式列为关键字的搜索和筛选, 实现了其中所有示例代码和漏洞, 包括
文档中所有提及可能存在隐患的情形. 随后对复现得到的大量候选样例进行人工审查, 去除重复及与漏洞无关的
业务逻辑, 基于第 2 节定义的漏洞模式手工提炼与构造每个模式对应的最小可复现测试单元.

