多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Fortify SCA 20.1.1 静态代码审计实战:从环境搭建到规则调优与 CI 集成

Fortify SCA 20.1.1 静态代码审计实战:从环境搭建到规则调优与 CI 集成 简介Fortify SCA 20.1.1 是一套面向安全测试人员、代码审计工程师与研发团队的白盒静态源代码安全测试工具适用于渗透测试、漏洞挖掘与上线前代码安全自查等场景。它内置数据流、语义、结构、控制流、配置流五大分析引擎可将 Java、C/C 等源码转换为中间语法树再匹配漏洞规则集定位源代码中的安全隐患并生成含漏洞详情、安全知识与修复建议的报告。资源包共 38 个文件以 30 个 bin 数据文件为主另含 exe 安装程序、jar 组件、license 授权文件、xml 配置与 txt 说明等压缩包约 985.2MB覆盖 Windows x64 版本的安装与运行所需组件。目前已有 7460 人学习下载读者可据此完成工具部署、规则库配置与中文报告导出快速搭建代码审计环境提升漏洞排查与修复效率。1. Fortify SCA 20.1.1为什么静态代码审计绕不开它接手一个几十万行的 Java 老项目安全部门要求上线前出一份代码审计报告人工翻代码显然不现实。这时候多数团队会想到静态应用安全测试工具而 Fortify SCAStatic Code Analyzer是这个领域里被反复提及的名字。它的核心逻辑不是跑起来看行为而是直接解析源码、字节码或中间文件构建抽象语法树和数据流图沿着污点传播路径去追用户输入有没有经过过滤就流进了 SQL 拼接、命令执行、文件操作这些危险汇聚点。20.1.1 这个版本属于 Micro Focus 时期的稳定分支规则库对 Java、C#、PHP、Python 等主流语言覆盖比较完整尤其适合做合规驱动的白盒审计。这篇文章面向的是需要落地代码审计的研发和安服人员从环境搭建、扫描配置、规则调优一路讲到结果验证和踩坑目标是让你在自己的机器上跑通一次完整扫描而不是停留在“听说过这个工具”。2. 环境搭建与第一次扫描从安装到出报告2.1 安装包选择与目录结构Fortify SCA 20.1.1 在 Windows 和 Linux 上都有发行版常见做法是拿到安装介质后先确认三个组件SCA 核心分析引擎、Fortify Update 规则更新工具、以及可选的 Fortify Software Security CenterSSC服务端。单机做审计只需要前两个。安装路径里不要带空格和中文这是血泪经验后面调用命令行时路径解析会出玄学问题。Linux 下典型安装目录是/opt/Fortify/Fortify_SCA_and_Apps_20.1.1Windows 默认在C:\Program Files\Fortify\Fortify_SCA_and_Apps_20.1.1。安装完成后把bin目录加进 PATH验证方式是执行sourceanalyzer -version能打印出版本号和构建号就说明核心引擎可用。规则库不是装完就固定的20.1.1 的规则通过 Fortify Update 单独拉取。执行fortifyupdate会连接更新服务下载最新的规则包这一步在内网环境经常失败需要提前配置更新代理或者离线导入规则包。规则库版本直接决定能检出哪些漏洞类型老规则对新型框架的污点源识别会漏所以正式扫描前先更新一次是必要的。2.2 用 sourceanalyzer 构建翻译与扫描Fortify 的扫描分两个阶段翻译translate和扫描scan。翻译阶段把源码转成中间表示扫描阶段在中间表示上跑规则。很多人直接把源码目录丢给扫描命令结果要么报错要么漏文件正确做法是先翻译再扫描。# 翻译阶段把 Java 源码转成 Fortify 中间文件 sourceanalyzer -b myapp \ -cp lib/*.jar:build/classes \ -source 1.8 \ src/main/java # 扫描阶段基于翻译结果跑规则输出 fpr 报告 sourceanalyzer -b myapp -scan \ -f myapp_scan.fpr \ -rules rules/java \ -Xmx4g-b指定构建 ID翻译和扫描必须用同一个 ID否则扫描阶段找不到中间文件。-cp是类路径Java 项目里第三方依赖的 jar 必须带上否则跨文件的污点传播链会断比如 Controller 调 Service 再调 DAO中间类解析不到就追不到汇聚点。-source 1.8指定源码兼容级别写错会导致语法解析失败。扫描阶段的-Xmx4g给 JVM 堆内存大项目默认内存不够会 OOM一般按代码规模给到 4G 到 8G。-rules指定规则目录不写会用默认全量规则扫描时间会明显拉长。翻译阶段常见的失败是编译错误Fortify 需要源码能通过基本语法解析缺依赖、缺生成代码都会让翻译中断。遇到这种情况先看build目录下的日志定位是哪个文件解析失败把缺失的依赖补进-cp再重试。2.3 报告解读与优先级判断扫描完成后得到.fpr文件用 Audit Workbench 打开或者用命令行生成 HTML/PDF 报告。报告里的问题按严重级别分 Critical、High、Medium、Low但不要直接按级别排期。Fortify 的误报率在默认规则下不低尤其是框架反射调用和自定义过滤逻辑规则识别不到就会报成漏洞。判断优先级要看三个维度污点源是否真的来自外部输入、传播路径上有没有有效过滤、汇聚点是否真的能触发危险操作。Audit Workbench 里可以点开每条问题的数据流视图从 source 到 sink 逐跳看如果中间某一跳的过滤函数规则没识别可以手动标记为已审计避免重复劳动。3. 规则调优与自定义让扫描结果贴合项目实际3.1 理解规则包结构与自定义规则入口Fortify 的规则用 XML 描述存放在安装目录的Core/config/rules下按语言分目录。每条规则定义了污点源Source、传播规则Pass-through、净化函数Sanitizer和汇聚点Sink。默认规则覆盖通用场景但项目里自研的过滤工具类、封装过的数据库访问层规则不认识就会漏报或误报。自定义规则的入口是写一个规则 XML 文件放到项目规则目录扫描时用-rules指向包含自定义规则的目录。!-- 自定义规则示例识别项目里的 XssFilter 为净化函数 -- RulePack xmlnsxmlns://www.fortifysoftware.com/schema/rules RuleDefinitions TaintSanitizerRule formatVersion1 RuleIDcustom-xss-filter/RuleID VulnCategoryCross-Site Scripting/VulnCategory Description项目自研 XSS 过滤器/Description Function Namecom.example.security.XssFilter.clean/Name Namespacecom.example.security/Namespace /Function /TaintSanitizerRule /RuleDefinitions /RulePack这段规则告诉引擎XssFilter.clean方法调用后污点被清除后续不再报 XSS。RuleID唯一标识规则VulnCategory要和内置漏洞分类对齐否则规则不生效。Function里的Name写全限定方法名Namespace写包名。写完规则后需要重新扫描验证如果原来报的问题消失了说明净化规则被正确加载。自定义规则最容易翻车的地方是方法签名匹配不上重载方法、泛型参数、内部类都会影响匹配建议先用一个最小测试类验证规则命中再放到全量项目里跑。3.2 过滤规则与扫描范围控制全量扫描大项目动辄几小时实际审计中往往只关心新增代码或特定模块。Fortify 支持通过-exclude排除目录也支持用-filter加载过滤规则文件只保留关心的漏洞类型。# 排除测试代码和生成代码只扫描主源码 sourceanalyzer -b myapp \ -exclude **/test/** \ -exclude **/generated/** \ -cp lib/*.jar \ src/main/java # 扫描时只保留 SQL 注入和 XSS 两类问题 sourceanalyzer -b myapp -scan \ -f myapp_scan.fpr \ -filter custom-filter.xml-exclude支持通配符排除测试目录能显著减少翻译时间和误报因为测试代码里大量硬编码字符串会被当成污点源。-filter文件里可以按漏洞类别、严重级别、文件路径做过滤格式是 Fortify 定义的过滤 DSL。常见做法是第一次全量扫描看整体情况后续迭代只扫变更文件用-exclude把无关模块排掉把扫描时间压到可接受范围。3.3 与 CI 流水线集成代码审计要产生持续价值必须进流水线。Fortify 提供命令行接口可以在 Jenkins、GitLab CI 里调用。典型流程是拉代码、翻译、扫描、解析 fpr 结果、按阈值决定是否阻断构建。# CI 中扫描并生成可解析的结果 sourceanalyzer -b ${BUILD_ID} -cp lib/*.jar src/main/java sourceanalyzer -b ${BUILD_ID} -scan -f result.fpr # 用 fortifyclient 或 FPR 解析工具提取问题数 # 这里用 reportgenerator 生成 XML 便于脚本解析 ReportGenerator -format xml -f result.xml -source result.fpr # 脚本判断 Critical 数量是否超阈值 critical_count$(grep -c Critical result.xml) if [ $critical_count -gt 0 ]; then echo 存在 Critical 级别问题阻断构建 exit 1 fiBUILD_ID用流水线变量保证每次构建独立避免中间文件冲突。ReportGenerator是 Fortify 自带的报告转换工具把 fpr 转成 XML 后可以用脚本统计各级别问题数。阈值策略看团队要求常见做法是 Critical 零容忍、High 允许存量但禁止新增。集成时注意扫描耗时如果流水线对时长敏感可以把全量扫描放到 nightly 任务增量扫描放在每次提交。4. 避坑与排查那些让扫描结果不可信的细节4.1 翻译成功但扫描结果为空现象是sourceanalyzer -scan正常结束fpr 文件也有大小但打开后一条问题都没有。原因通常是翻译阶段没有真正解析到源码比如-cp路径写错导致所有类都解析失败或者源码目录传成了空目录。解决方法是回看翻译阶段的日志确认解析的文件数量如果数量明显偏少检查-cp和源码路径。另一个可能是规则目录指向了空目录-rules参数写错时引擎不会报错只是不加载任何规则。4.2 大量误报集中在框架反射调用现象是 Spring 项目里RequestMapping方法被报成命令注入或路径穿越但实际参数经过了框架层校验。原因是 Fortify 默认规则把反射调用的参数当成污点源而框架的校验逻辑不在规则识别范围内。解决办法是写自定义净化规则把框架的校验注解或拦截器方法标记为 Sanitizer或者在扫描后用过滤规则把这类问题降级。更彻底的做法是维护一份项目专用的规则包把已知的框架安全机制都注册进去。4.3 内存溢出导致扫描中断现象是扫描进行到一半报OutOfMemoryError进程退出。原因是中间表示和规则匹配都吃内存大项目默认堆不够。解决办法是调大-Xmx同时可以分模块扫描把大项目拆成多个构建 ID 分别翻译扫描最后合并报告。分模块时注意跨模块的污点传播会断适合模块间耦合低的项目。4.4 规则更新后历史问题消失或暴增现象是执行fortifyupdate更新规则后同一份代码扫描结果和上次差异很大。原因是规则库版本变化会调整污点源和汇聚点的定义新增规则会报出新问题废弃规则会让老问题消失。解决办法是固定规则库版本把规则包纳入版本管理扫描时用固定路径的规则目录避免每次拉最新导致结果不可比。如果必须更新先在小范围代码上对比新旧结果评估差异后再全量应用。4.5 中文路径和编码问题现象是源码文件路径含中文时翻译失败或者报告里中文注释乱码。原因是 Fortify 底层对非 ASCII 路径支持不完善编码默认不是 UTF-8。解决办法是源码路径避免中文项目文件统一用 UTF-8 编码扫描时加-Dfile.encodingUTF-8参数。这个问题在 Windows 环境尤其常见Linux 下相对好一些。5. 进阶技巧用数据流视图做精准审计默认扫描结果只是起点真正体现审计价值的是对每条问题的数据流做人工确认。Audit Workbench 里的数据流视图会画出从 source 到 sink 的完整路径每一跳都标出文件、行号和调用关系。我的习惯是先从 Critical 和 High 里挑出污点源确实来自外部输入的问题沿着路径逐跳看重点检查三个位置入口参数有没有做类型和长度校验、中间有没有经过项目自研的过滤工具、汇聚点是不是真的执行了危险操作。如果某一跳的过滤函数规则没识别就在规则里补一条 Sanitizer重新扫描后这类问题会批量消失比逐条标记高效得多。对于跨模块的大项目可以先用-filter只保留特定漏洞类别把扫描范围缩小到核心模块出结果后再逐步扩大。验证规则是否生效有个小技巧写一个包含已知漏洞的最小测试类故意留一个 SQL 拼接扫描后确认能报出来再把这个类作为规则回归的基准。每次调整规则或升级版本后跑一遍能快速发现规则失效。另一个实用技巧是把 fpr 结果导入 SSC 做集中管理SSC 支持问题去重、状态跟踪和趋势分析适合团队协作场景。单机审计用 Audit Workbench 就够了但多人同时审计同一项目时SSC 能避免重复标记和遗漏。导入时注意 fpr 里的项目版本信息要和 SSC 里的应用版本对应否则问题会挂错版本。我自己的习惯是每次扫描前先跑一遍规则回归测试类确认规则库和自定义规则都正常加载再对目标项目做全量扫描。这个习惯帮我省过好几次后悔药有一次规则目录被误删扫描结果全空差点当成“代码很干净”交出去。希望帮到你。本文还有配套的精品资源点击获取
返回列表