58集团白盒代码审计系统建设实践1:技术选型
字数 2624 2025-08-22 18:37:21

58集团白盒代码审计系统建设实践:技术选型与实现

1. 背景与概述

源代码安全检测是安全开发流程(SDL)中至关重要的一环。在58集团的CI/CD流程中,每天有数千次量级的构建及发布,白盒检测的自动化能力显得极为重要。企业级的白盒代码审计系统不仅需要满足漏洞发现的需求,还需要适应企业CI/CD流程。

静态代码分析(SAST)是指在不实际执行程序的情况下,对代码语义和行为进行分析,找出程序中由于错误编码导致的异常程序语义或未定义行为。SAST技术通常在编程和/或测试软件生命周期(SLC)阶段分析应用程序的源代码、字节代码或二进制代码以查找安全漏洞。

2. 技术选型分析

2.1 商业产品分析

Coverity、Fortify、CheckMarx 是白盒静态扫描领域的领头产品:

优点

  • 深厚的技术积累,产品能力强大
  • 专业的技术团队支持
  • 在SAST领域内支持扫描的漏洞类型全面

缺点

  • 定制化需求支持困难,引擎对用户不透明
  • 规则学习成本高,自定义规则困难
  • 授权模式缺乏弹性,存在成本浪费
  • 难以适配企业内部漏洞模型
  • 融入企业CI/CD流程困难

实际案例

  1. Coverity的C/C++安全扫描依赖本地编译环境,MacOS版本适配通常延迟2-3个月
  2. Coverity未明显区分代码质量问题和安全漏洞,导致修复落地困难

2.2 开源产品分析

2.2.1 老牌开源工具

SonarQube、FindBugs、Checkstyle

优点

  • 源代码开源
  • 适配Jenkins等持续集成软件

缺点

  • 没有跨文件AST能力,无法分析跨文件数据流和控制流
  • 漏洞匹配模式导致误报率高
  • 更偏向代码质量检查而非安全性检查

2.2.2 其他开源产品

FlowDroid

产品概要

  • 针对Android的静态污点分析框架
  • 发表于PLDI'2014,Google Scholar引用1200+
  • GitHub仓库:https://github.com/secure-software-engineering/FlowDroid

技术分析

  • 命令行使用:
    java -jar soot-infoflow-cmd-jar-with-dependencies.jar \
      -al 500 -mc 500 -md 500 -a <APK文件路径> \
      -p <Android SDK平台目录路径> \
      -s <污染源和Sink点的定义文件>
    

优劣势

  • 优势:针对Android的开源框架,复杂性相对较低
  • 劣势:仅支持apk分析,安全规则需自行编写
ErrorProne

产品概要

  • Google出品,接管compiler在编译时进行检查
  • 官方文档:http://errorprone.info/
  • GitHub仓库:https://github.com/google/error-prone

技术分析

  • 支持多种安装方式(Bazel、Maven、Gradle等)
  • Maven示例配置:
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
        <fork>true</fork>
        <compilerArgs combine.children="append">
          <arg>-XDcompilePolicy=simple</arg>
          <arg>-Xplugin:ErrorProne -Xep:DeadException:WARN -Xep:GuardedBy:OFF</arg>
          <arg>-J-Xbootclasspath/p:${settings.localRepository}/com/google/errorprone/javac/9+181-r4173-1/javac-9+181-r4173-1.jar</arg>
        </compilerArgs>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.errorprone</groupId>
            <artifactId>error_prone_core</artifactId>
            <version>2.4.0</version>
          </path>
        </annotationProcessorPaths>
      </configuration>
    </plugin>
    

优劣势

  • 优势:编译阶段扫描缺陷点
  • 劣势:需要侵入项目配置,无法获取完整AST信息
Infer

产品概要

  • Facebook开源的静态程序分析工具
  • 官方文档:https://fbinfer.com/docs/getting-started/
  • GitHub仓库:https://github.com/facebook/infer

技术分析

  • 支持多种构建工具:ant、buck、cc、gradle、java、javac、make、mvn等
  • 扫描命令:
    mvn clean && infer -- mvn package
    
  • 结果输出在项目的infer-out/目录下

优劣势

  • 优势:支持多语言分析
  • 劣势:官方已放弃对AL(AST Language)的维护
Soot

产品概要

  • Java优化框架,提供4种中间代码分析和转换字节码
  • GitHub仓库:https://github.com/soot-oss/soot

技术分析

  • 支持分析格式:Java字节码(<=JDK9+)、Java源码(<=JDK7)、Android字节码等
  • 分析功能:CFG控制流图绘制、指针分析、数据流分析等
  • 使用示例:
    java -cp $SOOT_PATH soot.Main -pp \
      -cp .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH \
      org.packageName.MainClassName
    

