容器扫描Trivy及Trivy-db数据库研究

news2024/11/16 12:50:50

trivy介绍

Trivy是一个镜像容器扫描工具,用于扫描漏洞和配置错误。 它是一款相当全面且多功能的安全扫描器,支持多种扫描目标,能够弥补市面上常见Web 漏洞扫描工具的不足。 Trivy 可以轻松地通过安装并将二进制文件添加到项目中,进而集成到CI/CD 管道( DevSecOps )。

Trivy检测操作系统包(Alpine、RHEL、CentOS等)和应用程序依赖(Bundler、Composer、npm、yarn等)的漏洞。

在这里插入图片描述

功能:

  • 扫描镜像
  • 扫描打包好的镜像
  • 扫描配置文件
  • 集成与扩展

GitHub地址: https://github.com/aquasecurity/trivy

安装和使用方法可以参考网上其余文章

本文章主要研究trivy的数据库trivy-db : https://github.com/aquasecurity/trivy-db

trivy工具在运行前会先检查一遍数据是否最新,会拉去一份数据库到本地/home/quser/.cache/trivy/trivy.db

Trivy-db

trivy数据库内容结构
参考 https://blog.csdn.net/huzai9527/article/details/125975440

在这里插入图片描述
系统名称列表:

CBL-Mariner 1.0
CBL-Mariner 2.0
Oracle Linux 5
Oracle Linux 6
Oracle Linux 7
Oracle Linux 8
Oracle Linux 9
Photon OS 1.0
Photon OS 2.0
Photon OS 3.0
Photon OS 4.0
Photon OS 5.0
Red Hat
Red Hat CPE
SUSE Linux Enterprise 11
SUSE Linux Enterprise 11.1
SUSE Linux Enterprise 11.2
SUSE Linux Enterprise 11.3
SUSE Linux Enterprise 11.4
SUSE Linux Enterprise 12
SUSE Linux Enterprise 12.1
SUSE Linux Enterprise 12.2
SUSE Linux Enterprise 12.3
SUSE Linux Enterprise 12.4
SUSE Linux Enterprise 12.5
SUSE Linux Enterprise 15
SUSE Linux Enterprise 15.1
SUSE Linux Enterprise 15.2
SUSE Linux Enterprise 15.3
SUSE Linux Enterprise 15.4
SUSE Linux Enterprise 15.5
alma 8
alma 9
alpine 3.10
alpine 3.11
alpine 3.12
alpine 3.13
alpine 3.14
alpine 3.15
alpine 3.16
alpine 3.17
alpine 3.18
alpine 3.19
alpine 3.2
alpine 3.3
alpine 3.4
alpine 3.5
alpine 3.6
alpine 3.7
alpine 3.8
alpine 3.9
alpine edge
amazon linux 1
amazon linux 2
amazon linux 2022
amazon linux 2023
bitnami::Bitnami Vulnerability Database
cargo::GitHub Security Advisory Rust
chainguard
cocoapods::GitHub Security Advisory Swift
composer::GitHub Security Advisory Composer
composer::PHP Security Advisories Database
conan::GitLab Advisory Database Community
data-source
debian 10
debian 11
debian 12
debian 13
debian 7
debian 8
debian 9
erlang::GitHub Security Advisory Erlang
go::GitHub Security Advisory Go
k8s::Official Kubernetes CVE Feed
maven::GitHub Security Advisory Maven
npm::GitHub Security Advisory npm
npm::Node.js Ecosystem Security Working Group
nuget::GitHub Security Advisory NuGet
openSUSE Leap 15.0
openSUSE Leap 15.1
openSUSE Leap 15.2
openSUSE Leap 15.3
openSUSE Leap 15.4
openSUSE Leap 15.5
openSUSE Leap 42.1
openSUSE Leap 42.2
openSUSE Leap 42.3
pip::GitHub Security Advisory pip
pub::GitHub Security Advisory Pub
rocky 8
rocky 9
rubygems::GitHub Security Advisory RubyGems
rubygems::Ruby Advisory Database
swift::GitHub Security Advisory Swift
ubuntu 12.04
ubuntu 12.04-ESM
ubuntu 12.10
ubuntu 13.04
ubuntu 13.10
ubuntu 14.04
ubuntu 14.04-ESM
ubuntu 14.10
ubuntu 15.04
ubuntu 15.10
ubuntu 16.04
ubuntu 16.04-ESM
ubuntu 16.10
ubuntu 17.04
ubuntu 17.10
ubuntu 18.04
ubuntu 18.10
ubuntu 19.04
ubuntu 19.10
ubuntu 20.04
ubuntu 20.10
ubuntu 21.04
ubuntu 21.10
ubuntu 22.04
ubuntu 22.10
ubuntu 23.04
ubuntu 23.10
vulnerability
wolfi

