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] . 具备可扩展性意味着能够相对自动化地批量部署和分析复杂软件包, 这在软
   48   49   50   51   52   53   54   55   56   57   58