基于开源工具实现软件成分分析SCA
myc 历史精选 21329浏览 · 2022-07-05 15:22

企业开发过程中难免会使用到大量开源组件,然而近期fastjosn、log4j、spring等多个常用组件频频爆出严重漏洞,甲方安全工作人员不是在应急就是跑在应急的路上,排查影响范围、版本升级、组件替换搞的大家心力交瘁。为了快速、全面、准确的排查出企业内哪些应用使用了漏洞组件,解决软件供应链安全问题,SCA技术近日成了热点。本文将介绍SCA的基本概念以及通过开源工具实现SCA的方式。

SCA介绍

什么是SCA ?

SCA(Software Composition Analysis)即软件成分分析,通过分析源码提取项目依赖的第三方组件及其版本、许可证等信息,生成软件物料清单(SBOM,Software Bill-of-Materials),根据SBOM分析项目是否使用了存在已知漏洞的组件,后期其它组件爆出漏洞时也可根据SBOM快速排查受影响项目。

SCA实现思路

首先为了能够尽量覆盖所有的项目实现软件成分分析,一定要适应现在多语言开发的情况,企业往往是用了很多种语言进行各种项目的开发,所以SCA工具一定要能支持多种语言,最起码比如Java、GO、Python、NodeJs等主流语言要覆盖到。

对于以上三种语言,可以通过分析pom.xmlgo.modrequirements.txtyarn.lock等文件中的关键字段,提取项目依赖的第三方组件的名称、版本等信息,从而实现软件成分分析。此处难点在于开发语言较多,所以需要较大的开发量实现语言种类的覆盖。

其次为了方便的嵌入现有的DevOps流程实现DevSecOps,就要求SCA工具使用上要简单,可以柔和地接入现有DevOps工具链,减少对现有DevOps流程的影响,这也是DevSecOps提倡的原则。

最后是漏洞库来源,为了能够尽可能多的识别项目中的已知漏洞,我们需要增加漏洞来源,可以通过定期爬取OSSIndex、NVD、Npm、Cpe等网站,解析漏洞信息,实现扩充漏洞数据库。

通过开源工具实现SCA

CycloneDx是OWASP基金会下的一款轻量级软件物料清单标准,用于实现程序安全上下文和供应链安全分析。CycloneDx项目提供了一系列工具及lib库,用于生成JSON或XML格式的软件成分清单,该项目支持大部分常见语言,使用简单,非常满足我们的需求。

Dependency-Track也是OWASP基金会下的一款工具,Dependency-Track通过接收软件成分清单,自动分析项目存在的风险。而且Dependency-Track支持下载漏洞库、API丰富,可以非常简单的嵌入CI/CD流程。

环境搭建

Dependency-Track部署

Dependency-Track支持Docker、WAR包等多种部署方式,这里参考官方说明文档,通过Docker的方式进行部署,使用postgres数据库。

docker-compose.yml

version: '3.7'
volumes:
  dependency-track:
  postgres-volume:

services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=dtrack_postgres_user
      - POSTGRES_PASSWORD=dtrack_postgres_passwd
      - POSTGRES_DB=dtrack
    volumes:
      - 'postgres-volume:/var/lib/postgresql/data'
    restart: always

  dtrack-apiserver:
    image: dependencytrack/apiserver
    depends_on:
      - db
    environment:
    # Database Properties
    - ALPINE_DATABASE_MODE=external
    - ALPINE_DATABASE_URL=jdbc:postgresql://db:5432/dtrack
    - ALPINE_DATABASE_DRIVER=org.postgresql.Driver
    - ALPINE_DATABASE_USERNAME=dtrack_postgres_user
    - ALPINE_DATABASE_PASSWORD=dtrack_postgres_passwd

    deploy:
      resources:
        limits:
          memory: 12288m
        reservations:
          memory: 8192m
      restart_policy:
        condition: on-failure
    ports:
      - '8288:8080'
    volumes:
      - 'dependency-track:/data'
    restart: unless-stopped

  dtrack-frontend:
    image: dependencytrack/frontend
    depends_on:
      - dtrack-apiserver
    environment:
      # 此处需要注意,修改URL为dtrack-apiserver地址
      - API_BASE_URL=http://10.1.1.70:8288
    ports:
      - "8188:8080"
    restart: unless-stopped

运行成功后访问http://your-ip:8188 ,使用admin/admin登录即可,初次运行尽量不要打断,因为Dependency-Track需要下载漏洞库。

至此,Dependency-Track已经可以使用了。

进行软件成分时,使用CycloneDX工具生成SBOM文件,然后在Dependency-Track的【Projects】中新建项目,最后上传SBOM文件即可自动完成分析。

分析Java程序示例

