trivy 源码分析(扫描镜像中的漏洞信息)

本文分析了trivy扫描镜像中漏洞的流程,包括获取镜像资产信息,匹配CVE,以及CLI启动和匹配逻辑。重点在于理解如何根据镜像OS和包信息查询并判断是否存在安全隐患。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scan image 流程

总结

  • 把总结放在开头,能让我们看源码的时候有掌控全局的感觉。
  • 扫描逻辑其实很简单的,首先需要获取镜像中的各种资产信息(OSPackage等)
  • 然后需要根据(镜像的OS信息 + pkg信息) 查询相关的待选CVE
  • 然后在匹配当前的pkg的版本号,是不是CVE中fixed的版本号,如果不是就记录该CVE
  • 如果想要魔改或者抽取,建议直接看,从image获取pkg信息 以及 根据OS以及pkg查询CVE 这两个函数
  • 如果就想知道扫描流程,看到这就已经够了

cli 启动逻辑

// 扫描镜像的命令 [flags] 可以为空
cmd := &cobra.Command{
   
		Use:     "image [flags] IMAGE_NAME",
		Aliases: []string{
   "i"},
		Short:   "Scan a container image",
		Example: `  # Scan a container image
		....
		}
// 扫描需要的一些配置,分析最简单的仅扫描image,也就是没有flag全部为空或者默认值的情况
imageFlags := &flag.Flags{
   
		CacheFlagGroup:         flag.NewCacheFlagGroup(),
		DBFlagGroup:            flag.NewDBFlagGroup(),
		ImageFlagGroup:         flag.NewImageFlagGroup(), // container image specific
		LicenseFlagGroup:       flag.NewLicenseFlagGroup(),
		MisconfFlagGroup:       flag.NewMisconfFlagGroup(),
		RemoteFlagGroup:        flag.NewClientFlags(), // for client/server mode
		ReportFlagGroup:        reportFlagGroup,
		ScanFlagGroup:          flag.NewScanFlagGroup(),
		SecretFlagGroup:        flag.NewSecretFlagGroup(),
		VulnerabilityFlagGroup: flag.NewVulnerabilityFlagGroup(),
	}

PreRunE: func(cmd *cobra.Command, args []string) error {
   
			// viper.BindPFlag cannot be called in init(), so it is called in PreRunE.
			// cf. https://github.com/spf13/cobra/issues/875
			//     https://github.com/spf13/viper/issues/233
			if err := imageFlags.Bind(cmd); err != nil {
   
				return xerrors.Errorf("flag bind error: %w", err)
			}
			// 检查 flags
			return validateArgs(cmd, args)
		},
		RunE: func(cmd *cobra.Command, args []string) error {
   
      // 将参数转成 option 格式
			options, err := imageFlags.ToOptions(cmd.Version, args, globalFlags, outputWriter)
			if err != nil {
   
				return xerrors.Errorf("flag error: %w", err)
			}
      // 调用 artifact.Run , TargetContainerImage == 'image' 常量字符串
			return artifact.Run(cmd.Context(), options, artifact.TargetContainerImage)
		},

扫描逻辑

// Run performs artifact scanning
func Run(ctx context.Context, opts flag.Options, targetKind TargetKind) (err error) {
   
	.......
	// 根据执行参数构建一个runner
	r, err := NewRunner(ctx, opts)
  ......
	
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值