代码质量分析

代码质量

Java代码检查工具的介绍

1.SonarQube

是当前主流的开源代码质量扫描工具,支持自定义扫描规则,支持多种语言进行扫描

官方提供多个版本,只有社区版本免费。而社区版,只支持代码上传到sonar后进行扫描,需要配置SonarScanner才能实现功能,也不支持版本管理。

使用案例

2.CodeQL

CodeQL是GitHub代码扫描的核心工具(GitHub购买的),其利用QL语言对代码、执行流程等进行"查询",以此实现对代码的安全性白盒审计,进行漏洞挖掘。 目前只开源了扫描规则和cli工具,引擎并未开源。

官网访问:https://codeql.github.com/docs/codeql-overview/

核心工具:

介绍

使用案例:

原理:是把源代码转化成一个可查询的数据库,通过 Extractor 模块对源代码工程进行关键信息分析提取,构成一个关系型数据库。 CodeQL 的数据库并没有使用现有的数据库技术,而是一套基于文件的自己的实现。 对于编译型语言,Extractor 会监控编译过程,编译器每处理一个源代码文件,它都会收集源代码的相关信息, 如:语法信息(AST 抽象语法树)、语意信息(名称绑定、类型信息、运算操作等),控制流、数据流等,同时也会复制一份源代码文件。 而对于解释性语言,Extractor 则直接分析源代码,得到类似的相关信息。 关键信息提取完成后,所有分析所需的数据都会导入一个文件夹,这个就是 CodeQL database, 其中包括了源代码文件、关系数据、语言相关的 database schema(schema 定义了数据之间的相互关系)。

3.CodeDog

https://github.com/Tencent/CodeAnalysis

  • 腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台, 其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。

Java代码检查工具的介绍 http://www.bjpowernode.com/hot/2157.html https://blog.csdn.net/ch98000/article/details/126664737

4.其他

  1. PMD。官网https://pmd.github.io/PMD是一个通过Github发布的免费、开源、静态代码审查工具
    • 评估java源代码的完整性,它还会报告一些降低代码效率的常见错误,发现出重复或不需要的代码部分和变量和不必要的对象。
    • 可以检测出可能危及安全性的硬编码代码或密码认证漏洞。
    • 发现了常见的代码漏洞,如未使用的变量、空的try语句、冗余的对象创建等等
    • 支持多种语言。
    • 当前很多主流的扫描工具底层会使用PMD,例如sonarQube
  2. FindBugshttps://spotbugs.github.io/开源Java代码静态分析工具FindBugs是免费的
    • 发现代码部分中的缺陷和漏洞、逻辑前后不一致和安全威胁
    • SpotBugs工具是FindBugs的新版本
  3. Checkstylehttps://checkstyle.sourceforge.io/
    • 可以定位于解决类设计不兼容、方法设计问题以及代码布局和格式错误。主要集中于代码的格式、命名规范等
  4. SonarLint。SonarLint是另一个免费的开源Java代码检查工具,它根据自己的标准来检查代码以评估质量。是sonarQube的客户端工具
    • 该工具更适用于定位安全漏洞,并提供报告,和显示重复代码、给出代码复杂性和比较代码标准
  5. Snyk。https://snyk.io/product/snyk-code/
    • Snyk Code是一款新颖的静态Java代码审查工具,可以在开发人员编写代码时对Java源代码的安全漏洞进行漏洞分析。此工具可快速执行自动安全代码审查,在过程中很少有误报。
  6. JArchitect:官网 ,静态Java源代码分析工具JArchitect会评估Java代码的复杂性。本地客户端,不适合大型项目使用
    • 它提供了一些功能,如代码查询、启用自定义代码、平台使用评估以确定修复代码漏洞的成本(与不修复代码漏洞的风险)以及通过代码审计检验过程。
    • 该工具还提供了代码标准的度量和统计分析。
    • 识别代码度量,如算出代码复杂度(可能执行路径的数量)、源代码行、代码传入(传入)和传出(传出)耦合、嵌套和深度。
    • 生成报告,帮助找到可能出现的代码漏洞。

通常Checkstyle、FindBugs和PMD结合使用,以实现更强大专业的Java代码审计过程。

安全扫描

主要是针对项目中使用的依赖进行漏洞检查,需要扫描的内容比较多,所以并非每次CI流程都会进行该步骤,可以设置为定期检查。

主要包括:

  1. 代码漏洞扫描:sonar已经实现
  2. 开源漏洞检查:依赖引入的漏洞,例如log4j的漏洞。
  3. 开源协议检查等:防止类似于GPL的协议的组件对项目的污染。
  4. 镜像扫描:针对容器镜像的扫描。
  5. 其他:服务器漏洞扫描、web漏洞扫描等,都是需要应用运行后发起的。