读取指定系统的value,go代码

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	bolt "go.etcd.io/bbolt"
	"os"
	"time"
)

func main() {
	//连接trivy数据库
	db, err := bolt.Open("trivy.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
	if err != nil {
		panic("init trivydb failed")
	}

	file, err := os.Create("file.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	// 连接mysql数据库
	dbmysql, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/trivy-db")
	if err != nil {
		fmt.Println("Failed to connect to database:", err.Error())
		return
	}
	defer db.Close()

	whitelist := []string{"ubuntu 12.04", "ubuntu 12.10", "ubuntu 13.04",
		"ubuntu 13.10", "ubuntu 14.04", "ubuntu 14.10", "ubuntu 15.04",
		"ubuntu 15.10", "ubuntu 16.04", "ubuntu 16.10", "ubuntu 17.04",
		"ubuntu 17.10", "ubuntu 18.04", "ubuntu 18.10", "ubuntu 19.04",
		"ubuntu 19.10", "ubuntu 20.04", "ubuntu 20.10", "ubuntu 21.04",
		"ubuntu 21.10", "ubuntu 22.04", "ubuntu 22.10", "ubuntu 23.04",
		"ubuntu 23.10"}

	//查询数据库中的数据
	db.View(func(tx *bolt.Tx) error {
		//遍历所有桶
		tx.ForEach(func(osname []byte, b *bolt.Bucket) error {

			if containsWhitelist(whitelist, string(osname)) {
				b.ForEach(func(k, v []byte) error {
					// 遍历嵌套桶
					b.ForEachBucket(func(k []byte) error {
						//k 桶名 (包名)
						packageName := string(k)
						nestedbucket := b.Bucket([]byte(string(k)))
						nestedbucket.ForEach(func(k, v []byte) error {
							fmt.Fprintln(file, string(osname))
							fmt.Fprintln(file, packageName)
							fmt.Fprintln(file, string(k))
							fmt.Fprintln(file, string(v))
							//chuli(dbmysql, string(osname), packageName, string(k), string(v))
							fmt.Println(dbmysql, string(osname), packageName, string(k), string(v))
							return nil
						})
						return nil
					})
					return nil
				})
				return nil
			} else {
				fmt.Println("不在白名单中")
			}
			return nil
		})
		return nil
	})
}

func chuli(dbmysql *sql.DB, osname string, name string, s string, s2 string) {
	// 插入数据
	stmt, err := dbmysql.Prepare("INSERT INTO " + "`" + osname + "`" + "(Pname, CVE,value) VALUES(?,?,?)")
	if err != nil {
		fmt.Println("Failed to prepare statement:", err.Error())
		return
	}
	defer stmt.Close()

	_, err = stmt.Exec(name, s, s2)
	if err != nil {
		fmt.Println("Failed to execute statement:", err.Error())
		return
	}
	

}

// containsWhitelist 检查给定的OS是否在白名单中
func containsWhitelist(whitelist []string, name string) bool {
	for _, whiteName := range whitelist {
		if whiteName == name {
			return true
		}
	}
	return false
}

如果想转存到数据库中,需要新建系统表,表结构:

CREATE TABLE `ubuntu 12.04` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`Pname` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`CVE` VARCHAR(5000) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`value` VARCHAR(5000) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	INDEX `id` (`id`) USING BTREE
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=427755
;

数据库效果:
在这里插入图片描述
从13点到17点15分处理了四个小时,一个系统的已经接近百万条了,还没处理完,按照CVE区分确实太冗余了。。。

在这里插入图片描述


终于找到问题了,代码有一点小bug,多了一层遍历,怪不得这么多,而且刚好重复的次数是443次,因为之前统计过软件报名有443个,应该是多遍历了一遍软件包的桶 删掉这一层遍历b.ForEach(func(k, v []byte)

下面是修改后的代码:

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	bolt "go.etcd.io/bbolt"
	"os"
	"time"
)

func main() {
	//连接trivy数据库
	db, err := bolt.Open("trivy.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
	if err != nil {
		panic("init trivydb failed")
	}

	file, err := os.Create("file.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	// 连接mysql数据库
	dbmysql, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/trivy-db")
	if err != nil {
		fmt.Println("Failed to connect to database:", err.Error())
		return
	}
	defer db.Close()

	whitelist := []string{"ubuntu 12.04", "ubuntu 12.10", "ubuntu 13.04",
		"ubuntu 13.10", "ubuntu 14.04", "ubuntu 14.10", "ubuntu 15.04",
		"ubuntu 15.10", "ubuntu 16.04", "ubuntu 16.10", "ubuntu 17.04",
		"ubuntu 17.10", "ubuntu 18.04", "ubuntu 18.10", "ubuntu 19.04",
		"ubuntu 19.10", "ubuntu 20.04", "ubuntu 20.10", "ubuntu 21.04",
		"ubuntu 21.10", "ubuntu 22.04", "ubuntu 22.10", "ubuntu 23.04",
		"ubuntu 23.10"}

	//查询数据库中的数据
	db.View(func(tx *bolt.Tx) error {
		//遍历所有桶
		tx.ForEach(func(osname []byte, b *bolt.Bucket) error {

			if containsWhitelist(whitelist, string(osname)) {
				b.ForEachBucket(func(k []byte) error {
					//k 桶名 (包名)
					packageName := string(k)
					nestedbucket := b.Bucket([]byte(string(k)))
					nestedbucket.ForEach(func(k, v []byte) error {
						fmt.Fprintln(file, string(osname))
						fmt.Fprintln(file, packageName)
						fmt.Fprintln(file, string(k))
						fmt.Fprintln(file, string(v))
						//chuli(dbmysql, string(osname), packageName, string(k), string(v))
						fmt.Println(dbmysql, string(osname), packageName, string(k), string(v))
						return nil
					})
					return nil
				})
				return nil
			} else {
				fmt.Println("不在白名单中")
			}
			return nil
		})
		return nil
	})
}

func chuli(dbmysql *sql.DB, osname string, name string, s string, s2 string) {
	// 插入数据
	stmt, err := dbmysql.Prepare("INSERT INTO " + "`" + osname + "`" + "(Pname, CVE,value) VALUES(?,?,?)")
	if err != nil {
		fmt.Println("Failed to prepare statement:", err.Error())
		return
	}
	defer stmt.Close()

	_, err = stmt.Exec(name, s, s2)
	if err != nil {
		fmt.Println("Failed to execute statement:", err.Error())
		return
	}
	

}

// containsWhitelist 检查给定的OS是否在白名单中
func containsWhitelist(whitelist []string, name string) bool {
	for _, whiteName := range whitelist {
		if whiteName == name {
			return true
		}
	}
	return false
}

可以把id列删除之后,通过查询数据库判断重复信息,应该是不会重复了(但愿吧
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1376736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【qt】opencv导入pro

我的sdk0文件夹在opencv003项目下,使用opencv451 INCLUDEPATH $$PWD/sdk0/opencv/includeCONFIG(release, debug|release) {LIBS -L$$PWD/sdk0/opencv/lib/ -lopencv_world451opencv.files $$PWD/sdk0/opencv/bin/opencv_world451.dllopencv.path $$OUT_PWD/Re…

基于SpringBoot的医护人员排班系统(代码+数据库+文档)

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目 希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一、研究背景 1.1 研究背景 随…

【Linux进程】查看进程fork创建进程

目录 前言 1. 查看进程 2. 通过系统调用创建进程-fork初识 总结 前言 你有没有想过在使用Linux操作系统时,后台运行的程序是如何管理的?在Linux中,进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程,并且讨论如何使用…

概率论与数理统计-第7章 假设检验

假设检验的基本概念 二、假设检验的基本思想 假设检验的基本思想实质上是带有某种概率性质的反证法,为了检验一个假设H0,是否正确,首先假定该假设H0正确,然后根据抽取到的样本对假设H0作出接受或拒绝的决策,如果样本观察值导致了…

【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)

HashMap工作原理全揭秘 — 核心源码解析 知识盲点概念介绍数据结构数组链表数组VS链表哈希表不同JVM版本HashMap的展现形式 HashMap VS HashTable特性区别对比 hashcodehashCode的作用equals方法和hashcode的关系key为null怎么办执行步骤 核心参数容量探讨负载因子探讨加载因子…

基于pytorch的循环神经网络情感分析系统

任务目标 基于给定数据集,进行数据预处理,搭建以LSTM为基本单元的模型,以Adam优化器对模型进行训练,使用训练后的模型进行预测并计算预测分类的准确率。 数据简介 IMDB数据集是一个对电影评论标注为正向评论与负向评论的数据集…

【Android开发】不同Activity之间的数据回传实例(一)摘桃子游戏

一、功能介绍 该项目实现的功能主要有: 在首页显示一个按钮点击该按钮跳转到桃园页面在桃园页面,点击桃子会弹窗显示摘到几个桃子,同时被点击桃子消失,总桃子数1点击退出桃园会返回首页,首页桃子数会根据点击的桃子数…

伐木工 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 一根X米长的树木,伐木工切割成不同长度的木材后进行交易,交易价格为每根木头长度的乘积。规定切割后的每根木头长度都为正整数,也可以不切割,直接拿整根树木进行交易。请问伐木工如何尽量少的切割,才能使收益最大化? 输…

一、docker的安装与踩坑

目录 一、安装docker(centos7安装docker)1.安装环境前期准备2.参考官网安装前准备3.参考官网安装步骤开始安装docker4.运行首个容器 二、安装一些软件的踩坑1.启动docker踩坑2.安装mysql踩坑3.罕见问题 三、关于我的虚拟机 一、安装docker(ce…

销售团队如何实现业绩增长?CRM系统的线索管理功能有什么用?

随着“以客户为中心”观念的逐渐普及,销售团队的客户比过去更复杂,交易周期更久,竞争也更激烈。假如没有明确的销售计划,团队可能陷入混乱,最后导致客户&公司之间的负面结果。在这种情况下,人工智能驱动…

FineBI实战项目一(21):不同支付方式订单总额分析开发

点击新建组件,创建不同支付方式订单总额组件。 选择饼图,拖拽total_money到角度,拖拽pay_type到颜色,调节内径。 修改颜色的标识文字。 将组件拖拽到仪表板。 结果如下:

时至今日,编制与大厂到底怎么选?

我觉得这可能是一个辩论三天三夜也不会有结论的话题。 说实话,2023年已经过去,真的没有感觉赚钱更容易,反而是周边失业的同事不少。 现在感觉,是不是选择早点进入编制可能更加稳定?你们又怎么看?

Java中的多线程

进程和线程的概念 进程是应用程序的执行实例有独立的内存空间和系统资源。 线程是进程中执行运算的最小单位,可完成一个独立的顺序控制流程 一。一个进程可以包含多个线程,每个线程都独立执行特定的任务, 是CPU调度和分派的基本单位。 多线…

【AT 指令开发】软件框架与接口

目录 1 软件逻辑2.代码2.1 at_command.h2.2 at_command.c本文主要用于记录纯MCU无OS下,AT 指令开发软件框架 1 软件逻辑 2.代码 2.1 at_command.h #ifndef AT_COMMAND_H #define AT_COMMAND_Hvoid AT_CMD_Process(uint8_t *uartBuffer, uint8_t dataLen);/*描述AT指令返回值…

第二百五十九回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的…

PyCharm中配置安装PyQt5、QtDesigner

PyCharm中配置安装PyQt5 使用 pip install PyQt5 命令安装。 安装pyqt5-tools:pip install pyqt5-tools 安装PyQt5Designer:pip install PyQt5Designer 上述三个都安装好之后,输入 pip list 查看一下 有如下内容就安装成功啦!…

四、C++内存管理

1 C/C内存分布 在学习C的内存管理方式之前&#xff0c;我们先来看一道有关C/C内存分布的题目&#xff1a; 阅读下面的代码&#xff0c;回答相关问题&#xff1a; #include <iostream> using namespace std; int globalVar 1; static int staticGlobalVar 1; int main…

1.6计算机网络的性能指标

1.6计算机网络的性能指标 常用的计算机网络的性能指标有7个&#xff1a;速率、带宽、吞吐量、时延、往返时间、利用率、丢包率 1.6.1速率 计算机发送的信号是以二进制数字形式的。一个二进制数字就是一个比特(bit&#xff0c;binary digit)字节:Byte&#xff0c;1Byte8bit(1…

在海绵城市建设中,低功耗遥测终端有哪些独特的优势?

近年来&#xff0c;随着物联网技术的迅猛发展&#xff0c;数据监测和传输已经成为各行各业不可或缺的环节。在诸多特殊环境中因供电问题、潮湿、不便进入等诸多原因&#xff0c;需要一款功耗低、数据传输稳定&#xff0c;防潮抗锈蚀的低功耗遥测终端。 为满足这一需求&#xf…

太强了!腾讯开源!多模态AppAgent自主操作智能手机应用程序!

AppAgent是一款基于大型语言模型&#xff08;LLMs&#xff09;的新型多模态智能代理框架&#xff0c;专为操作智能手机应用而设计。它结合了GPT-4V的先进视觉理解能力&#xff0c;通过“眼睛”观察手机界面&#xff0c;模仿人类的点击和滑动交互方式来学习操作应用程序。这种方…