如何在自动创建版本的Fortify流水线中忽略指定高危漏洞?
问题场景
我有一条流水线,每次执行时都会在Fortify中创建一个版本,相关代码片段如下:
container('Fortify') { scanFortify { routeScan: "src/.java" nameProject: env.nameProject } }
该流水线会调用另一个包含Fortify执行逻辑的文件,代码如下:
def uploadFPR(String nameProject){ pipelineUtil.printm("Upload FPR -- App: ${nameProject} -- Version: ${BUILD_NUMBER}", "INFO") fortifyUpload appName: "${nameProject}", appVersion: "${BUILD_NUMBER}", resultsFile: 'code.fpr' } def call(Map pipelineParams){ stage('Fortify'){ if(pipelineParams.python == true){ scan.scanFortifyPython(pipelineParams.routeScan,pipelineParams.version) }else{ scan.scanFortify(pipelineParams.routeScan) } scan.uploadFPR(pipelineParams.nameProject) scan.verifyVulnerabilites(pipelineParams.nameProject) } }
当分析结果上传至Fortify后,会检测出一个高危漏洞,按上级要求需忽略该漏洞。我尝试在Fortify中禁用该漏洞,但由于流水线每次运行都会创建新版本,该操作无效,新版本仍会出现该漏洞,导致无法部署应用。请问是否可以通过流水线配置来忽略该漏洞,希望能得到解决思路。
解决思路
1. 扫描阶段直接排除目标漏洞规则
在Fortify扫描命令中添加规则排除参数,指定要忽略的漏洞对应的规则ID或规则名称,从根源上让扫描结果不包含该漏洞。比如修改scanFortify方法:
def scanFortify(String routeScan){ // 替换<目标漏洞规则ID>为实际的规则ID sh "sourceanalyzer -b ${nameProject} -exclude <目标漏洞规则ID> ${routeScan}" sh "fortifyscan -b ${nameProject} -f code.fpr" }
规则ID可以从Fortify平台的漏洞详情页获取,这种方式生成的FPR文件不会包含该漏洞,后续验证环节自然不会触发拦截。
2. 上传后通过Fortify API标记漏洞为忽略
利用Fortify REST API,在上传FPR之后、漏洞验证之前,调用API将指定漏洞标记为"忽略"状态,适配每次创建新版本的场景。示例代码片段:
def ignoreTargetVuln(String appName, String appVersion, String vulnId){ // 先获取Fortify认证令牌 def authToken = sh(script: "curl -s -X POST '${fortifyServerUrl}/api/v1/auth/token' -H 'Content-Type: application/json' -d '{\"username\":\"${fortifyUser}\",\"password\":\"${fortifyPass}\"}' | jq -r '.token'", returnStdout: true).trim() // 标记目标漏洞为忽略,添加合规理由 sh "curl -s -X PATCH '${fortifyServerUrl}/api/v1/apps/${appName}/versions/${appVersion}/vulnerabilities/${vulnId}' -H 'Authorization: Bearer ${authToken}' -H 'Content-Type: application/json' -d '{\"state\":\"IGNORED\",\"comment\":\"按合规要求忽略该高危漏洞\"}'" }
在uploadFPR执行完成后,调用这个方法并传入应用名、版本号和目标漏洞ID即可。
3. 修改漏洞验证逻辑,跳过特定漏洞检查
如果verifyVulnerabilites方法是用来拦截高危漏洞的核心逻辑,可以直接在其中过滤掉目标漏洞:
def verifyVulnerabilites(String nameProject){ // 过滤掉目标漏洞ID,只检查其他高危漏洞 def remainingHighVulns = sh(script: "fortifycli -show-vulnerabilities -app ${nameProject} -version ${BUILD_NUMBER} -severity High | grep -v <目标漏洞ID>", returnStdout: true) if(remainingHighVulns.trim() != ""){ error "存在未处理的高危漏洞,无法部署" } }
这种方式无需修改扫描和上传流程,仅在验证环节跳过特定漏洞,适合临时合规需求。
4. 使用自定义规则集文件禁用目标规则
创建自定义Fortify规则集XML文件,在其中禁用目标漏洞对应的规则,扫描时指定使用该规则集:
<!-- custom-exclude-rules.xml --> <RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules"> <RulePackID>custom-exclude-rules</RulePackID> <Name>自定义规则排除集</Name> <Description>忽略指定高危漏洞规则</Description> <Rules version="1.0"> <RuleAction action="Suppress" ruleID="<目标漏洞规则ID>"/> </Rules> </RulePack>
然后修改扫描方法,指定使用该规则集:
def scanFortify(String routeScan){ sh "sourceanalyzer -b ${nameProject} -ruleset custom-exclude-rules.xml ${routeScan}" sh "fortifyscan -b ${nameProject} -f code.fpr" }
内容的提问来源于stack exchange,提问作者llrichardll
相关产品推荐
相关产品推荐

