Page 53 - 《软件学报》2026年第7期
P. 53
2738 软件学报 2026 年第 37 卷第 7 期
表 9 PyCType、PolyCruise、Mopsa 软件供应链分析的真阳性 (TP) 和假阳性 (FP) 结果 (续)
PyCType PolyCruise Mopsa
评估项目 日安装量 (万) 测试准确率 (%)
可分析文件 警告 TP FP 成功触发 TP/警告 成功触发
C++ Python
greenlet 756 1/1 0 0 0 no 0 0 0 0
psutil 753 7/61 0 0 0 no 0 0 0 0
grpcio 736 45/520 0 0 0 no 0 0 0 0
pillow 720 80/86 5 5 (T2.2) 0 no 0 0 0 0
scipy 707 265/452 0 0 0 no 0 0 0 0
grpcio-tools 694 0/12 0 0 0 no 0 0 0 0
lxml 674 0/6 0 0 0 no 0 0 0 0
msgpack 576 0/1 0 0 0 no 0 0 0 0
regex 547 2/2 6 5 (T2.2) 1 (T2.2) no 0 0 0 0
coverage 486 4/4 5 5 (T2.2) 0 no 0 0 0 0
python-levenshtein 35 4/19 0 0 0 no 0 17/17 93.1* 98.0*
pyahocorasick 4 3/3 0 0 0 no 0 46/92 79.9* 93.2*
总计 50.8% 19 18 1 - 88.2%* - 93.9* 97.2*
注: *为文献[14,16]提供的评估数据
综上, 我们在 PyPI 软件包库安装量排名前 16 的含有 Python-C/C++互操作的软件包中新发现 3 种共 21 个漏
洞实例. 这些漏洞分布于 PyPI 安装量最高的核心包中, 日安装量在 486 万–1 799 万之间, 漏洞的影响用户数巨大.
此外, 这类软件供应链核心包一旦存在漏洞, 会通过依赖传播影响大量下游项目, 其安全隐患的影响范围不可忽视.
● RQ4: 先进工具在 PyPI 软件供应链中进行互操作安全性分析产生大量误报的主要原因是什么?
对于 CPyChecker, 其误报主要源于版本支持落后, 无法正确识别 Python 新版本中引入的语言特性和对应的
Python/C API. 例如, 从表 8 中的 grpcio、lxml 等项目可以看出, CPyChecker 在调用约定不匹配 (T2.2) 漏洞上产生
了大量误报. lxml 中的 227 条误报、grpcio 中的 263 条误报全部源于无法识别 METH_FASTCALL | METH_
KEYWORDS 这一 Python 3.7 引入的外部函数调用约定标志. 虽然对应的外部函数确实采用了正确的四参数签名,
但由于 CPyChecker 不支持该调用约定标志, 故错误地认为参数数量不符, 从而发出误报.
此外, CPyChecker 还存在一些分析算法设计上的问题. 例如, METH_NOARGS 调用约定标志规定外部函数不
从 Python 侧接收任何参数 (self 对象除外), 但是由于 CPyChecker 仅考虑外部函数类型 PyCFunction 可接收两个
参数, 因此其对所有采用 METH_NOARGS 声明的外部函数都会产生错误警告. 这类误报反映了工具在外部函数
类型建模上的缺陷.
PyRefcon 的误报主要源于其内建的引用计数状态机在某些语义推理上的不足. PyRefcon 主要通过静态追踪
Py_INCREF 和 Py_DECREF 的调用以推断对象生命周期, 但当进入 Py_DECREF 内部展开进一步分析时, 会沿着
调用链进一步跟踪至 Py_Dealloc. 此时在工具视角下, 对象被认为已经释放, 再次调用 Py_Dealloc 即会被视为释放
后使用而触发误报. 这种问题实质上并非真实错误, 而是由于工具在对象生命周期建模时未正确处理 Py_DECREF
到 Py_Dealloc 的关系, 导致状态转换超前, 产生误报.
● Answer 4. 误报主要来自: 1) 版本迭代引入未建模的 Python/C API; 2) 互操作的复杂性导致分析算法本身不
可靠; 3) 语义建模未考虑 Python/C API 内部实现.
4.5 可扩展性分析
可扩展性通常指当规模、负载、功能需求增长时, 系统或方法仍能高效、稳定地运行, 并且能够方便地扩展
功能或容量. 软件供应链往往包含海量的软件包, 其中高安装量的包大多结构复杂、代码量大. 编译时检查漏洞的
工具在面对大规模代码时, 或多或少地出现了部分代码无法通过编译、依赖专家知识扩展分析规则的问题. 以互
操作为例, 除了基于 Python/C API 编写跨语言接口外, PyTorch 还基于接口生成工具 pybind11 声明了部分的外部
函数, 多数工具不支持这一行为 [22] . 具备可扩展性意味着能够相对自动化地批量部署和分析复杂软件包, 这在软

