scan image 流程
总结
- 把总结放在开头,能让我们看源码的时候有掌控全局的感觉。
- 扫描逻辑其实很简单的,首先需要获取镜像中的各种资产信息(OSPackage等)
- 然后需要根据(镜像的OS信息 + pkg信息) 查询相关的待选CVE
- 然后在匹配当前的pkg的版本号,是不是CVE中fixed的版本号,如果不是就记录该CVE
- 如果想要魔改或者抽取,建议直接看,从image获取pkg信息 以及 根据OS以及pkg查询CVE 这两个函数
- 如果就想知道扫描流程,看到这就已经够了
cli 启动逻辑
cmd := &cobra.Command{
Use: "image [flags] IMAGE_NAME",
Aliases: []string{
"i"},
Short: "Scan a container image",
Example: ` # Scan a container image
....
}
imageFlags := &flag.Flags{
CacheFlagGroup: flag.NewCacheFlagGroup(),
DBFlagGroup: flag.NewDBFlagGroup(),
ImageFlagGroup: flag.NewImageFlagGroup(),
LicenseFlagGroup: flag.NewLicenseFlagGroup(),
MisconfFlagGroup: flag.NewMisconfFlagGroup(),
RemoteFlagGroup: flag.NewClientFlags(),
ReportFlagGroup: reportFlagGroup,
ScanFlagGroup: flag.NewScanFlagGroup(),
SecretFlagGroup: flag.NewSecretFlagGroup(),
VulnerabilityFlagGroup: flag.NewVulnerabilityFlagGroup(),
}
PreRunE: func(cmd *cobra.Command, args []string) error {
if err := imageFlags.Bind(cmd); err != nil {
return xerrors.Errorf("flag bind error: %w", err)
}
return validateArgs(cmd, args)
},
RunE: func(cmd *cobra.Command, args []string) error {
options, err := imageFlags.ToOptions(cmd.Version, args, globalFlags, outputWriter)
if err != nil {
return xerrors.Errorf("flag error: %w", err)
}
return artifact.Run(cmd.Context(), options, artifact.TargetContainerImage)
},
扫描逻辑
func Run(ctx context.Context, opts flag.Options, targetKind TargetKind) (err error) {
.......
r, err := NewRunner(ctx, opts)
......