Page 50 - 《软件学报》2026年第7期
P. 50
胡明哲 等: Python 软件包库中 C/C++外部语言调用的安全性分析 2735
4.2.3 数据流分析工具
● CPyChecker: 基于 GCC 的静态数据流分析工具, 用于检测 Python 的 C 扩展模块中常见的 Python/C API 误
用问题. CPyChecker 能够检查引用计数错误 (M1.1/M1.2)、异常处理错误 (E1.2/E1.3)、格式化字符串不匹配 (T2.1)
等安全漏洞. CPyChecker 在 GCC 中 C 程序静态分析的基础上, 建模并检查 Python/C API 的使用规范 (较早版本),
可以集成于 GCC 编译工具链的构建流程进行静态审计, 支持主流 GCC 版本且已开源.
4.2.4 基于跨语言中间表示的动态分析与测试工具
动态分析与测试可以弥补静态分析在动态特性上的误报和效率问题, 相关研究基于跨语言的中间表示将动态
分析与测试扩展到支持 Python-C/C++互操作程序.
● PolyCruise [14] : 设计了一种跨语言的统一中间表示 LISR (language-independent symbolic representation), 通过
轻量级静态分析提取不同语言模块间的符号依赖关系, 进而实现动态的选择性插桩与信息流分析. PolyCruise 在
运行时使用动态信息流图 (dynamic information flow graph, DIFG) 追踪变量依赖关系, 以检查诸如缓冲区溢出 (M3.1)、
整数溢出 (T1.1/T1.2)、除零错误 (N1.1) 等安全漏洞. 该工具已开源, 是目前少有的支持动态信息流计算的跨语言
漏洞检测框架之一.
● PolyFuzz [15] : 面向多语言系统设计的一种灰盒模糊测试框架, 通过统一中间表示 SAIR (static abstract
intermediate representation) 简化语言间语义差异, 结合支配树分析、种子敏感性建模和路径感知输入生成等技术
提高模糊测试效率. 该方法能够检查内存泄漏 (M1.1)、空指针解引用 (M1.2)、缓冲区越界访问 (M3.1) 等安全漏
洞, 目前已开源.
4.3 完备性分析
完备性是指分析能力覆盖目标范围内所有可能的安全问题, 具备完备性意味着检查器没有漏报. 完备性评估
衡量方法或系统分析能力的边界. 为系统评估分析已有先进工具在 Python-C/C++互操作程序漏洞检测时的完备
性, 我们提出以下两个研究问题.
● RQ1: 已有漏洞检测工具能够覆盖哪些 Python-C/C++互操作程序漏洞模式?
● RQ2: 已有漏洞检测工具在不同漏洞模式上的漏报率如何? 产生漏报的主要原因是什么?
基于第 3 节提出的漏洞基准套件, 我们系统地评估第 4.2 节选择的工具在第 2 节提出的漏洞模式上的适用性
与能力边界. 我们选取 Mopsa、CPyChecker、PyRefcon、PyCType 和 PolyCruise 对基准测试程序中每种漏洞模式
对应的若干测例逐一检查并统计其分析能力的覆盖情况. RID 与 Pungi 未开源, PolyFuzz 依赖输入驱动模糊测试,
因此被排除在外. 余下工具在不同漏洞模式下的表现汇总于表 7.
表 7 Python-C/C++互操作漏洞检查工具在基准测例上的表现
细粒度漏洞模式 分析工具测例通过率
编号 名称 测例数量 CPyChecker PyRefcon PyCType PolyCruise Mopsa
M1.1 内存泄漏 4 0/4 *2/4 - - -
M1.2 悬空引用或对象过早释放 5 0/5 *4/5 - - -
M2.1 构造析构不匹配 9 - - - - -
M2.2 非法内存分配与释放 6 - - - - -
M3.1 缓冲区越界访问 6 - - - *4/6 2/6
T1.1 跨语言传参溢出 3 - - - - *1/3
T1.2 接口层运算溢出 6 - - - 2/6 *2/6
T2.1 格式化字符串不匹配 12 *6/12 - - - 4/12
T2.2 调用约定不匹配 9 3/9 - *4/9 - -
E1.1 异常后非预期控制流 3 - - - - -
E1.2 异常重复抛出 2 - - - - -
E1.3 异常状态与返回值不一致 3 - - - - 0/3
E2.1 未检查接口函数返回值 5 0/5 - - - -