严重级别:CRITICAL(严重)> HIGH(高危)> MEDIUM(中危)> LOW(低危)。

1.dependency-check

相比其他工具准确率很高、误报率低、覆盖率高。

1.1.介绍

Dependency-Check 是 OWASP(Open Web Application Security Project)的一个实用开源程序,用于识别项目依赖项并检查是否存在任何已知的,公开披露的漏洞。

  • 目前,已支持Java、.NET、Ruby、Node.js、Python等语言编写的程序,并为C/C++构建系统(autoconf和cmake)提供了有限的支持。
  • 而且该工具还是OWASP Top 10的解决方案的一部分。
  • 支持面广(支持多种语言)、可集成性强,作为一款开源工具,已经支持和许多主流的软件进行集成,比如:命令行、Ant、Maven、Gradle、Jenkins、Sonar等;
  • 具备使用方便,落地简单等优势。

工作原理:

  1. 通过分析器对文件进行扫描搜集项目的依赖信息,包括vendor(供应商),product(产品)和version(版本)等,搜集到的信息被叫做迹象。
  2. jarAnalyzer将从jar文件包中的Mainfest、pom.xml和包名进行信息搜集,然后把各种搜集到的源放到一个或者多个迹象表里。
  3. 通过搜集到的迹象和CPE条目(NVD、CVE数据索引)进行匹配,分析器匹配到了就会给个标志发送到报告。
  4. 目前不使用hash识别文件,因为第三方依赖从源码中的hash值构建通常不会匹配官方发布版本的hash。后续版本中可能会增加一些hash来匹配一些常用的第三方库,例如Spring, Struts等。

1.2.安装使用

官网下载command line版本的解压后即可使用,提供了非常多的参数可以使用

查看详细的帮助文档:dependency-check.bat --advancedHelp


