ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Fortify SCA 20.1.1 实战:Java 项目静态代码审计与命令行扫描全流程

Fortify SCA 20.1.1 实战:Java 项目静态代码审计与命令行扫描全流程 简介Fortify SCA 20.1.1 是一款面向开发人员与安全团队的静态代码审计工具采用无需运行的静态分析技术在编码早期即可发现注入、跨站脚本、缓冲区溢出、越权访问等安全弱点支持包括 Java、C#、C、Python、JavaScript 在内的二十六种编程语言覆盖超过一百万个应用程序接口调用模式适用于 Web 应用、移动应用与后台服务等各类项目。整个资源包共四十一个文件以三十四个规则库文件为主体另含 Windows 安装程序、Java 公共组件、授权许可文件以及少量配置说明文档压缩后大小约九百八十六点九七兆字节解压后即可部署使用。当前已有九百一十七人学习/下载适合希望将安全审查嵌入研发流程的团队以及希望系统掌握源代码审计方法的个人。工具内置一千零一十九个漏洞类别规则规则由安全专家依据业界权威安全标准制定同时允许用户针对项目规范自定义检测规则它能够输出包含严重性、定位与修复建议的详细报告并通过可视化仪表板展示审计进度。此外Fortify SCA 可与 Eclipse、Visual Studio 等集成开发环境以及 Git、SVN、Jenkins、Azure DevOps 等版本控制与持续集成系统协同在编码、提交和部署各阶段自动执行安全扫描有效降低后期修复成本。 上线前安全评审被打回理由是“核心交易接口存在 SQL 注入风险需提供代码审计工具扫描证据”。这不是段子是我去年带团队做支付模块时的真实经历。当时我选定的工具就是 Fortify SCA 20.1.1一个在商用静态应用安全测试SAST领域出场率极高的版本。这篇博文不打算写成官方文档的复述我想以一次真实 Java 项目的完整扫描为线索把工具定位、下载准备、命令行动手流程和本地踩坑一次性讲透。适合正在选型 SAST 的研发负责人、DevSecOps 工程师以及刚拿到 Fortify 想快速上手的安全测试新人。1. 为什么偏要选 Fortify SCA它和开源扫描器的核心差异1.1 从上线前的“卡点”说起SAST 到底扫的是什么先聊聊场景。很多团队第一次接触 Fortify SCA不是因为主动选型而是被安全合规倒逼的。要么是等保测评要求要么是客户方的安全问卷里有一条“是否使用静态代码审计工具”要么是线上出了漏洞后领导拍板“以后发版前必须过扫描”。所谓静态应用安全测试核心思路是不运行程序直接对源代码或字节码做解析建立抽象语法树再通过数据流分析、污点传播分析、控制流分析追踪“用户可控的输入”是否流向了“危险函数”。这个过程会跨类、跨方法甚至跨多层调用链最终把一条完整的攻击路径给画出来。这和单元测试、动态渗透测试都不同。它不需要环境、不需要运行数据开发阶段就能介入这也是为什么它会成为 DevSecOps 流水线里最早落地的安全关卡。1.2 Fortify SCA 的底牌规则库与跨层数据流分析把 Fortify SCA 和开源工具放一起对比你会立刻看出差异。SonarQube 很流行但它的核心定位是代码质量安全规则更像附属品SpotBugs、FindBugs 做的是字节码层面的模式匹配逻辑相对固定深层的污点追踪能力很弱。对比项Fortify SCA 20.1.1SonarQubeSpotBugs核心定位专业商用安全分析代码质量安全规则字节码缺陷检查数据流追踪跨文件、跨方法调用链部分规则可追踪弱CWE 规则映射完整且持续更新有限有限支持语言25覆盖 JVM、C/C、Python、PHP、JS、SQL 等中主要 Java审计闭环支持误报标记、重分析、SSC 管理中弱我选择 Fortify SCA 的核心理由是它那套持续更新的规则库以及跨层的数据流分析能力。一个典型的注入漏洞往往要从 Controller 层一路追到 DAO 层中间隔了 Service、工具类、框架封装普通规则引擎早就断了Fortify 还能把链路拼出来。1.3 20.1.1 这个版本现在还值不值得用可能有人会问既然已经有更新的版本为什么还盯着 20.1.1 不放真实情况是很多企业采购了一套商业许可后用很多年不动安全团队也更倾向于“验证过的稳定版本”。20.1.1 是 2020 年前后 Micro Focus现 OpenText时代的一个维护版本相比 20.1.0它修复了一批规则解析问题对 Spring、Struts 等框架的覆盖更完整同时支持当时较新的 JDK 11。对新团队来说这个版本的优势是资料多、踩坑经验遍网都是、和 Jenkins/Maven 的集成方案成熟。当然如果你们是新采购我建议直接评估官网最新版本但如果你手头就是 20.1.1完全够用不必为了追新而升级。2. 20.1.1 下载前的准备获取通道、版本构成与安装环境2.1 正规下载渠道评估版与企业许可关于“下载”我建议你走正规路径这一点值得多说两句。Fortify SCA 是商业软件不存在官方公开的免授权下载点。通常有三类获取方式企业已采购登录官网的软件许可交付门户按合同下载对应平台安装包同时拿到 License 文件。未采购但想评估可以在官网提交试用申请获取一段时间的评估 License。内部安全团队统一分配很多公司由安全部门统一管理 Fortify 许可研发人员申请测试权限即可。不建议碰网盘上流传的“绿色版”“破解版”。扫描器这种工具一旦被植入恶意逻辑扫描结果的可信度归零等于给攻击者递刀子。做安全的人第一件事就是不该在产品供应链上留后门。2.2 安装包解压后有哪些内容拿到安装包之后建议先花十分钟搞清楚目录结构这会直接影响后续使用体验。以 Linux 和 Windows 发行版为例SCA 安装完成后核心组件包括这些bin/sourceanalyzer命令行扫描器真正的核心引擎。bin/auditworkbench图形化的审计工作台用来人工研判漏洞。Rules目录规则库扫描时的判断依据。plugins目录Eclipse、IntelliJ IDEA、Maven 等集成插件。core、lib等目录引擎运行所需的依赖。其中 command line 的sourceanalyzer是执行扫描的主体Audit Workbench 更多用于查看结果和处理误报。插件目录里的内容容易被忽略但如果你用 IDEA 或 Maven后续集成会用到。2.3 环境核对清单JDK、内存与路径安装前先对照下面几个点做检查能省下后面不少排查时间JDK 必须装不能只装 JRE。扫描器在翻译阶段需要调用javac来解析源码只有运行时环境是跑不起来的。20.1.1 官方支持 JDK 8 和 JDK 11。内存建议 8GB 起步。中型 Java 项目至少给扫描进程 4GB 堆空间大型微服务项目建议 16GB 物理内存。操作系统层面Windows 10/Server 2016、RedHat/CentOS 7、macOS 都能跑按官方支持矩阵来。环境变量方面把 SCA 安装目录设为FORTIFY_HOMEbin目录加入PATH确保JAVA_HOME指向一个受支持的 JDK。装完后先验证一下sourceanalyzer -version能正常输出版本号说明安装这一步过了。此时的版本信息里会明确显示 20.1.1 和内部 build 号和后续报告中的版本信息对应得上。3. 把 20.1.1 跑起来一次真实的 Java 项目扫描全流程3.1 sourceanalyzer 的三段式clean、translate、scanFortify SCA 20.1.1 的命令行扫描有一个固定的三段式流程clean、translate、scan。clean 是清掉之前的构建缓存保证这次扫描从零开始translate 是解析源码并建立中间模型这是最耗时的一步scan 是基于中间模型执行规则并产出报告。我以一个典型的 Spring Boot 项目为例完整命令大概是这样的# 1. 清理历史构建 sourceanalyzer -b demo -clean # 2. 翻译指定源码版本、classpath 和源码目录 sourceanalyzer -b demo -source 1.8 -cp lib/*;target/classes src # 3. 扫描输出 HTML 报告 sourceanalyzer -b demo -format html -f report.html这里-b demo是给这次扫描起个构建 ID后续 translate 和 scan 必须用同一个 ID。-source 1.8指定源码语言级别。关键在于-cp如果你不提供项目完整的 classpath翻译阶段能解析的符号就有限很多跨调用链的数据流会直接断掉扫描结果会大打折扣。对 Maven 项目更省心的做法是先mvn clean compile生成target/classes然后扫描时把target/classes和本地依赖~/.m2/repository中的 jar 都引入 classpath。一开始我图省事没带依赖扫完报告全是意义不明的“未关联到具体代码”的提示后来把 classpath 补全才恢复正常。3.2 结果报告怎么读从 Sink 反推 Source扫描结束后生成的 HTML 报告会按严重级别统计漏洞数。Fortify 的分级通常是 High、Medium、Low 三档里面每条漏洞都关联了对应的 CWE 编号比如 SQL 注入是 CWE-89、XSS 是 CWE-79、路径遍历是 CWE-22、危险反序列化是 CWE-502。我自己的阅读习惯是逆着报告顺序看。先看 High 级别的 Sink 清单——所谓 Sink 就是危险函数的调用位置比如executeQuery()、Runtime.exec()、Files.createTempFile()等。确定 Sink 之后再点开调用链去看 Source也就是数据入口通常是HttpServletRequest.getParameter()、RequestParam这类来自用户输入的位置。举一个当时真实扫出来的例子。Controller 层接收了userId参数经过一个转换工具类处理最后在 DAO 层用字符串拼接的方式拼进了 SQL。代码逐段看每层都不像有问题可 Fortify 把这几层串起来之后漏洞立刻坐实了。这就是代码审计工具比人工 review 高效的地方也是我坚持在流程里保留它的原因。3.3 接入 Jenkins/Maven 的最小配置如果只在本地手工扫描对日常开发意义有限真正有价值的是把它接入自动构建流程。在 20.1.1 时代最轻量的接入方式是在 Jenkins 的流水线里直接调用sourceanalyzer构建时执行扫描并把报告归档为构建产物sourceanalyzer -b demo -clean -source 1.8 -cp lib/*;target/classes src sourceanalyzer -b demo -format fpr -f report.fpr使用fpr格式是因为它是 Fortify 原生格式后续可以用 Audit Workbench 打开也可以上传到 Fortify SSCSoftware Security Center做集中管理和趋势分析。如果团队还没有 SSC 基础设施先用 HTML 报告作为临时方案也行。另外安装包plugins目录下带了 Fortify 的 Maven 插件可以用fortify:translate和fortify:scan两个 goal 与 Maven 构建生命周期绑定。我个人更偏好独立的构建步骤把扫描和编译解耦这样可以避免插件升级时互相打架。4. 本地实测遇到的坑编译环境、性能调优与误报过滤4.1 老项目 JDK 版本冲突两个 JDK 并行切换第一个让我折腾最久的坑是 JDK 版本冲突。公司的老项目还在用 JDK 6/7而 Fortify SCA 20.1.1 官方支持的是 JDK 8/11。如果直接用 JDK 11 去翻译一个用 JDK 6 写的项目会遇到 class 文件版本不匹配或语法解析失败。解决办法很朴素本机装两个 JDK扫描老项目前临时切换JAVA_HOME。# 扫描 JDK 11 标注的新项目 export JAVA_HOME/path/to/jdk11 sourceanalyzer -b demo -clean -source 11 -cp lib/*;target/classes src # 扫描老项目时切回 JDK 8 export JAVA_HOME/path/to/jdk8 sourceanalyzer -b legacy -clean -source 1.6 -cp lib/*;target/classes src另一个容易踩的坑是 Windows 路径。classpath 里的分隔符在 Windows 上是分号在 Linux 上是冒号如果项目路径带中文或空格偶尔会触发解析异常。我的建议是扫描机上专门建一个纯英文路径的工作目录把待扫描项目 sync 过去再扫。4.2 扫描慢不是引擎问题排除与内存调优另一个高频问题是“扫描太慢了一个项目跑了一整夜”。Fortify 的慢主要慢在 translate 阶段它要解析所有关联源码和依赖scan 阶段做数据流计算也需要时间。但很多时候慢是因为我们把不该扫的东西全扫了。建议显式排除测试代码、构建产物目录和生成代码sourceanalyzer -b demo -clean -j 4 -Xmx8G \ -exclude **/src/test/** \ -exclude **/target/generated-sources/** \ -source 1.8 -cp lib/*;target/classes src-j 4表示并行线程数在多核 Linux 机器上收益明显-Xmx8G指定 JVM 堆上限翻译和扫描两个阶段都要带否则默认堆不够时容易 OOM。如果你的项目依赖极多一个更激进的做法是只把真正参与编译的 jar 加进 classpath而不是一股脑lib/*。Classpath 越精简解析越快报告也越干净。我第一次跑一个微服务项目把所有依赖都引进去扫描时间从 40 分钟降到 9 分钟只是把被传递依赖拖进来的一大堆无关 jar 剔除掉而已。4.3 误报到底要不要管优先级过滤经验Fortify 默认规则比较保守误报是必然存在的尤其是 Spring 这类框架的自动绑定和参数解析常被识别成数据入口然后报一个“理论风险”。我的经验是不要追求把所有误报清完。先把 High 级别且修复成本低的漏洞处理掉Medium 里重点关注 CSRF、信息泄露、不安全随机数这几类Low 级别大多数可以延后甚至忽略。Audit Workbench 提供了误报标记功能你在界面里逐条研判后标记为“Not an Issue”下次分析时可以带上这个审计结果避免同一类问题反复出现。如果团队已经上了 Fortify SSC还可以把审计结果同步到服务器端形成团队级的知识沉淀。我个人的处理顺序是这样的第一轮所有 High 修复成本低的问题必须清零。第二轮Medium 里的数据类漏洞逐个研判。第三轮Low 和性能类问题记录在案按迭代计划处理。最后说点实际体会连续用了小半年 20.1.1我最大的感觉是Fortify 不是装上就能出结果的魔法它对构建环境的理解程度直接决定扫描质量。如果你第一次跑出来的报告全是“No analysis information available”别急着换工具先回去补 classpath。我自己现在的工作流已经固定下来拉出高危 Sink 清单 → 反推 Source → 逐条研判 → 和开发对齐修复方案。这个工具能帮你把漏洞找出来但能不能定性、怎么改终究还得靠人。希望上面这些记录能让你少踩几个我用时间换来的坑。本文还有配套的精品资源点击获取
返回列表