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

胡明哲 等: Python  软件包库中   C/C++外部语言调用的安全性分析                                        2733


                 式的误报率. PolyCruise [14] 和  Mopsa [16] 针对其分析的特定漏洞模式分别提供了测试用例, 以评估方法在特定语言特
                 性上的局限, 它们的数据集仅支持少数漏洞模式               (见第  4.3  节), 并且已经在归纳后包含在本文的漏洞模式分类中.

                  4   实验评估

                  4.1   C/C++单语言漏洞检测工具分析互操作程序的局限
                    首先说明    C/C++单语言漏洞检测工具在分析          Python-C/C++互操作程序漏洞上的局限. 考虑以下          6  个代表性的
                 分析工具: Clang Static Analyzer (CSA) 是基于  LLVM/Clang  编译器前端的符号执行框架; Cppcheck   采用规则驱动
                 的轻量数据流分析; Infer 基于抽象解释与路径推理, 分析内存与资源管理问题; Frama-C                   [20] 基于抽象解释, 支持函
                 数不变式求解与可达性分析; Splint 基于注释约定与类型检查实现接口一致性检查; Flawfinder 是基于规则匹配的
                 快速安全审计工具, 检测已知的危险函数模式.
                    从定性角度看      (表  5  中  C/C++分析工具可检测性列, △表示部分可检测), 现有          C/C++分析器的检测能力主要
                 聚焦于算术错误      (如整数溢出、除零)、内存错误          (如空指针解引用、资源泄漏、越界访问) 等传统               C/C++漏洞. 它
                 们通常通过数据流分析检查变量的取值范围与生命周期, 对                    malloc/free 等标准内存操作具有较高的检测精度. 然
                 而, 这类工具的分析止步于        C/C++语言及   C  系统调用这一边界, 缺乏对跨语言生命周期及异常传播机制的建模和
                 分析, 因而在   Python-C/C++互操作场景中存在显著的检测盲区.


                               表 5 C/C++单语言漏洞检测工具分析          Python-C/C++互操作程序漏洞的表现

                             细粒度漏洞模式                                                 测例通过率
                                                       C/C++分析工具可检测性
                  编号            名称           测例数量                          CSA   Cppcheck  Infer  Flawfinder
                  M1.1        内存泄漏              4              ×           -       -       -       -
                  M1.2   悬空引用或对象过早释放            5              ×           -       -       -       -
                  M2.1      构造析构不匹配             9             △            -       -       -       -
                  M2.2    非法内存分配与释放             6             △            -       -       -       -
                  M3.1      缓冲区越界访问             6             △            4/6     -       -      4/6
                   T1.1     跨语言传参溢出             3             △            -       -       -       -
                   T1.2     接口层运算溢出             6             △            -       1/6     -       -
                   T2.1   格式化字符串不匹配             12             ×           -       -       -       -
                   T2.2     调用约定不匹配             9              ×           -       -       -       -
                   E1.1   异常后非预期控制流             3              ×           -       -       -       -
                   E1.2      异常重复抛出             2              ×           -       -       -       -
                   E1.3  异常状态与返回值不一致            3              ×           -       -       -       -
                   E2.1   未检查接口函数返回值            5             △            -       -       -       -
                   C1.1   GIL引发的临界区阻塞           4              ×           -       -       -       -
                  N1.1    接口层整数除零操作             5             △            1/5     1/5     -       -

                    定量实验在前文介绍的模式驱动的漏洞测例子集上进行, 4                   个能够完成互操作程序分析流程的工具的评估结
                 果如表   5  所示, 结果基本验证了上述的定性分析. C/C++单语言漏洞检测工具在算术错误与局部内存错误上表现
                 出一定的检测能力, 但在涉及宿主语言对象状态和跨语言约束的测例中普遍失效.
                  4.2   Python-C/C++互操作程序漏洞检查工具的选择
                    为了全面评估已有先进工具检查            Python-C/C++互操作程序漏洞的能力, 我们系统地梳理            2010  年至今相关公
                 开文献与工具, 聚焦      Python  外部扩展的安全性分析与建模研究. 依据方法先进性、漏洞覆盖广度、工具可获取性
                 (开源/闭源)、资料完整度这        4  项标准, 遴选得到表    6  所示的  8  款代表性先进工具. 这些工具设计实现了不同的程
                 序分析技术    [21] , 包括数据流分析、符号执行、抽象解释、仿射分析、动态污点追踪、跨语言中间表示等, 能够识
                 别  Python-C/C++互操作程序的引用计数错误、类型一致性错误、缓冲区溢出、除零错误等安全漏洞.
   43   44   45   46   47   48   49   50   51   52   53