Page 52 - 《软件学报》2026年第7期
P. 52
胡明哲 等: Python 软件包库中 C/C++外部语言调用的安全性分析 2737
21 个真实漏洞.
● Answer 3. 对于软件供应链中的大型 Python-C/C++互操作项目, CPyChecker 漏洞误报率高达 99.9%;
PyRefcon 漏洞误报率高达 91.66%; PyCType 漏洞误报率 5.3%. 整体上, 被测先进工具的漏洞误报率高达 97.17%.
如表 8 所示, CPyChecker 报告格式化字符串不匹配 (T2.1) 漏洞共计 168 处, 仅 1 处为真阳性, 误报率 99.4%;
报告调用约定不匹配 (T2.2) 漏洞共 530 处, 未检出任何真实漏洞, 显示其在软件供应链分析中对类型一致性错误 (T2)
缺乏有效判别能力. PyRefcon 在引用计数错误 (M1) 的检查中报告内存泄漏 (M1.1) 漏洞 2 处, 确认 0 处为真阳性,
误报率 100%; 报告悬空引用或对象过早释放 (M1.2) 漏洞 22 处, 确认 2 处为真阳性, 误报率 91%. 虽然误报率相
对 CPyChecker 较好, 但整体误报率仍然高达 91.66%.
表 8 CPyChecker 和 PyRefcon 软件供应链分析的真阳性 (TP) 和假阳性 (FP) 结果
CPyChecker PyRefcon
评估项目 日安装量 (万)
编译通过 警告 TP FP 编译通过 警告 TP FP
numpy 1 799 no 0 0 0 yes 1 0 1 (M1.2)
cffi 1 527 yes 40 0 40 (T2.1) yes 5 0 4 (M1.2)+1 (M1.1)
pandas 1 479 no 0 0 0 yes 0 0 0
protobuf 1 367 yes 4 0 3 (T2.2)+1 (T2.1) yes 1 0 1 (M1.2)
multidict 904 yes 0 0 0 yes 0 0 0
wrapt 866 yes 6 0 2 (T2.2)+4 (T2.1) yes 1 0 1 (M1.2)
greenlet 756 no 0 0 0 yes 2 0 2 (M1.2)
psutil 753 no 0 0 0 yes 1 0 1 (M1.2)
grpcio 736 yes 263 0 263 (T2.2) yes 2 0 2 (M1.2)
pillow 720 yes 133 0 119 (T2.1)+14 (T2.2) yes 1 0 1 (M1.2)
scipy 707 no 0 0 0 yes 1 0 1 (M1.2)
grpcio-tools 694 yes 0 0 0 yes 1 0 1 (M1.2)
lxml 674 yes 227 0 227 (T2.2) yes 2 1 (M1.2) 1 (M1.1)
msgpack 576 yes 19 0 19 (T2.2) yes 2 1 (M1.2) 1 (M1.2)
regex 547 yes 3 0 1 (T2.1)+2 (T2.2) yes 1 0 1 (M1.2)
coverage 486 yes 1 1 (T2.1) 0 yes 1 0 1 (M1.2)
python-levenshtein 35 yes 0 0 0 yes 1 0 1 (M1.2)
pyahocorasick 4 yes 2 0 2 (T2.1) yes 1 0 1 (M1.2)
总计 13/18 698 1 697 16/16 24 2 22
如表 9 所示, PyCType 通过保守可靠的类型语义建模表现出较优的误报率. 在测试的 18 个 PyPI 包中报告调
用约定不匹配 (T2.2) 漏洞共 19 处, 其中 18 处为真阳性, 仅有 1 处为假阳性, 整体误报率仅 5.3%. 由于较差的可扩
展性, PolyCruise [14] 和 Mopsa [16] 无法在 16 个高下载量的主流软件包上进行有效评估, 我们复用其论文提供的评估
数据 (表 9 中*标记): PolyCruise 在 numpy 项目中发现了 3 个实际漏洞, 整体准确率 88.2%; Mopsa 在 C/C++和
Python 侧的测试准确率分别为 93.9% 和 97.2%. 综合表 8、表 9, 共计得到 741 个警报 (不含复用论文数据), 其中
21 个为真实漏洞, 整体漏洞误报率高达 97.17%.
表 9 PyCType、PolyCruise、Mopsa 软件供应链分析的真阳性 (TP) 和假阳性 (FP) 结果
PyCType PolyCruise Mopsa
评估项目 日安装量 (万) 测试准确率 (%)
可分析文件 警告 TP FP 成功触发 TP/警告 成功触发
C++ Python
numpy 1 799 732/1 018 2 2 (T2.2) 0 yes (1 (T1.2)+2 (M3.1))/3 0 0 0
cffi 1 527 15/25 1 1 (T2.2) 0 no 0 0 0 0
pandas 1 479 6/12 0 0 0 no 0 0 0 0
protobuf 1 367 2/73 0 0 0 no 0 0 0 0
multidict 904 0/1 0 0 0 no 0 0 0 0
wrapt 866 0/1 0 0 0 no 0 0 0 0