简单的使用案例:dependency-check.bat -n --project "my_project" -s "D:\my_project" -o D:\report\ -f JSON  --log scan.log
-n          不更新漏洞库,默认4小时自动拉取
--project   工程名,可与随意定义
–s          需要扫描的文件,可以是jar、war、zip、tar.gz、文件夹等。可以使用通配符表示多个,例如 **/*.jar
–o          报表生成的路径
-f          报表的输出格式,支持HTML, XML, CSV, JSON, JUNIT, SARIF, JENKINS, GITLAB or ALL
--disableRetireJS   不检查js,
--disableNodeJS     不检查nodejs
--log     记录日志

更新漏洞数据库:dependency-check.bat --updateonly

1.3.扫描报告

报告中一些重要字段的含义:

  • Dependency - 被扫描的第三依赖库名字
  • CPE - 所有被识别出来的CPE.
  • GAV - Maven 组, Artifact, 版本 (GAV).
  • Highest Severity - 所有关联的cve的最高漏洞等级
  • CVE Count - 关联的cve个数
  • CPE Confidence - dependency-check正确识别cpe的程度
  • Evidence Count - 识别CPE的数据个数

1.4.内置缓存数据库

dependency-check默认使用内置的H2数据库,数据库文件是odc.mv.db,默认更新后再bin同级目录data下。

查看漏洞数据库,详情https://jeremylong.github.io/DependencyCheck/data/cacheh2.html

  • 可以下载对应版本的h2数据库服务端,下载解压版,运行h2w.bat文件即可启动数据库。
  • 将odc.mv.db复制到h2的bin目录
  • 然后再浏览器自带打开控制台,jdbcurl中: jdbc:h2:{修改这里的名称} -> jdbc:h2:./odc
  • 账号密码:dcuser DC-Pass1337!

1.5.搭建本地漏洞库

这里特指NVD数据库,可以使用工具nist-data-mirror 一次性将NVD漏洞库(默认2020年以后的),漏洞库就是JSON文件,一年一个文件。

java -jar /root/dependency-check/data/nist-data-mirror.jar /root/dependency-check/data/nvdcache

使用漏洞库

dependency-check.bat
   --cveUrlModified  本地nvd库地址,例如:D:/data/nvdcve-1.1-modified.json.gz
   --cveUrlBase      本地nvd库地址,例如 D:/data/nvdcve-1.1-2020.json.gz
   --project test -s D:\checkjar\ -o D:\report\

1.6.常见问题

运行dependency-check.bat报错:[ERROR] Autoupdate is disabled and the database does not exist

通常首次运行时出现,执行updateonly命令即可。

2.OpenSCA-cli

悬镜开源的开源漏洞扫描工具:https://gitee.com/XmirrorSecurity/OpenSCA-cli

cli工具,主要作用是分析项目,生成SBOM文件,然后根据SBOM文件的内容进行检测。漏洞库是他们自己的云数据库,需要注册才能使用。 可以生成json、html等格式的检查报告。

3.dependency track

介绍:Dependency-Track基于上传的SBOM跟踪项目及其相关组件,并分析依赖组件是否存在已知漏洞。 本身就是一套管理平台,不提供扫描能力,需要自行使用工具,分析获得项目的SBOM文件,并上传到DTrack。 DTrack才会进行自动检查。

CycloneDX提供了大量的工具,帮助分析项目获得SBOM文件。例如maven的插件、Jenkins的插件等(不支持流水钱)

使用过程注意事项

访问地址:http://192.168.100.101:8080/  admin/root
docker控制台:docker exec -it data-dtrack-apiserver-1 /bin/sh
h2数据库:/data/.dependency-track  内嵌数据库,需要将数据库文件下载到本地才能访问。
接口文档:http://192.168.100.101:8081/api/swagger.json
在线导入接口:https://editor.swagger.io/#
开发:https://blog.csdn.net/weixin_61856963/article/details/131006970
上传bom接口:https://github.com/DependencyTrack/dependency-track/blob/4.3.x/src/main/java/org/dependencytrack/resources/v1/BomResource.java
maven插件:https://blog.csdn.net/WangYouJin321/article/details/127302470

支持修改数据库【但是问题比较多,需要人工干预】

优点:

  • 免费和开源,
  • SBOM可以通过用户界面和API上传,
  • 广泛且文档完备的API;
  • 优先采取补救行动的紧急方案计划;
  • 社区支持的许多集成,
  • 与其他类似的解决方案相比,UI显得更加现代。

缺点:

  • 只消耗和产生CycloneDX SBOM格式,
  • 需要一些部署和配置工作。

4.Trivy

4.1.介绍

Trivy 是由 Aqua Security 开发的开源容器安全扫描工具,旨在快速检测容器镜像、文件系统、Kubernetes 资源、 Git 仓库及基础设施即代码(IaC)配置中的安全漏洞、错误配置和供应链风险。

它以「零配置、开箱即用」为特点,支持扫描操作系统包(如 Alpine、RHEL)和应用依赖(如 npm、pip、Maven)的漏洞, 并能集成到 CI/CD 流水线中,成为 DevSecOps 流程的核心组件。

Trivy 已成为云原生安全领域的主流工具,被 CNCF 收录为毕业项目,并深度集成到 Harbor、GitLab、AWS ECR 等平台。 其开源生态活跃,社区持续贡献新功能,如对 Rust Cargo、Python Poetry 等新兴依赖管理工具的支持。

# 二进制安装使用
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.tar.gz

# Linux 安装
sudo apt install trivy

# macOS 安装
brew install aquasecurity/trivy/trivy

# Windows 安装(Scoop 包管理器)
scoop install trivy

4.2.核心功能与优势

  1. 多场景覆盖:支持容器镜像、OCI 制品、WASM 模块、Kubernetes 集群及多云环境的扫描。
  2. 高精度检测:针对 Alpine、RHEL 等操作系统的漏洞识别准确率高,并支持 SLSA 合规检测。
  3. 灵活集成:可通过 CLI、Docker 镜像或 API 方式嵌入工具链,例如在 GitHub Actions 中配置扫描任务。 ```yaml
    • name: Trivy Scan uses: aquasecurity/trivy-action@v0.5.0 with: image-ref: ‘your-image:latest' ```
  4. 离线与加速支持:提供漏洞数据库本地缓存和国内镜像源加速方案,以提升扫描效率。例如:
    export TRIVY_DB_REPOSITORY=https://mirror.ghproxy.com/https://github.com/aquasecurity/trivy-db
    

4.3.安装与使用

# 安装
docker:docker run aquasec/trivy
其他:推荐直接下载二进制文件,解压即可使用。

# 基本语法:trivy [子命令] [目标] [选项]

1. 扫描容器镜像(最常用):扫描本地或远程的容器镜像,检测其中的 OS 漏洞(如 Ubuntu 包漏洞)和应用依赖漏洞(如 Java依赖):
# 扫描本地镜像(例如 nginx:latest)
trivy image nginx:latest

# 扫描远程镜像(例如 Docker Hub 上的镜像)
trivy image ubuntu:22.04

# 扫描私有仓库镜像(需先登录仓库)
trivy image registry.example.com/myapp:v1.0

2. 扫描本地文件系统:扫描主机上的目录(如应用源代码目录),检测依赖漏洞和配置问题:
# 扫描当前目录
trivy fs .

# 扫描指定目录
trivy fs /path/to/project

3. 扫描 Git 仓库:直接扫描远程 Git 仓库(无需克隆到本地):
trivy repo https://github.com/example/project.git

4. 扫描配置文件(检测错误配置):Trivy 可检测 Dockerfile、Terraform、Kubernetes 等配置文件中的不安全设置(如使用 root 用户、权限过高等)
# 扫描 Dockerfile
trivy config Dockerfile

# 扫描 Terraform 配置目录
trivy config /path/to/terraform/files


5. 扫描 Kubernetes 资源:检测 Kubernetes 集群中的部署、Pod 等资源的安全问题:
# 扫描所有命名空间的资源
trivy k8s --all-namespaces all

# 扫描指定命名空间的部署
trivy k8s -n default deployment/my-deploy

其他选项

  • –severity HIGH,CRITICAL:只显示高危(HIGH)和严重(CRITICAL)漏洞
  • –ignore-unfixed:忽略未修复的漏洞(只显示有修复方案的)
  • –format json:以 JSON 格式输出结果(便于自动化处理)trivy默认提供了多种模版可以使用
  • –output result.json:将结果保存到文件
  • –no-progress:不显示扫描进度条(适合 CI/CD 环境)
  • –vuln-type os,library:指定漏洞类型(os:系统包漏洞;library:应用依赖漏洞)

案例

1. 只输出高危及以上、有修复方案的漏洞,并保存为 JSON:
trivy image --severity HIGH,CRITICAL --ignore-unfixed --format json --output scan-result.json nginx:latest

2. 扫描Java 的maven的项目。推荐:先编译项目,再扫描整个文件夹。
trivy.exe fs D:\workspace\managing-self\pom.xml  # 不推荐扫描pom文件,推荐扫描编译后的整个项目。
   --format template --template @./contrib/html.tpl    # 使用trivy提供的模版生成HTML
   --severity HIGH,CRITICAL                            # 只显示严重(CRITICAL) 和 高危(HIGH)漏洞
   --output scan-result.html                           # 输出扫描报告
   --ignore-unfixed                                    # 只显示有修复方案的
trivy.exe fs D:\workspace\managing-self --format template --template @./contrib/html.tpl --severity HIGH,CRITICAL  --output scan-result.html

4.4.集成CI/CD

.gitlab-ci.yml 中添加:

trivy-scan:
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image 
        --severity HIGH,CRITICAL 
        --ignore-unfixed 
        --exit-code 1 
        myapp:$CI_COMMIT_SHA

4.5.如何选择安全的基准镜像

Trivy在其中的作用选择一个安全的基准镜像是保障容器安全的第一步,也是至关重要的一步。 这遵循"预防为主"的原则。选择安全基准镜像的最佳实践

  1. Docker 官方提供了一套名为"Docker Official lmages"的精选镜像,这些镜像是构建安全容器的推荐起点。
  2. 选择最小化的镜像:选择只包含应用程序运行所必需组件的最小化镜像。这可以显著减少攻击面。
    • 推荐镜像:alpine、Google的 distroless镜像、Red Hat的 UBI minimal 等。
    • 对比:一个标准的 golang:1.12.9 镜像可能体积巨大且包含上千个漏洞,而 golang:1.12.9-alpine3.9 镜像则体积小得多,漏洞数量也锐减。
  3. 使用来自可信来源的镜像:始终从官方或经过验证的发布者那里拉取镜像,例如 Docker Hub 上的官方镜像。避免使用来源不明、长期无人维护的镜像。
  4. 保持基础镜像更新:定期更新您使用的基础镜像到最新的稳定版本,以获取最新的安全补丁
  5. 以非 root 用户运行:在 Dockerfile 中创建并切换到一个非 root 用户来运行您的应用程序,这是一种重要的安全加固措施。
  6. 删除不必要的工具:在构建过程的最后,清理掉所有编译工具、包管理器(如 apt,apk)和其他非运行环境必需的软件。

5.Sirius

官网:https://sirius.publickey.io 开源地址:https://github.com/SiriusScan/Sirius

Sirius Scan是业内首款真正开源的通用漏洞扫描工具,靠信息安全社区的集体技术力,功能上有超越部分商业产品的潜力。 它的核心框架含四大关键模块:漏洞数据库、网络扫描引擎、代理发现机制和自定义评估分析,下文会详解其安装与核心功能,帮安全从业者快速上手。

安装和使用

git clone https://github.com/SiriusScan/Sirius.git
cd Sirius   # 进入项目根目录
docker compose up -d  # 启动 Docker 容器服务

安装完成后, 在浏览器中打开http://localhost:3000
初始用户名和密码:admin password

基础功能。

  1. 控制面板: 展示系统运行状况指标、实时扫描活动和进度 最新的漏洞发现和趋势等。
  2. 控制面板: 展示系统运行状况指标、实时扫描活动和进度 最新的漏洞发现和趋势等。
  3. 漏洞查看: 扫描完成后,可在漏洞详情页查看结果,页面支持多种查看、排序及分析漏洞的方式,方便快速梳理信息。
  4. 漏洞报告: 选择对应漏洞,会出现相关漏洞报告。

文章信息

张雪随笔
master
Homepage
Issues
Download

This Software is under the terms of The Unlicense.