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

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


                  4.2.3    数据流分析工具
                    ● CPyChecker: 基于  GCC  的静态数据流分析工具, 用于检测        Python  的  C  扩展模块中常见的   Python/C API 误
                 用问题. CPyChecker 能够检查引用计数错误        (M1.1/M1.2)、异常处理错误    (E1.2/E1.3)、格式化字符串不匹配      (T2.1)
                 等安全漏洞. CPyChecker 在   GCC  中  C  程序静态分析的基础上, 建模并检查        Python/C API 的使用规范  (较早版本),
                 可以集成于    GCC  编译工具链的构建流程进行静态审计, 支持主流               GCC  版本且已开源.
                  4.2.4    基于跨语言中间表示的动态分析与测试工具
                    动态分析与测试可以弥补静态分析在动态特性上的误报和效率问题, 相关研究基于跨语言的中间表示将动态
                 分析与测试扩展到支持        Python-C/C++互操作程序.
                    ● PolyCruise [14] : 设计了一种跨语言的统一中间表示     LISR (language-independent symbolic representation), 通过
                 轻量级静态分析提取不同语言模块间的符号依赖关系, 进而实现动态的选择性插桩与信息流分析. PolyCruise 在
                 运行时使用动态信息流图         (dynamic information flow graph, DIFG) 追踪变量依赖关系, 以检查诸如缓冲区溢出   (M3.1)、
                 整数溢出   (T1.1/T1.2)、除零错误   (N1.1) 等安全漏洞. 该工具已开源, 是目前少有的支持动态信息流计算的跨语言
                 漏洞检测框架之一.
                    ● PolyFuzz  [15] : 面向多语言系统设计的一种灰盒模糊测试框架, 通过统一中间表示                  SAIR (static abstract
                 intermediate representation) 简化语言间语义差异, 结合支配树分析、种子敏感性建模和路径感知输入生成等技术
                 提高模糊测试效率. 该方法能够检查内存泄漏               (M1.1)、空指针解引用     (M1.2)、缓冲区越界访问      (M3.1) 等安全漏
                 洞, 目前已开源.
                  4.3   完备性分析
                    完备性是指分析能力覆盖目标范围内所有可能的安全问题, 具备完备性意味着检查器没有漏报. 完备性评估
                 衡量方法或系统分析能力的边界. 为系统评估分析已有先进工具在                      Python-C/C++互操作程序漏洞检测时的完备
                 性, 我们提出以下两个研究问题.
                    ● RQ1: 已有漏洞检测工具能够覆盖哪些           Python-C/C++互操作程序漏洞模式?
                    ● RQ2: 已有漏洞检测工具在不同漏洞模式上的漏报率如何? 产生漏报的主要原因是什么?
                    基于第   3  节提出的漏洞基准套件, 我们系统地评估第             4.2  节选择的工具在第    2  节提出的漏洞模式上的适用性
                 与能力边界. 我们选取      Mopsa、CPyChecker、PyRefcon、PyCType 和  PolyCruise 对基准测试程序中每种漏洞模式
                 对应的若干测例逐一检查并统计其分析能力的覆盖情况. RID                   与  Pungi 未开源, PolyFuzz 依赖输入驱动模糊测试,
                 因此被排除在外. 余下工具在不同漏洞模式下的表现汇总于表                    7.

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

                              细粒度漏洞模式                                    分析工具测例通过率
                   编号            名称            测例数量      CPyChecker  PyRefcon  PyCType  PolyCruise  Mopsa
                   M1.1        内存泄漏              4          0/4       *2/4      -         -         -
                   M1.2   悬空引用或对象过早释放            5          0/5       *4/5      -         -         -
                   M2.1      构造析构不匹配             9          -          -        -         -         -
                   M2.2    非法内存分配与释放             6          -          -        -         -         -
                   M3.1      缓冲区越界访问             6          -          -        -         *4/6     2/6
                   T1.1      跨语言传参溢出             3          -          -        -         -        *1/3
                   T1.2      接口层运算溢出             6          -          -        -         2/6      *2/6
                   T2.1    格式化字符串不匹配             12        *6/12       -        -         -        4/12
                   T2.2      调用约定不匹配             9          3/9        -        *4/9      -         -
                   E1.1    异常后非预期控制流             3          -          -        -         -         -
                   E1.2       异常重复抛出             2          -          -        -         -         -
                   E1.3   异常状态与返回值不一致            3          -          -        -         -        0/3
                   E2.1   未检查接口函数返回值             5          0/5        -        -         -         -
   45   46   47   48   49   50   51   52   53   54   55