Page 38 - 《软件学报》2026年第7期
P. 38
胡明哲 等: Python 软件包库中 C/C++外部语言调用的安全性分析 2723
洞模式分配唯一编号 (如 M1.1、T2.2 等), 作为后续漏洞检查工具分析评估和漏洞基准测例索引的标签. 该自顶向
下的漏洞模式框架提升分类体系的可解释性, 也为漏洞基准套件设计与工具效果评估提供系统化的分类标准, 同
时为后续漏洞检查方法扩展和设计提供理论基础.
Python/C API 官方 漏洞模式
文档 (v3.13) S1 审计、整理、分类
漏洞示例实现
已有 Python-C/C++ 语言特性差异
互操作研究与工具 安 语 版 E1
全 言 本
分 改 迭
其他语言的互操作 析 代 E2 互操作接口设计
安全研究 写
漏洞示例实现
CVE 库/Python- 跨语言
C/C++ 互操作软件 S2 运行时行为
开源漏洞列表
图 3 漏洞模式分类流程图
基于上述分类方法设计, 本文系统地构建了一个覆盖全面、结构清晰的 Python-C/C++互操作程序漏洞模式
分类体系 (如表 1 所示).
表 1 漏洞模式分类表
语言特性 漏洞模式小类 小类编号 细粒度漏洞模式 细粒度编号
内存泄漏 M1.1
引用计数错误 M1
悬空引用或对象过早释放 M1.2
内存模型 构造析构不匹配 M2.1
内存管理错误 M2
非法内存分配与释放 M2.2
缓冲区溢出 M3 缓冲区越界访问 M3.1
跨语言传参溢出 T1.1
整数溢出 T1
接口层运算溢出 T1.2
类型系统
格式化字符串不匹配 T2.1
类型一致性错误 T2
调用约定不匹配 T2.2
异常后非预期控制流 E1.1
异常处理错误 E1 异常重复抛出 E1.2
异常处理
异常状态与返回值不一致 E1.3
不完整的错误检查 E2 未检查接口函数返回值 E2.1
并发控制 数据竞争 C1 GIL导致的临界区阻塞 C1.1
数值计算 除零错误 N1 接口层整数除零操作 N1.1
下面将围绕上述漏洞模式分类, 系统地介绍每种漏洞模式并分析其语言特性差异及带来的 Python-C/C++外
部语言调用的安全性问题.
2.1 内存模型
2.1.1 引用计数错误 (M1)
Python 是带有自动垃圾收集机制的语言, 解释器通过引用计数跟踪每个 Python 对象的生命周期; 而在
C/C++中, 内存管理则依赖显式的分配与释放操作. 当 C/C++扩展模块持有 Python 对象的引用时, 开发者需通过调
用特定的 Python/C API 如 Py_INCREF 和 Py_DECREF 手动增减引用计数. 由于借引用和偷引用行为 [19] 的存在,
手动管理引用计数并不容易, 引用计数错误可能导致内存泄漏 (M1.1)、悬空引用或对象过早释放 (M1.2) 等错误,
进而引发运行时错误乃至安全攻击.
在代码 1 的测例 1 中, 外部函数实现 leaky_creation 通过 Python/C API 函数 PyLong_FromLong 创建一个新

