Skip to content

Releases: SolDevelo/InfraScan

InfraScan v1.2.3

Choose a tag to compare

@jkondrat jkondrat released this 13 Oct 18:03
6c42c00

InfraScan 1.2.3 Release Notes

This release contains all changes since v1.2.2.

Highlights

  • Grading recalibrated. Grades will shift compared with 1.2.2, mostly upward for repositories with many clean images and downward where a Critical/High finding used to be diluted by good scores elsewhere.
    • Container score is based on scanned images. The maximum score now uses the number of images that were scanned (clean ones included) instead of the IaC resource count, so one vulnerable image among many clean ones is no longer judged against an unrelated denominator.
    • Container severity weights: Medium 0.5, Low 0.1, Info 0 (Critical and High unchanged).
    • CVEs with no fix available are graded one severity level lower. The report and --fail-on still use the real severity.
    • Categories with nothing to check are graded N/A and left out of the overall grade — no Terraform, no IaC resources, or no images no longer produce a misleading "A".
    • Critical/High severity caps now apply to the overall grade too, not only to the category. When a cap lowers a grade, GradeInfo.cap_reason says why.

Fixes

  • "Address N images with …" recommendation counts images, not findings.
  • Grype remediation picks the lowest fix above the installed version. The first fix listed could be a downgrade.

Notes

  • The application version has been updated to 1.2.3.

InfraScan v1.2.2

Choose a tag to compare

@jkondrat jkondrat released this 29 Sep 14:57
d014b41

InfraScan 1.2.2 Release Notes

This release contains all changes since v1.2.1.

Highlights

  • New fail-on thresholds that only count what a PR adds: new_high_critical, new_critical, new_any. The existing thresholds count every finding in the repository, so in a repo with even one existing HIGH finding fail-on: high_critical fails every PR, including ones that don't touch infrastructure. The new_* thresholds compare against the baseline (the same comparison the PR comment's "New findings" uses) and fail only on findings the PR introduces. With no baseline — a push to the default branch, or a PR whose base branch couldn't be scanned — they're skipped with a notice in the log instead of treating every existing finding as new. The examples now use new_high_critical.
  • fail-on defaults to an explicit never in the GitHub Action and the Bitbucket pipe (same behaviour as before: no threshold, no failure).
  • Variables in compose image names are expanded the way docker compose does. image: prom/prometheus:${PROMETHEUS_VERSION} used to be resolved only from the scanner's own environment, so in CI such images were reported as unscannable. InfraScan now reads the environment, then .env, then the committed .env.example / .env.sample (since .env is usually gitignored), looked for next to the compose file and in parent directories. Supports $VAR, ${VAR}, ${VAR:-default}, ${VAR-default}. Values are only used to expand image names and are never exported — a placeholder like SLACK_WEBHOOK_URL in .env.example has no effect. An image with a variable that still can't be resolved is reported as not scanned, naming the variable. The file list is configurable with CONTAINER_ENV_FILES / container-env-files (e.g. deploy/versions.env,.env.sample).
  • Configurable per-image container scan timeout: CONTAINER_SCAN_TIMEOUT / container-scan-timeout, default 300 s (previously a fixed 240 s for Grype and 120 s for Docker Scout). The limit covers the pull and the analysis, and for large images the analysis dominates — e.g. grafana/grafana: ~40 s to pull, ~3 min in Syft's binary cataloger, so it didn't fit in 240 s. A timed-out image is reported as not scanned, with a hint to raise the limit.