CycloneDX工具: https://github.com/CycloneDX/cyclonedx-maven-plugin

下载待分析项目源码:https://github.com/sohutv/cachecloud,然后使用cyclonedx-maven-plugin生成SBOM文件:mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom,如下所示:

生成的SBOM文件如下,可以看到包含了组件的名称、版本、purl、描述、licenses等信息:

接着在Dependency-Track的【Projects】中新建一个名为cachecloud的项目,

项目创建完成后,进入项目,选择【Components】标签,最后上传BOM文件即可

稍候即可看到Dependency-Track根据上传的BOM文件,分析出了项目组件及其漏洞信息:

分析Go程序示例

CycloneDX工具: https://github.com/CycloneDX/cyclonedx-gomod

使用如下命令安装即可:

go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@latest

下载待分析项目源码:https://github.com/zhenorzz/goploy,然后使用cyclonedx-gomod生成SBOM文件:cyclonedx-gomod mod -json -output goploy.bom.json goploy

将生成的goploy.bom.json上传到Dependency-Track的Project下,即可自动分析goploy项目的软件成分及存在的漏洞。

分析Python程序示例

CycloneDX工具: https://github.com/CycloneDX/cyclonedx-python

使用以下命令安装即可:pip install cyclonedx-bom

下载待分析项目源码:https://github.com/MobSF/Mobile-Security-Framework-MobSF,然后使用cyclonedx-bom生成SBOM文件:cyclonedx-bom -r -i requirements.txt --format=json -o mobsf.bom.json

将SCA嵌入DevOps流程

DevSecOps的一大原则就是安全自动化,将上述过程嵌入现有的DevOps流程,保证每次CI/CD过程自动化的生成项目的SBOM并发送给Dependency-Track完成分析,如此可大大减少安全人员工作量。

Dependency-Track对API的支持良好,所以可通过脚本串联整个过程,然后加入CI/CD流程中。当然,Dependency-Track也有Jenkins插件可以协助我们完成这个过程。

Jenkins安装DTrack插件

插件地址:https://plugins.jenkins.io/dependency-track/

首先在Dependency-Track中点击【Administration】-> 【Access Management】->【Teams】,创建一个Team并记录其API Key。

然后在Jenkins中点击【Manager Jenkins】->【Manage Plugins】,搜索"Dependency-Track"并安装插件。

配置Dependency-Track插件,点击【Manager Jenkins】->【Configure System】,找到Dependency-Track,在“Dependency-Track Backend URL”填写Dependency-Track的URL及对应的API Key(点击Add,Kind选择“Secret text”,在Secret处填入API Key即可)。

Cyclonedx + DTrack插件自动化SCA

在Jenkins中新建项目,进入项目点击【Configure】

  1. 在【Source Code Management】处选择“Git”,然后填入Repository URL
  2. 在【Build】处选择“Execute Shell”,然后输入构建语句,并添加mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom生成sbom文件
  3. 在【Post-build Actions】处选择“Publish BOM to Dependency-Track”,填写project name 和 project version,在“Artifact”处输入${WORKSPACE}/target/bom.json
  4. 点击【Save】,返回后点击【Build Now】既可。

查看构建结果可以可以看到,已经成功生成软件成分清单并上传至Dependency-Track,

Jenkins的Pipeline脚本完成自动化SCA

在Jenkins新建Pipeline项目,在项目的Configure下Pipeline标签选择Pipeline Script,写入以下内容:

pipeline {
    agent any
    stages {
        stage('Start') {
           steps {
               echo 'Hello World'
           }
       }
       stage('Build') {
           steps {
                git 'https://github.com/sohutv/cachecloud.git'
                sh "mvn -DskipTests=true clean package"
            }
       }
        stage('Generating SBOM with Cyclonedx') {
            steps {
                sh 'mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom'
            }
        }
        stage('dependencyTrackPublisher') {
            steps {
                withCredentials([string(credentialsId: 'dtrack', variable: 'API_KEY')]) {
                    dependencyTrackPublisher artifact: 'target/bom.xml', projectName: 'my-project', projectVersion: '12', autoCreateProjects: true, dependencyTrackApiKey: API_KEY, synchronous: false
                }
            }
        }
    }
}

Dependency-Track Jenkins Pipeline参数: https://www.jenkins.io/doc/pipeline/steps/dependency-track/

构建结果:

最终效果

参照上述介绍的思路,笔者基于 CycloneDX + Dependency-Track 实现了软件成分分析,最终在企业内部实现了落地。初步实现了分析项目中第三方组件漏洞的效果,后续某组件爆出漏洞后,也可以快速定位受影响范围,推动业务线进行漏洞修复。

3 条评论
某人
表情
可输入 255