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
   47   48   49   50   51   52   53   54   55   56   57