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流程困难
实际案例:
- 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
技术分析:
- 命令行使用:
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语言对代码进行"查询",实现白盒审计和漏洞挖掘。
整体流程:
- 通过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集团的经验表明,在商业产品限制多、开源产品能力不足的情况下,基于优秀开源方案进行二次开发和自研是可行的技术路线。