优劣势

  • 优势:支持Java字节码和源码分析,可绘制控制流图
  • 劣势:前端编译器过时,对高版本JDK支持不佳
PMD

产品概要

  • 开源的静态代码分析工具
  • 官方文档:https://pmd.github.io/
  • GitHub仓库:https://github.com/pmd/pmd

技术分析

  • 支持语言:Java、JavaScript、Apex、PLSQL、XML等
  • 使用命令:
    ./run.sh pmd -d /path/to/工程目录 -R /path/to/规则集文件.xml -f text
    
  • 规则集示例:
    <ruleset name="Custom Rules">
      <description>My custom rules</description>
      <rule ref="category/java/errorprone.xml/EmptyCatchBlock" />
    </ruleset>
    

优劣势

  • 优势:支持多语言源码分析
  • 劣势:不支持编译后文件分析,安全规则薄弱

2.3 CodeQL深度分析

简介
CodeQL是Github安全实验室推出的静态代码分析引擎,使用QL语言对代码进行"查询",实现白盒审计和漏洞挖掘。

整体流程

  1. 通过AST解析器将代码解析为AST数据
  2. 按照预设数据模型将AST数据存储到CodeDB
  3. 使用QL语言定义污点追踪漏洞模型
  4. 执行QL查询CodeDB中的AST元数据

优点

  • 以CodeDB模式存储源代码数据,支持高效查询
  • 支持除PHP外的常见语言
  • QL规则开源且持续迭代
  • 可以深入Jar包进行扫描

缺点

  • AST分析引擎不开源
  • 不支持运行时动态绑定的重载方法分析
  • 不支持Resource文件扫描
  • 不支持软件成分分析

技术评价
CodeQL代表了开源SAST产品的最佳实践,通过:

  1. 结构化存储AST数据
  2. 使用QL语言进行类SQL查询
  3. 通过三元组<sources,sinks,sanitizers>定义漏洞模型
  4. 开源社区规则迭代
  5. 为AI训练提供样本

3. 技术选型结果

58集团最终选择参照CodeQL的设计思路,使用Spoon(Java AST解析器)加上自研跨文件串联能力作为扫描引擎的自研方案。主要考虑因素包括:

  1. CodeQL虽优秀但不允许企业集成到CI/CD流程
  2. 需要深度定制化以适应企业特定需求
  3. 58集团主要使用自研Java框架,需要针对性优化
  4. 需要支持企业级CI/CD流程的高并发需求

4. 后续计划

后续将详细分析SAST的技术原理,包括:

  1. AST解析技术
  2. 数据流和控制流分析
  3. 污点追踪实现
  4. 58基础安全团队学习CodeQL的过程
  5. 自研方案的技术实现细节

5. 总结

白盒代码审计系统的技术选型需要综合考虑:

  1. 技术能力(跨文件分析、数据流追踪等)
  2. 企业适配性(CI/CD集成、定制化需求)
  3. 维护成本(规则更新、技术支持)
  4. 性能与扩展性

58集团的经验表明,在商业产品限制多、开源产品能力不足的情况下,基于优秀开源方案进行二次开发和自研是可行的技术路线。

