Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wolfictl for openSUSE:Factory checked in at 2025-07-15 16:44:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wolfictl (Old) and /work/SRC/openSUSE:Factory/.wolfictl.new.7373 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wolfictl" Tue Jul 15 16:44:51 2025 rev:5 rq:1293261 version:0.38.2 Changes: -------- --- /work/SRC/openSUSE:Factory/wolfictl/wolfictl.changes 2025-07-09 17:29:20.469884505 +0200 +++ /work/SRC/openSUSE:Factory/.wolfictl.new.7373/wolfictl.changes 2025-07-15 16:46:41.138644811 +0200 @@ -1,0 +2,24 @@ +Tue Jul 15 06:02:37 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- Update to 0.38.2: + * scan: make max db allowed build age configurable by @hectorj2f + in #1677 + +------------------------------------------------------------------- +Tue Jul 15 05:58:46 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- Update to version 0.38.1: + * scan: add a comment to justify the change to 118h + * scan: add a warning when age is older than 48h for now + * scan: add docs with the new flag + * scan: make max db allowed build age configurable + * linter: avoid false positives for double ampersand (#6) + * fix background process regex (#5) + * lint: detect multiline background processes without redirect + (#4) + * fix lint false positive for -d (#3) + * lint: detect daemon flags and redirects (#2) + * Refine background process lint regex + * lint: warn on background processes without redirect + +------------------------------------------------------------------- Old: ---- wolfictl-0.38.0.obscpio New: ---- wolfictl-0.38.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wolfictl.spec ++++++ --- /var/tmp/diff_new_pack.2TVUea/_old 2025-07-15 16:46:42.546703125 +0200 +++ /var/tmp/diff_new_pack.2TVUea/_new 2025-07-15 16:46:42.550703290 +0200 @@ -17,7 +17,7 @@ Name: wolfictl -Version: 0.38.0 +Version: 0.38.2 Release: 0 Summary: A CLI used to work with the Wolfi OSS project License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.2TVUea/_old 2025-07-15 16:46:42.582704616 +0200 +++ /var/tmp/diff_new_pack.2TVUea/_new 2025-07-15 16:46:42.586704782 +0200 @@ -4,7 +4,7 @@ <param name="scm">git</param> <param name="exclude">.git</param> <param name="revision">main</param> - <param name="versionformat">v0.38.0</param> + <param name="versionformat">v0.38.2</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.2TVUea/_old 2025-07-15 16:46:42.606705610 +0200 +++ /var/tmp/diff_new_pack.2TVUea/_new 2025-07-15 16:46:42.614705942 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/wolfi-dev/wolfictl</param> - <param name="changesrevision">e3eb49c76dc1f3a60090af4fdd51d22488c2f90f</param></service></servicedata> + <param name="changesrevision">ed371971dc2ab60e6f4e7d792da9e7d8d90ea3b5</param></service></servicedata> (No newline at EOF) ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/wolfictl/vendor.tar.gz /work/SRC/openSUSE:Factory/.wolfictl.new.7373/vendor.tar.gz differ: char 133, line 1 ++++++ wolfictl-0.38.0.obscpio -> wolfictl-0.38.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/docs/cmd/wolfictl_scan.md new/wolfictl-0.38.2/docs/cmd/wolfictl_scan.md --- old/wolfictl-0.38.0/docs/cmd/wolfictl_scan.md 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/docs/cmd/wolfictl_scan.md 2025-07-14 21:23:23.000000000 +0200 @@ -94,18 +94,19 @@ ### Options ``` - -a, --advisories-repo-dir string directory containing the advisories repository - -f, --advisory-filter string exclude vulnerability matches that are referenced from the specified set of advisories (resolved|all|concluded) - --build-log treat input as a package build log file (or a directory that contains a packages.log file) - -D, --disable-sbom-cache don't use the SBOM cache - --distro string distro to use during vulnerability matching (default "wolfi") - -h, --help help for scan - --local-file-grype-db string import a local grype db file - -o, --output string output format (outline|json), defaults to outline - -r, --remote treat input(s) as the name(s) of package(s) in the Wolfi package repository to download and scan the latest versions of - --require-zero exit 1 if any vulnerabilities are found - -s, --sbom treat input(s) as SBOM(s) of APK(s) instead of as actual APK(s) - --use-cpes turn on all CPE matching in Grype + -a, --advisories-repo-dir string directory containing the advisories repository + -f, --advisory-filter string exclude vulnerability matches that are referenced from the specified set of advisories (resolved|all|concluded) + --build-log treat input as a package build log file (or a directory that contains a packages.log file) + -D, --disable-sbom-cache don't use the SBOM cache + --distro string distro to use during vulnerability matching (default "wolfi") + -h, --help help for scan + --local-file-grype-db string import a local grype db file + --max-allowed-built-age duration Max allowed age for vulnerability database, age being the time since it was built. Default max age is 120h (or five days) (default 120h0m0s) + -o, --output string output format (outline|json), defaults to outline + -r, --remote treat input(s) as the name(s) of package(s) in the Wolfi package repository to download and scan the latest versions of + --require-zero exit 1 if any vulnerabilities are found + -s, --sbom treat input(s) as SBOM(s) of APK(s) instead of as actual APK(s) + --use-cpes turn on all CPE matching in Grype ``` ### Options inherited from parent commands diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/docs/man/man1/wolfictl-scan.1 new/wolfictl-0.38.2/docs/man/man1/wolfictl-scan.1 --- old/wolfictl-0.38.0/docs/man/man1/wolfictl-scan.1 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/docs/man/man1/wolfictl-scan.1 2025-07-14 21:23:23.000000000 +0200 @@ -135,6 +135,10 @@ import a local grype db file .PP +\fB\-\-max\-allowed\-built\-age\fP=120h0m0s + Max allowed age for vulnerability database, age being the time since it was built. Default max age is 120h (or five days) + +.PP \fB\-o\fP, \fB\-\-output\fP="" output format (outline|json), defaults to outline diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/go.mod new/wolfictl-0.38.2/go.mod --- old/wolfictl-0.38.0/go.mod 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/go.mod 2025-07-14 21:23:23.000000000 +0200 @@ -68,6 +68,7 @@ require ( github.com/anchore/go-logger v0.0.0-20250318195838-07ae343dd722 github.com/chainguard-dev/advisory-schema v0.37.12 + github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b github.com/spf13/afero v1.14.0 ) @@ -206,7 +207,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect - github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.7.8 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/cli/scan.go new/wolfictl-0.38.2/pkg/cli/scan.go --- old/wolfictl-0.38.0/pkg/cli/scan.go 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/pkg/cli/scan.go 2025-07-14 21:23:23.000000000 +0200 @@ -14,6 +14,7 @@ "sort" "strings" "sync" + "time" "chainguard.dev/apko/pkg/apk/apk" "chainguard.dev/apko/pkg/apk/auth" @@ -235,6 +236,9 @@ opts := scan.DefaultOptions opts.UseCPEs = p.useCPEMatching opts.PathOfDatabaseArchiveToImport = p.localDBFilePath + if p.dbMaxAllowedBuildAge > 0 { + opts.MaxAllowedBuildAge = p.dbMaxAllowedBuildAge + } // Immediately start a goroutine, so we can initialize the vulnerability database. // Once that's finished, we will start to pull sboms off of done as they become ready. @@ -338,6 +342,7 @@ disableSBOMCache bool remoteScanning bool useCPEMatching bool + dbMaxAllowedBuildAge time.Duration } func (p *scanParams) addFlagsTo(cmd *cobra.Command) { @@ -352,6 +357,7 @@ cmd.Flags().BoolVarP(&p.disableSBOMCache, "disable-sbom-cache", "D", false, "don't use the SBOM cache") cmd.Flags().BoolVarP(&p.remoteScanning, "remote", "r", false, "treat input(s) as the name(s) of package(s) in the Wolfi package repository to download and scan the latest versions of") cmd.Flags().BoolVar(&p.useCPEMatching, "use-cpes", false, "turn on all CPE matching in Grype") + cmd.Flags().DurationVar(&p.dbMaxAllowedBuildAge, "max-allowed-built-age", 120*time.Hour, "Max allowed age for vulnerability database, age being the time since it was built. Default max age is 120h (or five days)") } func (p *scanParams) resolveInputsToScan(ctx context.Context, args []string) (inputs []string, cleanup func() error, err error) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/rules.go new/wolfictl-0.38.2/pkg/lint/rules.go --- old/wolfictl-0.38.0/pkg/lint/rules.go 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/pkg/lint/rules.go 2025-07-14 21:23:23.000000000 +0200 @@ -21,6 +21,28 @@ ) var ( + daemonFlags = []string{ + `(?:^|\s)--daemon\b`, + `(?:^|\s)--daemonize\b`, + `(?:^|\s)--detach\b`, + `(?:^|\s)-daemon\b`, + } + + redirPatterns = []string{ + `>\s*\S+`, + `>>\s*\S+`, + `2>\s*\S+`, + `2>>\s*\S+`, + `&>\s*\S+`, + `&>>\s*\S+`, + `>\s*\S+.*2>&1`, + `2>&1.*>\s*\S+`, + `>\s*/dev/null`, + `2>\s*/dev/null`, + `&>\s*/dev/null`, + `\d+>&\d+`, + } + reValidSHA256 = regexp.MustCompile(`^[a-fA-F0-9]{64}$`) reValidSHA512 = regexp.MustCompile(`^[a-fA-F0-9]{128}$`) reValidSHA1 = regexp.MustCompile(`^[a-fA-F0-9]{40}$`) @@ -43,6 +65,14 @@ hostEditDistanceExceptions = map[string]string{ "www.libssh.org": "www.libssh2.org", } + + // Detect background processes (commands ending with '&' or '& sleep ...') or daemonized commands + // reBackgroundProcess detects background processes (commands ending with '&' or '& sleep ...') + // We explicitly avoid matching '&&' which is commonly used for command chaining. + reBackgroundProcess = regexp.MustCompile(`(?:^|[^&])&(?:\s*$|\s+sleep\b)`) // matches 'cmd &' or 'cmd & sleep' + reDaemonProcess = regexp.MustCompile(`.*(?:` + strings.Join(daemonFlags, "|") + `).*`) + // Detect output redirection in shell commands + reOutputRedirect = regexp.MustCompile(strings.Join(redirPatterns, "|")) ) const gitCheckout = "git-checkout" @@ -457,6 +487,47 @@ }, }, { + Name: "background-process-without-redirect", + Description: "test steps should redirect output when running background processes", + Severity: SeverityWarning, + LintFunc: func(c config.Configuration) error { + checkSteps := func(steps []config.Pipeline) error { + for _, s := range steps { + if s.Runs == "" { + continue + } + lines := strings.Split(s.Runs, "\n") + for i, line := range lines { + checkLine := line + if strings.Contains(line, "&") && i+1 < len(lines) { + checkLine += "\n" + lines[i+1] + } + + needsRedirect := reBackgroundProcess.MatchString(checkLine) || reDaemonProcess.MatchString(line) + if needsRedirect && !reOutputRedirect.MatchString(line) { + return fmt.Errorf("background process missing output redirect: %s", strings.TrimSpace(line)) + } + } + } + return nil + } + + if c.Test != nil { + if err := checkSteps(c.Test.Pipeline); err != nil { + return err + } + } + for _, sp := range c.Subpackages { + if sp.Test != nil { + if err := checkSteps(sp.Test.Pipeline); err != nil { + return err + } + } + } + return nil + }, + }, + { Name: "valid-update-schedule", Description: "update schedule config should contain a valid period", Severity: SeverityError, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/rules_test.go new/wolfictl-0.38.2/pkg/lint/rules_test.go --- old/wolfictl-0.38.0/pkg/lint/rules_test.go 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/pkg/lint/rules_test.go 2025-07-14 21:23:23.000000000 +0200 @@ -469,6 +469,95 @@ wantErr: true, matches: 1, }, + { + file: "background-process-no-redirect.yaml", + minSeverity: SeverityWarning, + want: EvalResult{ + File: "background-process-no-redirect", + Errors: EvalRuleErrors{ + { + Rule: Rule{ + Name: "background-process-without-redirect", + Severity: SeverityWarning, + }, + Error: fmt.Errorf("[background-process-without-redirect]: background process missing output redirect: croc relay --ports=1234 & (WARNING)"), + }, + }, + }, + wantErr: false, + matches: 1, + }, + { + file: "background-process-multiline-no-redirect.yaml", + minSeverity: SeverityWarning, + want: EvalResult{ + File: "background-process-multiline-no-redirect", + Errors: EvalRuleErrors{ + { + Rule: Rule{ + Name: "background-process-without-redirect", + Severity: SeverityWarning, + }, + Error: fmt.Errorf("[background-process-without-redirect]: background process missing output redirect: coredns & (WARNING)"), + }, + }, + }, + wantErr: false, + matches: 1, + }, + { + file: "background-process-with-redirect.yaml", + minSeverity: SeverityWarning, + want: EvalResult{}, + wantErr: false, + matches: 0, + }, + { + file: "double-ampersand-valid.yaml", + minSeverity: SeverityWarning, + want: EvalResult{}, + wantErr: false, + matches: 0, + }, + { + file: "daemon-flag-no-redirect.yaml", + minSeverity: SeverityWarning, + want: EvalResult{ + File: "daemon-flag-no-redirect", + Errors: EvalRuleErrors{ + { + Rule: Rule{ + Name: "background-process-without-redirect", + Severity: SeverityWarning, + }, + Error: fmt.Errorf("[background-process-without-redirect]: background process missing output redirect: croc relay --daemon (WARNING)"), + }, + }, + }, + wantErr: false, + matches: 1, + }, + { + file: "daemon-flag-with-redirect.yaml", + minSeverity: SeverityWarning, + want: EvalResult{}, + wantErr: false, + matches: 0, + }, + { + file: "avahi-no-daemon.yaml", + minSeverity: SeverityWarning, + want: EvalResult{}, + wantErr: false, + matches: 0, + }, + { + file: "cut-d-flag.yaml", + minSeverity: SeverityWarning, + want: EvalResult{}, + wantErr: false, + matches: 0, + }, } for _, tt := range tests { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/avahi-no-daemon.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/avahi-no-daemon.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/avahi-no-daemon.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/avahi-no-daemon.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,45 @@ +package: + name: avahi-no-daemon + version: 1.0.0 + epoch: 0 + description: Package running avahi commands without backgrounding + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/avahi/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + # AUTOGENERATED + - runs: | + avahi-browse --version + avahi-browse-domains --version + avahi-publish --version + avahi-publish-address --version + avahi-publish-service --version + avahi-resolve --version + avahi-resolve-address --version + avahi-resolve-host-name --version + avahi-set-host-name --version + avahi-autoipd --version + avahi-daemon --version + avahi-dnsconfd --version + avahi-browse --help + avahi-browse-domains --help + avahi-publish --help + avahi-publish-address --help + avahi-publish-service --help + avahi-resolve --help + avahi-resolve-address --help + avahi-resolve-host-name --help + avahi-set-host-name --help + avahi-autoipd --help + avahi-daemon --help + avahi-dnsconfd --help +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/background-process-multiline-no-redirect.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/background-process-multiline-no-redirect.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/background-process-multiline-no-redirect.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/background-process-multiline-no-redirect.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,45 @@ +package: + name: background-process-multiline-no-redirect + version: 1.0.0 + epoch: 0 + description: Package with multiline background process without redirect + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/background/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: | + cat > Corefile <<EOF + .:1053 { + file /home/build/db.wolfi.dev + log + errors + cache + } + EOF + + cat > /home/build/db.wolfi.dev <<'EOF' + $TTL 3600 + @ IN SOA ns1.wolfi.dev. admin.wolfi.dev. ( + 20240101 ; Serial + 7200 ; Refresh + 3600 ; Retry + 1209600 ; Expire + 3600 ) ; Negative Cache TTL + ; + @ IN NS ns1.wolfi.dev. + ; + foo.wolfi.dev IN TXT "hi" + EOF + + coredns & + sleep 2 +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/background-process-no-redirect.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/background-process-no-redirect.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/background-process-no-redirect.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/background-process-no-redirect.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,20 @@ +package: + name: background-process-no-redirect + version: 1.0.0 + epoch: 0 + description: Package with background process without redirect + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/background/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: "croc relay --ports=1234 &" +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/background-process-with-redirect.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/background-process-with-redirect.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/background-process-with-redirect.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/background-process-with-redirect.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,20 @@ +package: + name: background-process-with-redirect + version: 1.0.0 + epoch: 0 + description: Package with background process with redirect + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/background/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: "croc relay --ports=1234 > croc.log 2>&1 &" +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/cut-d-flag.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/cut-d-flag.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/cut-d-flag.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/cut-d-flag.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,20 @@ +package: + name: cut-d-flag + version: 1.0.0 + epoch: 0 + description: Package using cut -d but not running daemon + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/cut/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: "getcap /usr/bin/fping | cut -d ' ' -f2 | grep -q -E '^cap_net_raw=+ep$'" +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/daemon-flag-no-redirect.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/daemon-flag-no-redirect.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/daemon-flag-no-redirect.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/daemon-flag-no-redirect.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,20 @@ +package: + name: daemon-flag-no-redirect + version: 1.0.0 + epoch: 0 + description: Package with daemon flag without redirect + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/daemon/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: "croc relay --daemon" +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/daemon-flag-with-redirect.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/daemon-flag-with-redirect.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/daemon-flag-with-redirect.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/daemon-flag-with-redirect.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,20 @@ +package: + name: daemon-flag-with-redirect + version: 1.0.0 + epoch: 0 + description: Package with daemon flag and redirect + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/daemon/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: "croc relay --daemon > croc.log 2>&1" +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/lint/testdata/files/double-ampersand-valid.yaml new/wolfictl-0.38.2/pkg/lint/testdata/files/double-ampersand-valid.yaml --- old/wolfictl-0.38.0/pkg/lint/testdata/files/double-ampersand-valid.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/wolfictl-0.38.2/pkg/lint/testdata/files/double-ampersand-valid.yaml 2025-07-14 21:23:23.000000000 +0200 @@ -0,0 +1,27 @@ +package: + name: double-ampersand-valid + version: 1.0.0 + epoch: 0 + description: Package with double ampersand not running background process + copyright: + - paths: + - "*" + attestation: TODO + license: GPL-2.0-only +pipeline: + - uses: fetch + with: + uri: https://test.com/double/${{package.version}}.tar.gz + expected-sha256: ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269 +test: + pipeline: + - runs: | + ruby - <<'RUBY' + unless client.identifier == 'client_id' && + client.secret == 'client_secret' && + client.redirect_uri == 'https://example.com/callback' + raise "Client configuration failed" + end + RUBY +update: + enabled: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wolfictl-0.38.0/pkg/scan/apk.go new/wolfictl-0.38.2/pkg/scan/apk.go --- old/wolfictl-0.38.0/pkg/scan/apk.go 2025-07-08 09:07:14.000000000 +0200 +++ new/wolfictl-0.38.2/pkg/scan/apk.go 2025-07-14 21:23:23.000000000 +0200 @@ -37,6 +37,7 @@ sbomSyft "github.com/anchore/syft/syft/sbom" "github.com/chainguard-dev/clog" "github.com/charmbracelet/log" + "github.com/hako/durafmt" "github.com/spf13/afero" anchorelogger "github.com/wolfi-dev/wolfictl/pkg/anchorelog" "github.com/wolfi-dev/wolfictl/pkg/sbom" @@ -44,6 +45,8 @@ const ( mavenSearchBaseURL = "https://search.maven.org/solrsearch/select" + + maxRecommendedBuildAge = 48 * time.Hour ) var DefaultGrypeDBDir = path.Join(xdg.CacheHome, "wolfictl", "grype", "db") @@ -166,6 +169,12 @@ // except for testing purposes. DisableDatabaseAgeValidation bool + // MaxAllowedBuildAge defines the maximum allowed age for the vulnerability database. + // If the database is older than this duration, it will be considered invalid unless + // DisableDatabaseAgeValidation is set to true. If not specified, the default value + // of 48 hours will be used. + MaxAllowedBuildAge time.Duration + // DisableSBOMCache controls whether the scanner will cache SBOMs generated from // APKs. If true, the scanner will not cache SBOMs or use existing cached SBOMs. DisableSBOMCache bool @@ -173,7 +182,10 @@ // DefaultOptions is the recommended default configuration for a new Scanner. // These options are suitable for most use scanning cases. -var DefaultOptions = Options{} +var DefaultOptions = Options{ + // TODO(hectorj2f): This is a temporary change to 120h, ideally we recommend to set that maximum built age to 48h. + MaxAllowedBuildAge: 120 * time.Hour, +} // NewScanner initializes the grype DB for reuse across multiple scans. func NewScanner(opts Options) (*Scanner, error) { @@ -182,11 +194,16 @@ dbDestDir = DefaultGrypeDBDir } + maxAllowedBuildAge := opts.MaxAllowedBuildAge + if maxAllowedBuildAge == 0 { + maxAllowedBuildAge = 120 * time.Hour + } + installCfg := installation.Config{ DBRootDir: dbDestDir, ValidateChecksum: true, ValidateAge: !opts.DisableDatabaseAgeValidation, - MaxAllowedBuiltAge: 48 * time.Hour, + MaxAllowedBuiltAge: maxAllowedBuildAge, UpdateCheckMaxFrequency: 1 * time.Hour, } @@ -230,6 +247,14 @@ return nil, fmt.Errorf("failed to load vulnerability database: %w", err) } + // built time is defined in UTC, + // we should compare it against UTC + now := time.Now().UTC() + age := now.Sub(dbStatus.Built) + if age > maxRecommendedBuildAge { + fmt.Fprintf(os.Stdout, "WARNING: the vulnerability database was built %s ago (max allowed age is %s but the recommended value is %s)\n", durafmt.ParseShort(age), durafmt.ParseShort(maxAllowedBuildAge), durafmt.ParseShort(maxRecommendedBuildAge)) + } + if checksum == "" { metadata, err := v6.ReadImportMetadata(afero.NewOsFs(), filepath.Dir(dbStatus.Path)) if err != nil { ++++++ wolfictl.obsinfo ++++++ --- /var/tmp/diff_new_pack.2TVUea/_old 2025-07-15 16:46:43.306734602 +0200 +++ /var/tmp/diff_new_pack.2TVUea/_new 2025-07-15 16:46:43.310734767 +0200 @@ -1,5 +1,5 @@ name: wolfictl -version: 0.38.0 -mtime: 1751958434 -commit: e3eb49c76dc1f3a60090af4fdd51d22488c2f90f +version: 0.38.2 +mtime: 1752521003 +commit: ed371971dc2ab60e6f4e7d792da9e7d8d90ea3b5