Fixes

  • GitHub Action: skip-if-no-match never skipped a scan. It diffed against origin/<base>, which actions/checkout's default shallow clone doesn't fetch, so the diff was always empty and the scan always ran. The action now fetches the PR's base commit (depth 1) and diffs against it. If that fetch fails, the scan still runs.
  • Grype: one image timing out skipped the rest of Docker Hub. 1.2.1 skips the remaining images of a registry after it proves unreachable, but its own per-image timeout counted as "unreachable" — so one slow, large image on Docker Hub caused every later Docker Hub image to be skipped, even after earlier ones had been scanned. A registry that has already served an image in the run is no longer blocked, and the per-image timeout never blocks Docker Hub.
  • Workflow examples (README, docs/GITHUB_ACTION.md, docs/PIPELINE_INTEGRATION.md): push runs only on the default branch (that run saves the baseline PRs compare against; on every branch it duplicated each PR's scan), and contents: read is included — once a workflow sets permissions:, everything unlisted is none, and actions/checkout then fails on private repositories.

Notes

  • The application version has been updated to 1.2.2.
  • Workflows that generated an env file before the scan just to expand compose image versions can drop that step — .env.example / .env.sample are picked up automatically. See "Container scanning" in docs/BITBUCKET_PIPELINE.md and the inputs table in docs/GITHUB_ACTION.md.

v1.2.1

Choose a tag to compare

@jkondrat jkondrat released this 29 Sep 12:06
b56fffa

InfraScan 1.2.1 Release Notes

This release contains all changes since v1.2.0.

Highlights

  • Images that can't be scanned are now reported, not counted as clean. Previously, if Grype couldn't pull an image (private registry unreachable from the CI runner, missing credentials, tag that doesn't exist), the image silently contributed zero findings. Now each one is listed with its reason in the build log, the PR comment and the step summary / Code Insights report ("K of M container images could not be scanned"). After the first unreachable or unauthorized registry, its remaining images are skipped instead of each one waiting out a timeout.
  • Grype is picked automatically when there are no Docker Hub credentials. Docker Scout needs a Docker login even on a free account, so without one every image first failed with Scout before falling back to Grype. Pass credentials to keep using Scout (fewer false positives): docker-hub-username / docker-hub-password inputs (GitHub Action) or DOCKER_HUB_USERNAME / DOCKER_HUB_PASSWORD (Bitbucket pipe). The pipe also gets CONTAINER_SCANNER to force either scanner.
  • New container-ignore-images / CONTAINER_IGNORE_IMAGES: a regex of images to skip, e.g. -SNAPSHOT$ for images the repo builds itself and only publishes after merge — on a PR the registry only has the previous build, so scanning it is misleading.
  • Grype vulnerability DB cache (saves a ~2.5 min download per run). GitHub Action: automatic, keyed on the date, so the DB is refreshed once a day. Bitbucket: opt-in infrascan-grype-db cache (added to all examples); when Anchore publishes a newer DB, the pipe replaces the cache through the step's local auth proxy, with BITBUCKET_ACCESS_TOKEN as a fallback. Scans always use a current DB either way — the cache only decides whether a download is needed.

Fixes

  • Bitbucket: stale baseline gave wrong PR deltas. Bitbucket never overwrites an existing cache, so the baseline saved on the first default-branch run was reused for up to a week while the branch kept changing. The baseline now carries a fingerprint of the scanned files; when a PR's target branch has changed since, the pipe scans the target branch directly for that PR's delta.
  • Bitbucket: the no-cache baseline fallback didn't work inside the pipe container (git "dubious ownership", the clone's origin proxy unreachable from the pipe, no write access to .git). It now reads and fetches the target branch without touching the clone.
  • Bitbucket: a declared Grype DB cache without the chmod line scanned no images at all. The pipe now ignores a cache directory it can't write to (with a hint in the log) and downloads the DB as if no cache were declared. Pipelines without any caches work out of the box, just slower.
  • GitHub Action: the baseline was rescanned on every PR. It was only ever saved by PR runs, and GitHub scopes a cache saved by a PR to that PR alone — no other PR could restore it. Pushes to the default branch now save their scan as the baseline for that commit, so PRs targeting it restore it instead of scanning the base branch again. A PR scan failing via fail-on also no longer skips saving the baseline or the step summary.
  • GitHub Action: the baseline scan ignored directory, scanner and framework, so a PR scan with non-default settings was compared against a differently-scanned baseline and reported false "new" findings. Both scans now use the same settings.
  • Findings tables showed only the file's basename, not its path — in a repo with many services each having their own docker-compose.yml/Dockerfile (common in a monorepo), every entry looked identical (e.g. docker-compose.yml:7) with no way to tell which service a finding actually belonged to. The step summary's findings/cost-savings tables and the PR comment's "New findings" table now show the full relative path.
  • GitHub Actions inline annotations could be dropped non-deterministically. GitHub Actions caps annotations at 10 errors / 10 warnings / 10 notices per step, and silently keeps only "a random subset" beyond that with no indication anything was cut. A repo with more than 10 CRITICAL (or HIGH, or cost-delta) findings would get an arbitrary subset shown as inline annotations from run to run. Findings are already severity-sorted, so InfraScan now stops at 10 per level itself — the ones that do show up are deterministically the most severe, not whatever GitHub happened to keep. Doesn't affect grading, the PR comment, or the step summary, which already show the full set.

Notes

  • The application version has been updated to 1.2.1.
  • Bitbucket users can add the Grype DB cache to their pipeline — see "Grype DB cache" in docs/BITBUCKET_PIPELINE.md. No token permission changes are needed.

v1.2.0

Choose a tag to compare

@jkondrat jkondrat released this 24 Sep 14:43
7b56a90

This release contains all changes since v1.1.1.

Highlights

  • New: Bitbucket Pipelines integration — InfraScan is now available as a Bitbucket Pipe (pipe: docker://soldevelo/infrascan:latest), at parity with the GitHub Action: PR comments, a Code Insights report (step-summary equivalent), inline annotations anchored to file/line, an HTML report artifact, and automatic cost/security baseline tracking against the default branch. See docs/BITBUCKET_PIPELINE.md.
  • The Code Insights report and annotations authenticate with no token required — only the PR comment (a different, more general API) needs a manually created Repository Access Token.
  • New MAX_ANNOTATIONS_PER_IMAGE variable (default 10) caps how many Code Insights annotations a single noisy container image can post, so one image's long CVE list can't drown out every other finding — doesn't affect grading, the PR comment, or the report.

Fixes (apply to both GitHub and Bitbucket)

  • Checkov findings could report garbage file paths (e.g. ../../../../../test_infra.tf) — was relpath-ing Checkov's own synthetic file_path instead of its real file_abs_path.
  • A container CVE for an image referenced by more than one compose/Kubernetes file was silently dropped for every file but the first one encountered — every referencing file now gets the finding, without double-counting it in grading or the PR comment.
  • Container CVE annotations now carry a real line number (the image's declaring line in its compose/Kubernetes file), instead of always being line-less.

Notes

  • The application version has been updated to 1.2.0.

InfraScan v1.1.1

Choose a tag to compare

@jkondrat jkondrat released this 18 Sep 14:53
0720e52

InfraScan 1.1.1 Release Notes

This release contains all changes since v1.1.0.

Highlights

  • feat: improve PR comments: display all new findings by default
  • fix: raise grype per-image timeout to cover large image pulls
  • fix: container scanning silently failing under non-default uid
  • fix: show container CVEs in PR comment findings
  • fix: prevent stored/reflected XSS via repository_url and add nginx rate limits

Other changes

  • The GitHub Action's framework input now defaults to smart (was auto), matching the CLI and web UI. smart scans all detected frameworks in a multi-framework repo instead of silently picking one and ignoring the rest — existing workflows that don't set framework: explicitly may see additional findings after this update.
  • action.yml's description and framework input docs updated to reflect Helm/CloudFormation/Ansible security-scanning support (cost estimation remains Terraform-only).

Notes

  • The application version has been updated to 1.1.1.
  • The Marketplace quick-start example now pins the rolling @v1 tag instead of a specific patch version.

v1.1.0

Choose a tag to compare

@jkondrat jkondrat released this 29 Jul 18:54
6ac75eb
  • Step summary: full results in workflow run's Summary tab
  • PR comments: grade table + cost estimate + new CRITICAL/HIGH findings (requires pull-requests: write)
  • Auto-baseline: cost delta tracking with automatic baseline management
  • Smart skipping: skips scan when no matching files changed in PRs
  • Inline annotations: ::error and ::warning markers in PR diff view
  • Cost estimation improvements

Full Changelog: v1.0.10...v1.1.0

v1.0.10

Choose a tag to compare

@jkondrat jkondrat released this 29 Jul 18:25

What's Changed

  • fix: reduce false positives in COST-001, COST-006, and COST-007 rules by @jkondrat in #103
  • Improve finding display accuracy by @jkondrat in #104
  • feat: add last scan link to supported projects table and include scanID in project data by @igor-soldev in #105
  • feat: add project scan history page and link from supported projects list by @igor-soldev in #106

Full Changelog: v1.0.9...v1.0.10

v1.0.9

Choose a tag to compare

@igor-soldev igor-soldev released this 25 Jun 07:31
ec0d116

What's Changed

  • feat: fetch and automatically pre-select default branch for GitHub repositories by @igor-soldev in #84
  • feat: simplify Markdown rendering in PDF report and enhance table layout for better readability by @igor-soldev in #92
  • feat(rules): add 8 new cost rules COST-020–COST-027 (RDS old-gen, Lam… by @jkondrat in #94
  • fix(rules): lower COST-011 Missing AWS Budget severity to Low by @ClydeTN in #96
  • fix: link Recent Scans repository titles to reports by @igor-soldev in #97
  • feat(cost): implement cost estimation by @jkondrat in #98
  • Add sorting and page size control to Supported Projects table by @igor-soldev in #99
  • feat: add support for GitHub Actions scans in Supported Projects by @igor-soldev in #95
  • Revise action name and description in action.yml by @igor-soldev in #78
  • chore(release): prepare v1.0.9 by @igor-soldev in #100

New Contributors

Full Changelog: v1.0.8...v1.0.9

InfraScan v1.0.8

Choose a tag to compare

@igor-soldev igor-soldev released this 12 Jun 06:34
bde62c9

What's Changed

  • feat: Add support for monitoring of InfraScan projects by @igor-soldev in #89

Full Changelog: v1.0.7...v1.0.8

v1.0.7

Choose a tag to compare

@igor-soldev igor-soldev released this 02 Jun 12:27
4c81787

What's Changed

  • feat(seo): implement SEO-friendly report URLs, SSR, and dynamic sitemap by @igor-soldev in #77
  • feat: implement report sharing functionality and clean up sitemap configuration by @igor-soldev in #79
  • Revise README to enhance project clarity by @igor-soldev in #82
  • Implemented the requested logging improvements. by @Natan-gal in #75
  • Update grade report card rendering logic by @Natan-gal in #70
  • feat: improve Docker Scout vulnerability descriptions in reports by @igor-soldev in #86
  • feat: add Ansible support and smart multi-framework detection by @igor-soldev in #85
  • feat: update to version 1.0.7, enhance release notes, and improve documentation references by @igor-soldev in #87

Full Changelog: v1.0.6...v1.0.7