You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自动创建版本的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:35:37