Page 51 - 《软件学报》2026年第7期
P. 51

2736                                                       软件学报  2026  年第  37  卷第  7  期


                                   表 7    Python-C/C++互操作漏洞检查工具在基准测例上的表现           (续)

                              细粒度漏洞模式                                   分析工具测例通过率
                   编号           名称           测例数量       CPyChecker  PyRefcon  PyCType  PolyCruise  Mopsa
                   C1.1   GIL引发的临界区阻塞           4          -          -         -         -        -
                   N1.1    接口层整数除零操作            5          -          -         -        *3/5      -
                 注: *为表现最好的工具
                    表  7  中画横线的单元格表示该工具不支持对应漏洞模式的检查, 因此未通过任何测例. 其余单元格内分母表
                 示漏洞模式的测例总数, 分子表示其中正确检出的测例数量.
                    ● Answer 1. 已有  Python-C/C++互操作程序漏洞检查工具对漏洞模式的覆盖能力存在明显不足, 仅能支持                     15
                 种漏洞模式中的      8  种, 此外还有  2  种漏洞模式尽管有检查工具宣称覆盖但未检出有效结果.
                    如表  7  所示, 在漏洞基准测例包含的        15  种常见漏洞模式中, 7    种漏洞模式     (占比  46.7%) 在所有工具上均未报
                 告有效检出. 例如, 对于内存管理错误          (M2), 其两个漏洞模式构造析构不匹配          (M2.1) 和非法内存分配与释放      (M2.2)
                 均未有检查工具提供分析能力. 此外, 异常后非预期控制流                  (E1.1), 异常重复抛出   (E1.2), GIL  引发的临界区阻塞
                 (C1.1) 等漏洞类型也没有工具可以支持. 异常状态与返回值不一致                 (E1.3), 未检查接口函数返回值      (E2.1) 这两个漏
                 洞模式尽管有工具宣称覆盖, 但均未检出有效报错.
                    ● Answer 2. 在能够分析的   8  种漏洞模式中, 在对每个漏洞都选用表现最好的工具的情况下, 整体漏报率仍然
                 高达  52% (26/50).
                    即使在有工具报告检出的          8  种漏洞模式中, 覆盖表现亦呈现显著局限性. 以在每种漏洞上检查能力表现最好
                 的工具为例, PyRefcon  对内存泄漏     (M1.1) 漏报  50%, 对悬空引用或对象过早释放        (M1.2) 漏报  20%. PolyCruise 对
                 缓冲区越界访问      (M3.1) 漏报  33%. Mopsa 对跨语言传参溢出    (T1.1) 漏报  67%. PolyCruise 和  Mopsa 对接口层运算
                 溢出  (T1.2) 均漏报  67%, CPyChecker 对格式化字符串不匹配     (T2.1) 漏报  50%, PyCType 对调用约定不匹配    (T2.2)
                 漏报  55%, PolyCruise 对接口层整数除零操作     (N1.1) 漏报  40%. 即使对于每个能够检查的漏洞都使用表现最好的
                 工具  (表  7  中*标记), 整体的漏报率依然高达       52%, 即综合运用    5  个工具在支持的    8  个漏洞模式的    50  个测例上仅
                 通过了其中的     26  个.
                    建模粒度较粗或分析策略局限是漏报的主要原因. PyCType 为类型推断工具, 对于调用约定不匹配的类型一
                 致性错误, 仅能检测无参外部函数的情形, 其与            CPyChecker 对参数使用行为的建模能够一定程度形成互补. PyCType
                 仅检查参数使用, 不检查参数声明与调用约定标志是否匹配, 是其无法通过部分测例的主要原因. 对于传参溢出和
                 运算溢出的测例, Mopsa 和     PolyCruise 都表现出一定的局限性. Mopsa 能捕获部分整数乘法和符号转换过程中的
                 溢出, 但对整数加法、位移以及浮点溢出均不支持, 导致多个测例漏报; PolyCruise 仅支持加法和乘法运算, 忽略
                 其他算术操作, 同时仅分析        C/C++侧运算过程, 对于     Python  侧传参所引发的溢出则无法感知. 此外, PolyCruise 在
                 除零错误检查时也不支持浮点运算和复杂表达式求值的情形. 对于引用计数错误                          (M1), PyRefcon  在检测释放后使
                 用  (use-after-free) 等错误方面表现优异, 但对于返回借引用却未显式增加引用计数的情形则存在无法有效分析的
                 测例. 同时, 由于依赖于显式       Py_INCREF、Py_DECREF   调用作为分析起点, PyRefcon     对复杂引用路径的支持仍
                 有不足.
                  4.4   可靠性分析
                    一个分析是可靠的意味着其报告的所有结果都是真实存在的漏洞或性质, 即漏洞检查没有误报. 可靠性直接
                 关系到系统的可用性, 能够避免对大规模软件包库产生过多误报而带来高昂的人工检查开销.
                    ● RQ3: 已有漏洞检查工具在真实软件供应链分析中的误报率如何?
                    我们选取了     PyPI 平台中安装量排名前      16 的包含  Python-C/C++互操作的项目作为分析对象. 由于         PolyCruise [14]
                 和  Mopsa [16] 可扩展性的问题  (详见  RQ4), 我们复用了其论文中部分项目          (python-levenshtein、pyahocorasick  和
                 numpy) 的数据, 这部分数据仅用于综合评估分析存在可扩展性问题的方法和工具, 其结果不计入本文新发现的
   46   47   48   49   50   51   52   53   54   55   56