58集团白盒代码审计系统建设实践:技术选型与实现 1. 背景与概述 源代码安全检测是安全开发流程(SDL)中至关重要的一环。在58集团的CI/CD流程中,每天有数千次量级的构建及发布,白盒检测的自动化能力显得极为重要。企业级的白盒代码审计系统不仅需要满足漏洞发现的需求,还需要适应企业CI/CD流程。 静态代码分析(SAST)是指在不实际执行程序的情况下,对代码语义和行为进行分析,找出程序中由于错误编码导致的异常程序语义或未定义行为。SAST技术通常在编程和/或测试软件生命周期(SLC)阶段分析应用程序的源代码、字节代码或二进制代码以查找安全漏洞。 2. 技术选型分析 2.1 商业产品分析 Coverity、Fortify、CheckMarx 是白盒静态扫描领域的领头产品: 优点 : 深厚的技术积累,产品能力强大 专业的技术团队支持 在SAST领域内支持扫描的漏洞类型全面 缺点 : 定制化需求支持困难,引擎对用户不透明 规则学习成本高,自定义规则困难 授权模式缺乏弹性,存在成本浪费 难以适配企业内部漏洞模型 融入企业CI/CD流程困难 实际案例 : Coverity的C/C++安全扫描依赖本地编译环境,MacOS版本适配通常延迟2-3个月 Coverity未明显区分代码质量问题和安全漏洞,导致修复落地困难 2.2 开源产品分析 2.2.1 老牌开源工具 SonarQube、FindBugs、Checkstyle : 优点 : 源代码开源 适配Jenkins等持续集成软件 缺点 : 没有跨文件AST能力,无法分析跨文件数据流和控制流 漏洞匹配模式导致误报率高 更偏向代码质量检查而非安全性检查 2.2.2 其他开源产品 FlowDroid 产品概要 : 针对Android的静态污点分析框架 发表于PLDI'2014,Google Scholar引用1200+ GitHub仓库:https://github.com/secure-software-engineering/FlowDroid 技术分析 : 命令行使用: 优劣势 : 优势:针对Android的开源框架,复杂性相对较低 劣势:仅支持apk分析,安全规则需自行编写 ErrorProne 产品概要 : Google出品,接管compiler在编译时进行检查 官方文档:http://errorprone.info/ GitHub仓库:https://github.com/google/error-prone 技术分析 : 支持多种安装方式(Bazel、Maven、Gradle等) Maven示例配置: 优劣势 : 优势:编译阶段扫描缺陷点 劣势:需要侵入项目配置,无法获取完整AST信息 Infer 产品概要 : Facebook开源的静态程序分析工具 官方文档:https://fbinfer.com/docs/getting-started/ GitHub仓库:https://github.com/facebook/infer 技术分析 : 支持多种构建工具:ant、buck、cc、gradle、java、javac、make、mvn等 扫描命令: 结果输出在项目的infer-out/目录下 优劣势 : 优势:支持多语言分析 劣势:官方已放弃对AL(AST Language)的维护 Soot 产品概要 : Java优化框架,提供4种中间代码分析和转换字节码 GitHub仓库:https://github.com/soot-oss/soot 技术分析 : 支持分析格式:Java字节码(<=JDK9+)、Java源码( <=JDK7)、Android字节码等 分析功能:CFG控制流图绘制、指针分析、数据流分析等 使用示例: 优劣势 : 优势:支持Java字节码和源码分析,可绘制控制流图 劣势:前端编译器过时,对高版本JDK支持不佳 PMD 产品概要 : 开源的静态代码分析工具 官方文档:https://pmd.github.io/ GitHub仓库:https://github.com/pmd/pmd 技术分析 : 支持语言:Java、JavaScript、Apex、PLSQL、XML等 使用命令: 规则集示例: 优劣势 : 优势:支持多语言源码分析 劣势:不支持编译后文件分析,安全规则薄弱 2.3 CodeQL深度分析 简介 : CodeQL是Github安全实验室推出的静态代码分析引擎,使用QL语言对代码进行"查询",实现白盒审计和漏洞挖掘。 整体流程 : 通过AST解析器将代码解析为AST数据 按照预设数据模型将AST数据存储到CodeDB 使用QL语言定义污点追踪漏洞模型 执行QL查询CodeDB中的AST元数据 优点 : 以CodeDB模式存储源代码数据,支持高效查询 支持除PHP外的常见语言 QL规则开源且持续迭代 可以深入Jar包进行扫描 缺点 : AST分析引擎不开源 不支持运行时动态绑定的重载方法分析 不支持Resource文件扫描 不支持软件成分分析 技术评价 : CodeQL代表了开源SAST产品的最佳实践,通过: 结构化存储AST数据 使用QL语言进行类SQL查询 通过三元组 <sources,sinks,sanitizers>定义漏洞模型 开源社区规则迭代 为AI训练提供样本 3. 技术选型结果 58集团最终选择参照CodeQL的设计思路,使用Spoon(Java AST解析器)加上自研跨文件串联能力作为扫描引擎的自研方案。主要考虑因素包括: CodeQL虽优秀但不允许企业集成到CI/CD流程 需要深度定制化以适应企业特定需求 58集团主要使用自研Java框架,需要针对性优化 需要支持企业级CI/CD流程的高并发需求 4. 后续计划 后续将详细分析SAST的技术原理,包括: AST解析技术 数据流和控制流分析 污点追踪实现 58基础安全团队学习CodeQL的过程 自研方案的技术实现细节 5. 总结 白盒代码审计系统的技术选型需要综合考虑: 技术能力(跨文件分析、数据流追踪等) 企业适配性(CI/CD集成、定制化需求) 维护成本(规则更新、技术支持) 性能与扩展性 58集团的经验表明,在商业产品限制多、开源产品能力不足的情况下,基于优秀开源方案进行二次开发和自研是可行的技术路线。