代码质量分析
- Java漏洞靶场是基于SpringBoot开发,目的是用来检测SAST工具的准确性https://github.com/l4yn3/micro_service_seclab/
代码质量
1.SonarQube
是当前主流的开源代码质量扫描工具,支持自定义扫描规则,支持多种语言进行扫描
- SonarQube:https://www.sonarqube.org/
- Sonar介绍
- SonarQube基础介绍与在代码检测中的应用
- SonarQube代码质量管理教程
- SonarQube 插件、权限、质量配置
- 本地搭建sonar服务之前端代码扫描
官方提供多个版本,只有社区版本免费。而社区版,只支持代码上传到sonar后进行扫描,需要配置SonarScanner才能实现功能,也不支持版本管理。
使用案例
2.CodeQL
CodeQL是GitHub代码扫描的核心工具(GitHub购买的),其利用QL语言对代码、执行流程等进行"查询",以此实现对代码的安全性白盒审计,进行漏洞挖掘。 目前只开源了扫描规则和cli工具,引擎并未开源。
官网访问:https://codeql.github.com/docs/codeql-overview/
核心工具:
- 规则仓库:https://github.com/github/codeql
- cli工具:下载后需要配置到环境变量中(path)https://github.com/github/codeql-cli-binaries/releases
介绍
- 「 CodeQL从入门到精通系列 」01.CodeQL简介
- 「 CodeQL从入门到精通系列 」02.CodeQL安装指导及使用方式
- 「 CodeQL从入门到精通系列 」03.CodeQL常用术语介绍
使用案例:
- CodeQL基础知识
- vocode安装CodeQL插件。vscode配置codeql使用教程
- java自动化审计
- CodeQL漏洞挖掘实战
- CodeQL分析XXL-JOB默认accessToken命令执行漏洞
原理:是把源代码转化成一个可查询的数据库,通过 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.其他
- PMD。官网https://pmd.github.io/PMD是一个通过Github发布的免费、开源、静态代码审查工具
- 评估java源代码的完整性,它还会报告一些降低代码效率的常见错误,发现出重复或不需要的代码部分和变量和不必要的对象。
- 可以检测出可能危及安全性的硬编码代码或密码认证漏洞。
- 发现了常见的代码漏洞,如未使用的变量、空的try语句、冗余的对象创建等等
- 支持多种语言。
- 当前很多主流的扫描工具底层会使用PMD,例如sonarQube
- FindBugshttps://spotbugs.github.io/开源Java代码静态分析工具FindBugs是免费的
- 发现代码部分中的缺陷和漏洞、逻辑前后不一致和安全威胁
- SpotBugs工具是FindBugs的新版本
- Checkstylehttps://checkstyle.sourceforge.io/
- 可以定位于解决类设计不兼容、方法设计问题以及代码布局和格式错误。主要集中于代码的格式、命名规范等
- SonarLint。SonarLint是另一个免费的开源Java代码检查工具,它根据自己的标准来检查代码以评估质量。是sonarQube的客户端工具
- 该工具更适用于定位安全漏洞,并提供报告,和显示重复代码、给出代码复杂性和比较代码标准
- Snyk。https://snyk.io/product/snyk-code/
- Snyk Code是一款新颖的静态Java代码审查工具,可以在开发人员编写代码时对Java源代码的安全漏洞进行漏洞分析。此工具可快速执行自动安全代码审查,在过程中很少有误报。
- JArchitect:官网 ,静态Java源代码分析工具JArchitect会评估Java代码的复杂性。本地客户端,不适合大型项目使用
- 它提供了一些功能,如代码查询、启用自定义代码、平台使用评估以确定修复代码漏洞的成本(与不修复代码漏洞的风险)以及通过代码审计检验过程。
- 该工具还提供了代码标准的度量和统计分析。
- 识别代码度量,如算出代码复杂度(可能执行路径的数量)、源代码行、代码传入(传入)和传出(传出)耦合、嵌套和深度。
- 生成报告,帮助找到可能出现的代码漏洞。
通常Checkstyle、FindBugs和PMD结合使用,以实现更强大专业的Java代码审计过程。
安全扫描
主要是针对项目中使用的依赖进行漏洞检查,需要扫描的内容比较多,所以并非每次CI流程都会进行该步骤,可以设置为定期检查。
主要包括:
- 代码漏洞扫描:sonar已经实现
- 开源漏洞检查:依赖引入的漏洞,例如log4j的漏洞。
- 开源协议检查等:防止类似于GPL的协议的组件对项目的污染。
- 镜像扫描:针对容器镜像的扫描。
- 其他:服务器漏洞扫描、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等;
- 具备使用方便,落地简单等优势。
工作原理:
- 通过分析器对文件进行扫描搜集项目的依赖信息,包括vendor(供应商),product(产品)和version(版本)等,搜集到的信息被叫做迹象。
- jarAnalyzer将从jar文件包中的Mainfest、pom.xml和包名进行信息搜集,然后把各种搜集到的源放到一个或者多个迹象表里。
- 通过搜集到的迹象和CPE条目(NVD、CVE数据索引)进行匹配,分析器匹配到了就会给个标志发送到报告。
- 目前不使用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
- 源码https://github.com/DependencyTrack/dependency-track
- 官网https://dependencytrack.org/
- 教程https://zhuanlan.zhihu.com/p/674859972
- 教程https://plaaso.com/post/5329.html
介绍: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.核心功能与优势
- 多场景覆盖:支持容器镜像、OCI 制品、WASM 模块、Kubernetes 集群及多云环境的扫描。
- 高精度检测:针对 Alpine、RHEL 等操作系统的漏洞识别准确率高,并支持 SLSA 合规检测。
- 灵活集成:可通过 CLI、Docker 镜像或 API 方式嵌入工具链,例如在 GitHub Actions 中配置扫描任务。 ```yaml
- name: Trivy Scan uses: aquasecurity/trivy-action@v0.5.0 with: image-ref: ‘your-image:latest' ```
- 离线与加速支持:提供漏洞数据库本地缓存和国内镜像源加速方案,以提升扫描效率。例如:
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在其中的作用选择一个安全的基准镜像是保障容器安全的第一步,也是至关重要的一步。 这遵循"预防为主"的原则。选择安全基准镜像的最佳实践
- Docker 官方提供了一套名为"Docker Official lmages"的精选镜像,这些镜像是构建安全容器的推荐起点。
- 选择最小化的镜像:选择只包含应用程序运行所必需组件的最小化镜像。这可以显著减少攻击面。
- 推荐镜像:alpine、Google的 distroless镜像、Red Hat的 UBI minimal 等。
- 对比:一个标准的 golang:1.12.9 镜像可能体积巨大且包含上千个漏洞,而 golang:1.12.9-alpine3.9 镜像则体积小得多,漏洞数量也锐减。
- 使用来自可信来源的镜像:始终从官方或经过验证的发布者那里拉取镜像,例如 Docker Hub 上的官方镜像。避免使用来源不明、长期无人维护的镜像。
- 保持基础镜像更新:定期更新您使用的基础镜像到最新的稳定版本,以获取最新的安全补丁
- 以非 root 用户运行:在 Dockerfile 中创建并切换到一个非 root 用户来运行您的应用程序,这是一种重要的安全加固措施。
- 删除不必要的工具:在构建过程的最后,清理掉所有编译工具、包管理器(如 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
基础功能。
- 控制面板: 展示系统运行状况指标、实时扫描活动和进度 最新的漏洞发现和趋势等。
- 控制面板: 展示系统运行状况指标、实时扫描活动和进度 最新的漏洞发现和趋势等。
- 漏洞查看: 扫描完成后,可在漏洞详情页查看结果,页面支持多种查看、排序及分析漏洞的方式,方便快速梳理信息。
- 漏洞报告: 选择对应漏洞,会出现相关漏洞报告。
- 本文作者:zhangxue
- 本文链接:https://lucksnow1989.github.io/article/10.devOps/代码质量分析.html
- 版权声明:本文为本人原创文章,遵循 CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接和本声明。