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

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


                 安装量最高的     16 个  PyPI 互操作包及上述漏洞测例子集都是         Python 调用  C/C++的情形, 其中允许通过    PyObject_Call
                 等  Python/C API 函数由  C/C++侧回调  Python  对象.
                    进一步地, 为确保后续静态分析工具能够准确解析各项目源码, 我们对每一个候选项目在本地环境中进行依
                 赖配置并测试构建流程. 该步骤对于静态分析工具的成功构建和分析准确性至关重要. 一方面, 先进分析工具往往
                 依赖项目构建过程中生成的中间文件, 以及系统头文件路径、预处理宏展开以及符号链接信息等, 只有在项目被
                 完整构建后, 这些上下文信息才可被工具有效解析. 若项目未能成功构建, 将严重阻碍静态分析完整的语法语义信
                 息, 导致分析不准确或失败.
                    不同项目在构建系统与依赖管理方式上的差异也对分析环境配置提出更高要求. 例如, numpy、scipy、pandas
                 等高性能计算项目已普遍引入           mamba 等现代化依赖解析器, 以适配复杂的编译依赖与平台特性; 相比之下, 其他
                 中小型项目仍采用       setuptools 或  distutils 等传统构建方式. 前者往往依赖  CMake、Meson、cythonize 等二级构建
                 系统, 并可能在构建阶段动态生成部分            C/C++文件和头文件, 而后者则相对结构简单. 这些差异直接影响构建流程
                 的完整性和构建产物的可访问性, 因此也对静态分析工具的兼容性与适配能力提出了挑战.
                    为了保证对不同项目的构建链的统一调度与评估复现, 我们在本地实现了一个统一驱动脚本, 作为自动化构
                 建与评估的入口. 该驱动脚本调用不同项目的原生构建脚本, 根据评估任务相应地设置环境变量并执行分析命令,
                 同时调用针对被测项目的配置文件. 确保每个项目的源码在分析前都已成功通过其原生构建系统处理, 最大程度
                 还原其语法结构和语义信息, 以保障分析评估阶段的完整性与准确性. 不同工具的主要分析命令、环境变量和配
                 置文件如表    4  所示.

                                       表 4 不同工具的主要分析命令、环境变量和配置文件

                    工具                   分析命令                            环境变量                 配置文件
                                                                  CC=“/path-to/gcc-python-plugin/
                  CPyChecker     python setup.py build_ext --inplace                           setup.py
                                                                     gcc-with-cpychecker”
                             scan-build -disable-checker core -enable-checker
                   PyRefcon   alpha.core.PythonReferenceCountingChecker     -                  setup.py
                                      python setup.py build
                   PyCType         python evaluate.py target_dir            -                ppconfig.yml
                                                                 CC=“clang -emit-llvm -Xclang -load
                                    python setup-sda.py build       -Xclang llvmSDIpass.so”
                             sda -file $bc -criterion <your-path>/criterion.xml  CXX=“clang -emit-llvm -Xclang -load  setup-instrm.py,
                   PolyCruise                                                                setup-sda.py,
                                  difaEngine &python -m pyinspect   -Xclang llvmSDIpass.so”  criterion.xml
                                   -C <criterion.xml> -t <case>  LDSHARED=“clang -flto -pthread
                                                                     -shared -lDynAnalyze”
                                                                  CC=“/path-to/mopsa-wrappers/
                                                                     x86_64-linux-gnu-gcc”
                    Mopsa          python3 setup.py build --force                              setup.py
                                                               LDSHARED=“/path-to/mopsa-wrappers/
                                                                  x86_64-linux-gnu-gcc -shared”

                    最后, 作为漏洞基准套件的一部分, 由           PyPI 库得到的高安装量软件包在构建成功并分离出互操作程序后, 由
                 先进安全分析工具进行评估          (评估过程和结果见第        4  节), 发现其中尚未报告和修复的漏洞, 并根据第            2  节中的漏
                 洞模式分类进行漏洞标注后加入漏洞基准套件.
                  3.3   其他互操作安全漏洞基准套件与数据集
                    已有的互操作安全研究大多没有提供系统而全面的漏洞基准套件, 仅针对漏洞模式给出示例代码, 或根据常
                 见漏洞来源选取部分测试项目. Tan          等人  [8] 分析总结了  Java-C/C++互操作的漏洞模式分类, 并在         Java 开发套件
                 (Java development kit, JDK) 中使用单语言工具进行了漏洞检查, 反映出单语言工具检查互操作漏洞时极高的误报
                 率. Hu  等人  [9,10] 分析讨论了  Java-C/C++互操作的漏洞模式在   Python-C/C++互操作程序中的表现形式, 设计实现了
                 基于模式匹配的轻量漏洞检查方法, 其误报率也较高. 这两个工作反映出                       Python-C/C++互操作的漏洞检查需要定
                 制的、精细的程序分析工具. 同时所有已知的数据集都无法评估漏报率, 而只能评估特定检查器针对少数漏洞模
   42   43   44   45   46   47   48   49   50   51   52