This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Welcome to Anchore Open Source

Anchore Open Source Software (OSS) is a suite of tools for Software Bill of Materials (SBOM) Generation, Vulnerability Scanning, License Scanning, and Vulnerability Database management.

Start by going to the project overview of Anchore OSS to learn more about the basic concepts and functions.

For information about generating SBOMs:

Get started with vulnerability scanning

Scan SBOMs or containers for licenses used:

Reference information

OSS release notes:

Note: Many topics have nested sub-topics in the navigation pane to the left that become visible when you click a topic.

Installing the Tools

The tools are available in many common distribution channels. The full list of official and community maintained packages can be found on the installation page.

Using the Tools

We have “Getting Started” user guides for SBOM Generation with Syft, Vulnerability Scanning with Grype, and License Scanning.

Developing

Developers also have Contribution Guides for all of our open source tools and libraries.

1 - Projects

Overview of Anchore Open Source tools.

Anchore Open Source Tools

We maintain three popular command-line tools, some libraries, and supporting utilities. Most are written in Go, with a few in Python. They are all released under the Apache-2.0 license. For the full list, see our GitHub org.

Syft logo Syft

SBOM Generator and library

Syft (pronounced like sift) is an open-source command-line tool and Go library. Its primary function is to scan container images, file systems, and archives to automatically generate a Software Bill of Materials, making it easier to understand the composition of software.  

Grype logo Grype

Vulnerability Scanner

Grype (pronounced like hype) is an open-source vulnerability scanner specifically designed to analyze container images and filesystems. It works by comparing the software components it finds against a database of known vulnerabilities, providing a report of potential risks so they can be addressed.

Grant logo Grant

License Scanner

Grant is an open-source command-line tool designed to discover and report on the software licenses present in container images, SBOM documents, or filesystems. It helps users understand the licenses of their software dependencies and can check them against user-defined policies to ensure compliance.

Installing the Tools

The tools are available in many common distribution channels. The full list of official and community maintained packages can be found on the installation page.

Using the Tools

We have “Getting Started” user guides for SBOM Generation with Syft, Vulnerability Scanning with Grype, and License Scanning.

Developing

Developers also have Contribution Guides for all of our open source tools and libraries.

2 - Data Sources

Vulnerability Data Sources

TODO

3 - Installation

Official and community maintained packages of Anchore OSS Tools

3.1 - Syft

Installing Syft

Official builds

The Anchore OSS team publish official source archives and binary builds of Syft for Linux, macOS and Windows. There are also numerous community-maintained builds of the tools for different platforms.

Installer script

Syft binaries are provided for Linux, macOS and Windows.

curl -sSfL https://get.anchore.io/syft | sudo sh -s -- -b /usr/local/bin

Install script options:

  • -b: Specify a custom installation directory (defaults to ./bin)
  • -d: More verbose logging levels (-d for debug, -dd for trace)
  • -v: Verify the signature of the downloaded artifact before installation (requires cosign to be installed)

Updating Syft

Syft checks for new versions on launch. It will print a message at the end of the output if the version in use is not the latest.

A newer version of syft is available for download: 1.20.0 (installed version is 1.19.2)

Docker container

docker pull anchore/syft

GitHub releases

  • Download the file for your operating system and architecture from the GitHub releases page
  • In the case of .deb or .rpm, install them using your package manager
  • For compressed archives, unpack the file, and copy the syft binary to a folder in your path such as /usr/local/bin

Community builds of syft

Alpine Linux

apk add syft

Thanks to Michał Polański for maintaining this package.

Chocolatey

choco install syft -y

Homebrew

brew tap anchore/syft
brew install syft

Thanks to the Syft community for maintaining this package.

Kali Linux

sudo apt install syft

Thanks to Sophie Brun for maintaining this package.

Nix

Syft is available in the stable channel since NixOS 22.05.

nix-env -i syft

Alternatively, just try it out in an ephemeral nix shell.

nix-shell -p syft

Scoop

scoop install syft

WinGet

nuget install Anchore.syft

Thanks to Alan Pope for maintaining this package.

Snapcraft

snap install syft

Thanks to Alan Pope for maintaining this package.

3.2 - Grype

Installing Grype

Official builds

The Anchore OSS team publish official source archives and binary builds of Grype for Linux, macOS and Windows. There are also numerous community-maintained builds of the tools for different platforms.

Installer script

Grype binaries are provided for Linux, macOS and Windows.

curl -sSfL https://get.anchore.io/grype | sudo sh -s -- -b /usr/local/bin

Install script options:

  • -b: Specify a custom installation directory (defaults to ./bin)
  • -d: More verbose logging levels (-d for debug, -dd for trace)
  • -v: Verify the signature of the downloaded artifact before installation (requires cosign to be installed)

Updating Grype

Grype checks for new versions on launch. It will print a message at the end of the output if the version in use is not the latest.

A newer version of grype is available for download: 0.92.0 (installed version is 0.91.2)

Docker container

docker pull anchore/grype

GitHub releases

  • Download the file for your operating system and architecture from the GitHub releases page
  • In the case of .deb or .rpm, install them using your package manager
  • For compressed archives, unpack the file, and copy the grype binary to a folder in your path such as /usr/local/bin

Community builds of Grype

Arch Linux

sudo pacman -S grype-bin

Homebrew

brew tap anchore/grype
brew install grype

MacPorts

sudo port install grype

NuGet

nuget install Anchore.Grype

Snapcraft

snap install grype

3.3 - Grant

Installing Grant

Official builds

The Anchore OSS team publish official source archives and binary builds for Linux and macOS. There are also some community-maintained builds of the tools for different platforms.

Installer script

Grant binaries are provided for Linux and macOS.

curl -sSfL https://get.anchore.io/grant | sudo sh -s -- -b /usr/local/bin

Install script options:

  • -b: Specify a custom installation directory (defaults to ./bin)
  • -d: More verbose logging levels (-d for debug, -dd for trace)
  • -v: Verify the signature of the downloaded artifact before installation (requires cosign to be installed)

GitHub releases

  • Download the file for your operating system and architecture from the GitHub releases page
  • In the case of .deb or .rpm, install them using your package manager
  • For compressed archives, unpack the file, and copy the grant binary to a folder in your path such as /usr/local/bin

Community builds of grant

Homebrew

brew tap anchore/grant
brew install grant

3.4 - Verifying Downloads

Verifying release assets after downloading

Why verify downloads?

Verifying your downloads ensures that:

  • The files haven’t been tampered with during transit
  • You’re installing authentic Anchore software
  • Your supply chain is secure from the start

All release artifacts include checksums, and the checksum file itself is cryptographically signed using cosign for verification.

Prerequisites

Before verifying downloads, you need:

  • The binary you want to verify (see Installation)
  • Cosign installed (for signature verification)

Note: Checksum verification doesn’t require additional tools beyond your operating system’s built-in utilities.

Cosign signature verification

This method verifies that your download is both authentic (from Anchore) and hasn’t been tampered with.

Step 1: Download the files

Download your tool binary and the verification files from the appropriate GitHub releases page:

You’ll need:

  • The binary file (e.g., syft_1.23.1_darwin_arm64.tar.gz)
  • checksums.txt
  • checksums.txt.pem
  • checksums.txt.sig

Step 2: Verify the signature

Use cosign to verify the checksum file’s signature:

cosign verify-blob <path to checksums.txt> \
  --certificate <path to checksums.txt.pem> \
  --signature <path to checksums.txt.sig> \
  --certificate-identity-regexp 'https://github\.com/anchore/<tool-name>/\.github/workflows/.+' \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"

Replace <tool-name> with syft, grype, or grant depending on which tool you’re verifying.

Expected output on success:

Verified OK

Step 3: Verify the checksum

Once the signature is confirmed as valid, verify that the SHA256 checksum matches your downloaded file:

sha256sum --ignore-missing -c checksums.txt

Expected output on success:

<your-binary-file>: OK

Complete example

Here’s a complete example verifying Syft v1.23.1 for macOS ARM64:

Download the files:

# Download the binary
wget https://github.com/anchore/syft/releases/download/v1.23.1/syft_1.23.1_darwin_arm64.tar.gz

# Download verification files
wget https://github.com/anchore/syft/releases/download/v1.23.1/syft_1.23.1_checksums.txt
wget https://github.com/anchore/syft/releases/download/v1.23.1/syft_1.23.1_checksums.txt.pem
wget https://github.com/anchore/syft/releases/download/v1.23.1/syft_1.23.1_checksums.txt.sig

Verify the signature:

cosign verify-blob ./syft_1.23.1_checksums.txt \
  --certificate ./syft_1.23.1_checksums.txt.pem \
  --signature ./syft_1.23.1_checksums.txt.sig \
  --certificate-identity-regexp 'https://github\.com/anchore/syft/\.github/workflows/.+' \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com"

Output:

Verified OK

Verify the checksum:

sha256sum --ignore-missing -c syft_1.23.1_checksums.txt

Output:

syft_1.23.1_darwin_arm64.tar.gz: OK

Checksum verification

If you can’t use cosign, you can verify checksums manually. This verifies file integrity but not authenticity.

Step 1: Download the files

Download your tool binary and the checksums file:

# Example for Syft v1.23.1
wget https://github.com/anchore/syft/releases/download/v1.23.1/syft_1.23.1_darwin_arm64.tar.gz
wget https://github.com/anchore/syft/releases/download/v1.23.1/syft_1.23.1_checksums.txt

Step 2: Verify the checksum

sha256sum --ignore-missing -c syft_1.23.1_checksums.txt

Expected output:

syft_1.23.1_darwin_arm64.tar.gz: OK

Troubleshooting

Verification failed

If cosign verification fails, check these common issues:

  • Mismatched certificate identity: Ensure you’re using the correct tool name (syft, grype, or grant) in the certificate identity pattern
  • Outdated cosign: Update to the latest version of cosign
  • Network connectivity: Cosign requires internet access to verify against transparency logs
  • Corrupted download: Try downloading the verification files again

Checksum doesn’t match

If the checksum verification fails:

  • Download again: The file may have been corrupted during download
  • Check the filename: Ensure you’re comparing the checksum for the correct file (right version, architecture, and tool)
  • Do not proceed: A mismatched checksum indicates a potential security issue or corruption

Platform-specific issues

macOS:

  • If you get a “command not found” error for sha256sum, use shasum -a 256 instead
  • Example: shasum -a 256 syft_1.23.1_darwin_arm64.tar.gz

Windows:

  • Use PowerShell’s Get-FileHash command:

    Get-FileHash .\syft_1.23.1_windows_amd64.zip -Algorithm SHA256
    

Need help?

If you’re still having issues:

4 - Guides

4.1 - SBOM Generation

Learn how to create a Software Bill of Materials (SBOMs) for container images, filesystems, and archives using Syft.

An SBOM, or Software Bill of Materials, is a detailed list of all the components, libraries, and modules that make up a piece of software.

For a developer, having an SBOM is crucial for tracking dependencies, quickly identifying known vulnerabilities within those components, and ensuring license compliance.

For a consumer or organization using the software, an SBOM provides transparency into the software’s supply chain, allowing them to assess potential security risks and understand what’s “under the hood.”  

Syft is an open-source command-line tool and Go library. Its primary function is to scan container images, file systems, and archives to automatically generate a Software Bill of Materials, making it easier to understand the composition of software.

4.1.1 - Getting Started

Use Syft to generate your first SBOM from container images, directories, or archives.

Syft is a CLI tool for generating a Software Bill of Materials (SBOM) from container images and filesystems.

Installation

Syft is provided as a single compiled executable. Run the command for your platform to download the latest release. The full list of official and community maintained packages can be found on the installation page.

curl -sSfL <https://get.anchore.io/syft> | sudo sh -s -- -b /usr/local/bin
brew install syft
nuget install Anchore.Syft

See the installation guide for more options including package managers and manual installation.

Display the contents of a public container image

Run syft against a small container image, which will be pulled from DockerHub. The output will be a simple human-readable table.

syft alpine:latest

The output will look similar to the following table.

NAME                    VERSION      TYPE
alpine-baselayout       3.6.8-r1     apk
alpine-baselayout-data  3.6.8-r1     apk
alpine-keys             2.5-r0       apk
alpine-release          3.21.3-r0    apk
apk-tools               2.14.6-r3    apk
busybox                 1.37.0-r12   apk
busybox-binsh           1.37.0-r12   apk
...

Create an industry-standard SBOM

This command will display the human-readable table and write SBOMs in both SPDX and CycloneDX formats, the two primary industry standards.

syft alpine:latest -o table -o spdx-json=alpine.spdx.json -o cyclonedx-json=alpine.cdx.json

The same table will be displayed, and two SBOM files will be created in the current directory.

Examine the SBOM file contents

We can use jq to extract specific package data from the SBOM files (note: by default Syft outputs JSON on a single line, but you can enable pretty-printing with the SYFT_FORMAT_PRETTY=true environment variable). Both formats structure package information differently:

SPDX format:

jq '.packages[].name' alpine.spdx.json

CycloneDX format:

jq '.components[].name' alpine.cdx.json

Both commands show the packages that Syft found in the container image:

"alpine-baselayout"
"alpine-baselayout-data"
"alpine-keys"
"alpine-release"
"apk-tools"
"busybox"
"busybox-binsh"
...

By default, Syft shows only software visible in the final container image (the “squashed” representation). To include software from all image layers, regardless of its presence in the final image, use --scope all-layers:

syft <image> --scope all-layers

FAQ

Does Syft need internet access?

Only for downloading container images. By default, scanning works offline.

What about private container registries?

Syft supports authentication for private registries. See Private Registries.

Can I use Syft in CI/CD pipelines?

Absolutely! Syft is designed for automation. Generate SBOMs during builds and scan them for vulnerabilities.

What data does Syft send externally?

Nothing. Syft runs entirely locally and doesn’t send any data to external services.

Next steps

Now that you’ve generated your first SBOM, here’s what you can do next:

  • Scan for vulnerabilities: Use Grype to find security issues in your SBOMs
  • Check licenses: Learn about License Scanning to understand dependency licenses
  • Customize output: Explore different Output Formats for various tools and workflows
  • Scan different sources: Discover all Supported Sources Syft can analyze
  • Query SBOM data: Master Working with Syft JSON for advanced data extraction

4.1.2 - Supported Sources

Explore the different sources Syft can analyze including container images, OCI registries, directories, files, and archives.

Syft can generate an SBOM from a variety of sources including container images, directories, files, and archives. In most cases, you can simply point Syft at what you want to analyze and it will automatically detect and catalog it correctly.

Catalog a container image from your local daemon or a remote registry:

syft alpine:latest

Catalog a directory (useful for analyzing source code or installed applications):

syft /path/to/project

Catalog a container image archive:

syft image.tar

To explicitly specify the source, use the --from flag:

--from ARG Description
docker Use images from the Docker daemon
podman Use images from the Podman daemon
containerd Use images from the Containerd daemon
docker-archive Use a tarball from disk for archives created from docker save
oci-archive Use a tarball from disk for OCI archives (from Skopeo or otherwise)
oci-dir Read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
singularity Read directly from a Singularity Image Format (SIF) container file on disk
dir Read directly from a path on disk (any directory)
file Read directly from a path on disk (any single file)
registry Pull image directly from a registry (bypass any container runtimes)

Source-Specific Behaviors

Container Image Sources

When working with container images, Syft applies the following defaults and behaviors:

  • Registry: If no registry is specified in the image reference (e.g. alpine:latest instead of docker.io/alpine:latest), Syft assumes docker.io
  • Platform: For unspecific image references (tags) or multi-arch images pointing to an index (not a manifest), Syft analyzes the linux/amd64 manifest by default. Use the --platform flag to target a different platform.

When you provide an image reference without specifying a source type (i.e. no --from flag), Syft attempts to resolve the image using the following sources in order:

  1. Docker daemon
  2. Podman daemon
  3. Containerd daemon
  4. Direct registry access

For example, when you run syft alpine:latest, Syft will first check your local Docker daemon for the image. If Docker isn’t available, it tries Podman, then Containerd, and finally attempts to pull directly from the registry.

You can override this default behavior with the default-image-pull-source configuration option to always prefer a specific source. See Configuration for more details.

Directory Sources

When you provide a directory path as the source, Syft recursively scans the directory tree to catalog installed software packages and files.

When you point Syft at a directory (especially system directories like /), it automatically skips certain filesystem types to improve scan performance and avoid indexing areas that don’t contain installed software packages.

Filesystems always skipped

  • proc / procfs - Virtual filesystem for process information
  • sysfs - Virtual filesystem for kernel and device information
  • devfs / devtmpfs / udev - Device filesystems

Filesystems conditionally skipped

tmpfs filesystems are only skipped when mounted at these specific locations:

  • /dev - Device files
  • /sys - System information
  • /run and /var/run - Runtime data and process IDs
  • /var/lock - Lock files

These paths are excluded because they contain virtual or temporary runtime data rather than installed software packages. Skipping them significantly improves scan performance and enables you to catalog entire system root directories without getting stuck scanning thousands of irrelevant entries.

Syft identifies these filesystems by reading your system’s mount table (/proc/self/mountinfo on Linux). When a directory matches one of these criteria, the entire directory tree under that mount point is skipped.

File types excluded

These file types are never indexed during directory scans:

  • Character devices
  • Block devices
  • Sockets
  • FIFOs (named pipes)
  • Irregular files

Regular files, directories, and symbolic links are always processed.

Archive Sources

Syft automatically detects and unpacks common archive formats, then catalogs their contents. If an archive is a container image archive (from docker save or skopeo copy), Syft treats it as a container image.

Supported archive formats:

Standard archives:

  • .zip
  • .tar (uncompressed)
  • .rar (read-only extraction)

Compressed tar variants:

  • .tar.gz / .tgz
  • .tar.bz2 / .tbz2
  • .tar.br / .tbr (brotli)
  • .tar.lz4 / .tlz4
  • .tar.sz / .tsz (snappy)
  • .tar.xz / .txz
  • .tar.zst / .tzst (zstandard)

Standalone compression formats (extracted if containing tar):

  • .gz (gzip)
  • .bz2 (bzip2)
  • .br (brotli)
  • .lz4
  • .sz (snappy)
  • .xz
  • .zst / .zstd (zstandard)

OCI Archives and Layout Sources

Syft automatically detects OCI archive and directory structures (including OCI layouts and SIF files) and catalogs them accordingly.

OCI archives and layouts are particularly useful for CI/CD pipelines, as they allow you to catalog images, scan for vulnerabilities, or perform other checks without publishing to a registry. This provides a powerful pattern for build-time gating.

Create OCI sources without a registry

OCI archive from an image:

skopeo copy \
  docker://alpine@sha256:eafc1edb577d2e9b458664a15f23ea1c370214193226069eb22921169fc7e43f \
  oci-archive:alpine.tar

OCI layout directory from an image:

skopeo copy \
  docker://alpine@sha256:eafc1edb577d2e9b458664a15f23ea1c370214193226069eb22921169fc7e43f \
  oci:alpine

Container image archive from an image:

docker save -o alpine.tar alpine:latest

Container Runtime Configuration

Image Availability and Authentication

When using container runtime sources (Docker, Podman, or Containerd):

  • Missing images: If an image doesn’t exist locally in the container runtime, Syft attempts to pull it from the registry via the runtime
  • Private images: You must be logged in to the registry via the container runtime (e.g., docker login) or have credentials configured for direct registry access. See Authentication with Private Registries for more details.

Environment Variables

Syft respects the following environment variables for each container runtime:

Source Environment Variables Description
Docker DOCKER_HOST Docker daemon socket/host address (supports ssh:// for remote connections)
DOCKER_TLS_VERIFY Enable TLS verification (auto-sets DOCKER_CERT_PATH if not set)
DOCKER_CERT_PATH Path to TLS certificates (defaults to ~/.docker if DOCKER_TLS_VERIFY is set)
DOCKER_CONFIG Override default Docker config directory
Podman CONTAINER_HOST Podman socket/host address (e.g., unix:///run/podman/podman.sock or ssh://user@host/path/to/socket)
CONTAINER_SSHKEY SSH identity file path for remote Podman connections
CONTAINER_PASSPHRASE Passphrase for the SSH key
Containerd CONTAINERD_ADDRESS Containerd socket address (overrides default /run/containerd/containerd.sock)
CONTAINERD_NAMESPACE Containerd namespace (defaults to default)

Podman Daemon Requirements

Unlike Docker Desktop, which typically auto-starts, Podman requires explicitly starting the service.

Syft attempts to connect to Podman using the following methods in order:

  1. Unix Socket (primary)

    • Checks CONTAINER_HOST environment variable first
    • Falls back to Podman config files
    • Finally tries default socket locations ($XDG_RUNTIME_DIR/podman/podman.sockand/run/podman/podman.sock`)
  2. SSH (fallback)

    • Configured via CONTAINER_HOST, CONTAINER_SSHKEY, and CONTAINER_PASSPHRASE environment variables
    • Used for remote Podman instances

Direct Registry Access

The registry source bypasses container runtimes entirely and pulls images directly from the registry.

Credentials are resolved in the following order:

  • Syft first attempts to use default Docker credentials from ~/.docker/config.json if they exist
  • If default credentials are not available, you can provide credentials via environment variables. See Authentication with Private Registries for more details.

4.1.3 - Output Formats

Choose from multiple SBOM output formats including SPDX, CycloneDX, and Syft’s native JSON format.

Syft supports multiple output formats to fit different workflows and requirements by using the -o (or --output) flag:

syft <image> -o <format>

Available formats

Syft-native formats

-o ARG Description
table A columnar summary (default)
json Native output for Syft—use this to get as much information out of Syft as possible! (see the JSON schema)
purls A line-separated list of Package URLs (PURLs) for all discovered packages
github-json A JSON report conforming to GitHub’s dependency snapshot format
template Lets you specify a custom output format via Go templates (see Templates for more detail)
text A row-oriented, human-and-machine-friendly output

CycloneDX

CycloneDX is an OWASP-maintained industry standard SBOM format.

-o ARG Description
cyclonedx-json A JSON report conforming to the CycloneDX specification
cyclonedx-xml An XML report conforming to the CycloneDX specification

SPDX

SPDX (Software Package Data Exchange) is an ISO/IEC 5962:2021 industry standard SBOM format.

-o ARG Description
spdx-json A JSON report conforming to the SPDX JSON Schema
spdx-tag-value A tag-value formatted report conforming to the SPDX specification

Format versions

Some output formats support multiple schema versions. Specify a version by appending @<version> to the format name:

syft <source> -o <format>@<version>

Examples:

# Use CycloneDX JSON version 1.4
syft <source> -o cyclonedx-json@1.4

# Use SPDX JSON version 2.2
syft <source> -o spdx-json@2.2

# Default to latest version if not specified
syft <source> -o cyclonedx-json

Formats with version support:

  • cyclonedx-json: 1.2, 1.3, 1.4, 1.5, 1.6
  • cyclonedx-xml: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6
  • spdx-json: 2.2, 2.3
  • spdx-tag-value: 2.1, 2.2, 2.3

When no version is specified, Syft uses the latest supported version of the format.

Format examples

NAME     VERSION  TYPE
busybox  1.37.0   binary
{
  "artifacts": [
    {
      "id": "74d9294c42941b37",
      "name": "busybox",
      "version": "1.37.0",
      "type": "binary",
      "foundBy": "binary-classifier-cataloger",
      "locations": [
        {
          "path": "/bin/[",
          "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19",
          "accessPath": "/bin/busybox",
          "annotations": { "evidence": "primary" }
        }
      ],
      "licenses": [],
      "language": "",
      "cpes": [{ "cpe": "cpe:2.3:a:busybox:busybox:1.37.0:*:*:*:*:*:*:*", "source": "nvd-cpe-dictionary" }],
      "purl": "pkg:generic/busybox@1.37.0",
      "metadataType": "binary-signature",
      "metadata": {
        "matches": [
          {
            "classifier": "busybox-binary",
            "location": {
              "path": "/bin/[",
              "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19",
              "accessPath": "/bin/busybox",
              "annotations": { "evidence": "primary" }
            }
          }
        ]
      }
    }
  ],
  "artifactRelationships": [
    {
      "parent": "74d9294c42941b37",
      "child": "de0bf36b25443562",
      "type": "evident-by",
      "metadata": { "kind": "primary" }
    },
    {
      "parent": "cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3",
      "child": "74d9294c42941b37",
      "type": "contains"
    }
  ],
  "files": [
    {
      "id": "de0bf36b25443562",
      "location": {
        "path": "/bin/[",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "metadata": {
        "mode": 755,
        "type": "RegularFile",
        "userID": 0,
        "groupID": 0,
        "mimeType": "application/x-sharedlib",
        "size": 1119784
      },
      "digests": [
        { "algorithm": "sha1", "value": "99f9c7cb06f6f8f074b5c16245f295e33844855a" },
        { "algorithm": "sha256", "value": "8a4212147744cedcf7f679c81921942c81eb3b8d356bbb2b08b51336b2fe8add" }
      ],
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": true,
        "importedLibraries": ["libm.so.6", "libresolv.so.2", "libc.so.6"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": false,
          "nx": true,
          "relRO": "partial",
          "pie": true,
          "dso": true,
          "safeStack": false
        }
      }
    },
    {
      "id": "b240ee11665506ce",
      "location": {
        "path": "/bin/getconf",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": true,
        "importedLibraries": ["libc.so.6"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": false,
          "nx": true,
          "relRO": "full",
          "pie": true,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "48a6e9fa63c5f6cc",
      "location": {
        "path": "/lib/ld-linux-aarch64.so.1",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": true,
        "importedLibraries": [],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": true,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "a2dc8cb35e1e0485",
      "location": {
        "path": "/lib/libc.so.6",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": true,
        "importedLibraries": ["ld-linux-aarch64.so.1"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": true,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "8746a5a87ab9e597",
      "location": {
        "path": "/lib/libm.so.6",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libc.so.6", "ld-linux-aarch64.so.1"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": true,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "75835d9334e3cd14",
      "location": {
        "path": "/lib/libnss_compat.so.2",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libc.so.6", "ld-linux-aarch64.so.1"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": true,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "a75d014485c88e79",
      "location": {
        "path": "/lib/libnss_dns.so.2",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libc.so.6"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": false,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "b5abc725c65d58cf",
      "location": {
        "path": "/lib/libnss_files.so.2",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libc.so.6"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": false,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "8570ef9dff59aa56",
      "location": {
        "path": "/lib/libnss_hesiod.so.2",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libresolv.so.2", "libc.so.6", "ld-linux-aarch64.so.1"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": true,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "585855f0b92c8232",
      "location": {
        "path": "/lib/libpthread.so.0",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libc.so.6"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": false,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    },
    {
      "id": "ee8c205846a71e54",
      "location": {
        "path": "/lib/libresolv.so.2",
        "layerID": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "executable": {
        "format": "elf",
        "hasExports": true,
        "hasEntrypoint": false,
        "importedLibraries": ["libc.so.6", "ld-linux-aarch64.so.1"],
        "elfSecurityFeatures": {
          "symbolTableStripped": true,
          "stackCanary": true,
          "nx": true,
          "relRO": "full",
          "pie": false,
          "dso": true,
          "safeStack": false
        }
      },
      "unknowns": ["unknowns-labeler: no package identified in executable file"]
    }
  ],
  "source": {
    "id": "cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3",
    "name": "busybox",
    "version": "sha256:cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3",
    "type": "image",
    "metadata": {
      "userInput": "busybox:latest",
      "imageID": "sha256:e8291c1a323abf610ebeb32699b8df3e8046823b5dfbf795d888c9c6a73aeff8",
      "manifestDigest": "sha256:cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3",
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "tags": [],
      "imageSize": 4170750,
      "layers": [
        {
          "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
          "digest": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19",
          "size": 4170750
        }
      ],
      "manifest": "ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OmU4MjkxYzFhMzIzYWJmNjEwZWJlYjMyNjk5YjhkZjNlODA0NjgyM2I1ZGZiZjc5NWQ4ODhjOWM2YTczYWVmZjgiLAoJCSJzaXplIjogNDc3Cgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ5OWJjZjNjOGVhZDhlZjI1NzBmN2VlOGU0YWI1YTQ0ODk2NDdkNjdkZDFjMWI0MjVmZGJkNGE3NGY0YjQzODYiLAoJCQkic2l6ZSI6IDE5MDI3NjYKCQl9CgldLAoJImFubm90YXRpb25zIjogewoJCSJvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9kb2NrZXItbGlicmFyeS9idXN5Ym94IiwKCQkib3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb24iOiAiMS4zNy4wLWdsaWJjIgoJfQp9Cg==",
      "config": "ewoJImNvbmZpZyI6IHsKCQkiQ21kIjogWwoJCQkic2giCgkJXSwKCQkiRW52IjogWwoJCQkiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCgkJXQoJfSwKCSJjcmVhdGVkIjogIjIwMjQtMDktMjZUMjE6MzE6NDJaIiwKCSJoaXN0b3J5IjogWwoJCXsKCQkJImNyZWF0ZWQiOiAiMjAyNC0wOS0yNlQyMTozMTo0MloiLAoJCQkiY3JlYXRlZF9ieSI6ICJCdXN5Qm94IDEuMzcuMCAoZ2xpYmMpLCBEZWJpYW4gMTMiCgkJfQoJXSwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbCgkJCSJzaGEyNTY6NmFiYTVlMGQzMmQ5MWUzZTkyMzg1NGRjYjMwNTg4ZGM0MTEyYmZhMWRhZTgyYjg5NTM1YWQzMWQzMjJhN2IxOSIKCQldCgl9LAoJImFyY2hpdGVjdHVyZSI6ICJhcm02NCIsCgkib3MiOiAibGludXgiLAoJInZhcmlhbnQiOiAidjgiCn0K",
      "repoDigests": [
        "index.docker.io/library/busybox@sha256:d82f458899c9696cb26a7c02d5568f81c8c8223f8661bb2a7988b269c8b9051e"
      ],
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "distro": {
    "prettyName": "BusyBox v1.37.0",
    "name": "busybox",
    "id": "busybox",
    "idLike": ["busybox"],
    "version": "1.37.0",
    "versionID": "1.37.0"
  },
  "descriptor": {
    "name": "syft",
    "version": "1.33.0",
    "configuration": {
      "catalogers": {
        "requested": { "default": ["image", "file"] },
        "used": [
          "alpm-db-cataloger",
          "apk-db-cataloger",
          "binary-classifier-cataloger",
          "bitnami-cataloger",
          "cargo-auditable-binary-cataloger",
          "conan-info-cataloger",
          "dotnet-deps-binary-cataloger",
          "dotnet-packages-lock-cataloger",
          "dpkg-db-cataloger",
          "elf-binary-package-cataloger",
          "file-content-cataloger",
          "file-digest-cataloger",
          "file-executable-cataloger",
          "file-metadata-cataloger",
          "go-module-binary-cataloger",
          "graalvm-native-image-cataloger",
          "homebrew-cataloger",
          "java-archive-cataloger",
          "java-jvm-cataloger",
          "javascript-package-cataloger",
          "linux-kernel-cataloger",
          "lua-rock-cataloger",
          "nix-cataloger",
          "pe-binary-package-cataloger",
          "php-composer-installed-cataloger",
          "php-interpreter-cataloger",
          "php-pear-serialized-cataloger",
          "portage-cataloger",
          "python-installed-package-cataloger",
          "r-package-cataloger",
          "rpm-db-cataloger",
          "ruby-installed-gemspec-cataloger",
          "wordpress-plugins-cataloger"
        ]
      },
      "data-generation": { "generate-cpes": true },
      "files": {
        "content": { "globs": null, "skip-files-above-size": 0 },
        "hashers": ["sha-1", "sha-256"],
        "selection": "owned-by-package"
      },
      "licenses": { "coverage": 75, "include-content": "none" },
      "packages": {
        "binary": [
          "python-binary",
          "python-binary-lib",
          "pypy-binary-lib",
          "go-binary",
          "julia-binary",
          "helm",
          "redis-binary",
          "nodejs-binary",
          "go-binary-hint",
          "busybox-binary",
          "util-linux-binary",
          "haproxy-binary",
          "perl-binary",
          "php-composer-binary",
          "httpd-binary",
          "memcached-binary",
          "traefik-binary",
          "arangodb-binary",
          "postgresql-binary",
          "mysql-binary",
          "mysql-binary",
          "mysql-binary",
          "xtrabackup-binary",
          "mariadb-binary",
          "rust-standard-library-linux",
          "rust-standard-library-macos",
          "ruby-binary",
          "erlang-binary",
          "erlang-alpine-binary",
          "erlang-library",
          "swipl-binary",
          "dart-binary",
          "haskell-ghc-binary",
          "haskell-cabal-binary",
          "haskell-stack-binary",
          "consul-binary",
          "hashicorp-vault-binary",
          "nginx-binary",
          "bash-binary",
          "openssl-binary",
          "gcc-binary",
          "fluent-bit-binary",
          "wordpress-cli-binary",
          "curl-binary",
          "lighttpd-binary",
          "proftpd-binary",
          "zstd-binary",
          "xz-binary",
          "gzip-binary",
          "sqlcipher-binary",
          "jq-binary",
          "chrome-binary",
          "ffmpeg-binary",
          "java-binary",
          "java-jdb-binary"
        ],
        "dotnet": {
          "dep-packages-must-claim-dll": true,
          "dep-packages-must-have-dll": false,
          "propagate-dll-claims-to-parents": true,
          "relax-dll-claims-when-bundling-detected": true
        },
        "golang": {
          "local-mod-cache-dir": "/go/pkg/mod",
          "local-vendor-dir": "",
          "main-module-version": { "from-build-settings": true, "from-contents": false, "from-ld-flags": true },
          "proxies": ["https://proxy.golang.org", "direct"],
          "search-local-mod-cache-licenses": false,
          "search-local-vendor-licenses": false,
          "search-remote-licenses": false
        },
        "java-archive": {
          "include-indexed-archives": true,
          "include-unindexed-archives": false,
          "maven-base-url": "https://repo1.maven.org/maven2",
          "maven-localrepository-dir": "/.m2/repository",
          "max-parent-recursive-depth": 0,
          "resolve-transitive-dependencies": false,
          "use-maven-localrepository": false,
          "use-network": false
        },
        "javascript": {
          "include-dev-dependencies": false,
          "npm-base-url": "https://registry.npmjs.org",
          "search-remote-licenses": false
        },
        "linux-kernel": { "catalog-modules": true },
        "nix": { "capture-owned-files": false },
        "python": { "guess-unpinned-requirements": false }
      },
      "relationships": {
        "exclude-binary-packages-with-file-ownership-overlap": true,
        "package-file-ownership": true,
        "package-file-ownership-overlap": true
      },
      "search": { "scope": "squashed" }
    }
  },
  "schema": {
    "version": "16.0.39",
    "url": "https://raw.githubusercontent.com/anchore/syft/main/schema/json/schema-16.0.39.json"
  }
}
pkg:generic/busybox@1.37.0
{
  "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:ad79379e-ec73-4989-b6b7-31c113221b72",
  "version": 1,
  "metadata": {
    "timestamp": "2025-10-09T14:08:19Z",
    "tools": { "components": [{ "type": "application", "author": "anchore", "name": "syft", "version": "1.33.0" }] },
    "component": {
      "bom-ref": "84d86520b9546322",
      "type": "container",
      "name": "busybox",
      "version": "sha256:cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3"
    }
  },
  "components": [
    {
      "bom-ref": "pkg:generic/busybox@1.37.0?package-id=74d9294c42941b37",
      "type": "application",
      "name": "busybox",
      "version": "1.37.0",
      "cpe": "cpe:2.3:a:busybox:busybox:1.37.0:*:*:*:*:*:*:*",
      "purl": "pkg:generic/busybox@1.37.0",
      "properties": [
        { "name": "syft:package:foundBy", "value": "binary-classifier-cataloger" },
        { "name": "syft:package:type", "value": "binary" },
        { "name": "syft:package:metadataType", "value": "binary-signature" },
        {
          "name": "syft:location:0:layerID",
          "value": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
        },
        { "name": "syft:location:0:path", "value": "/bin/[" }
      ]
    },
    {
      "bom-ref": "os:busybox@1.37.0",
      "type": "operating-system",
      "name": "busybox",
      "version": "1.37.0",
      "description": "BusyBox v1.37.0",
      "swid": { "tagId": "busybox", "name": "busybox", "version": "1.37.0" },
      "properties": [
        { "name": "syft:distro:extendedSupport", "value": "false" },
        { "name": "syft:distro:id", "value": "busybox" },
        { "name": "syft:distro:idLike:0", "value": "busybox" },
        { "name": "syft:distro:prettyName", "value": "BusyBox v1.37.0" },
        { "name": "syft:distro:versionID", "value": "1.37.0" }
      ]
    },
    {
      "bom-ref": "de0bf36b25443562",
      "type": "file",
      "name": "/bin/[",
      "hashes": [
        { "alg": "SHA-1", "content": "99f9c7cb06f6f8f074b5c16245f295e33844855a" },
        { "alg": "SHA-256", "content": "8a4212147744cedcf7f679c81921942c81eb3b8d356bbb2b08b51336b2fe8add" }
      ]
    }
  ]
}
<?xml version="1.0" encoding="UTF-8"?>
<bom xmlns="http://cyclonedx.org/schema/bom/1.6" serialNumber="urn:uuid:34686a58-0f6f-42ef-93ea-db6ce62f4dec" version="1"><metadata><timestamp>2025-10-09T14:08:20Z</timestamp><tools><components><component type="application"><author>anchore</author><name>syft</name><version>1.33.0</version></component></components></tools><component bom-ref="84d86520b9546322" type="container"><name>busybox</name><version>sha256:cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3</version></component></metadata><components><component bom-ref="pkg:generic/busybox@1.37.0?package-id=74d9294c42941b37" type="application"><name>busybox</name><version>1.37.0</version><cpe>cpe:2.3:a:busybox:busybox:1.37.0:*:*:*:*:*:*:*</cpe><purl>pkg:generic/busybox@1.37.0</purl><properties><property name="syft:package:foundBy">binary-classifier-cataloger</property><property name="syft:package:type">binary</property><property name="syft:package:metadataType">binary-signature</property><property name="syft:location:0:layerID">sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19</property><property name="syft:location:0:path">/bin/[</property></properties></component><component bom-ref="os:busybox@1.37.0" type="operating-system"><name>busybox</name><version>1.37.0</version><description>BusyBox v1.37.0</description><swid tagId="busybox" name="busybox" version="1.37.0"></swid><properties><property name="syft:distro:extendedSupport">false</property><property name="syft:distro:id">busybox</property><property name="syft:distro:idLike:0">busybox</property><property name="syft:distro:prettyName">BusyBox v1.37.0</property><property name="syft:distro:versionID">1.37.0</property></properties></component><component bom-ref="de0bf36b25443562" type="file"><name>/bin/[</name><hashes><hash alg="SHA-1">99f9c7cb06f6f8f074b5c16245f295e33844855a</hash><hash alg="SHA-256">8a4212147744cedcf7f679c81921942c81eb3b8d356bbb2b08b51336b2fe8add</hash></hashes></component></components></bom>
{
  "spdxVersion": "SPDX-2.3",
  "dataLicense": "CC0-1.0",
  "SPDXID": "SPDXRef-DOCUMENT",
  "name": "busybox",
  "documentNamespace": "https://anchore.com/syft/image/busybox-528e282e-94ed-49cc-9050-e1cd5bf3c766",
  "creationInfo": {
    "licenseListVersion": "3.27",
    "creators": ["Organization: Anchore, Inc", "Tool: syft-1.33.0"],
    "created": "2025-10-09T14:08:20Z"
  },
  "packages": [
    {
      "name": "busybox",
      "SPDXID": "SPDXRef-Package-binary-busybox-74d9294c42941b37",
      "versionInfo": "1.37.0",
      "supplier": "NOASSERTION",
      "downloadLocation": "NOASSERTION",
      "filesAnalyzed": false,
      "sourceInfo": "acquired package info from the following paths: /bin/[",
      "licenseConcluded": "NOASSERTION",
      "licenseDeclared": "NOASSERTION",
      "copyrightText": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "SECURITY",
          "referenceType": "cpe23Type",
          "referenceLocator": "cpe:2.3:a:busybox:busybox:1.37.0:*:*:*:*:*:*:*"
        },
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:generic/busybox@1.37.0"
        }
      ]
    },
    {
      "name": "busybox",
      "SPDXID": "SPDXRef-DocumentRoot-Image-busybox",
      "versionInfo": "sha256:cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3",
      "supplier": "NOASSERTION",
      "downloadLocation": "NOASSERTION",
      "filesAnalyzed": false,
      "checksums": [
        { "algorithm": "SHA256", "checksumValue": "cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3" }
      ],
      "licenseConcluded": "NOASSERTION",
      "licenseDeclared": "NOASSERTION",
      "copyrightText": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:oci/busybox@sha256%3Acddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3?arch=arm64&tag=latest"
        }
      ],
      "primaryPackagePurpose": "CONTAINER"
    }
  ],
  "files": [
    {
      "fileName": "bin/[",
      "SPDXID": "SPDXRef-File-bin---de0bf36b25443562",
      "fileTypes": ["APPLICATION", "BINARY"],
      "checksums": [
        { "algorithm": "SHA1", "checksumValue": "99f9c7cb06f6f8f074b5c16245f295e33844855a" },
        { "algorithm": "SHA256", "checksumValue": "8a4212147744cedcf7f679c81921942c81eb3b8d356bbb2b08b51336b2fe8add" }
      ],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "bin/getconf",
      "SPDXID": "SPDXRef-File-bin-getconf-b240ee11665506ce",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/ld-linux-aarch64.so.1",
      "SPDXID": "SPDXRef-File-lib-ld-linux-aarch64.so.1-48a6e9fa63c5f6cc",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libc.so.6",
      "SPDXID": "SPDXRef-File-lib-libc.so.6-a2dc8cb35e1e0485",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libm.so.6",
      "SPDXID": "SPDXRef-File-lib-libm.so.6-8746a5a87ab9e597",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libnss_compat.so.2",
      "SPDXID": "SPDXRef-File-lib-libnss-compat.so.2-75835d9334e3cd14",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libnss_dns.so.2",
      "SPDXID": "SPDXRef-File-lib-libnss-dns.so.2-a75d014485c88e79",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libnss_files.so.2",
      "SPDXID": "SPDXRef-File-lib-libnss-files.so.2-b5abc725c65d58cf",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libnss_hesiod.so.2",
      "SPDXID": "SPDXRef-File-lib-libnss-hesiod.so.2-8570ef9dff59aa56",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libpthread.so.0",
      "SPDXID": "SPDXRef-File-lib-libpthread.so.0-585855f0b92c8232",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    },
    {
      "fileName": "lib/libresolv.so.2",
      "SPDXID": "SPDXRef-File-lib-libresolv.so.2-ee8c205846a71e54",
      "checksums": [{ "algorithm": "SHA1", "checksumValue": "0000000000000000000000000000000000000000" }],
      "licenseConcluded": "NOASSERTION",
      "licenseInfoInFiles": ["NOASSERTION"],
      "copyrightText": "NOASSERTION",
      "comment": "layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
    }
  ],
  "relationships": [
    {
      "spdxElementId": "SPDXRef-Package-binary-busybox-74d9294c42941b37",
      "relatedSpdxElement": "SPDXRef-File-bin---de0bf36b25443562",
      "relationshipType": "OTHER",
      "comment": "evident-by: indicates the package's existence is evident by the given file"
    },
    {
      "spdxElementId": "SPDXRef-DocumentRoot-Image-busybox",
      "relatedSpdxElement": "SPDXRef-Package-binary-busybox-74d9294c42941b37",
      "relationshipType": "CONTAINS"
    },
    {
      "spdxElementId": "SPDXRef-DOCUMENT",
      "relatedSpdxElement": "SPDXRef-DocumentRoot-Image-busybox",
      "relationshipType": "DESCRIBES"
    }
  ]
}
SPDXVersion: SPDX-2.3
DataLicense: CC0-1.0
SPDXID: SPDXRef-DOCUMENT
DocumentName: busybox
DocumentNamespace: https://anchore.com/syft/image/busybox-9e6cffe6-80e8-4cb9-ba5d-a1145b45d8d8
LicenseListVersion: 3.27
Creator: Organization: Anchore, Inc
Creator: Tool: syft-1.33.0
Created: 2025-10-09T14:08:21Z

##### Unpackaged files

FileName: bin/[
SPDXID: SPDXRef-File-bin---de0bf36b25443562
FileType: APPLICATION
FileType: BINARY
FileChecksum: SHA1: 99f9c7cb06f6f8f074b5c16245f295e33844855a
FileChecksum: SHA256: 8a4212147744cedcf7f679c81921942c81eb3b8d356bbb2b08b51336b2fe8add
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: bin/getconf
SPDXID: SPDXRef-File-bin-getconf-b240ee11665506ce
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/ld-linux-aarch64.so.1
SPDXID: SPDXRef-File-lib-ld-linux-aarch64.so.1-48a6e9fa63c5f6cc
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libc.so.6
SPDXID: SPDXRef-File-lib-libc.so.6-a2dc8cb35e1e0485
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libm.so.6
SPDXID: SPDXRef-File-lib-libm.so.6-8746a5a87ab9e597
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libnss_compat.so.2
SPDXID: SPDXRef-File-lib-libnss-compat.so.2-75835d9334e3cd14
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libnss_dns.so.2
SPDXID: SPDXRef-File-lib-libnss-dns.so.2-a75d014485c88e79
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libnss_files.so.2
SPDXID: SPDXRef-File-lib-libnss-files.so.2-b5abc725c65d58cf
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libnss_hesiod.so.2
SPDXID: SPDXRef-File-lib-libnss-hesiod.so.2-8570ef9dff59aa56
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libpthread.so.0
SPDXID: SPDXRef-File-lib-libpthread.so.0-585855f0b92c8232
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

FileName: lib/libresolv.so.2
SPDXID: SPDXRef-File-lib-libresolv.so.2-ee8c205846a71e54
FileChecksum: SHA1: 0000000000000000000000000000000000000000
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
FileComment: layerID: sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19

##### Package: busybox

PackageName: busybox
SPDXID: SPDXRef-DocumentRoot-Image-busybox
PackageVersion: sha256:cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3
PackageSupplier: NOASSERTION
PackageDownloadLocation: NOASSERTION
PrimaryPackagePurpose: CONTAINER
FilesAnalyzed: false
PackageChecksum: SHA256: cddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3
PackageLicenseConcluded: NOASSERTION
PackageLicenseDeclared: NOASSERTION
PackageCopyrightText: NOASSERTION
ExternalRef: PACKAGE-MANAGER purl pkg:oci/busybox@sha256%3Acddc8af5547af9de5e6fb66b36d66ef7418561204e1255ae528d0b2c919d09a3?arch=arm64&tag=latest

##### Package: busybox

PackageName: busybox
SPDXID: SPDXRef-Package-binary-busybox-74d9294c42941b37
PackageVersion: 1.37.0
PackageSupplier: NOASSERTION
PackageDownloadLocation: NOASSERTION
FilesAnalyzed: false
PackageSourceInfo: acquired package info from the following paths: /bin/[
PackageLicenseConcluded: NOASSERTION
PackageLicenseDeclared: NOASSERTION
PackageCopyrightText: NOASSERTION
ExternalRef: SECURITY cpe23Type cpe:2.3:a:busybox:busybox:1.37.0:*:*:*:*:*:*:*
ExternalRef: PACKAGE-MANAGER purl pkg:generic/busybox@1.37.0

##### Relationships

Relationship: SPDXRef-Package-binary-busybox-74d9294c42941b37 OTHER SPDXRef-File-bin---de0bf36b25443562
RelationshipComment: evident-by: indicates the package's existence is evident by the given file
Relationship: SPDXRef-DocumentRoot-Image-busybox CONTAINS SPDXRef-Package-binary-busybox-74d9294c42941b37
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-DocumentRoot-Image-busybox
{
  "version": 0,
  "job": {},
  "detector": {
    "name": "syft",
    "url": "https://github.com/anchore/syft",
    "version": "1.33.0"
  },
  "metadata": {
    "syft:distro": "pkg:generic/busybox@1.37.0?like=busybox"
  },
  "manifests": {
    "busybox:latest:/bin/busybox": {
      "name": "busybox:latest:/bin/busybox",
      "file": {
        "source_location": "busybox:latest:/bin/busybox"
      },
      "metadata": {
        "syft:filesystem": "sha256:6aba5e0d32d91e3e923854dcb30588dc4112bfa1dae82b89535ad31d322a7b19"
      },
      "resolved": {
        "pkg:generic/busybox@1.37.0": {
          "package_url": "pkg:generic/busybox@1.37.0",
          "relationship": "direct",
          "scope": "runtime"
        }
      }
    }
  },
  "scanned": "2025-10-09T14:08:21Z"
}

Writing output to files

Direct Syft output to a file instead of stdout by appending =<file> to the format option:

# Write JSON to a file
syft <source> -o json=sbom.json

# Write to stdout (default behavior)
syft <source> -o json

Multiple outputs

Generate multiple SBOM formats in a single run by specifying multiple -o flags:

syft <source> \
  -o json=sbom.json \
  -o spdx-json=sbom.spdx.json

You can both display to terminal and write to file:

syft <source> \
  -o table \           # report to stdout
  -o json=sbom.json    # write to file

Next steps

4.1.4 - Working with Syft JSON

Learn how to work with Syft’s native JSON format including querying with jq, extracting metadata, and understanding the SBOM structure.

Syft’s native JSON format provides the most comprehensive view of discovered software components, capturing all package metadata, file details, relationships, and source information.

Since Syft can convert from its native JSON format to standard SBOM formats, capturing your SBOM in Syft JSON format lets you generate any SBOM format as needed for compliance requirements.

Data Shapes

A Syft JSON output contains these main sections:

{
  "artifacts": [], // Package nodes discovered
  "artifactRelationships": [], // Edges between packages and files
  "files": [], // File nodes discovered
  "source": {}, // What was scanned (the image, directory, etc.)
  "distro": {}, // Linux distribution discovered
  "descriptor": {}, // Syft version and configuration that captured this SBOM
  "schema": {} // Schema version
}

Package (artifacts)

A software package discovered by Syft (library, application, OS package, etc.).

{
  "id": "74d9294c42941b37", // Unique identifier for this package that is content addressable
  "name": "openssl",
  "version": "1.1.1k",
  "type": "apk", // Package ecosystem (apk, deb, npm, etc.)
  "foundBy": "apk-cataloger",
  "locations": [
    // Paths used to populate information on this package object
    {
      "path": "/lib/apk/db/installed", // Always the real-path
      "layerID": "sha256:...",
      "accessPath": "/lib/apk/db/installed", // How Syft accessed the file (may be a symlink)
      "annotations": {
        "evidence": "primary" // Qualifies the kind of evidence extracted from this location (primary, supporting)
      }
    }
  ],
  "licenses": [
    {
      "value": "Apache-2.0", // Raw value discovered
      "spdxExpression": "Apache-2.0", // Normalized SPDX expression of the discovered value
      "type": "declared", // "declared", "concluded", or "observed"
      "urls": ["https://..."],
      "locations": [] // Where license was found
    }
  ],
  "language": "c",
  "cpes": [
    {
      "cpe": "cpe:2.3:a:openssl:openssl:1.1.1k:*:*:*:*:*:*:*",
      "source": "nvd-dictionary" // Where the CPE was derived from (nvd-dictionary or syft-generated)
    }
  ],
  "purl": "pkg:apk/alpine/openssl@1.1.1k",
  "metadata": {} // Ecosystem-specific fields (varies by type)
}

File

A file found on disk or referenced in package manager metadata.

{
  "id": "def456",
  "location": {
    "path": "/usr/bin/example",
    "layerID": "sha256:..." // For container images
  },
  "metadata": {
    "mode": 493, // File permissions in octal
    "type": "RegularFile",
    "mimeType": "application/x-executable",
    "size": 12345 // Size in bytes
  },
  "digests": [
    {
      "algorithm": "sha256",
      "value": "abc123..."
    }
  ],
  "licenses": [
    {
      "value": "Apache-2.0", // Raw value discovered
      "spdxExpression": "Apache-2.0", // Normalized SPDX expression of the discovered value
      "type": "declared", // "declared", "concluded", or "observed"
      "evidence": {
        "confidence": 100,
        "offset": 1234, // Byte offset in file
        "extent": 567 // Length of match
      }
    }
  ],
  "executable": {
    "format": "elf", // "elf", "pe", or "macho"
    "hasExports": true,
    "hasEntrypoint": true,
    "importedLibraries": [
      // Shared library dependencies
      "libc.so.6",
      "libssl.so.1.1"
    ],
    "elfSecurityFeatures": {
      // ELF binaries only
      "symbolTableStripped": false,
      "stackCanary": true, // Stack protection
      "nx": true, // No-Execute bit
      "relRO": "full", // Relocation Read-Only
      "pie": true // Position Independent Executable
    }
  }
}

Relationship

Connects any two nodes (package, file, or source) with a typed relationship.

{
  "parent": "package-id", // Package, file, or source ID
  "child": "file-id",
  "type": "contains" // contains, dependency-of, etc.
}

Source

Information about what was scanned (container image, directory, file, etc.).

{
  "id": "sha256:...",
  "name": "alpine:3.9.2", // User input
  "version": "sha256:...",
  "type": "image", // image, directory, file
  "metadata": {
    "imageID": "sha256:...",
    "manifestDigest": "sha256:...",
    "mediaType": "application/vnd.docker...",
    "tags": ["alpine:3.9.2"],
    "repoDigests": []
  }
}

Distribution

Linux distribution details from /etc/os-release or similar sources.

{
  "name": "alpine",
  "version": "3.9.2",
  "idLike": ["alpine"] // Related distributions
}

Location

Describes where a package or file was found.

{
  "path": "/lib/apk/db/installed",
  "layerID": "sha256:...",
  "accessPath": "/var/lib/apk/installed",
  "annotations": {
    "evidence": "primary"
  }
}

The path field always contains the real path after resolving symlinks, while accessPath shows how Syft accessed the file (which may be through a symlink).

The evidence annotation indicates whether this location was used to discover the package (primary) or contains only auxiliary information (supporting).

Descriptor

Syft version and configuration used to generate this SBOM.

{
  "name": "syft",
  "version": "1.0.0",
  "configuration": {} // Syft configuration used
}

The Syft JSON schema is versioned and available in the Syft repository:

JQ Recipes

jq is a command-line tool for querying and manipulating JSON. The following examples demonstrate practical queries for working with Syft JSON output.

Find packages by name pattern:

Uses regex pattern matching to find security-critical packages

.artifacts[] |
  select(.name | test("^(openssl|ssl|crypto)")) |  # Regex pattern match on package name
  {
    name,
    version,
    type  # Package type (apk, deb, rpm, etc.)
  }
syft alpine:3.9.2 -o json | \
  jq '.artifacts[] |
  select(.name | test("^(openssl|ssl|crypto)")) |
  {
    name,
    version,
    type
  }'
{
  "name": "ssl_client",
  "version": "1.29.3-r10",
  "type": "apk"
}

Location of all JARs:

Shows Java packages with their primary installation paths

.artifacts[] |
  select(.type == "java-archive") |  # Filter for JAR packages
  {
    package: "\(.name)@\(.version)",
    path: (.locations[] | select(.annotations.evidence == "primary") | .path)  # Primary installation path
  }
syft openjdk:11-jre-slim -o json | \
  jq '.artifacts[] |
  select(.type == "java-archive") |
  {
    package: "\(.name)@\(.version)",
    path: (.locations[] | select(.annotations.evidence == "primary") | .path)
  }'
{
  "package": "jrt-fs@11.0.16",
  "path": "/usr/local/openjdk-11/lib/jrt-fs.jar"
}

All executable files:

Lists all binary files with their format and entry point status

.files[] |
  select(.executable != null) |  # Filter for executable files
  {
    path: .location.path,
    format: .executable.format,  # ELF, Mach-O, PE, etc.
    importedLibraries: .executable.importedLibraries  # Shared library dependencies
  }
syft alpine:3.9.2 -o json | \
  jq '.files[] |
  select(.executable != null) |
  {
    path: .location.path,
    format: .executable.format,
    importedLibraries: .executable.importedLibraries
  }'
{
  "path": "/bin/busybox",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/lib/ld-musl-aarch64.so.1",
  "format": "elf",
  "importedLibraries": []
}
{
  "path": "/lib/libcrypto.so.1.1",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/lib/libssl.so.1.1",
  "format": "elf",
  "importedLibraries": [
    "libcrypto.so.1.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/lib/libz.so.1.2.11",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/sbin/apk",
  "format": "elf",
  "importedLibraries": [
    "libssl.so.1.1",
    "libcrypto.so.1.1",
    "libz.so.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/sbin/mkmntdirs",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/bin/getconf",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/bin/getent",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/bin/iconv",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/bin/scanelf",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/bin/ssl_client",
  "format": "elf",
  "importedLibraries": [
    "libtls-standalone.so.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/lib/engines-1.1/afalg.so",
  "format": "elf",
  "importedLibraries": [
    "libcrypto.so.1.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/lib/engines-1.1/capi.so",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/lib/engines-1.1/padlock.so",
  "format": "elf",
  "importedLibraries": [
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/lib/libtls-standalone.so.1.0.0",
  "format": "elf",
  "importedLibraries": [
    "libssl.so.1.1",
    "libcrypto.so.1.1",
    "libc.musl-aarch64.so.1"
  ]
}

Binaries not owned by packages:

Uses set operations on relationships to identify untracked binaries that might indicate supply chain issues

. as $root |
  [.files[] | select(.executable != null) | .id] as $binaries |  # All binary IDs
  [.artifactRelationships[] | select(.type == "contains") | .child] as $owned |  # Package-owned files
  ($binaries - $owned) as $unowned |  # Set subtraction to find unowned binaries
  $root.files[] |
  select(.id as $id | $unowned | index($id)) |  # Filter to unowned binaries
  {
    path: .location.path,
    sha256: .digests[] | select(.algorithm == "sha256") | .value  # For integrity verification
  }
syft httpd:2.4.65 -o json | \
  jq '. as $root |
  [.files[] | select(.executable != null) | .id] as $binaries |
  [.artifactRelationships[] | select(.type == "contains") | .child] as $owned |
  ($binaries - $owned) as $unowned |
  $root.files[] |
  select(.id as $id | $unowned | index($id)) |
  {
    path: .location.path,
    sha256: .digests[] | select(.algorithm == "sha256") | .value
  }'
# .syft.yaml
file:
  metadata:
    selection: all
{
  "path": "/usr/local/apache2/bin/ab",
  "sha256": "1aa76de1f9eb534fe22d35a01ccbf7ede03e250f6f5d0a00553e687187565d3a"
}
{
  "path": "/usr/local/apache2/bin/checkgid",
  "sha256": "af3372d60eee3f8132d2bdd10fb8670db8a9965b2e056c267131586184ba11fb"
}
{
  "path": "/usr/local/apache2/bin/fcgistarter",
  "sha256": "eea2fa75671e7e647692cd0352405ef8a0b17167a05770b9552602a3c720bfdb"
}
{
  "path": "/usr/local/apache2/bin/htcacheclean",
  "sha256": "94e0fd5f0f5cf6231080177072846a4e99846f1f534224911e3bed17ce27ec38"
}
{
  "path": "/usr/local/apache2/bin/htdbm",
  "sha256": "e2a41d96c92cb16c98972a043ac380c06f19b5bddbafe0b2d2082ed174f8cfe3"
}
{
  "path": "/usr/local/apache2/bin/htdigest",
  "sha256": "0881598a4fd15455297c186fa301fdb1656ff26d0f77626d54a15421095e047f"
}
{
  "path": "/usr/local/apache2/bin/htpasswd",
  "sha256": "871ef0aa4ae0914747a471bf3917405548abf768dd6c94e3e0177c8e87334d9e"
}
{
  "path": "/usr/local/apache2/bin/httpd",
  "sha256": "4ee82f26958e62065b51ca56ab4c55b32988f27a8402ed518b05d48ed2342142"
}
{
  "path": "/usr/local/apache2/bin/httxt2dbm",
  "sha256": "1d5eb8e5d910760aa859c45e79b541362a84499f08fb79b8773bf9b8faf7bbdb"
}
{
  "path": "/usr/local/apache2/bin/logresolve",
  "sha256": "de8ed1fa5184170fca09980025f40c55d9fbf14b47c73b2575bc90ac1c9bf20e"
}
{
  "path": "/usr/local/apache2/bin/rotatelogs",
  "sha256": "f5ed895712cddcec7f542dee08a1ff74fd00ae3a9b0d92ede429e04ec2b9b8ae"
}
{
  "path": "/usr/local/apache2/bin/suexec",
  "sha256": "264efc529c09a60fed57fcde9e7a2c36f8bb414ae0e1afc9bb85595113ab4ec2"
}
{
  "path": "/usr/local/apache2/modules/mod_access_compat.so",
  "sha256": "0d6322b7d7d3d6c459751f8b271f733fa05a8b56eecd75f608100a5dbf464fc2"
}
{
  "path": "/usr/local/apache2/modules/mod_actions.so",
  "sha256": "6dc5dea7137ec0ae139c545b26efd860c6de7bcc19d2e31db213399c86bf2ead"
}
{
  "path": "/usr/local/apache2/modules/mod_alias.so",
  "sha256": "bb422c4486600ec349ac9b89acaa3793265d69498c30370e678a362900daea04"
}
{
  "path": "/usr/local/apache2/modules/mod_allowmethods.so",
  "sha256": "99a9db80c8f18fe3defb315731af3bceef321a98bd52f518f068ca2632596cee"
}
{
  "path": "/usr/local/apache2/modules/mod_asis.so",
  "sha256": "039014ad5ad3f357e811b570bd9977a772e74f191856981a503e57263b88cc44"
}
{
  "path": "/usr/local/apache2/modules/mod_auth_basic.so",
  "sha256": "1f9534187df98194fa60259c3d9feca05f1b2564d49b37b49da040232e7a327b"
}
{
  "path": "/usr/local/apache2/modules/mod_auth_digest.so",
  "sha256": "ad77d0457b773c9d13097adf47bebcd95297466fc9fb6886b7bff85e2acdd99d"
}
{
  "path": "/usr/local/apache2/modules/mod_auth_form.so",
  "sha256": "ceb56183d83c22ff08853982b0f35f122185cf69d3bcfd948eeb1df32dd12bbb"
}
{
  "path": "/usr/local/apache2/modules/mod_authn_anon.so",
  "sha256": "44308e1d5a65ab64232d27f24a827aa1afdb2fef580dd1a8454788431ebd639f"
}
{
  "path": "/usr/local/apache2/modules/mod_authn_core.so",
  "sha256": "9cbf85b1a20da26483ca4a57186161a2876ca296dd1174ed5a5af9f5301fe5e8"
}
{
  "path": "/usr/local/apache2/modules/mod_authn_dbd.so",
  "sha256": "08dc7b848a67131a091563046e3fc6914e86f248740bd2f23905f2f6df3ce541"
}
{
  "path": "/usr/local/apache2/modules/mod_authn_dbm.so",
  "sha256": "1e5900c8b41ca227b59ba54738154e04841cef2045d8040747e4b7887526a763"
}
{
  "path": "/usr/local/apache2/modules/mod_authn_file.so",
  "sha256": "74f83d5717276ae6a37f4a2d0c54f8d23e57ae1c3f73bb2b332c77860b7421ed"
}
{
  "path": "/usr/local/apache2/modules/mod_authn_socache.so",
  "sha256": "2f51212b62c5bbda54ddec0c1a07f523e96c2b56d987fefa43e0cc42dbf6f5d0"
}
{
  "path": "/usr/local/apache2/modules/mod_authnz_fcgi.so",
  "sha256": "4fa0fa7d3d4b742b3f73a781d2e8d4625d477c76aa0698aa0d499f87e6985554"
}
{
  "path": "/usr/local/apache2/modules/mod_authnz_ldap.so",
  "sha256": "dccffc453f46d201ecb1003b372a6ca417ac40a33036500a2215697b2e5ac0af"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_core.so",
  "sha256": "e2b825ec9e2992b1cc157aef12c4ecd75960604658c3b7aa4a370088e89455b5"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_dbd.so",
  "sha256": "61b427078b5d11b3fd8693cbfa22cb5871dc9784b08d3182b73ad3e99b8579d9"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_dbm.so",
  "sha256": "1d99ed703743d9dd2185a0d7e9e351fa38066b3234ae997e87efa6dc1e4513eb"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_groupfile.so",
  "sha256": "3e9adb775d41a8b01802ff610dda01f8e62a0d282ea0522d297a252207453c4d"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_host.so",
  "sha256": "c0fcd53dc9596fd6bc280c55d14b61c72dc12470bf5c1bc86e369217af05cb2c"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_owner.so",
  "sha256": "e8923ef5f11e03c37b4579e18d396758ee085bae4dadc0519374ca63da86c932"
}
{
  "path": "/usr/local/apache2/modules/mod_authz_user.so",
  "sha256": "3c5674a1e7af6b7d09e8c66f973a3138fed0dde4dfaee98fc132c89730cd9156"
}
{
  "path": "/usr/local/apache2/modules/mod_autoindex.so",
  "sha256": "2d992f31f40be2c0ec34a29981191c3bfb9e4448a2099f11a4876ba4d394dc2f"
}
{
  "path": "/usr/local/apache2/modules/mod_brotli.so",
  "sha256": "73bfe5aeff2040a7b56a0bf822bc4069ce3e9954186f81322060697f5cf0546f"
}
{
  "path": "/usr/local/apache2/modules/mod_bucketeer.so",
  "sha256": "9f146159e928405d2a007dba3690566a45e5793cde87871a30dbfd1dc9114db1"
}
{
  "path": "/usr/local/apache2/modules/mod_buffer.so",
  "sha256": "710bd1b238a7814963b2857eb92c891bafeff61d9e40f807d68ded700c8c37f2"
}
{
  "path": "/usr/local/apache2/modules/mod_cache.so",
  "sha256": "976222e2c7ddb317d8804383801b310be33c6b3542f6972edd12c38ddc527e38"
}
{
  "path": "/usr/local/apache2/modules/mod_cache_disk.so",
  "sha256": "c5359004a563b9b01bf0416cbe856bb50de642bf06649383ffcae26490dc69c8"
}
{
  "path": "/usr/local/apache2/modules/mod_cache_socache.so",
  "sha256": "94abdf3779a9f7d258b1720021e1e3f10c630e625f5aa13c683c3c811b8dac10"
}
{
  "path": "/usr/local/apache2/modules/mod_case_filter.so",
  "sha256": "79a0a336c1bacd06c0fc5ca14cfc97223c92f0f5b0c88ec95f7e163e8cdf917d"
}
{
  "path": "/usr/local/apache2/modules/mod_case_filter_in.so",
  "sha256": "aa5e1c9452e1be3789a8a867a98dab700e4a579c0ea1ff7180adf4e41b8495e3"
}
{
  "path": "/usr/local/apache2/modules/mod_cern_meta.so",
  "sha256": "1a6da74d768c01b1a96f5c0f0e74686d5b0f51c3d7f1149fa1124cdf10ba842a"
}
{
  "path": "/usr/local/apache2/modules/mod_cgi.so",
  "sha256": "f2716c663f4f7db8cd78f456e5bd098a62c1b8fde86253ed4617edfe9cdb93b2"
}
{
  "path": "/usr/local/apache2/modules/mod_cgid.so",
  "sha256": "d5a19aeeb7b9063bac25e4a172ea7578e83bb32da4fe21ecd858409115de166c"
}
{
  "path": "/usr/local/apache2/modules/mod_charset_lite.so",
  "sha256": "9c4a1b27532c5f47eea7cfc61f65a7cf2f132286e556175ec28e313024641c9d"
}
{
  "path": "/usr/local/apache2/modules/mod_data.so",
  "sha256": "4dcae9a704c7d9861497e57b15423b9ce3fc7dda6544096ecfff64e4223f3684"
}
{
  "path": "/usr/local/apache2/modules/mod_dav.so",
  "sha256": "1a33728b16ad05b12fbecf637168608cb10f258ef7a355bd37cef8ce2ed86fd7"
}
...

Binary file digests:

Useful for verifying binary integrity and detecting tampering

.files[] |
  select(.executable != null) |  # Filter for executable files
  {
    path: .location.path,
    digests: [.digests[] | {algorithm, value}]  # All available hash algorithms
  }
syft alpine:3.9.2 -o json | \
  jq '.files[] |
  select(.executable != null) |
  {
    path: .location.path,
    digests: [.digests[] | {algorithm, value}]
  }'
{
  "path": "/bin/busybox",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "7423801dfb28659fcaaaa5e8d41051d470b19008"
    },
    {
      "algorithm": "sha256",
      "value": "2c1276c3c02ccec8a0e1737d3144cdf03db883f479c86fbd9c7ea4fd9b35eac5"
    }
  ]
}
{
  "path": "/lib/ld-musl-aarch64.so.1",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "0b83c1eb91d633379e0c17349e7dae821fa36dbb"
    },
    {
      "algorithm": "sha256",
      "value": "0132814479f1acc1e264ef59f73fd91563235897e8dc1bd52765f974cde382ca"
    }
  ]
}
{
  "path": "/lib/libcrypto.so.1.1",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "e9d1540e5bbd9e77b388ab0e6e2f52603eb032a4"
    },
    {
      "algorithm": "sha256",
      "value": "6c597c8ad195eeb7a9130ad832dfa4cbf140f42baf96304711b2dbd43ba8e617"
    }
  ]
}
{
  "path": "/lib/libssl.so.1.1",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "a8d5036010b52a80402b900c626fe862ab06bd8b"
    },
    {
      "algorithm": "sha256",
      "value": "fb72f4615fb4574bd6eeabfdb86be47012618b9076d75aeb1510941c585cae64"
    }
  ]
}
{
  "path": "/lib/libz.so.1.2.11",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "83378fc7a19ff908a7e92a9fd0ca39eee90d0a3c"
    },
    {
      "algorithm": "sha256",
      "value": "19e790eb36a09eba397b5af16852f3bea21a242026bbba3da7b16442b8ba305b"
    }
  ]
}
{
  "path": "/sbin/apk",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "adac7738917adecff81d4a6f9f0c7971b173859a"
    },
    {
      "algorithm": "sha256",
      "value": "22d7d85bd24923f1f274ce765d16602191097829e22ac632748302817ce515d8"
    }
  ]
}
{
  "path": "/sbin/mkmntdirs",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "fff9b110ad6c659a39681e7be3b2a036fbbcca7b"
    },
    {
      "algorithm": "sha256",
      "value": "a14a5a28525220224367616ef46d4713ef7bd00d22baa761e058e8bdd4c0af1b"
    }
  ]
}
{
  "path": "/usr/bin/getconf",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "06ed40070e1c2ad6d4171095eff4a6bdf9c8489b"
    },
    {
      "algorithm": "sha256",
      "value": "82bcde66ead19bc3b9ff850f66c2dbf5eaff36d481f1ec154100f73f6265d2ef"
    }
  ]
}
{
  "path": "/usr/bin/getent",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "c318a3a780fc27ed7dba57827a825191fa7ee8bd"
    },
    {
      "algorithm": "sha256",
      "value": "53ffb508150e91838d795831e8ecc71f2bc3a7db036c6d7f9512c3973418bb5e"
    }
  ]
}
{
  "path": "/usr/bin/iconv",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "eb98f04742e41cfc3ed44109b0e059d13e5523ea"
    },
    {
      "algorithm": "sha256",
      "value": "1c99d1f4edcb8da6db1da60958051c413de45a4c15cd3b7f7285ed87f9a250ff"
    }
  ]
}
{
  "path": "/usr/bin/scanelf",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "cb085d106f35862e44e17849026927bd05845bff"
    },
    {
      "algorithm": "sha256",
      "value": "908da485ad2edea35242f8989c7beb9536414782abc94357c72b7d840bb1fda2"
    }
  ]
}
{
  "path": "/usr/bin/ssl_client",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "7e17cb64c3fce832e5fa52a3b2ed1e1ccd26acd0"
    },
    {
      "algorithm": "sha256",
      "value": "67ab7f3a1ba35630f439d1ca4f73c7d95f8b7aa0e6f6db6ea1743f136f074ab4"
    }
  ]
}
{
  "path": "/usr/lib/engines-1.1/afalg.so",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "6bd2c385e3884109c581659a8b184592c86e7cee"
    },
    {
      "algorithm": "sha256",
      "value": "ea7c2f48bc741fd828d79a304dbf713e20e001c0187f3f534d959886af87f4af"
    }
  ]
}
{
  "path": "/usr/lib/engines-1.1/capi.so",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "41bb990b6f8e2013487980fd430455cc3b59905f"
    },
    {
      "algorithm": "sha256",
      "value": "b461ed43f0f244007d872e84760a446023b69b178c970acf10ed2666198942c6"
    }
  ]
}
{
  "path": "/usr/lib/engines-1.1/padlock.so",
  "digests": [
    {
      "algorithm": "sha1",
      "value": "82d8308700f481884fd77c882e0e9406fb17b317"
    },
    {
      "algorithm": "sha256",
      "value": "0ccb04f040afb0216da1cea2c1db7a0b91d990ce061e232782aedbd498483649"
    }
  ]
}
{
  "path": "/usr/lib/libtls-standalone.so.1.0.0",
  "digests": [
    {
      "algorithm": "sha1",
...

Binaries with security features:

Analyzes ELF security hardening features extracted during SBOM generation

.files[] |
  select(.executable != null and .executable.format == "elf") |  # ELF binaries only
  {
    path: .location.path,
    pie: .executable.elfSecurityFeatures.pie,  # Position Independent Executable
    stackCanary: .executable.elfSecurityFeatures.stackCanary,  # Stack protection
    nx: .executable.elfSecurityFeatures.nx  # No-Execute bit
  }
syft alpine:3.9.2 -o json | \
  jq '.files[] |
  select(.executable != null and .executable.format == "elf") |
  {
    path: .location.path,
    pie: .executable.elfSecurityFeatures.pie,
    stackCanary: .executable.elfSecurityFeatures.stackCanary,
    nx: .executable.elfSecurityFeatures.nx
  }'
{
  "path": "/bin/busybox",
  "pie": true,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/lib/ld-musl-aarch64.so.1",
  "pie": false,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/lib/libcrypto.so.1.1",
  "pie": false,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/lib/libssl.so.1.1",
  "pie": false,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/lib/libz.so.1.2.11",
  "pie": false,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/sbin/apk",
  "pie": true,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/sbin/mkmntdirs",
  "pie": true,
  "stackCanary": false,
  "nx": true
}
{
  "path": "/usr/bin/getconf",
  "pie": true,
  "stackCanary": false,
  "nx": true
}
{
  "path": "/usr/bin/getent",
  "pie": true,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/usr/bin/iconv",
  "pie": true,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/usr/bin/scanelf",
  "pie": true,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/usr/bin/ssl_client",
  "pie": true,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/usr/lib/engines-1.1/afalg.so",
  "pie": false,
  "stackCanary": true,
  "nx": true
}
{
  "path": "/usr/lib/engines-1.1/capi.so",
  "pie": false,
  "stackCanary": false,
  "nx": true
}
{
  "path": "/usr/lib/engines-1.1/padlock.so",
  "pie": false,
  "stackCanary": false,
  "nx": true
}
{
  "path": "/usr/lib/libtls-standalone.so.1.0.0",
  "pie": false,
  "stackCanary": true,
  "nx": true
}

Binaries importing specific libraries:

Identifies which binaries depend on specific shared libraries for security audits

.files[] |
  select(.executable != null and .executable.importedLibraries != null) |
  select(.executable.importedLibraries[] | contains("libcrypto")) |  # Find binaries using libcrypto
  {
    path: .location.path,
    imports: .executable.importedLibraries  # Shared library dependencies
  }
syft alpine:3.9.2 -o json | \
  jq '.files[] |
  select(.executable != null and .executable.importedLibraries != null) |
  select(.executable.importedLibraries[] | contains("libcrypto")) |
  {
    path: .location.path,
    imports: .executable.importedLibraries
  }'
{
  "path": "/lib/libssl.so.1.1",
  "imports": [
    "libcrypto.so.1.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/sbin/apk",
  "imports": [
    "libssl.so.1.1",
    "libcrypto.so.1.1",
    "libz.so.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/lib/engines-1.1/afalg.so",
  "imports": [
    "libcrypto.so.1.1",
    "libc.musl-aarch64.so.1"
  ]
}
{
  "path": "/usr/lib/libtls-standalone.so.1.0.0",
  "imports": [
    "libssl.so.1.1",
    "libcrypto.so.1.1",
    "libc.musl-aarch64.so.1"
  ]
}

Extract Package URLs (PURLs):

Extracts Package URLs for cross-tool SBOM correlation and vulnerability matching

.artifacts[] |
  select(.purl != null and .purl != "") |  # Filter packages with PURLs
  {
    name,
    version,
    purl  # Package URL for cross-tool compatibility
  }
syft alpine:3.9.2 -o json | \
  jq '.artifacts[] |
  select(.purl != null and .purl != "") |
  {
    name,
    version,
    purl
  }'
{
  "name": "alpine-baselayout",
  "version": "3.1.0-r3",
  "purl": "pkg:apk/alpine/alpine-baselayout@3.1.0-r3?arch=aarch64&distro=alpine-3.9.2"
}
{
  "name": "alpine-keys",
  "version": "2.1-r1",
  "purl": "pkg:apk/alpine/alpine-keys@2.1-r1?arch=aarch64&distro=alpine-3.9.2"
}
{
  "name": "apk-tools",
  "version": "2.10.3-r1",
  "purl": "pkg:apk/alpine/apk-tools@2.10.3-r1?arch=aarch64&distro=alpine-3.9.2"
}
{
  "name": "busybox",
  "version": "1.29.3-r10",
  "purl": "pkg:apk/alpine/busybox@1.29.3-r10?arch=aarch64&distro=alpine-3.9.2"
}
{
  "name": "ca-certificates-cacert",
  "version": "20190108-r0",
  "purl": "pkg:apk/alpine/ca-certificates-cacert@20190108-r0?arch=aarch64&distro=alpine-3.9.2&upstream=ca-certificates"
}
{
  "name": "libc-utils",
  "version": "0.7.1-r0",
  "purl": "pkg:apk/alpine/libc-utils@0.7.1-r0?arch=aarch64&distro=alpine-3.9.2&upstream=libc-dev"
}
{
  "name": "libcrypto1.1",
  "version": "1.1.1a-r1",
  "purl": "pkg:apk/alpine/libcrypto1.1@1.1.1a-r1?arch=aarch64&distro=alpine-3.9.2&upstream=openssl"
}
{
  "name": "libssl1.1",
  "version": "1.1.1a-r1",
  "purl": "pkg:apk/alpine/libssl1.1@1.1.1a-r1?arch=aarch64&distro=alpine-3.9.2&upstream=openssl"
}
{
  "name": "libtls-standalone",
  "version": "2.7.4-r6",
  "purl": "pkg:apk/alpine/libtls-standalone@2.7.4-r6?arch=aarch64&distro=alpine-3.9.2"
}
{
  "name": "musl",
  "version": "1.1.20-r3",
  "purl": "pkg:apk/alpine/musl@1.1.20-r3?arch=aarch64&distro=alpine-3.9.2"
}
{
  "name": "musl-utils",
  "version": "1.1.20-r3",
  "purl": "pkg:apk/alpine/musl-utils@1.1.20-r3?arch=aarch64&distro=alpine-3.9.2&upstream=musl"
}
{
  "name": "scanelf",
  "version": "1.2.3-r0",
  "purl": "pkg:apk/alpine/scanelf@1.2.3-r0?arch=aarch64&distro=alpine-3.9.2&upstream=pax-utils"
}
{
  "name": "ssl_client",
  "version": "1.29.3-r10",
  "purl": "pkg:apk/alpine/ssl_client@1.29.3-r10?arch=aarch64&distro=alpine-3.9.2&upstream=busybox"
}
{
  "name": "zlib",
  "version": "1.2.11-r1",
  "purl": "pkg:apk/alpine/zlib@1.2.11-r1?arch=aarch64&distro=alpine-3.9.2"
}

Group packages by language:

Groups and counts packages by programming language

[.artifacts[] | select(.language != null and .language != "")] |
  group_by(.language) |  # Group by programming language
  map({
    language: .[0].language,
    count: length  # Count packages per language
  }) |
  sort_by(.count) |
  reverse  # Highest count first
syft node:18-alpine -o json | \
  jq '[.artifacts[] | select(.language != null and .language != "")] |
  group_by(.language) |
  map({
    language: .[0].language,
    count: length
  }) |
  sort_by(.count) |
  reverse'
[
  {
    "language": "javascript",
    "count": 204
  }
]

Count packages by type:

Provides a summary count of packages per ecosystem

[.artifacts[]] |
  group_by(.type) |  # Group packages by ecosystem type
  map({
    type: .[0].type,
    count: length  # Count packages in each group
  }) |
  sort_by(.count) |
  reverse  # Highest count first
syft node:18-alpine -o json | \
  jq '[.artifacts[]] |
  group_by(.type) |
  map({
    type: .[0].type,
    count: length
  }) |
  sort_by(.count) |
  reverse'
[
  {
    "type": "npm",
    "count": 204
  },
  {
    "type": "apk",
    "count": 17
  },
  {
    "type": "binary",
    "count": 1
  }
]

Package locations:

Maps packages to their filesystem locations

.artifacts[] |
  {
    name,
    version,
    type,
    locations: [.locations[] | .path]  # All filesystem locations
  }
syft alpine:3.9.2 -o json | \
  jq '.artifacts[] |
  {
    name,
    version,
    type,
    locations: [.locations[] | .path]
  }'
{
  "name": "alpine-baselayout",
  "version": "3.1.0-r3",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "alpine-keys",
  "version": "2.1-r1",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "apk-tools",
  "version": "2.10.3-r1",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "busybox",
  "version": "1.29.3-r10",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "ca-certificates-cacert",
  "version": "20190108-r0",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "libc-utils",
  "version": "0.7.1-r0",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "libcrypto1.1",
  "version": "1.1.1a-r1",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "libssl1.1",
  "version": "1.1.1a-r1",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "libtls-standalone",
  "version": "2.7.4-r6",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "musl",
  "version": "1.1.20-r3",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "musl-utils",
  "version": "1.1.20-r3",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "scanelf",
  "version": "1.2.3-r0",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "ssl_client",
  "version": "1.29.3-r10",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}
{
  "name": "zlib",
  "version": "1.2.11-r1",
  "type": "apk",
  "locations": [
    "/lib/apk/db/installed"
  ]
}

Files by MIME type:

Filters files by MIME type, useful for finding specific file types

.files[] |
  select(.metadata.mimeType == "application/x-sharedlib") |  # Filter by MIME type
  {
    path: .location.path,
    mimeType: .metadata.mimeType,
    size: .metadata.size  # File size in bytes
  }
syft alpine:3.9.2 -o json | \
  jq '.files[] |
  select(.metadata.mimeType == "application/x-sharedlib") |
  {
    path: .location.path,
    mimeType: .metadata.mimeType,
    size: .metadata.size
  }'
{
  "path": "/bin/busybox",
  "mimeType": "application/x-sharedlib",
  "size": 841320
}
{
  "path": "/lib/ld-musl-aarch64.so.1",
  "mimeType": "application/x-sharedlib",
  "size": 616960
}
{
  "path": "/lib/libcrypto.so.1.1",
  "mimeType": "application/x-sharedlib",
  "size": 2321984
}
{
  "path": "/lib/libssl.so.1.1",
  "mimeType": "application/x-sharedlib",
  "size": 515376
}
{
  "path": "/lib/libz.so.1.2.11",
  "mimeType": "application/x-sharedlib",
  "size": 91888
}
{
  "path": "/sbin/apk",
  "mimeType": "application/x-sharedlib",
  "size": 218928
}
{
  "path": "/sbin/mkmntdirs",
  "mimeType": "application/x-sharedlib",
  "size": 5712
}
{
  "path": "/usr/bin/getconf",
  "mimeType": "application/x-sharedlib",
  "size": 33544
}
{
  "path": "/usr/bin/getent",
  "mimeType": "application/x-sharedlib",
  "size": 48704
}
{
  "path": "/usr/bin/iconv",
  "mimeType": "application/x-sharedlib",
  "size": 21968
}
{
  "path": "/usr/bin/scanelf",
  "mimeType": "application/x-sharedlib",
  "size": 79592
}
{
  "path": "/usr/bin/ssl_client",
  "mimeType": "application/x-sharedlib",
  "size": 9808
}
{
  "path": "/usr/lib/engines-1.1/afalg.so",
  "mimeType": "application/x-sharedlib",
  "size": 18568
}
{
  "path": "/usr/lib/engines-1.1/capi.so",
  "mimeType": "application/x-sharedlib",
  "size": 5672
}
{
  "path": "/usr/lib/engines-1.1/padlock.so",
  "mimeType": "application/x-sharedlib",
  "size": 5672
}
{
  "path": "/usr/lib/libtls-standalone.so.1.0.0",
  "mimeType": "application/x-sharedlib",
  "size": 96032
}

Dependency relationships:

Traverses package dependency graph using relationships

. as $root |
  .artifactRelationships[] |
  select(.type == "dependency-of") |  # Filter for dependency relationships
  .parent as $parent |
  .child as $child |
  {
    parent: ($root.artifacts[] | select(.id == $parent).name),  # Parent package name
    child: ($root.artifacts[] | select(.id == $child).name)  # Dependency name
  }
syft node:18-alpine -o json | \
  jq '. as $root |
  .artifactRelationships[] |
  select(.type == "dependency-of") |
  .parent as $parent |
  .child as $child |
  {
    parent: ($root.artifacts[] | select(.id == $parent).name),
    child: ($root.artifacts[] | select(.id == $child).name)
  }'
{
  "parent": "ca-certificates-bundle",
  "child": "apk-tools"
}
{
  "parent": "alpine-keys",
  "child": "alpine-release"
}
{
  "parent": "alpine-baselayout-data",
  "child": "alpine-baselayout"
}
{
  "parent": "musl",
  "child": "ssl_client"
}
{
  "parent": "musl",
  "child": "libgcc"
}
{
  "parent": "musl",
  "child": "libstdc++"
}
{
  "parent": "musl",
  "child": "musl-utils"
}
{
  "parent": "musl",
  "child": "libssl3"
}
{
  "parent": "musl",
  "child": "busybox"
}
{
  "parent": "musl",
  "child": "apk-tools"
}
{
  "parent": "musl",
  "child": "scanelf"
}
{
  "parent": "musl",
  "child": "libcrypto3"
}
{
  "parent": "musl",
  "child": "zlib"
}
{
  "parent": "libgcc",
  "child": "libstdc++"
}
{
  "parent": "libssl3",
  "child": "ssl_client"
}
{
  "parent": "libssl3",
  "child": "apk-tools"
}
{
  "parent": "busybox",
  "child": "busybox-binsh"
}
{
  "parent": "scanelf",
  "child": "musl-utils"
}
{
  "parent": "busybox-binsh",
  "child": "alpine-baselayout"
}
{
  "parent": "libcrypto3",
  "child": "ssl_client"
}
{
  "parent": "libcrypto3",
  "child": "libssl3"
}
{
  "parent": "libcrypto3",
  "child": "apk-tools"
}
{
  "parent": "zlib",
  "child": "apk-tools"
}

Files without packages:

Finds orphaned files not associated with any package

. as $root |
  [.files[].id] as $allFiles |  # All file IDs
  [.artifactRelationships[] | select(.type == "contains") | .child] as $ownedFiles |  # Package-owned files
  ($allFiles - $ownedFiles) as $orphans |  # Set subtraction for unowned files
  $root.files[] |
  select(.id as $id | $orphans | index($id)) |  # Filter to orphaned files
  .location.path
syft alpine:3.9.2 -o json | \
  jq '. as $root |
  [.files[].id] as $allFiles |
  [.artifactRelationships[] | select(.type == "contains") | .child] as $ownedFiles |
  ($allFiles - $ownedFiles) as $orphans |
  $root.files[] |
  select(.id as $id | $orphans | index($id)) |
  .location.path'
"/lib/apk/db/installed"

Largest files:

Identifies the top 10 largest files by size

[.files[] |
  {
    path: .location.path,
    size: .metadata.size,
    mimeType: .metadata.mimeType
  }] |
  sort_by(.size) |
  reverse |  # Largest first
  .[0:10]  # Top 10 files
syft alpine:3.9.2 -o json | \
  jq '[.files[] |
  {
    path: .location.path,
    size: .metadata.size,
    mimeType: .metadata.mimeType
  }] |
  sort_by(.size) |
  reverse |
  .[0:10]'
[
  {
    "path": "/lib/libcrypto.so.1.1",
    "size": 2321984,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/bin/busybox",
    "size": 841320,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/lib/ld-musl-aarch64.so.1",
    "size": 616960,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/lib/libssl.so.1.1",
    "size": 515376,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/etc/ssl/cert.pem",
    "size": 232598,
    "mimeType": "text/plain"
  },
  {
    "path": "/sbin/apk",
    "size": 218928,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/usr/lib/libtls-standalone.so.1.0.0",
    "size": 96032,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/lib/libz.so.1.2.11",
    "size": 91888,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/usr/bin/scanelf",
    "size": 79592,
    "mimeType": "application/x-sharedlib"
  },
  {
    "path": "/usr/bin/getent",
    "size": 48704,
    "mimeType": "application/x-sharedlib"
  }
]

Extract CPEs:

Lists Common Platform Enumeration identifiers for vulnerability scanning

.artifacts[] |
  select(.cpes != null and (.cpes | length) > 0) |  # Filter packages with CPEs
  {
    name,
    version,
    cpes: [.cpes[].cpe]  # Extract CPE strings
  }
syft alpine:3.9.2 -o json | \
  jq '.artifacts[] |
  select(.cpes != null and (.cpes | length) > 0) |
  {
    name,
    version,
    cpes: [.cpes[].cpe]
  }'
{
  "name": "alpine-baselayout",
  "version": "3.1.0-r3",
  "cpes": [
    "cpe:2.3:a:alpine-baselayout:alpine-baselayout:3.1.0-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine-baselayout:alpine_baselayout:3.1.0-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine_baselayout:alpine-baselayout:3.1.0-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine_baselayout:alpine_baselayout:3.1.0-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine:alpine-baselayout:3.1.0-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine:alpine_baselayout:3.1.0-r3:*:*:*:*:*:*:*"
  ]
}
{
  "name": "alpine-keys",
  "version": "2.1-r1",
  "cpes": [
    "cpe:2.3:a:alpine-keys:alpine-keys:2.1-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine-keys:alpine_keys:2.1-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine_keys:alpine-keys:2.1-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine_keys:alpine_keys:2.1-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine:alpine-keys:2.1-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:alpine:alpine_keys:2.1-r1:*:*:*:*:*:*:*"
  ]
}
{
  "name": "apk-tools",
  "version": "2.10.3-r1",
  "cpes": [
    "cpe:2.3:a:apk-tools:apk-tools:2.10.3-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:apk-tools:apk_tools:2.10.3-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:apk_tools:apk-tools:2.10.3-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:apk_tools:apk_tools:2.10.3-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:apk:apk-tools:2.10.3-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:apk:apk_tools:2.10.3-r1:*:*:*:*:*:*:*"
  ]
}
{
  "name": "busybox",
  "version": "1.29.3-r10",
  "cpes": [
    "cpe:2.3:a:busybox:busybox:1.29.3-r10:*:*:*:*:*:*:*"
  ]
}
{
  "name": "ca-certificates-cacert",
  "version": "20190108-r0",
  "cpes": [
    "cpe:2.3:a:ca-certificates-cacert:ca-certificates-cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca-certificates-cacert:ca_certificates_cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca_certificates_cacert:ca-certificates-cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca_certificates_cacert:ca_certificates_cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca-certificates:ca-certificates-cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca-certificates:ca_certificates_cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca_certificates:ca-certificates-cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca_certificates:ca_certificates_cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:mozilla:ca-certificates-cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:mozilla:ca_certificates_cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca:ca-certificates-cacert:20190108-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:ca:ca_certificates_cacert:20190108-r0:*:*:*:*:*:*:*"
  ]
}
{
  "name": "libc-utils",
  "version": "0.7.1-r0",
  "cpes": [
    "cpe:2.3:a:libc-utils:libc-utils:0.7.1-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:libc-utils:libc_utils:0.7.1-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:libc_utils:libc-utils:0.7.1-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:libc_utils:libc_utils:0.7.1-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:libc:libc-utils:0.7.1-r0:*:*:*:*:*:*:*",
    "cpe:2.3:a:libc:libc_utils:0.7.1-r0:*:*:*:*:*:*:*"
  ]
}
{
  "name": "libcrypto1.1",
  "version": "1.1.1a-r1",
  "cpes": [
    "cpe:2.3:a:libcrypto1.1:libcrypto1.1:1.1.1a-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:libcrypto1.1:libcrypto:1.1.1a-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:libcrypto:libcrypto1.1:1.1.1a-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:libcrypto:libcrypto:1.1.1a-r1:*:*:*:*:*:*:*"
  ]
}
{
  "name": "libssl1.1",
  "version": "1.1.1a-r1",
  "cpes": [
    "cpe:2.3:a:libssl1.1:libssl1.1:1.1.1a-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:libssl1.1:libssl:1.1.1a-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:libssl:libssl1.1:1.1.1a-r1:*:*:*:*:*:*:*",
    "cpe:2.3:a:libssl:libssl:1.1.1a-r1:*:*:*:*:*:*:*"
  ]
}
{
  "name": "libtls-standalone",
  "version": "2.7.4-r6",
  "cpes": [
    "cpe:2.3:a:libtls-standalone:libtls-standalone:2.7.4-r6:*:*:*:*:*:*:*",
    "cpe:2.3:a:libtls-standalone:libtls_standalone:2.7.4-r6:*:*:*:*:*:*:*",
    "cpe:2.3:a:libtls_standalone:libtls-standalone:2.7.4-r6:*:*:*:*:*:*:*",
    "cpe:2.3:a:libtls_standalone:libtls_standalone:2.7.4-r6:*:*:*:*:*:*:*",
    "cpe:2.3:a:libtls:libtls-standalone:2.7.4-r6:*:*:*:*:*:*:*",
    "cpe:2.3:a:libtls:libtls_standalone:2.7.4-r6:*:*:*:*:*:*:*"
  ]
}
{
  "name": "musl",
  "version": "1.1.20-r3",
  "cpes": [
    "cpe:2.3:a:musl-libc:musl:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl_libc:musl:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl:musl:1.1.20-r3:*:*:*:*:*:*:*"
  ]
}
{
  "name": "musl-utils",
  "version": "1.1.20-r3",
  "cpes": [
    "cpe:2.3:a:musl-utils:musl-utils:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl-utils:musl_utils:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl_utils:musl-utils:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl_utils:musl_utils:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl:musl-utils:1.1.20-r3:*:*:*:*:*:*:*",
    "cpe:2.3:a:musl:musl_utils:1.1.20-r3:*:*:*:*:*:*:*"
  ]
}
{
  "name": "scanelf",
  "version": "1.2.3-r0",
  "cpes": [
    "cpe:2.3:a:scanelf:scanelf:1.2.3-r0:*:*:*:*:*:*:*"
  ]
}
{
  "name": "ssl_client",
  "version": "1.29.3-r10",
  "cpes": [
    "cpe:2.3:a:ssl-client:ssl-client:1.29.3-r10:*:*:*:*:*:*:*",
    "cpe:2.3:a:ssl-client:ssl_client:1.29.3-r10:*:*:*:*:*:*:*",
    "cpe:2.3:a:ssl_client:ssl-client:1.29.3-r10:*:*:*:*:*:*:*",
    "cpe:2.3:a:ssl_client:ssl_client:1.29.3-r10:*:*:*:*:*:*:*",
    "cpe:2.3:a:ssl:ssl-client:1.29.3-r10:*:*:*:*:*:*:*",
    "cpe:2.3:a:ssl:ssl_client:1.29.3-r10:*:*:*:*:*:*:*"
  ]
}
{
  "name": "zlib",
  "version": "1.2.11-r1",
  "cpes": [
    "cpe:2.3:a:zlib:zlib:1.2.11-r1:*:*:*:*:*:*:*"
  ]
}

Packages without licenses:

Identifies packages missing license information for compliance audits

.artifacts[] |
  select(.licenses == null or (.licenses | length) == 0) |  # Packages without license info
  {
    name,
    version,
    type,
    locations: [.locations[].path]  # Where package is installed
  }
syft httpd:2.4.65 -o json | \
  jq '.artifacts[] |
  select(.licenses == null or (.licenses | length) == 0) |
  {
    name,
    version,
    type,
    locations: [.locations[].path]
  }'
{
  "name": "httpd",
  "version": "2.4.65",
  "type": "binary",
  "locations": ["/usr/local/apache2/bin/httpd"]
}

Packages with CPE identifiers:

Lists packages with CPE identifiers indicating potential CVE matches

.artifacts[] |
  select(.cpes != null and (.cpes | length) > 0) |  # Packages with CPE identifiers
  {
    name,
    version,
    type,
    cpeCount: (.cpes | length)  # Number of CPE matches
  }
syft alpine:3.9.2 -o json | \
  jq '.artifacts[] |
  select(.cpes != null and (.cpes | length) > 0) |
  {
    name,
    version,
    type,
    cpeCount: (.cpes | length)
  }'
{
  "name": "alpine-baselayout",
  "version": "3.1.0-r3",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "alpine-keys",
  "version": "2.1-r1",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "apk-tools",
  "version": "2.10.3-r1",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "busybox",
  "version": "1.29.3-r10",
  "type": "apk",
  "cpeCount": 1
}
{
  "name": "ca-certificates-cacert",
  "version": "20190108-r0",
  "type": "apk",
  "cpeCount": 12
}
{
  "name": "libc-utils",
  "version": "0.7.1-r0",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "libcrypto1.1",
  "version": "1.1.1a-r1",
  "type": "apk",
  "cpeCount": 4
}
{
  "name": "libssl1.1",
  "version": "1.1.1a-r1",
  "type": "apk",
  "cpeCount": 4
}
{
  "name": "libtls-standalone",
  "version": "2.7.4-r6",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "musl",
  "version": "1.1.20-r3",
  "type": "apk",
  "cpeCount": 3
}
{
  "name": "musl-utils",
  "version": "1.1.20-r3",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "scanelf",
  "version": "1.2.3-r0",
  "type": "apk",
  "cpeCount": 1
}
{
  "name": "ssl_client",
  "version": "1.29.3-r10",
  "type": "apk",
  "cpeCount": 6
}
{
  "name": "zlib",
  "version": "1.2.11-r1",
  "type": "apk",
  "cpeCount": 1
}

Next steps

4.1.5 - Package Catalogers

Configure which package catalogers Syft uses to discover software components including language-specific and file-based catalogers.

Catalogers are Syft’s detection modules that identify software packages in your projects. Each cataloger specializes in finding specific types of packages—for example, python-package-cataloger finds Python dependencies declared in requirements.txt, while python-installed-package-cataloger finds Python packages that have already been installed.

Syft includes dozens of catalogers covering languages like Python, Java, Go, JavaScript, Ruby, Rust, and more, as well as OS packages (APK, RPM, DEB) and binary formats.

Default Behavior

Syft uses different cataloger sets depending on what you’re scanning:

Scan Type Default Catalogers What They Find Example
Container Image Image-specific catalogers Installed packages only Python packages in site-packages
Directory Directory-specific catalogers Installed packages + declared dependencies Python packages in site-packages AND requirements.txt

This behavior ensures accurate results across different contexts. When you scan an image, Syft assumes installation steps have completed –this way you are getting results for software that is positively present. When you scan a directory (like a source code repository), Syft looks for both what’s installed and what’s declared as a dependency –this way you are getting results for not only what’s installed but also what you intend to install.

Why use different catalogers for different sources?

Most of the time, files that hint at the intent to install software do not have enough information in them to determine the exact version of the package that would be installed. For example, a requirements.txt file might specify a package without a version, or with a version range. By looking at installed packages in an image, after any build tooling has been invoked, Syft can provide more accurate version information.

Example: Python Package Detection

Scanning an image:

$ syft <container-image> --select-catalogers python
# Uses: python-installed-package-cataloger
# Finds: Packages in site-packages directories

Scanning a directory:

$ syft <source-directory> --select-catalogers python
# Uses: python-installed-package-cataloger, python-package-cataloger
# Finds: Packages in site-packages + requirements.txt, setup.py, Pipfile, etc.

Viewing Active Catalogers

The most reliable way to see which catalogers Syft used is to check the SBOM itself. Every SBOM captures both the catalogers that were requested and those that actually ran:

syft busybox:latest -o json | jq '.descriptor.configuration.catalogers'

Output:

{
  "requested": {
    "default": [
      "image",
      "file"
    ]
  },
  "used": [
    "alpm-db-cataloger",
    "apk-db-cataloger",
    "binary-classifier-cataloger",
    "bitnami-cataloger",
    "cargo-auditable-binary-cataloger",
    "conan-info-cataloger",
    "dotnet-deps-binary-cataloger",
    "dotnet-packages-lock-cataloger",
    "dpkg-db-cataloger",
    "elf-binary-package-cataloger",
    ...
  ]
}

This shows what catalogers were attempted, not just what found packages. The requested field shows your cataloger selection strategy, while used lists every cataloger that ran.

You can also see cataloger activity in real-time using verbose logging, though this is less comprehensive and not as direct.

Exploring Available Catalogers

Use the syft cataloger list command to see all available catalogers, their tags, and test selection expressions.

List all catalogers

syft cataloger list

Output shows file and package catalogers with their tags:

┌───────────────────────────┬───────────────────────┐
│ FILE CATALOGER            │ TAGS                  │
├───────────────────────────┼───────────────────────┤
│ file-content-cataloger    │ content, file         │
│ file-digest-cataloger     │ digest, file          │
│ file-executable-cataloger │ binary-metadata, file │
│ file-metadata-cataloger   │ file, file-metadata   │
└───────────────────────────┴───────────────────────┘
┌────────────────────────────────────┬────────────────────────────────────────────────────────┐
│ PACKAGE CATALOGER                  │ TAGS                                                   │
├────────────────────────────────────┼────────────────────────────────────────────────────────┤
│ python-installed-package-cataloger │ directory, image, installed, language, package, python │
│ python-package-cataloger           │ declared, directory, language, package, python         │
│ java-archive-cataloger             │ directory, image, installed, java, language, maven     │
│ go-module-binary-cataloger         │ binary, directory, go, golang, image, installed        │
│ ...                                │                                                        │
└────────────────────────────────────┴────────────────────────────────────────────────────────┘

Test cataloger selection

Preview which catalogers a selection expression would use:

$ syft cataloger list --select-catalogers python
Default selections: 1
'all'
Selection expressions: 1
'python' (intersect)

┌────────────────────────────────────┬────────────────────────────────────────────────────────┐
│ PACKAGE CATALOGER                  │ TAGS                                                   │
├────────────────────────────────────┼────────────────────────────────────────────────────────┤
│ python-installed-package-cataloger │ directory, image, installed, language, package, python │
│ python-package-cataloger           │ declared, directory, language, package, python         │
└────────────────────────────────────┴────────────────────────────────────────────────────────┘

This shows exactly which catalogers your selection expression will use, helping you verify your configuration before running a scan.

Output formats

Get cataloger information in different formats:

# Table format (default)
$ syft cataloger list

# JSON format (useful for automation)
$ syft cataloger list -o json

Cataloger References

You can refer to catalogers in two ways:

  • By name: The exact cataloger identifier (e.g., java-pom-cataloger, go-module-binary-cataloger)
  • By tag: A group label for related catalogers (e.g., java, python, image, directory)

Common tags include:

  • Language tags: python, java, go, javascript, ruby, rust, etc.
  • Scan type tags: image, directory
  • Installation state tags: installed, declared
  • Ecosystem tags: maven, npm, cargo, composer, etc.

Customizing Cataloger Selection

Syft provides two flags for controlling catalogers:

--select-catalogers: Modify Defaults

Use this flag to adjust the default cataloger set. This is the recommended approach for most use cases.

Syntax:

Operation Syntax Example Description
Filter <tag> --select-catalogers java Use only Java catalogers from the defaults
Add +<name> --select-catalogers +sbom-cataloger Add a specific cataloger to defaults
Remove -<name-or-tag> --select-catalogers -rpm Remove catalogers by name or tag
Combine <tag>,+<name>,-<tag> --select-catalogers java,+sbom-cataloger,-maven Multiple operations together

Selection Logic:

  1. Start with default catalogers (image or directory based)
  2. If tags provided (without + or -), filter to only those tagged catalogers
  3. Remove any catalogers matching -<name-or-tag>
  4. Add any catalogers specified with +<name>

--override-default-catalogers: Replace Defaults

Use this flag to completely replace Syft’s default cataloger selection. This bypasses the automatic image vs. directory behavior.

Syntax:

--override-default-catalogers <comma-separated-names-or-tags>

When to use:

  • You need catalogers from both image and directory sets
  • You want to use catalogers that aren’t in the default set
  • You need precise control regardless of scan type

Examples by Use Case

Filtering to Specific Languages

Scan for only Python packages using defaults for your scan type:

syft <target> --select-catalogers python

Scan for only Java and Go packages:

syft <target> --select-catalogers java,go

Adding Catalogers

Use defaults and also include the SBOM cataloger (which finds embedded SBOMs):

syft <target> --select-catalogers +sbom-cataloger

Scan with defaults plus both SBOM and binary catalogers:

syft <target> --select-catalogers +sbom-cataloger,+binary-cataloger

Removing Catalogers

Use defaults but exclude all RPM-related catalogers:

syft <target> --select-catalogers -rpm

Scan with defaults but remove Java JAR cataloger specifically:

syft <target> --select-catalogers -java-archive-cataloger

Combining Operations

Scan for Go packages, always include SBOM cataloger, but exclude binary analysis:

$ syft <container-image> --select-catalogers go,+sbom-cataloger,-binary
# Result: go-module-binary-cataloger, sbom-cataloger
# (binary cataloger excluded even though it's in go tag)

Filter to Java, add POM cataloger, remove Gradle:

syft <directory> --select-catalogers java,+java-pom-cataloger,-gradle

Complete Override Examples

Use only binary analysis catalogers regardless of scan type:

$ syft <target> --override-default-catalogers binary
# Result: binary-cataloger, cargo-auditable-binary-cataloger,
#         dotnet-portable-executable-cataloger, go-module-binary-cataloger

Use exactly two specific catalogers:

syft <target> --override-default-catalogers go-module-binary-cataloger,go-module-file-cataloger

Use all directory catalogers even when scanning an image:

syft <container-image> --override-default-catalogers directory

Troubleshooting

My language isn’t being detected

Check which catalogers ran and whether they found packages:

# See which catalogers were used
$ syft <target> -o json | jq '.descriptor.configuration.catalogers.used'

# See which catalogers found packages
$ syft <target> -o json | jq '.artifacts[].foundBy'

# See packages found by a specific cataloger
$ syft <target> -o json | jq '.artifacts[] | select(.foundBy == "python-package-cataloger") | .name'

If your expected cataloger isn’t in the used list:

  1. Verify the cataloger exists for your scan type: Use syft cataloger list --select-catalogers <tag> to preview
  2. Check your selection expressions: You may have excluded it with - or not included it in your filter
  3. Check file locations: Some catalogers look for specific paths (e.g., site-packages for Python)

If the cataloger ran but found nothing, check that:

  • Package files exist in the scanned source
  • Files are properly formatted
  • Files are in the expected locations for that cataloger

How do I know if I’m using image or directory defaults?

Check the SBOM’s cataloger configuration:

syft <target> -o json | jq '.descriptor.configuration.catalogers.requested'

This shows the selection strategy used:

  • "default": ["image", "file"] indicates image defaults
  • "default": ["directory", "file"] indicates directory defaults

What’s the difference between a name and a tag?

  • Name: The unique identifier for a single cataloger (e.g., python-package-cataloger)
  • Tag: A label that groups multiple catalogers (e.g., python includes both python-package-cataloger and python-installed-package-cataloger)

Use tags when you want to downselect from the default catalogers, and names when you need to target a specific cataloger.

Why use –select-catalogers vs –override-default-catalogers?

  • --select-catalogers: Respects Syft’s automatic image/directory behavior, safer for most use cases
  • --override-default-catalogers: Ignores scan type, gives complete control, requires more knowledge

When in doubt, use --select-catalogers.

Technical Reference

For reference, here’s the formal logic Syft uses for cataloger selection:

image_catalogers = all_catalogers AND catalogers_tagged("image")

directory_catalogers = all_catalogers AND catalogers_tagged("directory")

default_catalogers = image_catalogers OR directory_catalogers

sub_selected_catalogers = default_catalogers INTERSECT catalogers_tagged(TAG) [ UNION sub_selected_catalogers ... ]

base_catalogers = default_catalogers OR sub_selected_catalogers

final_set = (base_catalogers SUBTRACT removed_catalogers) UNION added_catalogers

This logic applies when using --select-catalogers. The --override-default-catalogers flag bypasses the default cataloger selection entirely and starts with the specified catalogers instead.

4.1.6 - File Selection

Control which files and directories Syft includes or excludes when generating SBOMs.

By default, Syft catalogs file details and digests for files owned by discovered packages. You can change this behavior using the SYFT_FILE_METADATA_SELECTION environment variable or the file.metadata.selection configuration option.

Available options:

  • all: capture all files from the search space
  • owned-by-package: capture only files owned by packages (default)
  • none: disable file information capture

Excluding file paths

You can exclude specific files and paths from scanning using glob patterns with the --exclude parameter. Use multiple --exclude flags to specify multiple patterns.

# Exclude a specific directory
syft <source> --exclude /etc

# Exclude files by pattern
syft <source> --exclude './out/**/*.json'

# Combine multiple exclusions
syft <source> --exclude './out/**/*.json' --exclude /etc --exclude '**/*.log'

Exclusion behavior by source type

How Syft interprets exclusion patterns depends on whether you’re scanning an image or a directory.

Image scanning

When scanning container images, Syft scans the entire filesystem. Use absolute paths for exclusions:

# Exclude system directories
syft alpine:latest --exclude /etc --exclude /var

# Exclude files by pattern across entire filesystem
syft alpine:latest --exclude '/usr/**/*.txt'

Directory scanning

When scanning directories, Syft resolves exclusion patterns relative to the specified directory. All exclusion patterns must begin with ./, */, or **/.

# Scanning /usr/foo
syft /usr/foo --exclude ./package.json        # Excludes /usr/foo/package.json
syft /usr/foo --exclude '**/package.json'     # Excludes all package.json files under /usr/foo
syft /usr/foo --exclude './out/**'            # Excludes everything under /usr/foo/out

Path prefix requirements for directory scans:

Pattern Meaning Example
./ Relative to scan directory root ./config.json
*/ One level of directories */temp
**/ Any depth of directories **/node_modules

Common exclusion patterns

# Exclude all JSON files
syft <source> --exclude '**/*.json'

# Exclude build output directories
syft <source> --exclude '**/dist/**' --exclude '**/build/**'

# Exclude dependency directories
syft <source> --exclude '**/node_modules/**' --exclude '**/vendor/**'

# Exclude test files
syft <source> --exclude '**/*_test.go' --exclude '**/test/**'

4.1.7 - Using Templates

Create custom SBOM output formats using Go templates with available data fields to build tailored reports for specific tooling or compliance requirements.

Syft lets you define custom output formats using Go templates. This is useful for generating custom reports, integrating with specific tools, or extracting only the data you need.

How to use templates

Set the output format to template and specify the template file path:

syft <image> -o template -t ./path/to/custom.tmpl

You can also configure the template path in your configuration file:

#.syft.yaml
format:
  template:
    path: "/path/to/template.tmpl"

Available fields

Templates receive the same data structure as the syft-json output format. The Syft JSON schema is the source of truth for all available fields and their structure.

To see what data is available:

# View the full JSON structure
syft <image> -o json

# Explore specific fields
syft <image> -o json | jq '.artifacts[0]'

Key fields commonly used in templates:

  • .artifacts - Array of discovered packages
  • .files - Array of discovered files
  • .source - Information about what was scanned
  • .distro - Detected Linux distribution (if applicable)
  • .descriptor - Syft version and configuration

Common package (artifact) fields:

  • .name, .version, .type - Basic package info
  • .licenses - License information (array)
  • .purl - Package URL
  • .cpes - Common Platform Enumerations
  • .locations - Where the package was found

Template functions

Syft templates support:

Function Arguments Description
getLastIndex collection Returns the last index of a slice (length - 1), useful for comma-separated lists
hasField obj, field Checks if a field exists on an object, returns boolean

Examples

The following examples show template source code and the rendered output when run against alpine:3.9.2:

CSV output

"Package","Version","Type","Found by"
{{- range .artifacts}}
"{{.name}}","{{.version}}","{{.type}}","{{.foundBy}}"
{{- end}}
"Package","Version","Type","Found by"
"alpine-baselayout","3.1.0-r3","apk","apk-db-cataloger"
"alpine-keys","2.1-r1","apk","apk-db-cataloger"
"apk-tools","2.10.3-r1","apk","apk-db-cataloger"
"busybox","1.29.3-r10","apk","apk-db-cataloger"
"ca-certificates-cacert","20190108-r0","apk","apk-db-cataloger"
"libc-utils","0.7.1-r0","apk","apk-db-cataloger"
"libcrypto1.1","1.1.1a-r1","apk","apk-db-cataloger"
"libssl1.1","1.1.1a-r1","apk","apk-db-cataloger"
"libtls-standalone","2.7.4-r6","apk","apk-db-cataloger"
"musl","1.1.20-r3","apk","apk-db-cataloger"
"musl-utils","1.1.20-r3","apk","apk-db-cataloger"
"scanelf","1.2.3-r0","apk","apk-db-cataloger"
"ssl_client","1.29.3-r10","apk","apk-db-cataloger"
"zlib","1.2.11-r1","apk","apk-db-cataloger"

Filter by package type

{{range .artifacts}}
{{- if eq .type "apk"}}
{{.name}}@{{.version}}{{end}}
{{- end}}
alpine-baselayout@3.1.0-r3
alpine-keys@2.1-r1
apk-tools@2.10.3-r1
busybox@1.29.3-r10
ca-certificates-cacert@20190108-r0
libc-utils@0.7.1-r0
libcrypto1.1@1.1.1a-r1
libssl1.1@1.1.1a-r1
libtls-standalone@2.7.4-r6
musl@1.1.20-r3
musl-utils@1.1.20-r3
scanelf@1.2.3-r0
ssl_client@1.29.3-r10
zlib@1.2.11-r1

Markdown report

# SBOM Report: {{.source.metadata.userInput}}

Scanned: {{.source.name}}:{{.source.version}} ({{.source.type}})
{{- if .distro}}
Distribution: {{.distro.prettyName}}
{{- end}}

## Packages ({{len .artifacts}})

| Package | Version | Type |
|---------|---------|------|
{{- range .artifacts}}
| {{.name}} | {{.version}} | {{.type}} |
{{- end}}
# SBOM Report: alpine:3.9.2

Scanned: alpine:3.9.2 (image)
Distribution: Alpine Linux v3.9

## Packages (14)

| Package                | Version     | Type |
| ---------------------- | ----------- | ---- |
| alpine-baselayout      | 3.1.0-r3    | apk  |
| alpine-keys            | 2.1-r1      | apk  |
| apk-tools              | 2.10.3-r1   | apk  |
| busybox                | 1.29.3-r10  | apk  |
| ca-certificates-cacert | 20190108-r0 | apk  |
| libc-utils             | 0.7.1-r0    | apk  |
| libcrypto1.1           | 1.1.1a-r1   | apk  |
| libssl1.1              | 1.1.1a-r1   | apk  |
| libtls-standalone      | 2.7.4-r6    | apk  |
| musl                   | 1.1.20-r3   | apk  |
| musl-utils             | 1.1.20-r3   | apk  |
| scanelf                | 1.2.3-r0    | apk  |
| ssl_client             | 1.29.3-r10  | apk  |
| zlib                   | 1.2.11-r1   | apk  |

License compliance

{{range .artifacts}}
{{- if .licenses}}
{{.name}}: {{range .licenses}}{{.value}} {{end}}{{end}}
{{- end}}
alpine-baselayout: GPL-2.0
alpine-keys: MIT
apk-tools: GPL2
busybox: GPL-2.0
ca-certificates-cacert: GPL-2.0-or-later MPL-2.0
libc-utils: BSD
libcrypto1.1: OpenSSL
libssl1.1: OpenSSL
libtls-standalone: ISC
musl: MIT
musl-utils: BSD GPL2+ MIT
scanelf: GPL-2.0
ssl_client: GPL-2.0
zlib: zlib

Custom JSON subset

{
  "scanned": "{{.source.metadata.userInput}}",
  "packages": [
    {{- $last := sub (len .artifacts) 1}}
    {{- range $i, $pkg := .artifacts}}
    {"name": "{{$pkg.name}}", "version": "{{$pkg.version}}"}{{if ne $i $last}},{{end}}
    {{- end}}
  ]
}
{
  "scanned": "alpine:3.9.2",
  "packages": [
    { "name": "alpine-baselayout", "version": "3.1.0-r3" },
    { "name": "alpine-keys", "version": "2.1-r1" },
    { "name": "apk-tools", "version": "2.10.3-r1" },
    { "name": "busybox", "version": "1.29.3-r10" },
    { "name": "ca-certificates-cacert", "version": "20190108-r0" },
    { "name": "libc-utils", "version": "0.7.1-r0" },
    { "name": "libcrypto1.1", "version": "1.1.1a-r1" },
    { "name": "libssl1.1", "version": "1.1.1a-r1" },
    { "name": "libtls-standalone", "version": "2.7.4-r6" },
    { "name": "musl", "version": "1.1.20-r3" },
    { "name": "musl-utils", "version": "1.1.20-r3" },
    { "name": "scanelf", "version": "1.2.3-r0" },
    { "name": "ssl_client", "version": "1.29.3-r10" },
    { "name": "zlib", "version": "1.2.11-r1" }
  ]
}

Executable file digests

{{range .files -}}
{{- if .executable}}
{{.location.path}}: {{range .digests}}{{if eq .algorithm "sha256"}}{{.value}}{{end}}{{end}}
{{end}}
{{- end}}
/bin/busybox: 2c1276c3c02ccec8a0e1737d3144cdf03db883f479c86fbd9c7ea4fd9b35eac5

/lib/ld-musl-aarch64.so.1: 0132814479f1acc1e264ef59f73fd91563235897e8dc1bd52765f974cde382ca

/lib/libcrypto.so.1.1: 6c597c8ad195eeb7a9130ad832dfa4cbf140f42baf96304711b2dbd43ba8e617

/lib/libssl.so.1.1: fb72f4615fb4574bd6eeabfdb86be47012618b9076d75aeb1510941c585cae64

/lib/libz.so.1.2.11: 19e790eb36a09eba397b5af16852f3bea21a242026bbba3da7b16442b8ba305b

/sbin/apk: 22d7d85bd24923f1f274ce765d16602191097829e22ac632748302817ce515d8

/sbin/mkmntdirs: a14a5a28525220224367616ef46d4713ef7bd00d22baa761e058e8bdd4c0af1b

/usr/bin/getconf: 82bcde66ead19bc3b9ff850f66c2dbf5eaff36d481f1ec154100f73f6265d2ef

/usr/bin/getent: 53ffb508150e91838d795831e8ecc71f2bc3a7db036c6d7f9512c3973418bb5e

/usr/bin/iconv: 1c99d1f4edcb8da6db1da60958051c413de45a4c15cd3b7f7285ed87f9a250ff

/usr/bin/scanelf: 908da485ad2edea35242f8989c7beb9536414782abc94357c72b7d840bb1fda2

/usr/bin/ssl_client: 67ab7f3a1ba35630f439d1ca4f73c7d95f8b7aa0e6f6db6ea1743f136f074ab4

/usr/lib/engines-1.1/afalg.so: ea7c2f48bc741fd828d79a304dbf713e20e001c0187f3f534d959886af87f4af

/usr/lib/engines-1.1/capi.so: b461ed43f0f244007d872e84760a446023b69b178c970acf10ed2666198942c6

/usr/lib/engines-1.1/padlock.so: 0ccb04f040afb0216da1cea2c1db7a0b91d990ce061e232782aedbd498483649

/usr/lib/libtls-standalone.so.1.0.0: 7f4c2ff4010e30a69f588ab4f213fdf9ce61a524a0eecd3f5af31dc760e8006c

Find binaries importing a library

{{range .files -}}
{{- if .executable}}
{{- $path := .location.path}}
{{- range .executable.importedLibraries}}
{{- if eq . "libcrypto.so.1.1"}}
{{$path}}
{{break}}
{{- end}}
{{- end}}
{{- end}}
{{- end}}
/lib/libssl.so.1.1

/sbin/apk

/usr/lib/engines-1.1/afalg.so

/usr/lib/libtls-standalone.so.1.0.0

Troubleshooting

“can’t evaluate field” errors: The field doesn’t exist or is misspelled. Check field names with syft <image> -o json | jq.

Empty output: Verify your field paths are correct. Use syft <image> -o json to see the actual data structure.

Template syntax errors: Refer to the Go template documentation for syntax help.

Additional resources

4.1.8 - Format Conversion

Convert existing SBOMs between different formats including SPDX and CycloneDX using Syft’s experimental conversion capabilities.

The ability to convert existing SBOMs means you can create SBOMs in different formats quickly, without the need to regenerate the SBOM from scratch, which may take significantly more time.

syft convert <ORIGINAL-SBOM-FILE> -o <NEW-SBOM-FORMAT>[=<NEW-SBOM-FILE>]

We support formats with wide community usage AND good encode/decode support by Syft. The supported formats are:

  • Syft JSON (-o json)
  • SPDX JSON (-o spdx-json)
  • SPDX tag-value (-o spdx-tag-value)
  • CycloneDX JSON (-o cyclonedx-json)
  • CycloneDX XML (-o cyclonedx-xml)

Conversion example:

syft alpine:latest -o syft-json=sbom.syft.json # generate a syft SBOM
syft convert sbom.syft.json -o cyclonedx-json=sbom.cdx.json  # convert it to CycloneDX

Best practices

Use Syft JSON as the source format

Generate and keep Syft JSON as your primary SBOM. Convert from it to other formats as needed:

# Generate Syft JSON (native format with complete data)
syft <source> -o json=sbom.json

# Convert to other formats
syft convert sbom.json -o spdx-json=sbom.spdx.json
syft convert sbom.json -o cyclonedx-json=sbom.cdx.json

Converting between non-Syft formats loses data. Syft JSON contains all information Syft extracted, while other formats use different schemas that can’t represent the same fields.

What gets preserved

Conversions from Syft JSON to SPDX or CycloneDX preserve all standard SBOM fields. Converted output matches directly-generated output (only timestamps and IDs differ).

Avoid chaining conversions (e.g., SPDX → CycloneDX). Each step may lose format-specific data.

Reliably preserved across conversions:

  • Package names, versions, and PURLs
  • License information
  • CPEs and external references
  • Package relationships

May be lost in conversions:

  • Tool configuration and cataloger information
  • Source metadata (image manifests, layers, container config)
  • File location details and layer attribution
  • Package-manager-specific metadata (git commits, checksums, provides/dependencies)
  • Distribution details

When to convert vs regenerate

Convert from Syft JSON when:

  • You need multiple formats for different tools
  • The original source is unavailable
  • Scanning takes significant time

Regenerate from source when:

  • You need complete format-specific data
  • Conversion output is missing critical information

4.1.9 - Attestation

Generate cryptographically signed SBOM attestations using in-toto and Sigstore to create, verify, and attach attestations to container images for supply chain security.

Overview

An attestation is cryptographic proof that you created a specific SBOM for a container image. When you publish an image, consumers need to trust that the SBOM accurately describes the image contents. Attestations solve this by letting you sign SBOMs and attach them to images, enabling consumers to verify authenticity.

Syft supports two approaches:

  • Keyless attestation: Uses your identity (GitHub, Google, Microsoft) as trust root via Sigstore. Best for CI/CD and teams.
  • Local key attestation: Uses cryptographic key pairs you manage. Best for air-gapped environments or specific security requirements.

Prerequisites

Before creating attestations, ensure you have:

  • Syft installed
  • Cosign ≥ v1.12.0 installed (installation guide)
  • Write access to the OCI registry where you’ll publish attestations
  • Registry authentication configured (e.g., docker login for Docker Hub)

For local key attestations, you’ll also need a key pair. Generate one with:

cosign generate-key-pair

This creates cosign.key (private key) and cosign.pub (public key). Keep the private key secure.

Keyless attestation

Keyless attestation uses Sigstore to tie your OIDC identity (GitHub, Google, or Microsoft account) to the attestation. This eliminates key management overhead.

Create a keyless attestation

syft attest --output cyclonedx-json <IMAGE>

Replace <IMAGE> with your image reference (e.g., docker.io/myorg/myimage:latest). You must have write access to this image.

What happens:

  1. Syft opens your browser to authenticate via OIDC (GitHub, Google, or Microsoft)
  2. After authentication, Syft generates the SBOM
  3. Sigstore signs the SBOM using your identity
  4. The attestation is uploaded to the OCI registry alongside your image

Verify a keyless attestation

Anyone can verify the attestation using cosign:

COSIGN_EXPERIMENTAL=1 cosign verify-attestation <IMAGE>

Successful output shows:

  • Attestation claims are validated
  • Claims exist in the Sigstore transparency log
  • Certificates verified against Fulcio (Sigstore’s certificate authority)
  • Certificate subject (your identity email)
  • Certificate issuer (identity provider URL)

Example:

Certificate subject:  user@example.com
Certificate issuer URL:  https://accounts.google.com

This proves the attestation was created by the specified identity.

Local key attestation

Local key attestation uses cryptographic key pairs you manage. You sign attestations with your private key, and consumers verify with your public key.

Create a key-based attestation

Generate the attestation and save it locally:

syft attest --output spdx-json --key cosign.key docker.io/myorg/myimage:latest > attestation.json

The output is a DSSE envelope containing an in-toto statement with your SBOM as the predicate.

Attach the attestation to your image

Use cosign to attach the attestation:

cosign attach attestation --attestation attestation.json docker.io/myorg/myimage:latest

You need write access to the image registry for this to succeed.

Verify a key-based attestation

Consumers verify using your public key:

cosign verify-attestation --key cosign.pub --type spdxjson docker.io/myorg/myimage:latest

Successful output shows:

Verification for docker.io/myorg/myimage:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
  - Any certificates were verified against the Fulcio roots.

To extract and view the SBOM:

cosign verify-attestation --key cosign.pub --type spdxjson docker.io/myorg/myimage:latest | \
  jq '.payload | @base64d | .payload | fromjson | .predicate'

Use with vulnerability scanning

Pipe the verified SBOM directly to Grype for vulnerability analysis:

cosign verify-attestation --key cosign.pub --type spdxjson docker.io/myorg/myimage:latest | \
  jq '.payload | @base64d | .payload | fromjson | .predicate' | \
  grype

This ensures you’re scanning a verified, trusted SBOM.

Troubleshooting

Authentication failures

  • Ensure you’re logged into the registry: docker login <registry>
  • Verify you have write access to the image repository

Cosign version errors

  • Update to cosign ≥ v1.12.0: cosign version

Verification failures

  • For keyless: ensure COSIGN_EXPERIMENTAL=1 is set
  • For key-based: verify you’re using the correct public key
  • Check the attestation type matches (--type spdxjson or --type cyclonedx-json)

Permission denied uploading attestations

  • Verify write access to the registry
  • Check authentication credentials are current
  • Ensure the image exists in the registry before attaching attestations

4.2 - Vulnerability Scanning

Learn how to scan container images, filesystems, and SBOMs for known software vulnerabilities.

Vulnerability scanning is the automated process of proactively identifying security weaknesses and known exploits within software and systems. This is crucial because it helps developers and organizations find and fix potential security holes before malicious actors can discover and exploit them, thus protecting data and maintaining system integrity.

Grype is an open-source vulnerability scanner specifically designed to analyze container images and filesystems. It works by comparing the software components it finds against a database of known vulnerabilities, providing a report of potential risks so they can be addressed.

4.2.1 - Getting Started

Vulnerability Scanning Getting Started

Introduction

Grype is an easy-to-integrate open source vulnerability scanning tool for container images and filesystems.

Install the latest Grype release

Grype is provided as a single compiled executable. Issue the command for your platform to download the latest release of Grype. The full list of official and community maintained packages can be found on the installation page.

curl -sSfL <https://get.anchore.io/grype> | sudo sh -s -- -b /usr/local/bin
brew install grype
nuget install Anchore.Grype

Once installed, ensure the grype binary is in the PATH for your system.

Scan a container for vulnerabilities

grype <image>

Scan a public container image for vulnerabilities

Run grype with default options against a small container, which will be pulled from DockerHub. Grype will also download the latest vulnerability database. The output will be a simple human-readable table.

grype alpine:latest
 ✔ Loaded image alpine:latest
 ✔ Parsed image sha256:8d591b0b7dea080ea3be9e12ae563eebf9…
 ✔ Cataloged contents 058c92d86112aa6f641b01ed238a07a3885…
   ├── ✔ Packages                        [15 packages]
   ├── ✔ File metadata                   [82 locations]
   ├── ✔ File digests                    [82 files]
   └── ✔ Executables                     [17 executables]
 ✔ Scanned for vulnerabilities     [6 vulnerability matches]
   ├── by severity: 0 critical, 0 high, 0 medium, 6 low, 0 negligible
   └── by status:   0 fixed, 6 not-fixed, 0 ignored
NAME           INSTALLED   FIXED-IN  TYPE  VULNERABILITY   SEVERITY
busybox        1.37.0-r12            apk   CVE-2024-58251  Low
busybox        1.37.0-r12            apk   CVE-2025-46394  Low
busybox-binsh  1.37.0-r12            apk   CVE-2024-58251  Low
busybox-binsh  1.37.0-r12            apk   CVE-2025-46394  Low
ssl_client     1.37.0-r12            apk   CVE-2024-58251  Low
ssl_client     1.37.0-r12            apk   CVE-2025-46394  Low

Scan an existing SBOM for vulnerabilities

Grype can scan containers directly, but it can also scan an existing SBOM document.

grype alpine_latest-spdx.json

Grype should give similar output to the previous table.

Create a vulnerability report in JSON format

The JSON-formatted output from Grype may be processed or visualized by other tools.

Create the vulnerability report using the --output, and via jq to make it prettier.

grype alpine:latest --output json | jq . > vuln_report.json

Example:

 ✔ Pulled image
 ✔ Loaded image alpine:latest
 ✔ Parsed image sha256:8d591b0b7dea080ea3be9e12ae563eebf9869168ffced1cb25b2470a3d9fe15e
 ✔ Cataloged contents 058c92d86112aa6f641b01ed238a07a3885b8c0815de3e423e5c5f789c398b45
   ├── ✔ Packages                        [15 packages]
   ├── ✔ File digests                    [82 files]
   ├── ✔ Executables                     [17 executables]
   └── ✔ File metadata                   [82 locations]
 ✔ Scanned for vulnerabilities     [6 vulnerability matches]
   ├── by severity: 0 critical, 0 high, 0 medium, 6 low, 0 negligible
   └── by status:   0 fixed, 6 not-fixed, 0 ignored

Create an HTML Vulnerability Report

4.2.2 - Vulnerability Database

Using the Grype Vulnerability Database

Introduction

Grype uses a locally cached database of known vulnerabilities when searching a container, directory, or SBOM for security vulnerabilities. Anchore collates vulnerability data from common feeds, and publishes that data online, at no cost to users.

Updating the local database

When Grype is launched, it checks for an existing vulnerability database, and looks for an updated one online. If available, Grype will automatically download the new database.

Users can manage the locally cached database with the grype db command:

Check and update the database

Manually checking for updates shouldn’t be necessary, due to Grype automatically doing this on launch. However, it is possible to force Grype to look for an updated vulnerability database.

grype db check

A message will indicate if no updates are available since the last download.

Installed DB version v6.0.2 was built on 2025-05-08T04:08:40Z
No update available

If the database is outdated, a message such as this will be displayed.

Installed DB version v6.0.2 was built on 2025-05-07T04:08:13Z
Updated DB version v6.0.2 was built on 2025-05-08T04:08:40Z
You can run 'grype db update' to update to the latest db
[0000] ERROR db upgrade available
grype db update

A short animation will show progress of downloading, uncompressing and hydrating (creating indexes on) the database. Then a message reporting the successful update will be displayed.

grype db update
 ✔ Vulnerability DB                [updated]
Vulnerability database updated to latest version!

4.2.3 - Data sources

Learn about the vulnerability data sources Grype uses for matching

Grype matches vulnerabilities by comparing package information from your software against vulnerability databases. Grype sources these databases from multiple upstream providers, each covering different operating systems and programming language ecosystems. This page documents each data source, what it covers, and how Grype interprets the data.

Quick reference

Language ecosystems

Ecosystem Data Source Vunnel provider
Composer (PHP) GitHub Security Advisories github
Dart GitHub Security Advisories github
Go GitHub Security Advisories github
Java (Maven) GitHub Security Advisories github
npm (JavaScript) GitHub Security Advisories github
NuGet (.NET) GitHub Security Advisories github
Python (PyPI) GitHub Security Advisories github
Ruby (RubyGems) GitHub Security Advisories github
Rust (crates.io) GitHub Security Advisories github
Swift GitHub Security Advisories github
GitHub Actions GitHub Security Advisories github
Various Bitnami Vulnerability Database bitnami

Operating systems

Operating System Supported Versions Data Source Vunnel provider
Ubuntu 12.04, 14.04, 16.04, 18.04,
20.04, 22.04, 24.04, 24.10,
25.04, 25.10
Ubuntu CVE Tracker ubuntu
Debian 7 (wheezy), 8 (jessie), 9 (stretch),
10 (buster), 11 (bullseye), 12 (bookworm),
13 (trixie), 14 (forky), 15 (duke),
unstable (sid)
Debian Security Tracker debian
Alpine Linux 3.2+, edge Alpine SecDB alpine
Red Hat Enterprise Linux 5, 6, 7, 8, 9 Red Hat Security Data API rhel
Amazon Linux 2, 2022, 2023 Amazon Linux Security Center amazon
Oracle Linux 5, 6, 7, 8, 9 Oracle Linux Security oracle
SUSE Linux Enterprise Server 11, 12, 15 SUSE Security OVAL sles
Wolfi Current Wolfi Security wolfi
Chainguard Current Chainguard Security chainguard
AlmaLinux 8, 9 AlmaLinux OSV Database alma
Rocky Linux 8, 9 Rocky Linux Apollo API rocky
CBL-Mariner 1.0, 2.0, 3.0 Microsoft CBL-Mariner OVAL mariner

Cross-cutting sources

The National Vulnerability Database (NVD) provides Common Vulnerabilities and Exposures (CVE) data that supplements ecosystem-specific sources. Grype uses the NVD CVE API 2.0 (Vunnel provider: nvd) to access vulnerability information across all ecosystems using Common Platform Enumeration (CPE) matching.

Language ecosystem providers

GitHub Security Advisories

Data source: GitHub Security Advisories

Vunnel provider: github

What it covers:

GitHub Security Advisories provides vulnerability data for multiple language ecosystems:

  • Composer (PHP) → composer
  • Dart → dart
  • Go → go
  • Java (Maven) → java
  • npm (JavaScript) → npm
  • NuGet (.NET) → nuget
  • Python (PyPI) → python
  • Ruby (RubyGems) → gem
  • Rust (crates.io) → rust
  • Swift → swift
  • GitHub Actions → github-action

How it works:

Grype retrieves vulnerability data from GitHub’s GraphQL Application Programming Interface (API). Each advisory includes a GitHub Security Advisories ID (GHSA-xxx) and may include associated CVE identifiers. The data includes both general vulnerabilities and malware classifications.

The provider downloads advisories in batches of 100 per GraphQL request and handles GitHub’s rate limiting by pausing when fewer than 10 API requests remain. For incremental updates, the provider uses an updatedSince timestamp parameter to fetch only advisories modified since the last update.

Assumptions and interpretation:

  • Severity mapping: GitHub provides four severity levels that map directly to Grype’s normalized scale:

    • LOW → Low
    • MODERATE → Medium
    • HIGH → High
    • CRITICAL → Critical
  • Version matching: GitHub provides version ranges in ecosystem-specific formats. For example, npm packages use semantic versioning (semver) syntax, while Python packages use PEP 440 version specifiers. Grype interprets these ranges according to each ecosystem’s version comparison rules.

  • CVSS scores: When available, Grype extracts and validates CVSS vector strings from the advisory data to provide detailed vulnerability scoring information.

  • Authentication: GitHub requires a personal access token for API access. Without proper authentication, data retrieval fails.

Bitnami Vulnerability Database

Data source: Bitnami Vulnerability Database

Vunnel provider: bitnami

What it covers:

The Bitnami Vulnerability Database contains vulnerability information for applications packaged by Bitnami. The data covers various language ecosystems and is stored in Open Source Vulnerability (OSV) format version 1.5.0.

How it works:

Grype clones the Bitnami VulnDB Git repository from the main branch and processes the OSV-formatted vulnerability records.

Assumptions and interpretation:

  • Data format: All vulnerability records follow the OSV schema, which provides a standardized structure for vulnerability information across different ecosystems.

  • Scope: The database focuses on vulnerabilities affecting Bitnami-packaged applications, which may include both upstream vulnerabilities and Bitnami-specific issues.

Operating system providers

Ubuntu Security Tracker

Data source: Ubuntu CVE Tracker

Vunnel provider: ubuntu

Supported versions:

  • 12.04 (precise)
  • 14.04 (trusty)
  • 16.04 (xenial)
  • 18.04 (bionic)
  • 20.04 (focal)
  • 22.04 (jammy)
  • 24.04 (noble)
  • 24.10 (oracular)
  • 25.04 (plucky)
  • 25.10 (questing)

Additional development and end-of-life releases are also supported.

How it works:

Grype clones the Ubuntu CVE Tracker Git repository and parses the tracking files that document vulnerability status for each Ubuntu release. The tracker includes patch states that indicate whether a package is vulnerable, fixed, or not affected.

For end-of-life Ubuntu releases, Grype examines the repository’s revision history to determine the final patch states before support ended.

Assumptions and interpretation:

  • Severity mapping: Ubuntu uses a six-level severity scale that maps to Grype’s normalized levels:

    • Untriaged → Unknown
    • Negligible → Negligible
    • Low → Low
    • Medium → Medium
    • High → High
    • Critical → Critical
  • Patch states: Ubuntu tracks vulnerabilities with several patch states:

    • DNE (Does Not Exist) → Package not affected because it doesn’t exist in this release
    • needs-triage → Vulnerability confirmed but not yet assessed
    • needed → Vulnerable, no fix available yet
    • released → Vulnerable, fix available at specified version
    • pending → Fix prepared but not yet released
    • active → Vulnerability being actively worked on
    • ignored → Vulnerability acknowledged but deliberately not fixed (not considered vulnerable for matching purposes)
  • Version format: Ubuntu uses dpkg version comparison rules for determining whether a package version is affected.

  • End-of-life handling: For releases that have reached end-of-life, Grype merges patch states from the repository’s revision history to capture the final vulnerability status.

  • Fix availability: When a patch state indicates released, Grype extracts the fix version from the tracking data. A fix version of “None” means the package is vulnerable with no fix available.

Debian Security Tracker

Data source: Debian Security Tracker

Vunnel provider: debian

Supported versions:

  • 7 (wheezy)
  • 8 (jessie)
  • 9 (stretch)
  • 10 (buster)
  • 11 (bullseye)
  • 12 (bookworm)
  • 13 (trixie)
  • 14 (forky)
  • 15 (duke)
  • unstable (sid)

How it works:

Grype retrieves vulnerability data from two Debian sources: a JSON feed from the Debian Security Tracker and Debian Security Advisory (DSA) lists. The provider combines information from both sources to build a complete picture of vulnerabilities affecting Debian packages.

Assumptions and interpretation:

  • Severity mapping: Debian uses an urgency-based severity system with some special notations:

    • unimportant → Negligible
    • low, low** → Low
    • medium, medium** → Medium
    • high, high** → High
    • When Debian doesn’t provide severity information, Grype falls back to NVD severity data if available
  • Version format: Debian uses dpkg version comparison rules, the same as Ubuntu.

  • Special version handling: A fix version of “0” indicates the package is not vulnerable in that particular Debian release.

  • Advisory metadata: When a DSA (Debian Security Advisory) exists for a vulnerability, Grype includes the DSA identifier and provides a link to the advisory.

  • Legacy data support: The provider can also process data from Debian’s previous feed service format to maintain historical vulnerability records.

Alpine SecDB

Data source: Alpine SecDB

Vunnel provider: alpine

Supported versions:

Alpine Linux 3.2 and newer, plus the edge (development) branch.

How it works:

Grype downloads YAML files from Alpine’s Security Database (SecDB) for each supported Alpine release. Each release has separate databases for the main and community package repositories. The provider parses the “secfixes” sections that map package versions to the CVE identifiers they fix.

Assumptions and interpretation:

  • Severity: Alpine’s SecDB does not include severity ratings in the source data. All Alpine vulnerabilities show as “Unknown” severity unless supplemented by data from other sources like NVD.

  • Version format: Alpine uses apk package version comparison rules.

  • Database types: Alpine maintains two package databases:

    • main → Core Alpine packages
    • community → Community-maintained packages

    Note: Alpine 3.2 does not have a community database (community repository support was added in 3.3).

  • Fix mapping: The secfixes section lists package versions and the CVE IDs they address. When a package version includes a fix for a CVE, Grype considers that version and all later versions non-vulnerable.

Red Hat Enterprise Linux

Data source: Red Hat Security Data API

Vunnel provider: rhel

Supported versions:

Red Hat Enterprise Linux 5, 6, 7, 8, 9 (RHEL 3 and 4 are skipped by default)

How it works:

Grype retrieves vulnerability data from Red Hat’s Common Vulnerabilities and Exposures (CVE) summary Application Programming Interface (API) and supplements it with detailed information from either Common Security Advisory Framework (CSAF) or Open Vulnerability and Assessment Language (OVAL) sources. You can configure which advisory format to use.

The provider performs a minimal initial download of CVE summaries, then fetches full CVE details only for relevant vulnerabilities. To avoid excessive API calls, the provider performs full synchronization at a configurable interval (default: 2 days) and uses incremental updates between full syncs.

Assumptions and interpretation:

  • RHSA source options: Red Hat Security Advisories (RHSA) are available in two formats:

    • CSAF (Common Security Advisory Framework) → Structured JSON format
    • OVAL (Open Vulnerability and Assessment Language) → XML format for automated assessment
  • Version format: Red Hat uses RPM version comparison rules.

  • Extended Update Support (EUS): The provider handles EUS versions, which receive extended security updates beyond the normal RHEL lifecycle.

  • Parallel processing: By default, Grype processes Red Hat data using 4 parallel workers to improve performance during large synchronizations.

Amazon Linux

Data source: Amazon Linux Security Center

Vunnel provider: amazon

Supported versions:

  • Amazon Linux 2
  • Amazon Linux 2022
  • Amazon Linux 2023

How it works:

Grype retrieves Amazon Linux Security Advisories (ALAS) from RSS feeds maintained for each Amazon Linux version. The provider parses the RSS feed to get advisory summaries, then scrapes the HTML pages for detailed package and vulnerability information.

Due to occasional HTTP 403 errors when accessing advisory pages, the provider tolerates up to 25 such errors by default before failing.

Assumptions and interpretation:

  • Severity mapping: Amazon Linux uses four severity levels:

    • low → Low
    • medium → Medium
    • important → High
    • critical → Critical
  • Version format: Amazon Linux uses RPM version comparison rules.

  • RSS feeds: Each Amazon Linux version has its own RSS feed URL:

    • AL2: https://alas.aws.amazon.com/AL2/alas.rss
    • AL2022: https://alas.aws.amazon.com/AL2022/alas.rss
    • AL2023: https://alas.aws.amazon.com/AL2023/alas.rss

Oracle Linux

Data source: Oracle Linux Security

Vunnel provider: oracle

Supported versions:

Oracle Linux 5, 6, 7, 8, 9

How it works:

Grype downloads a compressed OVAL XML file that contains all Enterprise Linux Security Advisories (ELSA) for Oracle Linux. The provider parses this XML file to extract vulnerability and package information.

Assumptions and interpretation:

  • Severity mapping: Oracle Linux uses a five-level severity scale:

    • n/a → Negligible
    • low → Low
    • moderate → Medium
    • important → High
    • critical → Critical
  • Version format: Oracle Linux uses RPM version comparison rules.

  • Ksplice filtering: The provider filters out packages related to Ksplice (Oracle’s kernel live-patching technology) because these packages are not fully supported for vulnerability matching.

  • OVAL format: The data comes from a single compressed XML file: https://linux.oracle.com/security/oval/com.oracle.elsa-all.xml.bz2

SUSE Linux Enterprise Server

Data source: SUSE Security OVAL

Vunnel provider: sles

Supported versions:

SUSE Linux Enterprise Server 11, 12, 15 (configurable, defaults to these three versions)

How it works:

Grype downloads OVAL XML files from SUSE’s FTP server, with one file per major SLES version. Each file contains vulnerability definitions and affected package information.

Assumptions and interpretation:

  • Severity mapping: SUSE uses multiple terms that map to Grype’s normalized levels:

    • low → Low
    • moderate → Medium
    • medium → Medium
    • high → High
    • important → High
    • critical → Critical
  • Version format: SUSE uses RPM version comparison rules.

  • URL template: OVAL files follow this pattern: https://ftp.suse.com/pub/projects/security/oval/suse.linux.enterprise.server.{version}.xml.bz2

Wolfi

Data source: Wolfi Security

Vunnel provider: wolfi

What it covers:

Wolfi is a Linux distribution (undistro) designed for containers. The security feed covers packages in the Wolfi OS.

How it works:

Grype downloads a JSON file from Wolfi’s package repository that contains security information for all Wolfi packages.

Assumptions and interpretation:

  • Version format: Wolfi uses apk package version comparison rules (similar to Alpine).

Chainguard

Data source: Chainguard Security

Vunnel provider: chainguard

What it covers:

Chainguard Images are minimal container images based on Wolfi. The security feed covers packages used in Chainguard Images.

How it works:

Grype downloads a JSON file from Chainguard’s package repository that contains security information for packages in Chainguard Images.

Assumptions and interpretation:

  • Version format: Chainguard uses apk package version comparison rules (same as Wolfi and Alpine).

AlmaLinux

Data source: AlmaLinux OSV Database

Vunnel provider: alma

Supported versions:

AlmaLinux 8, 9

How it works:

Grype clones the AlmaLinux OSV Database Git repository and processes vulnerability records stored in Open Source Vulnerability (OSV) format.

Assumptions and interpretation:

  • Data format: All vulnerability records follow the OSV schema.

  • Version format: AlmaLinux uses RPM version comparison rules.

Rocky Linux

Data source: Rocky Linux Apollo API

Vunnel provider: rocky

Supported versions:

Rocky Linux 8, 9

What it covers:

Rocky Linux is a community enterprise operating system designed to be downstream compatible with Red Hat Enterprise Linux.

How it works:

Grype fetches vulnerability data for Rocky Linux from the Rocky Linux Apollo API, which provides records in Open Source Vulnerability (OSV) format.

Assumptions and interpretation:

  • Data format: All vulnerability records follow the OSV schema.

  • Ecosystem normalization: The provider normalizes ecosystem identifiers from the OSV format. For example, “Rocky Linux:8” becomes “rocky:8” for consistency with Grype’s internal ecosystem naming.

  • Version format: Rocky Linux uses RPM version comparison rules.

CBL-Mariner

Data source: Microsoft CBL-Mariner OVAL

Vunnel provider: mariner

Supported versions:

CBL-Mariner 1.0, 2.0, 3.0

What it covers:

CBL-Mariner (Common Base Linux) is Microsoft’s internal Linux distribution, also available as an open source project.

How it works:

Grype downloads OVAL XML files for CBL-Mariner and parses them using the xsdata library. The provider processes rpminfo_test, rpminfo_object, and rpminfo_state elements to extract vulnerability and package information.

Assumptions and interpretation:

  • Version format: CBL-Mariner uses RPM version comparison rules.

  • OVAL processing: The provider handles standard OVAL XML structures to identify which package versions are affected by vulnerabilities.

Cross-cutting providers

National Vulnerability Database (NVD)

Data source: NVD CVE API 2.0

Vunnel provider: nvd

What it covers:

The National Vulnerability Database provides comprehensive Common Vulnerabilities and Exposures (CVE) data across all ecosystems. Unlike ecosystem-specific providers, NVD uses Common Platform Enumeration (CPE) matching to identify vulnerable software.

How it works:

Grype retrieves CVE data from the NVD API 2.0, which provides up to 2000 results per request. For initial synchronization, the provider downloads all CVEs. For subsequent updates, it uses the last modified timestamp to fetch only CVEs that changed since the previous update.

The provider caches input data in a SQLite database to improve performance across runs. It supports retry logic (10 retries by default) to handle transient API failures.

Assumptions and interpretation:

  • CPE matching: NVD identifies vulnerable software using CPE (Common Platform Enumeration) identifiers. A CPE describes a software product with vendor, product name, version, and other attributes. Grype matches packages against CPE patterns to determine vulnerability status.

  • Incremental updates: The provider uses lastModStartDate and lastModEndDate parameters to fetch only CVEs modified within a specific time range, reducing API calls and bandwidth.

  • API rate limits: NVD enforces rate limits on API requests. You can provide an API key to enable higher rate limits. Without an API key, you’re limited to the public rate limit.

  • Fix date enrichment: NVD data often lacks information about when fixes became available. Grype supplements NVD data with fix dates from external databases when available, improving the accuracy of vulnerability timelines.

  • CPE configuration overrides: The provider supports custom CPE configurations that can override or supplement the default CPE matching data from NVD.

  • Publication date ranges: When querying by publication date, the API enforces a maximum 120-day range per request. The provider automatically splits larger date ranges into multiple requests.

Relationship to other providers:

NVD serves as a cross-cutting data source that complements ecosystem-specific providers. When an ecosystem-specific provider lacks severity information (such as Alpine), Grype can fall back to NVD severity ratings. NVD is also essential for CVE-only lookups where you need to check for a specific CVE across all ecosystems.

Because NVD uses CPE matching rather than package manager metadata, it can identify vulnerabilities in software that doesn’t come from a package manager. However, ecosystem-specific sources typically provide more accurate and granular information for their respective ecosystems by using native package version information.

Common patterns across providers

Severity normalization

All vulnerability providers map their severity ratings to a common scale that Grype uses for reporting:

  • Unknown → Severity information not available
  • Negligible → Minimal or no practical impact
  • Low → Limited impact, typically requiring complex exploit conditions
  • Medium → Moderate impact, may require specific conditions
  • High → Serious impact, relatively easy to exploit
  • Critical → Severe impact, easily exploitable, or widespread effect

Different providers use different severity scales in their source data. For example, Amazon Linux uses “important” while Oracle Linux uses “important” with the same meaning (both map to High). Grype normalizes these provider-specific terms to ensure consistent severity reporting across all data sources.

When a provider doesn’t include severity information in their data, Grype may fall back to NVD severity ratings if available.

Version matching

Version matching rules depend on the package format:

DEB-based systems (Ubuntu, Debian):

These systems use dpkg version comparison rules, which handle Debian-specific version components like epochs and revisions. For example, 1:2.0-1 has an epoch of 1, making it newer than 2.0-1 despite appearing lower numerically.

RPM-based systems (RHEL, Amazon, Oracle, SLES, Mariner, Alma, Rocky):

These systems use RPM version comparison rules, which compare version strings segment by segment. RPM versions can include release numbers and distribution tags. For example, 1.2.3-4.el8 includes version 1.2.3, release 4, and distribution tag el8.

APK-based systems (Alpine, Wolfi, Chainguard):

These systems use Alpine package version rules, which follow a simpler numeric comparison scheme with support for suffix modifiers like -r1 for package revisions.

Language packages (GitHub):

Language ecosystems use their own version comparison rules:

  • npm uses semantic versioning (semver) with ranges like >=1.2.3 <2.0.0
  • Python uses PEP 440 version specifiers with ranges like >=1.2,<2.0
  • Ruby uses RubyGems version comparison
  • Maven uses Maven version ordering rules

Each ecosystem has its own syntax for expressing version ranges, and Grype interprets these ranges according to the ecosystem’s version comparison semantics.

Fix date enrichment

Many providers supplement vulnerability records with “fix available” dates, which indicate when a vulnerability fix first became available. This information establishes accurate vulnerability timelines.

Grype uses external databases (called “fixdaters”) to determine fix availability dates. These databases track when security advisories were published or when fixed package versions were released. The fix date information includes:

  • Date: When the fix became available
  • Kind: The type of evidence (such as “advisory” for security advisory publication dates or “snapshot” for package repository snapshots)

Fix dates improve matching accuracy by allowing Grype to determine whether a vulnerability existed in a package at a specific point in time.

Data freshness

Different providers use different strategies for keeping vulnerability data current:

Incremental updates:

Some providers support incremental updates that fetch only changed data since the last run:

  • GitHub Security Advisories: Uses an updatedSince timestamp parameter to fetch only advisories modified after a specific date
  • NVD: Uses lastModStartDate and lastModEndDate parameters to fetch only CVEs modified within a date range
  • Red Hat: Downloads minimal CVE summaries, then selectively fetches full CVE details for relevant vulnerabilities; performs full synchronization every 2 days by default

Full refresh:

Other providers re-download and re-process all data each run, though they may use caching to improve performance:

  • Git-based providers (Ubuntu, Bitnami, Alma): Clone the entire Git repository each run
  • Feed-based providers (Debian, Alpine, Oracle, SLES): Download complete feeds, which may be cached locally
  • RSS-based providers (Amazon): Parse RSS feeds and fetch advisory pages

The update strategy affects how quickly new vulnerability data appears in Grype. Providers with incremental updates can fetch recent changes more efficiently, while full refresh providers ensure complete data consistency at the cost of higher bandwidth usage.

4.2.4 - Database Publishing

Publishing the Grype Vulnerability Database

TODO

4.3 - License Scanning

Learn how to scan container images and filesystems for software licenses covering detection, compliance checking, and managing license obligations.

License scanning involves automatically identifying and analyzing the licenses associated with the various software components used in a project.

This is important because most software relies on third-party and open-source components, each with its own licensing terms that dictate how the software can be used, modified, and distributed, and failing to comply can lead to legal issues.

Grant is an open-source command-line tool designed to discover and report on the software licenses present in container images, SBOM documents, or filesystems. It helps users understand the licenses of their software dependencies and can check them against user-defined policies to ensure compliance.

4.3.1 - Getting Started

License Scanning Getting Started

Introduction

Grant searches SBOMs for licenses and the packages they belong to.

Install the latest Grant release

Grant is provided as a single compiled executable. Issue the command for your platform to download the latest release of Grant. The full list of official and community maintained packages can be found on the installation page.

curl -sSfL <a href="https://get.anchore.io/grant">https://get.anchore.io/grant</a> | sudo sh -s &ndash; -b /usr/local/bin
brew install grant
  1. Scan a container for all the licenses used
grant alpine:latest

Grant will produce a list of licenses.

* alpine:latest
  * license matches for rule: default-deny-all; matched with pattern *
    * Apache-2.0
    * BSD-2-Clause
    * GPL-2.0-only
    * GPL-2.0-or-later
    * MIT
    * MPL-2.0
    * Zlib
  1. Scan a container for OSI compliant licenses

Now we scan a different container, that contains some software that is distributed under non-OSI-compliant licenses.

grant check pytorch/pytorch:latest --osi-approved

Read more in our License Auditing User Guide.

4.4 - Private Registries

Configure authentication for scanning container images from private registries using credentials, registry tokens, and credential helpers.

The Anchore OSS tools analyze container images from private registries using multiple authentication methods. When a container runtime isn’t available, the tools use the go-containerregistry library to handle authentication directly with registries.

When using a container runtime explicitly (for instance, with the --from docker flag) the tools defer to the runtime’s authentication mechanisms. However, if the registry source is used, the tools use the Docker configuration file and any configured credential helpers to authenticate with the registry.

Registry tokens and personal access tokens

Many registries support personal access tokens (PATs) or registry tokens for authentication. Use docker login with your token, then the tools can use the cached credentials:

# GitHub Container Registry - create token at https://github.com/settings/tokens (needs read:packages scope)
docker login ghcr.io -u <username> -p <token>
syft ghcr.io/username/private-image:latest

# GitLab Container Registry - use deploy token or personal access token
docker login registry.gitlab.com -u <username> -p <token>
syft registry.gitlab.com/group/project/image:latest

The tools read credentials from ~/.docker/config.json, the same file Docker uses when you run docker login. This file can contain either basic authentication credentials or credential helper configurations.

Here are examples of what the config looks like if you are crafting it manually:

Basic authentication example:

{
  "auths": {
    "registry.example.com": {
      "username": "AzureDiamond",
      "password": "hunter2"
    }
  }
}

Token authentication example:

// token auth, where credentials are base64-encoded
{
  "auths": {
    "ghcr.io": {
      "auth": "dXNlcm5hb...m5h=="
    }
  }
}

By default, the tools look for credentials in ~/.docker/config.json. You can override this location using the DOCKER_CONFIG environment variable:

export DOCKER_CONFIG=/path/to/custom/config
syft registry.example.com/private/image:latest

You can also use this in a container:

docker run -v ./config.json:/auth/config.json -e "DOCKER_CONFIG=/auth" anchore/syft:latest <private_image>

Docker credential helpers

Docker credential helpers are specialized programs that securely store and retrieve registry credentials. They’re particularly useful for cloud provider registries that use dynamic, short-lived tokens.

Instead of storing passwords as plaintext in config.json, you configure helpers that generate credentials on-demand. This is facilitated by the google/go-containerregistry library.

Configuring credential helpers

Add credential helpers to your config.json:

{
  "credHelpers": {
    // using the docker-credential-gcr for Google Container Registry and Artifact Registry
    "gcr.io": "gcr",
    "us-docker.pkg.dev": "gcloud",

    // using the amazon-ecr-credential-helper for AWS Elastic Container Registry
    "123456789012.dkr.ecr.us-west-2.amazonaws.com": "ecr-login",

    // using the docker-credential-acr for Azure Container Registry
    "myregistry.azurecr.io": "acr"
  }
}

When the tools access these registries, they execute the corresponding helper program (for example, docker-credential-gcr, or more generically docker-credential-NAME where NAME is the config value) to obtain credentials.

For more information about Docker credential helpers for various cloud providers:

Within Kubernetes

When running the tools in Kubernetes and you need access to private registries, mount Docker credentials as a secret.

Create secret

Create a Kubernetes secret containing your Docker credentials. The key config.json is important—it becomes the filename when mounted into the pod. For more information about the credential file format, see the go-containerregistry config docs.

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: registry-config
  namespace: syft
data:
  config.json: <base64-encoded-config.json>

Create the secret:

# Base64 encode your config.json
cat ~/.docker/config.json | base64

# Apply the secret
kubectl apply -f secret.yaml

Configure pod

Configure your pod to use the credential secret. The DOCKER_CONFIG environment variable tells the tools where to look for credentials. Setting DOCKER_CONFIG=/config means the tools look for credentials at /config/config.json. This matches the secret key config.json we created above—when Kubernetes mounts secrets, each key becomes a file with that name.

The volumeMounts section mounts the secret to /config, and the volumes section references the secret created in the previous step.

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: syft-k8s-usage
spec:
  containers:
    - image: anchore/syft:latest
      name: syft-private-registry-demo
      env:
        - name: DOCKER_CONFIG
          value: /config
      volumeMounts:
        - mountPath: /config
          name: registry-config
          readOnly: true
      args:
        - <private-image>
  volumes:
    - name: registry-config
      secret:
        secretName: registry-config

Apply and check logs:

kubectl apply -f pod.yaml
kubectl logs syft-private-registry-demo

5 - Contributing

Guidelines for developing & contributing to Anchore Open Source projects

Anchore OSS Contribution Guidelines

Each tool has their own slightly different guide, linked below. However, some of the guidelines are common across all tools, and are shown in the next section, General Guidelines.

Tool-Specific Guides

User facing tools

  • Syft - SBOM generation tool and library
  • Grype - Vulnerability scanner
  • Grant - License search

Automation tools

Backend tools & libraries

  • Grype-DB - Vulnerability database creation
  • Vunnel - Collect vulnerability data from sources
  • Stereoscope - Container image processing library

General Guidelines

This document is the single source of truth for how to contribute to the code base. We’d love to accept your patches and contributions to this project. There are just a few small guidelines you need to follow.

Sign off your work

The sign-off is an added line at the end of the explanation for the commit, certifying that you wrote it or otherwise have the right to submit it as an open-source patch. By submitting a contribution, you agree to be bound by the terms of the DCO Version 1.1 and Apache License Version 2.0.

Signing off a commit certifies the below Developer’s Certificate of Origin (DCO):

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

   (a) The contribution was created in whole or in part by me and I
       have the right to submit it under the open source license
       indicated in the file; or

   (b) The contribution is based upon previous work that, to the best
       of my knowledge, is covered under an appropriate open source
       license and I have the right under that license to submit that
       work with modifications, whether created in whole or in part
       by me, under the same open source license (unless I am
       permitted to submit under a different license), as indicated
       in the file; or

   (c) The contribution was provided directly to me by some other
       person who certified (a), (b) or (c) and I have not modified
       it.

   (d) I understand and agree that this project and the contribution
       are public and that a record of the contribution (including all
       personal information I submit with it, including my sign-off) is
       maintained indefinitely and may be redistributed consistent with
       this project or the open source license(s) involved.

All contributions to this project are licensed under the Apache License Version 2.0, January 2004.

When committing your change, you can add the required line manually so that it looks like this:

Signed-off-by: John Doe <john.doe@example.com>

Creating a signed-off commit is then possible with -s or --signoff:

git commit -s -m "this is a commit message"

To double-check that the commit was signed-off, look at the log output:

$ git log -1
commit 37ceh170e4hb283bb73d958f2036ee5k07e7fde7 (HEAD -> issue-35, origin/main, main)
Author: John Doe <john.doe@example.com>
Date:   Mon Aug 1 11:27:13 2020 -0400

    this is a commit message

    Signed-off-by: John Doe <john.doe@example.com>

Test your changes

This project has a Makefile which includes many helpers running both unit and integration tests. You can run make help to see all the options. Although PRs will have automatic checks for these, it is useful to run them locally, ensuring they pass before submitting changes. Ensure you’ve bootstrapped once before running tests:

make bootstrap

You only need to bootstrap once. After the bootstrap process, you can run the tests as many times as needed:

make unit
make integration

You can also run make all to run a more extensive test suite, but there is additional configuration that will be needed for those tests to run correctly. We will not cover the extra steps here.

Pull Request

If you made it this far and all the tests are passing, it’s time to submit a Pull Request (PR) for the project. Submitting a PR is always a scary moment as what happens next can be an unknown. The projects strive to be easy to work with, we appreciate all contributions. Nobody is going to yell at you or try to make you feel bad. We love contributions and know how scary that first PR can be.

PR Title and Description

Just like the commit title and description mentioned above, the PR title and description is very important for letting others know what’s happening. Please include any details you think a reviewer will need to more properly review your PR.

A PR that is very large or poorly described has a higher likelihood of being pushed to the end of the list. Reviewers like PRs they can understand and quickly review.

What to expect next

Please be patient with the project. We try to review PRs in a timely manner, but this is highly dependent on all the other tasks we have going on. It’s OK to ask for a status update every week or two, it’s not OK to ask for a status update every day.

It’s very likely the reviewer will have questions and suggestions for changes to your PR. If your changes don’t match the current style and flow of the other code, expect a request to change what you’ve done.

Document your changes

And lastly, when proposed changes are modifying user-facing functionality or output, it is expected the PR will include updates to the documentation as well. Our projects are not heavy on documentation. This will mostly be updating the README and help for the tool.

If nobody knows new features exist, they can’t use them!

5.1 - Syft

Developer guidelines when contributing to Syft

We welcome contributions to the project! There are a few useful things to know before diving into the codebase.

Do also take note of the General Guidelines that apply accross all Anchore Open Source projects.

Getting started

In order to test and develop in the Syft repo you will need the following dependencies installed:

  • Golang
  • docker
  • make
  • Python (>= 3.9)

Docker settings for getting started

Make sure you’ve updated your docker settings so the default docker socket path is available.

Go to:

docker -> settings -> advanced

Make sure:

Allow the default Docker socket to be used

is checked.

Also double check that the docker context being used is the default context. If it is not, run:

docker context use default

After cloning the following step can help you get setup:

  1. run make bootstrap to download go mod dependencies, create the /.tmp dir, and download helper utilities.
  2. run make to view the selection of developer commands in the Makefile
  3. run make build to build the release snapshot binaries and packages
  4. for an even quicker start you can run go run cmd/syft/main.go to print the syft help.
    • this command go run cmd/syft/main.go alpine:latest will compile and run syft against alpine:latest
  5. view the README or syft help output for more output options

The main make tasks for common static analysis and testing are lint, format, lint-fix, unit, integration, and cli.

See make help for all the current make tasks.

Internal Artifactory Settings

Not always applicable

Some companies have Artifactory setup internally as a solution for sourcing secure dependencies. If you’re seeing an issue where the unit tests won’t run because of the below error then this section might be relevant for your use case.

[ERROR] [ERROR] Some problems were encountered while processing the POMs

If you’re dealing with an issue where the unit tests will not pull/build certain java fixtures check some of these settings:

  • a settings.xml file should be available to help you communicate with your internal artifactory deployment
  • this can be moved to syft/pkg/cataloger/java/test-fixtures/java-builds/example-jenkins-plugin/ to help build the unit test-fixtures
  • you’ll also want to modify the build-example-jenkins-plugin.sh to use settings.xml

For more information on this setup and troubleshooting see issue 1895

Architecture

At a high level, this is the package structure of syft:

./cmd/syft/
│   ├── cli/
│   │   ├── cli.go          // where all commands are wired up
│   │   ├── commands/       // all command implementations
│   │   ├── options/        // all command flags and configuration options
│   │   └── ui/             // all handlers for events that are shown on the UI
│   └── main.go             // entrypoint for the application
└── syft/                   // the "core" syft library
    ├── format/             // contains code to encode or decode to and from SBOM formats
    ├── pkg/                // contains code to catalog packages from a source
    ├── sbom/               // contains the definition of an SBOM
    └── source/             // contains code to create a source object for some input type (e.g. container image, directory, etc)

Syft’s core library is implemented in the syft package and subpackages, where the major packages are:

  • the syft/source package produces a source.Source object that can be used to catalog a directory, container, and other source types.
  • the syft package contains a single function that can take a source.Source object and catalog it, producing an sbom.SBOM object
  • the syft/format package contains the ability to encode and decode SBOMs to and from different SBOM formats (such as SPDX and CycloneDX)

The cmd package at the highest level execution flow wires up spf13/cobra commands for execution in the main application:

sequenceDiagram
    participant main as cmd/syft/main
    participant cli as cli.New()
    participant root as root.Execute()
    participant cmd as <command>.Execute()

    main->>+cli:

    Note right of cli: wire ALL CLI commands
    Note right of cli: add flags for ALL commands

    cli-->>-main:  root command

    main->>+root:
    root->>+cmd:
    cmd-->>-root: (error)

    root-->>-main: (error)

    Note right of cmd: Execute SINGLE command from USER

The packages command uses the core library to generate an SBOM for the given user input:

sequenceDiagram
    participant source as source.New(ubuntu:latest)
    participant sbom as sbom.SBOM
    participant catalog as syft.CatalogPackages(src)
    participant encoder as syft.Encode(sbom, format)

    Note right of source: use "ubuntu:latest" as SBOM input

    source-->>+sbom: add source to SBOM struct
    source-->>+catalog: pass src to generate catalog
    catalog-->-sbom: add cataloging results onto SBOM
    sbom-->>encoder: pass SBOM and format desired to syft encoder
    encoder-->>source: return bytes that are the SBOM of the original input

    Note right of catalog: cataloger configuration is done based on src

Additionally, here is a gist of using syft as a library to generate a SBOM for a docker image.

pkg.Package object

The pkg.Package object is a core data structure that represents a software package. Fields like name and version probably don’t need a detailed explanation, but some of the other fields are worth a quick overview:

  • FoundBy: the name of the cataloger that discovered this package (e.g. python-pip-cataloger).
  • Locations: these are the set of paths and layer ids that were parsed to discover this package (e.g. python-pip-cataloger).
  • Language: the language of the package (e.g. python).
  • Type: this is a high-level categorization of the ecosystem the package resides in. For instance, even if the package is a egg, wheel, or requirements.txt reference, it is still logically a “python” package. Not all package types align with a language (e.g. rpm) but it is common.
  • Metadata: specialized data for specific location(s) parsed. We should try and raise up as much raw information that seems useful. As a rule of thumb the object here should be as flat as possible and use the raw names and values from the underlying source material parsed.

When pkg.Package is serialized an additional MetadataType is shown. This is a label that helps consumers understand the datashape of the Metadata field.

By convention the MetadataType value should follow these rules of thumb:

  • Only use lowercase letters, numbers, and hyphens. Use hyphens to separate words.
  • Try to anchor the name in the ecosystem, language, or packaging tooling it belongs to. For a package manager for a language ecosystem the language, framework or runtime should be used as a prefix. For instance pubspec-lock is an OK name, but dart-pubspec-lock is better. For an OS package manager this is not necessary (e.g. apk-db-entry is a good name, but alpine-apk-db-entry is not since alpine and the a in apk is redundant).
  • Be as specific as possible to what the data represents. For instance ruby-gem is NOT a good MetadataType value, but ruby-gemspec is. Why? Ruby gem information can come from a gemspec file or a Gemfile.lock, which are very different. The latter name provides more context as to what to expect.
  • Should describe WHAT the data is, NOT HOW it’s used. For instance r-description-installed-file is NOT a good MetadataType value since it’s trying to convey that we use the DESCRIPTION file in the R ecosystem to detect installed packages. Instead simply describe what the DESCRIPTION file is itself without context of how it’s used: r-description.
  • Use the lock suffix to distinct between manifest files that loosely describe package version requirements vs files that strongly specify one and only one version of a package (“lock” files). These should only be used with respect to package managers that have the guide and lock distinction, but would not be appropriate otherwise (e.g. rpm does not have a guide vs lock, so lock should NOT be used to describe a db entry).
  • Use the archive suffix to indicate a package archive (e.g. rpm file, apk file, etc) that describes the contents of the package. For example an RPM file that was cataloged would have a rpm-archive metadata type (not to be confused with an RPM DB record entry which would be rpm-db-entry).
  • Use the entry suffix to indicate information about a package that was found as a single entry within file that has multiple package entries. If the entry was found within a DB or a flat-file store for an OS package manager, you should use db-entry.
  • Should NOT contain the phrase package, though exceptions are allowed (say if the canonical name literally has the phrase package in it).
  • Should NOT contain have a file suffix unless the canonical name has the term “file”, such as a pipfile or gemfile. An example of a bad name for this rule isruby-gemspec-file; a better name would be ruby-gemspec.
  • Should NOT contain the exact filename+extensions. For instance pipfile.lock shouldn’t really be in the name, instead try and describe what the file is: python-pipfile-lock (but shouldn’t this be python-pip-lock you might ask? No, since the pip package manger is not related to the pipfile project).
  • Should NOT contain the phrase metadata, unless the canonical name has this term.
  • Should represent a single use case. For example, trying to describe Hackage metadata with a single HackageMetadata struct (and thus MetadataType) is not allowed since it represents 3 mutually exclusive use cases: representing a stack.yaml, stack.lock, or cabal.project file. Instead, each of these should have their own struct types and MetadataType values.

There are other cases that are not covered by these rules… and that’s ok! The goal is to provide a consistent naming scheme that is easy to understand and use when it’s applicable. If the rules do not exactly apply in your situation then just use your best judgement (or amend these rules as needed whe new common cases come up).

What if the underlying parsed data represents multiple files? There are two approaches to this:

  • use the primary file to represent all the data. For instance, though the dpkg-cataloger looks at multiple files to get all information about a package, it’s the status file that gets represented.
  • nest each individual file’s data under the Metadata field. For instance, the java-archive-cataloger may find information from on or all of the files: pom.xml, pom.properties, and MANIFEST.MF. However, the metadata is simply `java-metadata’ with each possibility as a nested optional field.

Syft Catalogers

Catalogers are the way in which syft is able to identify and construct packages given a set a targeted list of files. For example, a cataloger can ask syft for all package-lock.json files in order to parse and raise up javascript packages (see how file globs and file parser functions are used for a quick example).

From a high level catalogers have the following properties:

  • They are independent from one another. The java cataloger has no idea of the processes, assumptions, or results of the python cataloger, for example.

  • They do not know what source is being analyzed. Are we analyzing a local directory? an image? if so, the squashed representation or all layers? The catalogers do not know the answers to these questions. Only that there is an interface to query for file paths and contents from an underlying “source” being scanned.

  • Packages created by the cataloger should not be mutated after they are created. There is one exception made for adding CPEs to a package after the cataloging phase, but that will most likely be moved back into the cataloger in the future.

Cataloger names should be unique and named with the following rules of thumb in mind:

  • Must end with -cataloger
  • Use lowercase letters, numbers, and hyphens only
  • Use hyphens to separate words
  • Catalogers for language ecosystems should start with the language name (e.g. python- for a cataloger that raises up python packages)
  • Distinct between when the cataloger is searching for evidence of installed packages vs declared packages. For example, there are currently two different gemspec-based catalogers, the ruby-gemspec-cataloger and ruby-installed-gemspec-cataloger, where the latter requires that the gemspec is found within a specifications directory (which means it was installed, not just at the root of a source repo).

Building a new Cataloger

Catalogers must fulfill the pkg.Cataloger interface in order to add packages to the SBOM. All catalogers should be added to:

For reference, catalogers are invoked within syft one after the other, and can be invoked in parallel.

generic.NewCataloger is an abstraction syft used to make writing common components easier (see the apkdb cataloger for example usage). It takes the following information as input:

  • A catalogerName to identify the cataloger uniquely among all other catalogers.
  • Pairs of file globs as well as parser functions to parse those files. These parser functions return a slice of pkg.Package as well as a slice of artifact.Relationship to describe how the returned packages are related. See this the apkdb cataloger parser function as an example.

Identified packages share a common pkg.Package struct so be sure that when the new cataloger is constructing a new package it is using the Package struct. If you want to return more information than what is available on the pkg.Package struct then you can do so in the pkg.Package.Metadata section of the struct, which is unique for each pkg.Type. See the pkg package for examples of the different metadata types that are supported today. These are plugged into the MetadataType and Metadata fields in the above struct. MetadataType informs which type is being used. Metadata is an interface converted to that type.

Finally, here is an example of where the package construction is done within the apk cataloger:

Interested in building a new cataloger? Checkout the list of issues with the new-cataloger label! If you have questions about implementing a cataloger feel free to file an issue or reach out to us on discourse!

Searching for files

All catalogers are provided an instance of the file.Resolver to interface with the image and search for files. The implementations for these abstractions leverage stereoscope in order to perform searching. Here is a rough outline how that works:

  1. a stereoscope file.Index is searched based on the input given (a path, glob, or MIME type). The index is relatively fast to search, but requires results to be filtered down to the files that exist in the specific layer(s) of interest. This is done automatically by the filetree.Searcher abstraction. This abstraction will fallback to searching directly against the raw filetree.FileTree if the index does not contain the file(s) of interest. Note: the filetree.Searcher is used by the file.Resolver abstraction.
  2. Once the set of files are returned from the filetree.Searcher the results are filtered down further to return the most unique file results. For example, you may have requested for files by a glob that returns multiple results. These results are filtered down to deduplicate by real files, so if a result contains two references to the same file, say one accessed via symlink and one accessed via the real path, then the real path reference is returned and the symlink reference is filtered out. If both were accessed by symlink then the first (by lexical order) is returned. This is done automatically by the file.Resolver abstraction.
  3. By the time results reach the pkg.Cataloger you are guaranteed to have a set of unique files that exist in the layer(s) of interest (relative to what the resolver supports).

Testing

Testing commands

  • make help shows a list of available commands
  • make unit, make integration, make cli, and make acceptance run those test suites (see below)
  • make test runs all those tests (and is therefore pretty slow)
  • make fixtures clears and re-fetches all test fixtures.
  • go test ./syft/pkg/ for example can test particular packages, assuming fixtures are already made
  • make clean-cache cleans all test cache. Note that subsequent test runs will be slower after this

Levels of testing

  • unit: The default level of test which is distributed throughout the repo are unit tests. Any _test.go file that does not reside somewhere within the /test directory is a unit test. Other forms of testing should be organized in the /test directory. These tests should focus on correctness of functionality in depth. % test coverage metrics only considers unit tests and no other forms of testing.

  • integration: located within cmd/syft/internal/test/integration, these tests focus on the behavior surfaced by the common library entrypoints from the syft package and make light assertions about the results surfaced. Additionally, these tests tend to make diversity assertions for enum-like objects, ensuring that as enum values are added to a definition that integration tests will automatically fail if no test attempts to use that enum value. For more details see the “Data diversity and freshness assertions” section below.

  • cli: located with in test/cli, these are tests that test the correctness of application behavior from a snapshot build. This should be used in cases where a unit or integration test will not do or if you are looking for in-depth testing of code in the cmd/ package (such as testing the proper behavior of application configuration, CLI switches, and glue code before syft library calls).

  • acceptance: located within test/compare and test/install, these are smoke-like tests that ensure that application packaging and installation works as expected. For example, during release we provide RPM packages as a download artifact. We also have an accompanying RPM acceptance test that installs the RPM from a snapshot build and ensures the output of a syft invocation matches canned expected output. New acceptance tests should be added for each release artifact and architecture supported (when possible).

Data diversity and freshness assertions

It is important that tests against the codebase are flexible enough to begin failing when they do not cover “enough” of the objects under test. “Cover” in this case does not mean that some percentage of the code has been executed during testing, but instead that there is enough diversity of data input reflected in testing relative to the definitions available.

For instance, consider an enum-like value like so:

type Language string

const (
  Java            Language = "java"
  JavaScript      Language = "javascript"
  Python          Language = "python"
  Ruby            Language = "ruby"
  Go              Language = "go"
)

Say we have a test that exercises all the languages defined today:

func TestCatalogPackages(t *testing.T) {
  testTable := []struct {
    // ... the set of test cases that test all languages
  }
  for _, test := range cases {
    t.Run(test.name, func (t *testing.T) {
      // use inputFixturePath and assert that syft.CatalogPackages() returns the set of expected Package objects
      // ...
    })
  }
}

Where each test case has a inputFixturePath that would result with packages from each language. This test is brittle since it does not assert that all languages were exercised directly and future modifications (such as adding a new language) won’t be covered by any test cases.

To address this the enum-like object should have a definition of all objects that can be used in testing:

type Language string

// const( Java Language = ..., ... )

var AllLanguages = []Language{
 Java,
 JavaScript,
 Python,
 Ruby,
 Go,
 Rust,
}

Allowing testing to automatically fail when adding a new language:

func TestCatalogPackages(t *testing.T) {
  testTable := []struct {
   // ... the set of test cases that (hopefully) covers all languages
  }

  // new stuff...
  observedLanguages := strset.New()

  for _, test := range cases {
    t.Run(test.name, func (t *testing.T) {
      // use inputFixturePath and assert that syft.CatalogPackages() returns the set of expected Package objects
     // ...

     // new stuff...
     for _, actualPkg := range actual {
        observedLanguages.Add(string(actualPkg.Language))
     }

    })
  }

   // new stuff...
  for _, expectedLanguage := range pkg.AllLanguages {
    if  !observedLanguages.Contains(expectedLanguage) {
      t.Errorf("failed to test language=%q", expectedLanguage)
    }
  }
}

This is a better test since it will fail when someone adds a new language but fails to write a test case that should exercise that new language. This method is ideal for integration-level testing, where testing correctness in depth is not needed (that is what unit tests are for) but instead testing in breadth to ensure that units are well integrated.

A similar case can be made for data freshness; if the quality of the results will be diminished if the input data is not kept up to date then a test should be written (when possible) to assert any input data is not stale.

An example of this is the static list of licenses that is stored in internal/spdxlicense for use by the SPDX presenters. This list is updated and published periodically by an external group and syft can grab and update this list by running go generate ./... from the root of the repo.

An integration test has been written to grabs the latest license list version externally and compares that version with the version generated in the codebase. If they differ, the test fails, indicating to someone that there is an action needed to update it.

_The key takeaway is to try and write tests that fail when data assumptions change and not just when code changes._

Snapshot tests

The format objects make a lot of use of “snapshot” testing, where you save the expected output bytes from a call into the git repository and during testing make a comparison of the actual bytes from the subject under test with the golden copy saved in the repo. The “golden” files are stored in the test-fixtures/snapshot directory relative to the go package under test and should always be updated by invoking go test on the specific test file with a specific CLI update flag provided.

Many of the Format tests make use of this approach, where the raw SBOM report is saved in the repo and the test compares that SBOM with what is generated from the latest presenter code. The following command can be used to update the golden files for the various snapshot tests:

make update-format-golden-files

These flags are defined at the top of the test files that have tests that use the snapshot files.

Snapshot testing is only as good as the manual verification of the golden snapshot file saved to the repo! Be careful and diligent when updating these files.

5.2 - Grype

Developer guidelines when contributing to Grype

There are a few useful things to know before diving into the codebase. This project depends on a few things being available like a vulnerability database, which you might want to create manually instead of retrieving a released version.

Do also take note of the General Guidelines that apply accross all Anchore Open Source projects.

Getting started

After cloning do the following:

  1. run go build ./cmd/grype to get a binary named main from the source (use -o <name> to get a differently named binary), or optionally go run ./cmd/grype to run from source.

In order to run tests and build all artifacts:

  1. run make bootstrap to download go mod dependencies, create the /.tmp dir, and download helper utilities (this only needs to be done once or when build tools are updated).
  2. run make to run linting, tests, and other verifications to make certain everything is working alright.

The main make tasks for common static analysis and testing are lint, format, lint-fix, unit, and integration.

See make help for all the current make tasks.

Relationship to Syft

Grype uses Syft as a library for all-things related to obtaining and parsing the given scan target (pulling container images, parsing container images, indexing directories, cataloging packages, etc). Releases of Grype should always use released versions of Syft (commits that are tagged and show up in the GitHub releases page). However, continually integrating unreleased Syft changes into Grype incrementally is encouraged (e.g. go get github.com/anchore/syft@main) as long as by the time a release is cut the Syft version is updated to a released version (e.g. go get github.com/anchore/syft@v<semantic-version>).

Inspecting the database

The currently supported database format is Sqlite3. Install sqlite3 in your system and ensure that the sqlite3 executable is available in your path. Ask grype about the location of the database, which will be different depending on the operating system:

$ go run ./cmd/grype db status
Location:  /Users/alfredo/Library/Caches/grype/db
Built:  2020-07-31 08:18:29 +0000 UTC
Current DB Version:  1
Require DB Version:  1
Status: Valid

The database is located within the XDG_CACHE_HOME path. To verify the database filename, list that path:

# OSX-specific path
$ ls -alh  /Users/alfredo/Library/Caches/grype/db
total 445392
drwxr-xr-x  4 alfredo  staff   128B Jul 31 09:27 .
drwxr-xr-x  3 alfredo  staff    96B Jul 31 09:27 ..
-rw-------  1 alfredo  staff   139B Jul 31 09:27 metadata.json
-rw-r--r--  1 alfredo  staff   217M Jul 31 09:27 vulnerability.db

Next, open the vulnerability.db with sqlite3:

sqlite3 /Users/alfredo/Library/Caches/grype/db/vulnerability.db

To make the reporting from Sqlite3 easier to read, enable the following:

sqlite> .mode column
sqlite> .headers on

List the tables:

sqlite> .tables
id                      vulnerability           vulnerability_metadata

In this example you retrieve a specific vulnerability from the nvd namespace:

sqlite> select * from vulnerability where (namespace="nvd" and package_name="libvncserver") limit 1;
id             record_source  package_name  namespace   version_constraint  version_format  cpes                                                         proxy_vulnerabilities
-------------  -------------  ------------  ----------  ------------------  --------------  -----------------------------------------------------------  ---------------------
CVE-2006-2450                 libvncserver  nvd         = 0.7.1             unknown         ["cpe:2.3:a:libvncserver:libvncserver:0.7.1:*:*:*:*:*:*:*"]  []

5.3 - Grant

Developer guidelines when contributing to Grant

We welcome contributions to the project! There are a few useful things to know before diving into the codebase.

Do also take note of the General Guidelines that apply accross all Anchore Open Source projects.

Getting Started

After pulling the repository, you can get started by running the following command to install the necessary dependencies and build grant from source

make

After building the project, you can run the following command to run the newly built binary

./snapshot/<os>-build_<>os_<arch>/grant

Keep in mind the build artifacts are placed in the snapshot directory and built for each supported platform so choose the appropriate binary for your platform.

If you just want to run the project with any local changes you have made, you can run the following command:

go run cmd/grant/main.go

Testing

You can run the tests for the project by running the following command:

make test

Linting

You can run the linter for the project by running the following command:

make static-analysis

Making a PR

Just fork the repository, make your changes on a branch, and submit a PR. We will review your changes and merge them if they are good to go.

When making a PR, please make sure to include a description of the changes you have made and the reasoning behind them. If you are adding a new feature, please include tests for the new feature. If you are fixing a bug, please include a test that reproduces the bug and ensure that the test passes after your changes.

5.4 - Grype-DB

Developer guidelines when contributing to Grype-DB

We welcome contributions to the project! There are a few useful things to know before diving into the codebase.

Do also take note of the General Guidelines that apply accross all Anchore Open Source projects.

Getting started

This codebase is primarily Go, however, there are also Python scripts critical to the daily DB publishing process as well as acceptance testing. You will require the following:

  • Python 3.8+ installed on your system. Consider using pyenv if you do not have a preference for managing python interpreter installations.

  • zstd binary utility if you are packaging v6+ DB schemas

  • (optional) xz binary utility if you have specifically overridden the package command options

  • Poetry installed for dependency and virtualenv management for python dependencies, to install:

    curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
    

To download go tooling used for static analysis and dependent go modules run the following:

make bootstrap

Getting an initial vulnerability data cache

In order to build a grype DB you will need a local cache of vulnerability data:

make download-all-provider-cache

This will populate the ./data directory locally with everything needed to run grype-db build (without needing to run grype-db pull).

Running tests

To unit test the Go code and unit test the publisher python scripts:

make unit

To verify that all supported schema versions interop with grype run:

make acceptance
# Note: this may take a while... go make some coffee.

The main make tasks for common static analysis functions are lint, format, lint-fix, unit, cli.

See make help for all the current make tasks.

Create a new DB schema

  1. Create a new v# schema package in the grype repo (within pkg/db)
  2. Create a new v# schema package in the grype-db repo (use the bump-schema.py helper script) that uses the new changes from grype-db
  3. Modify the manager/src/grype_db_manager/data/schema-info.json to pin the last-latest version to a specific version of grype and add the new schema version pinned to the “main” branch of grype (or a development branch)
  4. Update all references in grype to use the new schema
  5. Use the Staging DB Publisher workflow to test your DB changes with grype in a flow similar to the daily DB publisher workflow

Making a staging DB

While developing a new schema version it may be useful to get a DB built for you by the Staging DB Publisher GitHub Actions workflow. This code exercises the same code as the Daily DB Publisher, with the exception that only a single schema is built and is validated against a given development branch of grype. When these DBs are published you can point grype at the proper listing file like so:

GRYPE_DB_UPDATE_URL=https://toolbox-data.anchore.io/grype/staging-databases/listing.json grype centos:8 ...

Architecture

grype-db is essentially an application that extracts information from upstream vulnerability data providers, transforms it into smaller records targeted for grype consumption, and loads the individual records into a new SQLite DB.

~~~~~ "Pull" ~~~~~      ~~~~~~~~~~~~~~~~~~ "Build" ~~~~~~~~~~~~~~~~     ~~ "Package" ~~

┌─────────────────┐     ┌───────────────────┐     ┌───────────────┐     ┌─────────────┐
│ Pull vuln data  │     │ Transform entries │     │ Load entries  │     │ Package DB  │
│ from upstream   ├────►│                   ├────►│ into new DB   ├────►│             │
└─────────────────┘     └───────────────────┘     └───────────────┘     └─────────────┘

What makes grype-db a little more unique than a typical ETL job is the extra responsibility of needing to transform the most recent vulnerability data shape (defined in the vunnel repo) to all supported DB schema versions. From the perspective of the Daily DB Publisher workflow, (abridged) execution looks something like this:

 ┌─────────────────┐          ┌──────────────┐     ┌────────────────┐
 │ Pull vuln data  ├────┬────►│ Build V1 DB  │────►│ Package V1 DB  │ ...
 └─────────────────┘    │     └──────────────┘     └────────────────┘
                        │     ┌──────────────┐     ┌────────────────┐
                        ├────►│ Build V2 DB  │────►│ Package V2 DB  │ ...
                        │     └──────────────┘     └────────────────┘
                        │     ┌──────────────┐     ┌────────────────┐
                        ├────►│ Build V3 DB  │────►│ Package V3 DB  │ ...
                        │     └──────────────┘     └────────────────┘
                        ...

In order to support multiple DB schemas easily from a code-organization perspective the following abstractions exist:

  • Provider: responsible for providing raw vulnerability data files that are cached locally for later processing.

  • Processor: responsible for unmarshalling any entries given by the Provider, passing them into Transformers, and returning any resulting entries. Note: the object definition is schema-agnostic but instances are schema-specific since Transformers are dependency-injected into this object.

  • Transformer: Takes raw data entries of a specific vunnel-defined schema and transforms the data into schema-specific entries to later be written to the database. Note: the object definition is schema-specific, encapsulating grypeDB/v# specific objects within schema-agnostic Entry objects.

  • Entry: Encapsulates schema-specific database records produced by Processors/Transformers (from the provider data) and accepted by Writers.

  • Writer: Takes Entry objects and writes them to a backing store (today a SQLite database). Note: the object definition is schema-specific and typically references grypeDB/v# schema-specific writers.

All the above abstractions are defined in the pkg/data Go package and are used together commonly in the following flow:

                       ┌────────────────────────────────────────────┐
                cache  │data.Processor                              │
 ┌─────────────┐ file  │ ┌────────────┐       ┌───────────────────┐ │ []data.Entry  ┌───────────┐     ┌───────────────────────┐
 │data.Provider├──────►│ │unmarshaller├──────►│v# data.Transformer│ ├──────────────►│data.Writer├────►│grypeDB/v#/writer.Write│
 └─────────────┘       │ └────────────┘       └───────────────────┘ │               └───────────┘     └───────────────────────┘
                       └───────────────────────────────────────────-┘

Where there is a data.Provider for each upstream data source (e.g. canonical, redhat, github, NIST, etc.), a data.Processor for every vunnel-defined data shape (github, os, msrc, nvd, etc… defined in the vunnel repo), a data.Transformer for every processor and DB schema version pairing, and a data.Writer for every DB schema version.

From a Go package organization perspective, the above abstractions are organized as follows:

grype-db/
└── pkg
    ├── data                      # common data structures and objects that define the ETL flow
    ├── process
    │    ├── processors           # common data.Processors to call common unmarshallers and pass entries into data.Transformers
    │    ├── v1
    │    │    ├── processors.go   # wires up all common data.Processors to v1-specific data.Transformers
    │    │    ├── writer.go       # v1-specific store writer
    │    │    └── transformers    # v1-specific transformers
    │    ├── v2
    │    │    ├── processors.go   # wires up all common data.Processors to v2-specific data.Transformers
    │    │    ├── writer.go       # v2-specific store writer
    │    │    └── transformers    # v2-specific transformers
    │    └── ...more schema versions here...
    └── provider                  # common code to pull, unmarshal, and cache updstream vuln data into local files
        └── ...

DB structure and definitions

The definitions of what goes into the database and how to access it (both reads and writes) live in the public grype repo under the db package. Responsibilities of grype (not grype-db) include (but are not limited to):

  • What tables are in the database
  • What columns are in each table
  • How each record should be serialized for writing into the database
  • How records should be read/written from/to the database
  • Providing rich objects for dealing with schema-specific data structures
  • The name of the SQLite DB file within an archive
  • The definition of a listing file and listing file entries

The purpose of grype-db is to use the definitions from grype.db and the upstream vulnerability data to create DB archives and make them publicly available for consumption via grype.

DB listing file

The listing file contains URLs to grype DB archives that are available for download, organized by schema version, and ordered by latest-date-first. The definition of the listing file resides in grype, however, it is the responsibility of the grype-db repo to generate DBs and re-create the listing file daily. As long as grype has been configured to point to the correct listing file, the DBs can be stored separately from the listing file, be replaced with a running service returning the listing file contents, or can be mirrored for systems behind an air gap.

Getting a grype DB out to OSS users (daily)

There are two workflows that drive getting a new grype DB out to OSS users:

  1. The daily data sync workflow, which uses vunnel to pull upstream vulnerability data.
  2. The daily DB publisher workflow, which uses builds and publishes a grype DB from the data obtained in the daily data sync workflow.

Daily data sync workflow

This workflow takes the upstream vulnerability data (from canonical, redhat, debian, NVD, etc), processes it, and writes the results to the OCI repos.

┌──────────────┐         ┌──────────────────────────────────────────────────────────┐
│ Pull alpine  ├────────►│ Publish to ghcr.io/anchore/grype-db/data/alpine:<date>   │
└──────────────┘         └──────────────────────────────────────────────────────────┘
┌──────────────┐         ┌──────────────────────────────────────────────────────────┐
│ Pull amazon  ├────────►│ Publish to ghcr.io/anchore/grype-db/data/amazon:<date>   │
└──────────────┘         └──────────────────────────────────────────────────────────┘
┌──────────────┐         ┌──────────────────────────────────────────────────────────┐
│ Pull debian  ├────────►│ Publish to ghcr.io/anchore/grype-db/data/debian:<date>   │
└──────────────┘         └──────────────────────────────────────────────────────────┘
┌──────────────┐         ┌──────────────────────────────────────────────────────────┐
│ Pull github  ├────────►│ Publish to ghcr.io/anchore/grype-db/data/github:<date>   │
└──────────────┘         └──────────────────────────────────────────────────────────┘
┌──────────────┐         ┌──────────────────────────────────────────────────────────┐
│ Pull nvd     ├────────►│ Publish to ghcr.io/anchore/grype-db/data/nvd:<date>      │
└──────────────┘         └──────────────────────────────────────────────────────────┘
... repeat for all upstream providers ...

Once all providers have been updated a single vulnerability cache OCI repo is updated with all of the latest vulnerability data at ghcr.io/anchore/grype-db/data:<date>. This repo is what is used downstream by the DB publisher workflow to create grype DBs.

The in-repo .grype-db.yaml and .vunnel.yaml configurations are used to define the upstream data sources, how to obtain them, and where to put the results locally.

Daily DB publishing workflow

This workflow takes the latest vulnerability data cache, builds a grype DB, and publishes it for general consumption.

The manager/ directory contains all code responsible for driving the Daily DB Publisher workflow, generating DBs for all supported schema versions and making them available to the public. The publishing process is made of three steps (depicted and described below):

~~~~~ 1. Pull ~~~~~      ~~~~~~~~~~~~~~~~~~ 2. Generate Databases ~~~~~~~~~~~~~~~~~~~~      ~~ 3. Update Listing ~~

┌─────────────────┐      ┌──────────────┐     ┌───────────────┐     ┌────────────────┐      ┌─────────────────────┐
│ Pull vuln data  ├──┬──►│ Build V1 DB  ├────►│ Package V1 DB ├────►│ Upload Archive ├──┬──►│ Update listing file │
└─────────────────┘  │   └──────────────┘     └───────────────┘     └────────────────┘  │   └─────────────────────┘
  (from the daily    │   ┌──────────────┐     ┌───────────────┐     ┌────────────────┐  │
   sync workflow     ├──►│ Build V2 DB  ├────►│ Package V2 DB ├────►│ Upload Archive ├──┤
   output)           │   └──────────────┘     └───────────────┘     └────────────────┘  │
                     │                                                                  │
                     └──►      ...repeat for as many DB schemas are supported...      ──┘

Note: Running these steps locally may result in publishing a locally generated DB to production, which should never be done.

  1. pull: Download the latest vulnerability data from various upstream data sources into a local directory.

    # from the repo root
    make download-all-provider-cache
    

    The destination for the provider data is in the data/vunnel directory.

  2. generate: Build databases for all supported schema versions based on the latest vulnerability data and upload them to S3.

    # from the repo root
    # must be in a poetry shell
    grype-db-manager db build-and-upload --schema-version <version>
    

    This call needs to be repeated for all schema versions that are supported (see manager/src/grype_db_manager/data/schema-info.json).

    Once built each DB is smoke tested with grype by comparing the performance of the last OSS DB with the current (local) DB, using the vulnerability-match-label to quality differences.

    Only DBs that pass validation are uploaded to S3. At this step the DBs can be downloaded from S3 but are NOT yet discoverable via grype db download yet (this is what the listing file update will do).

  3. update-listing: Generate and upload a new listing file to S3 based on the existing listing file and newly discovered DB archives already uploaded to S3.

    # from the repo root
    # must be in a poetry shell
    grype-db-manager listing update
    

    During this step the locally crafted listing file is tested against installations of grype. The correctness of the reports are NOT verified (since this was done in a previous step), however, in order to pass the scan must have a non-zero count of matches found.

    Once the listing file has been uploaded user-facing grype installations should pick up that there are new DBs available to download.

5.5 - SBOM Action

Developer guidelines when contributing to sbom-action

TODO

5.6 - Scan Action

Developer guidelines when contributing to scan-action

TODO

5.7 - Vunnel

Developer guidelines when contributing to Vunnel

We welcome contributions to the project! There are a few useful things to know before diving into the codebase.

Do also take note of the General Guidelines that apply accross all Anchore Open Source projects.

Getting Started

This project requires:

  • python (>= 3.7)
  • pip (>= 22.2)
  • uv
  • docker
  • go (>= 1.20)
  • posix shell (bash, zsh, etc… needed for the make dev “development shell”)

Once you have python and uv installed, get the project bootstrapped:

# clone grype and grype-db, which is needed for provider development
git clone git@github.com:anchore/grype.git
git clone git@github.com:anchore/grype-db.git
# note: if you already have these repos cloned, you can skip this step. However, if they
# reside in a different directory than where the vunnel repo is, then you will need to
# set the `GRYPE_PATH` and/or `GRYPE_DB_PATH` environment variables for the development
# shell to function. You can add these to a local .env file in the vunnel repo root.

# clone the vunnel repo
git clone git@github.com:anchore/vunnel.git
cd vunnel

# get basic project tooling
make bootstrap

# install project dependencies
uv sync --all-extras --dev

Pre-commit is used to help enforce static analysis checks with git hooks:

uv run pre-commit install --hook-type pre-push

Developing

The easiest way to develop on a providers is to use the development shell, selecting the specific provider(s) you’d like to focus your development workflow on:

# Specify one or more providers you want to develop on.
# Any provider from the output of "vunnel list" is valid.
# Specify multiple as a space-delimited list:
# make dev providers="oracle wolfi nvd"
$ make dev provider="oracle"

Entering vunnel development shell...
• Configuring with providers: oracle ...
• Writing grype config: /Users/wagoodman/code/vunnel/.grype.yaml ...
• Writing grype-db config: /Users/wagoodman/code/vunnel/.grype-db.yaml ...
• Activating virtual env: /Users/wagoodman/code/vunnel/.venv ...
• Installing editable version of vunnel ...
• Building grype ...
• Building grype-db ...

Note: development builds grype and grype-db are now available in your path.
To update these builds run 'make build-grype' and 'make build-grype-db' respectively.
To run your provider and update the grype database run 'make update-db'.
Type 'exit' to exit the development shell.

You can now run the provider you specified in the make dev command, build an isolated grype DB, and import the DB into grype:

$ make update-db
• Updating vunnel providers ...
[0000]  INFO grype-db version: ede464c2def9c085325e18ed319b36424d71180d-adhoc-build
...
[0000]  INFO configured providers parallelism=1 providers=1
[0000] DEBUG   └── oracle
[0000] DEBUG all providers started, waiting for graceful completion...
[0000]  INFO running vulnerability provider provider=oracle
[0000] DEBUG oracle:  2023-03-07 15:44:13 [INFO] running oracle provider
[0000] DEBUG oracle:  2023-03-07 15:44:13 [INFO] downloading ELSA from https://linux.oracle.com/security/oval/com.oracle.elsa-all.xml.bz2
[0019] DEBUG oracle:  2023-03-07 15:44:31 [INFO] wrote 6298 entries
[0019] DEBUG oracle:  2023-03-07 15:44:31 [INFO] recording workspace state
• Building grype-db ...
[0000]  INFO grype-db version: ede464c2def9c085325e18ed319b36424d71180d-adhoc-build
[0000]  INFO reading all provider state
[0000]  INFO building DB build-directory=./build providers=[oracle] schema=5
• Packaging grype-db ...
[0000]  INFO grype-db version: ede464c2def9c085325e18ed319b36424d71180d-adhoc-build
[0000]  INFO packaging DB from="./build" for="https://toolbox-data.anchore.io/grype/databases"
[0000]  INFO created DB archive path=build/vulnerability-db_v5_2023-03-07T20:44:13Z_405ae93d52ac4cde6606.tar.gz
• Importing DB into grype ...
Vulnerability database imported

You can now run grype that uses the newly created DB:

$ grype oraclelinux:8.4
 ✔ Pulled image
 ✔ Loaded image
 ✔ Parsed image
 ✔ Cataloged packages      [195 packages]
 ✔ Scanning image...       [193 vulnerabilities]
   ├── 0 critical, 25 high, 146 medium, 22 low, 0 negligible
   └── 193 fixed

NAME                        INSTALLED                FIXED-IN                    TYPE  VULNERABILITY   SEVERITY
bind-export-libs            32:9.11.26-4.el8_4       32:9.11.26-6.el8            rpm   ELSA-2021-4384  Medium
bind-export-libs            32:9.11.26-4.el8_4       32:9.11.36-3.el8            rpm   ELSA-2022-2092  Medium
bind-export-libs            32:9.11.26-4.el8_4       32:9.11.36-3.el8_6.1        rpm   ELSA-2022-6778  High
bind-export-libs            32:9.11.26-4.el8_4       32:9.11.36-5.el8            rpm   ELSA-2022-7790  Medium

# note that we're using the database we just built...
$ grype db status
Location:  /Users/wagoodman/code/vunnel/.cache/grype/5  # <--- this is the local DB we just built
...

# also note that we're using a development build of grype
$ which grype
/Users/wagoodman/code/vunnel/bin/grype

The development builds of grype and grype-db provided are derived from ../grype and ../grype-db paths relative to the vunnel project. If you want to use a different path, you can set the GRYPE_PATH and GRYPE_DB_PATH environment variables. This can be persisted by adding a .env file to the root of the vunnel project:

# example .env file in the root of the vunnel repo
GRYPE_PATH=~/somewhere/else/grype
GRYPE_DB_PATH=~/also/somewhere/else/grype-db

To rebuild the grype and grype-db binaries from local source, run:

make build-grype
make build-grype-db

This project uses Make for running common development tasks:


make                  # run static analysis and unit testing
make static-analysis  # run static analysis
make unit             # run unit tests
make format           # format the codebase with black
make lint-fix         # attempt to automatically fix linting errors
...

If you want to see all of the things you can do:

make help

If you want to use a locally-editable copy of vunnel while you develop without the custom development shell:

uv pip uninstall vunnel  #... if you already have vunnel installed in this virtual env
uv pip install -e .

Snapshot Tests

In order to ensure that the same feed state from providers would make the same set of vulnerabilities, snapshot testing is used.

Snapshot tests are run as part of ordinary unit tests, and will run during make unit.

To update snapshots, run the following pytest command. (Note that this example is for the debian provider, and the test name and path will be different for other providers):

pytest ./tests/unit/providers/debian/test_debian.py -k test_provider_via_snapshot --snapshot-update

Architecture

Vunnel is a CLI tool that downloads and processes vulnerability data from various sources (in the codebase, these are called “providers”).

Vunnel run workflow diagram

Conceptually, one or more invocations of Vunnel will produce a single data directory which Grype-DB uses to create a Grype database:

Vunnel and Grype-DB workflow diagram

Additionally, the Vunnel CLI tool is optimized to run a single provider at a time, not orchestrating multiple providers at once. Grype-db is the tool that collates output from multiple providers and produces a single database, and is ultimately responsible for orchestrating multiple Vunnel calls to prepare the input data:

Grype-DB actions workflow diagram

For more information about how Grype-DB uses Vunnel see the Grype-DB documentation.

Vunnel Providers

A “Provider” is the core abstraction for Vunnel and represents a single source of vulnerability data. Vunnel is a CLI wrapper around multiple vulnerability data providers.

All provider implementations should…

  • live under src/vunnel/providers in their own directory (e.g. the NVD provider code is under src/vunnel/providers/nvd/...)
  • have a class that implements the Provider interface
  • be centrally registered with a unique name under src/vunnel/providers/__init__.py
  • be independent from other vulnerability providers data –that is, the debian provider CANNOT reach into the NVD data provider directory to look up information (such as severity)
  • follow the workspace conventions for downloaded provider inputs, produced results, and tracking of metadata

Each provider has a “workspace” directory within the “vunnel root” directory (defaults to ./data) named after the provider.

data/                       # the "vunnel root" directory
└── alpine/                 # the provider workspace directory
    ├── input/              # any file that needs to be downloaded and referenced should be stored here
    ├── results/            # schema-compliant vulnerability results (1 record per file)
    ├── checksums           # listing of result file checksums (xxh64 algorithm)
    └── metadata.json       # metadata about the input and result files

The metadata.json and checksums are written out after all results are written to results/. An example metadata.json:

{
  "provider": "amazon",
  "urls": ["https://alas.aws.amazon.com/AL2022/alas.rss"],
  "listing": {
    "digest": "dd3bb0f6c21f3936",
    "path": "checksums",
    "algorithm": "xxh64"
  },
  "timestamp": "2023-01-01T21:20:57.504194+00:00",
  "schema": {
    "version": "1.0.0",
    "url": "https://raw.githubusercontent.com/anchore/vunnel/main/schema/provider-workspace-state/schema-1.0.0.json"
  }
}

Where:

  • provider: the name of the provider that generated the results
  • urls: the URLs that were referenced to generate the results
  • listing: the path to the checksums listing file that lists all of the results, the checksum of that file, and the algorithm used to checksum the file (and the same algorithm used for all contained checksums)
  • timestamp: the point in time when the results were generated or last updated
  • schema: the data shape that the current file conforms to

All results from a provider are handled by a common base class helper (provider.Provider.results_writer()) and is driven by the application configuration (e.g. JSON flat files or SQLite database). The data shape of the results are self-describing via an envelope with a schema reference. For example:

For example:

{
  "schema": "https://raw.githubusercontent.com/anchore/vunnel/main/schema/vulnerability/os/schema-1.0.0.json",
  "identifier": "3.3/cve-2015-8366",
  "item": {
    "Vulnerability": {
      "Severity": "Unknown",
      "NamespaceName": "alpine:3.3",
      "FixedIn": [
        {
          "VersionFormat": "apk",
          "NamespaceName": "alpine:3.3",
          "Name": "libraw",
          "Version": "0.17.1-r0"
        }
      ],
      "Link": "http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8366",
      "Description": "",
      "Metadata": {},
      "Name": "CVE-2015-8366",
      "CVSS": []
    }
  }
}

Where:

  • the schema field is a URL to the schema that describes the data shape of the item field
  • the identifier field should have a unique identifier within the context of the provider results
  • the item field is the actual vulnerability data, and the shape of this field is defined by the schema

Note that the identifier is 3.3/cve-2015-8366 and not just cve-2015-8366 in order to uniquely identify cve-2015-8366 as applied to the alpine 3.3 distro version among other records in the results directory.

Currently only JSON payloads are supported at this time.

Possible vulnerability schemas supported within the vunnel repo are:

If at any point a breaking change needs to be made to a provider (and say the schema remains the same), then you can set the __version__ attribute on the provider class to a new integer value (incrementing from 1 onwards). This is a way to indicate that the cached input/results are not compatible with the output of the current version of the provider, in which case the next invocation of the provider will delete the previous input and results before running.

Provider configurations

Each provider has a configuration object defined next to the provider class. This object is used in the vunnel application configuration and is passed as input to the provider class. Take the debian provider configuration for example:

from dataclasses import dataclass, field

from vunnel import provider, result

@dataclass
class Config:
    runtime: provider.RuntimeConfig = field(
        default_factory=lambda: provider.RuntimeConfig(
            result_store=result.StoreStrategy.SQLITE,
            existing_results=provider.ResultStatePolicy.DELETE_BEFORE_WRITE,
        ),
    )
    request_timeout: int = 125

Every provider configuration must:

  • be a dataclass
  • have a runtime field that is a provider.RuntimeConfig field

The runtime field is used to configure common behaviors of the provider that are enforced within the vunnel.provider.Provider subclass. Options include:

  • on_error: what to do when the provider fails, sub fields include:

    • action: choose to fail, skip, or retry when the failure occurs
    • retry_count: the number of times to retry the provider before failing (only applicable when action is retry)
    • retry_delay: the number of seconds to wait between retries (only applicable when action is retry)
    • input: what to do about the input data directory on failure (such as keep or delete)
    • results: what to do about the results data directory on failure (such as keep or delete)
  • existing_results: what to do when the provider is run again and the results directory already exists. Options include:

    • delete-before-write: delete the existing results just before writing the first processed (new) result
    • delete: delete existing results before running the provider
    • keep: keep the existing results
  • existing_input: what to do when the provider is run again and the input directory already exists. Options include:

    • delete: delete the existing input before running the provider
    • keep: keep the existing input
  • result_store: where to store the results. Options include:

    • sqlite: store results as key-value form in a SQLite database, where keys are the record identifiers values are the json vulnerability records
    • flat-file: store results in JSON files named after the record identifiers

Any provider-specific config options can be added to the configuration object as needed (such as request_timeout, which is a common field).

Adding a new provider

“Vulnerability matching” is the process of taking a list of vulnerabilities and matching them against a list of packages. A provider in this repo is responsible for the “vulnerability” side of this process. The “package” side is handled by Syft. A prerequisite for adding a new provider is that Syft can catalog the package types that the provider is feeding vulnerability data for, so Grype can perform the matching from these two sources.

To add a new provider, you will need to create a new provider class under /src/vunnel/providers/<name> that inherits from provider.Provider and implements:

  • name(): a unique and semantically-useful name for the provider (same as the name of the directory)
  • update(): downloads and processes the raw data, writing all results with self.results_writer()

All results must conform to a particular schema, today there are a few kinds:

  • os: a generic operating system vulnerability (e.g redhat, debian, ubuntu, alpine, wolfi, etc.)
  • nvd: tailored to describe vulnerabilities from the NVD
  • github-security-advisory: tailored to describe vulnerabilities from GitHub
  • osv: tailored to describe vulnerabilities from the aggregated OSV vulnerability database

Once the provider is implemented, you will need to wire it up into the application in a couple places:

  • add a new entry under the dispatch table in src/vunnel/providers/__init__.py mapping your provider name to the class
  • add the provider configuration to the application configuration under src/vunnel/cli/config.py (specifically the Providers dataclass)

For a more detailed example on the implementation details of a provider see the “example” provider.

Validating this provider has different implications depending on what is being added. For example, if the provider is adding a new vulnerability source but is ultimately using an existing schema to express results then there may be very little to do! If you are adding a new schema, then the downstream data pipeline will need to be altered to support reading data in the new schema.

Please feel free to reach out to a maintainer on an incomplete draft PR and we can help you get it over the finish line!

…for an existing schema

1. Fork Vunnel and add the new provider.

Take a look at the example provider in the example directory. You are encouraged to copy example/awesome/* into src/vunnel/providers/YOURPROVIDERNAME/ and modify it to fit the needs of your new provider, however, this is not required:

# from the root of the vunnel repo
cp -a example/awesome src/vunnel/providers/YOURPROVIDERNAME

See the “example” provider README as well as the code comments for steps and considerations to take when implementing a new provider.

Once implemented, you should be able to see the new provider in the vunnel list command and run it with vunnel run <name>. The entries written should write out to a specific namespace in the DB downstream, as indicated in the record. This namespace is needed when making Grype changes.

While developing the provider consider using the make dev provider="<your-provider-name>"developer shell to run the provider and manually test the results against grype.

At this point you can optionally open a Vunnel PR with your new provider and a Maintainer can help with the next steps. Or if you’d like to get PR changes merged faster you can continue with the next steps.

2. Fork Grype and map distro type to a specific namespace.

This step might not be needed depending on the provider.

Common reasons for needing Grype changes include:

If you’re using the developer shell (make dev ...) then you can run make build-grype to get a build of grype with your changes.

3. In Vunnel: add a new test case to tests/quality/config.yaml for the new provider.

The configuration maps a provider to test to specific images to test with, for example:

---
- provider: amazon
  images:
    - docker.io/amazonlinux:2@sha256:1301cc9f889f21dc45733df9e58034ac1c318202b4b0f0a08d88b3fdc03004de
    - docker.io/anchore/test_images:vulnerabilities-amazonlinux-2-5c26ce9@sha256:cf742eca189b02902a0a7926ac3fbb423e799937bf4358b0d2acc6cc36ab82aa

These images are used to test the provider on PRs and nightly builds to verify the specific provider is working. Always use both the image tag and digest for all container image entries. Pick an image that has a good representation of the package types that your new provider is adding vulnerability data for.

4. In Vunnel: swap the tools to your Grype branch in tests/quality/config.yaml.

If you wanted to see PR quality gate checks pass with your specific Grype changes (if you have any) then you can update the yardstick.tools[*] entries for grype to use the a version that points to your fork (w.g. your-fork-username/grype@main). If you don’t have any grype changes needed then you can skip this step.

5. In Vunnel: add new “vulnerability match labels” to annotate True and False positive findings with Grype.

In order to evaluate the quality of the new provider, we need to know what the expected results are. This is done by annotating Grype results with “True Positive” labels (good results) and “False Positive” labels (bad results). We’ll use Yardstick to do this:

$ cd tests/quality

# capture results with the development version of grype (from your fork)
$ make capture provider=<your-provider-name>

# list your results
$ uv run yardstick result list | grep grype

d415064e-2bf3-4a1d-bda6-9c3957f2f71a  docker.io/anc...  grype@v0.58.0             2023-03...
75d1fe75-0890-4d89-a497-b1050826d9f6  docker.io/anc...  grype[custom-db]@bdcefd2  2023-03...

# use the "grype[custom-db]" result UUID and explore the results and add labels to each entry
$ uv run yardstick label explore 75d1fe75-0890-4d89-a497-b1050826d9f6

# You can use the yardstick TUI to label results:
# - use "T" to label a row as a True Positive
# - use "F" to label a row as a False Positive
# - Ctrl-Z to undo a label
# - Ctrl-S to save your labels
# - Ctrl-C to quit when you are done

Later we’ll open a PR in the vulnerability-match-labels repo to persist these labels. For the meantime we can iterate locally with the labels we’ve added.

6. In Vunnel: run the quality gate.

cd tests/quality

# runs your specific provider to gather vulnerability data, builds a DB, and runs grype with the new DB
make capture provider=<your-provider-name>

# evaluate the quality gate
make validate

This uses the latest Grype-DB release to build a DB and the specified Grype version with a DB containing only data from the new provider.

You are looking for a passing run before continuing further.

7. Open a vulnerability-match-labels repo PR to persist the new labels.

Vunnel uses the labels in the vulnerability-Match-Labels repo via a git submodule. We’ve already added labels locally within this submodule in an earlier step. To persist these labels we need to push them to a fork and open a PR:

# fork the github.com/anchore/vulnerability-match-labels repo, but you do not need to clone it...

# from the Vunnel repo...
$ cd tests/quality/vulnerability-match-labels

$ git remote add fork git@github.com:your-fork-name/vulnerability-match-labels.git
$ git checkout -b 'add-labels-for-<your-provider-name>'
$ git status

# you should see changes from the labels/ directory for your provider that you added

$ git add .
$ git commit -m 'add labels for <your-provider-name>'
$ git push fork add-labels-for-<your-provider-name>

At this point you can open a PR against in the vulnerability-match-labels repo.

Note: you will not be able to open a Vunnel PR that passes PR checks until the labels are merged into the vulnerability-match-labels repo.

Once the PR is merged in the vulnerability-match-labels repo you can update the submodule in Vunnel to point to the latest commit in the vulnerability-match-labels repo.

cd tests/quality

git submodule update --remote vulnerability-match-labels

8. In Vunnel: open a PR with your new provider.

The PR will also run all of the same quality gate checks that you ran locally.

If you have Grype changes, you should also create a PR for that as well. The Vunnel PR will not pass PR checks until the Grype PR is merged and the test/quality/config.yaml file is updated to point back to the latest Grype version.

…for a new schema

This is the same process as listed above with a few additional steps:

  1. You will need to add the new schema to the Vunnel repo in the schemas directory.
  2. Grype-DB will need to be updated to support the new schema in the pkg/provider/unmarshal and pkg/process/v* directories.
  3. The Vunnel tests/quality/config.yaml file will need to be updated to use development grype-db.version, pointing to your fork.
  4. The final Vunnel PR will not be able to be merged until the Grype-DB PR is merged and the tests/quality/config.yaml file is updated to point back to the latest Grype-DB version.

What might need refactoring?

Looking to help out with improving the code quality of Vunnel, but not sure where to start?

The best way is to look for issues with the refactor label.

More general ways would be to use radon to search for complexity and maintainability issues:

$ radon cc src --total-average -nb
src/vunnel/provider.py
    M 115:4 Provider._on_error - B
src/vunnel/providers/alpine/parser.py
    M 73:4 Parser._download - C
    M 178:4 Parser._normalize - C
    M 141:4 Parser._load - B
    C 44:0 Parser - B
src/vunnel/providers/amazon/parser.py
    M 66:4 Parser._parse_rss - C
    C 164:0 JsonifierMixin - C
    M 165:4 JsonifierMixin.json - C
    C 32:0 Parser - B
    M 239:4 PackagesHTMLParser.handle_data - B
...

The output of radon indicates the type (M=method, C=class, F=function), the path/name, and a A-F grade. Anything that’s not an A is worth taking a look at.

Another approach is to use wily:

$ wily build
...
$ wily rank
-----------Rank for Maintainability Index for bdb4983 by Alex Goodman on 2022-12-25.------------
╒═════════════════════════════════════════════════╤═════════════════════════╕
│ File                                            │   Maintainability Index │
╞═════════════════════════════════════════════════╪═════════════════════════╡
│ src/vunnel/providers/rhel/parser.py             │                 21.591  │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ src/vunnel/providers/ubuntu/parser.py           │                 21.6144 │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ tests/unit/providers/github/test_github.py      │                 35.3599 │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ tests/unit/utils/test_oval_v2.py                │                 36.3388 │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ src/vunnel/providers/debian/parser.py           │                 37.3723 │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ tests/unit/utils/test_fdb.py                    │                 38.6926 │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ tests/unit/providers/sles/test_sles.py          │                 41.6602 │
├─────────────────────────────────────────────────┼─────────────────────────┤
│ tests/unit/providers/ubuntu/test_ubuntu.py      │                 43.1323 │
├─────────────────────────────────────────────────┼─────────────────────────┤
...

Ideally we should try to get wily diff output into the CI pipeline and post on a sticky PR comment to show regressions (and potentially fail the CI run).

Not everything has types

This codebase has been ported from another repo that did not have any type hints. This is OK, though ideally over time this should be corrected as new features are added and bug fixes made.

We use mypy today for static type checking, however, the ported code has been explicitly ignored (see pyproject.toml).

If you want to make enhancements in this area consider using automated tooling such as pytype to generate types via inference into .pyi files and later merge them into the codebase with merge-pyi.

Alternatively a tool like MonkeyType can be used generate static types from runtime data and incorporate into the code.

5.8 - Stereoscope

Developer guidelines when contributing to Stereoscope

We welcome contributions to the project! There are a few useful things to know before diving into the codebase.

Do also take note of the General Guidelines that apply accross all Anchore Open Source projects.

Getting started

In order to test and develop in this repo you will need the following dependencies installed:

  • Golang
  • docker
  • make
  • podman (for benchmark and integration tests only)
  • containerd (for integration tests only)
  • skopeo (for integration tests only)

After cloning the following step can help you get setup:

  1. run make bootstrap to download go mod dependencies, create the /.tmp dir, and download helper utilities.
  2. run make help to view the selection of developer commands in the Makefile

The main make tasks for common static analysis and testing are lint, format, lint-fix, unit, and integration.

See make help for all the current make tasks.

Background

Stereoscope is a library for reading and manipulating container images. It is capable of parsing multiple image sources, providing a single abstraction for interacting with them. Ultimately this provides a squashfs-like interface for interacting with image layers as well as a content API for accessing files contained within the image.

Overview of objects:

  • image.Image: Once parsed with image.Read() this object represents a container image. Consists of a sequence of image.Layer objects, a image.FileCatalog for accessing files, and filetree.SearchContext for searching for files from the squashed representation of the image filesystem. Additionally exposes GGCR v1.Image objects for accessing the raw image metadata.
  • image.Layer: represents a single layer of the image. Consists of a filetree.FileTree that represents the raw layer contents, and a filetree.SearchContext for searching for files relative to the raw (single layer) filetree as well as the squashed representation of the layer relative to all layers below this one. Additionally exposes GGCR v1.Layer objects for accessing the raw layer metadata.
  • filetree.FileTree: a tree representing a filesystem. All nodes represent real paths (paths with no link resolution anywhere in the path) and are absolute paths (start with / and contain no relative path elements [e.g. ../ or ./]). This represents the filesystem structure and each node has a reference to the file metadata for that path.
  • file.Reference: a unique file in the filesystem, identified by an absolute, real path as well as an integer ID (file.IDs). These are used to reference concrete nodes in the filetree.FileTree and image.FileCatalog objects.
  • file.Index: stores all known file.Reference and file.Metadata. Entries are indexed with a variety of ways to provide fast access to references and metadata without needing to crawl the tree. This is especially useful for speeding up globbing.
  • image.FileCatalog: an image-aware extension of file.Index that additionally relates image.Layers to file.IDs and provides a content API for any files contained within the image (regardless of which layer or squashed representation it exists in).

Searching for files

Searching for files is exposed to users in three ways:

  • search by file path
  • search by file glob
  • search by file content MIME type

Searching itself is performed two different ways:

  • search the image.FileCatalog on the image by a heuristic
  • search the filetree.FileTree directly

The “best way” to search is automatically determined in the filetree.searchContext object, exposed on image.Image and image.Layer objects as a filetree.Searcher for general use.

File trees

The filetree.FileTree object represents a filesystem and consists of filenode.Node objects. The tree itself leverages tree.Tree as a generic datastructure. What filetree.FileTree adds is the concept of file types, the semantics of each type, the ability to resolve links based on a given strategy, merging of trees with the same semantics of a union filesystem (e.g. whiteout files), and the ability to search for files via direct paths or globs.

The fs.FS abstraction has been implemented on filetree.FileTree to allow for easy integration with the standard library as well as to interop with the doublestar library to facilitate globing. Using the fs.FS abstraction for filetree operations is faster than OS interactions with the filesystem directly but relatively slower than the indexes provided by image.FileCatalog and file.Index.

filetree.FileTree objects can be created with a corresponding file.Index object by leveraging the filetree.Builder object, which aids in the indexing of files.

6 - Reference

Reference for Anchore OSS Tools

6.1 - Grype Command Line Reference

A vulnerability scanner for container images, filesystems, and SBOMs.

Supports the following image sources:
    grype yourrepo/yourimage:tag             defaults to using images from a Docker daemon
    grype path/to/yourproject                a Docker tar, OCI tar, OCI directory, SIF container, or generic filesystem directory

You can also explicitly specify the scheme to use:
    grype podman:yourrepo/yourimage:tag          explicitly use the Podman daemon
    grype docker:yourrepo/yourimage:tag          explicitly use the Docker daemon
    grype docker-archive:path/to/yourimage.tar   use a tarball from disk for archives created from "docker save"
    grype oci-archive:path/to/yourimage.tar      use a tarball from disk for OCI archives (from Podman or otherwise)
    grype oci-dir:path/to/yourimage              read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    grype singularity:path/to/yourimage.sif      read directly from a Singularity Image Format (SIF) container on disk
    grype dir:path/to/yourproject                read directly from a path on disk (any directory)
    grype file:path/to/yourfile                  read directly from a file on disk
    grype sbom:path/to/syft.json                 read Syft JSON from path on disk
    grype registry:yourrepo/yourimage:tag        pull image directly from a registry (no container runtime required)
    grype purl:path/to/purl/file                 read a newline separated file of package URLs from a path on disk
    grype PURL                                   read a single package PURL directly (e.g. pkg:apk/openssl@3.2.1?distro=alpine-3.20.3)
    grype CPE                                    read a single CPE directly (e.g. cpe:2.3:a:openssl:openssl:3.0.14:*:*:*:*:*)

You can also pipe in Syft JSON directly:
 syft yourimage:tag -o json | grype

Usage:
  grype [IMAGE] [flags]
  grype [command]

Available Commands:
  completion  Generate a shell completion for Grype (listing local docker images)
  config      show the grype configuration
  db          vulnerability database operations
  explain     Ask grype to explain a set of findings
  help        Help about any command
  version     show version information

Flags:
      --add-cpes-if-none       generate CPEs for packages with no CPE data
      --by-cve                 orient results by CVE instead of the original vulnerability ID when possible
  -c, --config stringArray     grype configuration file(s) to use
      --distro string          distro to match against in the format: <distro>:<version>
      --exclude stringArray    exclude paths from being scanned using a glob expression
  -f, --fail-on string         set the return code to 1 if a vulnerability is found with a severity >= the given severity, options=[negligible low medium high critical]
      --file string            file to write the default report output to (default is STDOUT)
  -h, --help                   help for grype
      --ignore-states string   ignore matches for vulnerabilities with specified comma separated fix states, options=[fixed not-fixed unknown wont-fix]
      --name string            set the name of the target being analyzed
      --only-fixed             ignore matches for vulnerabilities that are not fixed
      --only-notfixed          ignore matches for vulnerabilities that are fixed
  -o, --output stringArray     report output formatter, formats=[json table cyclonedx cyclonedx-json sarif template], deprecated formats=[embedded-cyclonedx-vex-json embedded-cyclonedx-vex-xml]
      --platform string        an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')
      --profile stringArray    configuration profiles to use
  -q, --quiet                  suppress all logging output
  -s, --scope string           selection of layers to analyze, options=[squashed all-layers deep-squashed] (default "squashed")
      --show-suppressed        show suppressed/ignored vulnerabilities in the output (only supported with table output format)
      --sort-by string         sort the match results with the given strategy, options=[package severity epss risk kev vulnerability] (default "risk")
  -t, --template string        specify the path to a Go template file (requires 'template' output to be selected)
  -v, --verbose count          increase verbosity (-v = info, -vv = debug)
      --version                version for grype
      --vex stringArray        a list of VEX documents to consider when producing scanning results

Use "grype [command] --help" for more information about a command.

grype config

Show the grype configuration.

Usage:
  grype config [flags]
  grype config [command]

Available Commands:
  locations   shows all locations and the order in which grype will look for a configuration file

Flags:
  -h, --help   help for config
      --load   load and validate the grype configuration

grype db check

Check to see if there is a database update available.

Usage:
  grype db check [flags]

Flags:
  -h, --help            help for check
  -o, --output string   format to display results (available=[text, json]) (default "text")

grype db delete

Delete the vulnerability database.

Usage:
  grype db delete [flags]

Flags:
  -h, --help   help for delete

grype db import

Import a vulnerability database archive from a local FILE or URL.

DB archives can be obtained from “https://grype.anchore.io/databases” (or running db list). If the URL has a checksum query parameter with a fully qualified digest (e.g. ‘sha256:abc728…’) then the archive/DB will be verified against this value.

Usage:
  grype db import FILE | URL [flags]

Flags:
  -h, --help   help for import

grype db list

List all DBs available according to the listing URL.

Usage:
  grype db list [flags]

Flags:
  -h, --help            help for list
  -o, --output string   format to display results (available=[text, raw, json]) (default "text")

grype db providers

List vulnerability providers that are in the database.

Usage:
  grype db providers [flags]

Flags:
  -h, --help            help for providers
  -o, --output string   format to display results (available=[table, json]) (default "table")

Search the DB for vulnerabilities or affected packages.

Usage:
  grype db search [flags]
  grype db search [command]

Examples:

  Search for affected packages by vulnerability ID:

    $ grype db search --vuln ELSA-2023-12205

  Search for affected packages by package name:

    $ grype db search --pkg log4j

  Search for affected packages by package name, filtering down to a specific vulnerability:

    $ grype db search --pkg log4j --vuln CVE-2021-44228

  Search for affected packages by PURL (note: version is not considered):

    $ grype db search --pkg 'pkg:rpm/redhat/openssl' # or: '--ecosystem rpm --pkg openssl

  Search for affected packages by CPE (note: version/update is not considered):

    $ grype db search --pkg 'cpe:2.3:a:jetty:jetty_http_server:*:*:*:*:*:*:*:*'
    $ grype db search --pkg 'cpe:/a:jetty:jetty_http_server'

Available Commands:
  vuln        Search for vulnerabilities within the DB (supports DB schema v6+ only)

Flags:
      --broad-cpe-matching       allow for specific package CPE attributes to match with '*' values on the vulnerability
      --distro stringArray       refine to results with the given operating system (format: 'name', 'name@version', 'name@maj.min', 'name@codename')
      --ecosystem string         ecosystem of the package to search within
  -h, --help                     help for search
      --limit int                limit the number of results returned, use 0 for no limit (default 5000)
      --modified-after string    only show vulnerabilities originally published or modified since the given date (format: YYYY-MM-DD)
  -o, --output string            format to display results (available=[table, json]) (default "table")
      --pkg stringArray          package name/CPE/PURL to search for
      --provider stringArray     only show vulnerabilities from the given provider
      --published-after string   only show vulnerabilities originally published after the given date (format: YYYY-MM-DD)
      --vuln stringArray         only show results for the given vulnerability ID

grype db status

Display database status and metadata.

Usage:
  grype db status [flags]

Flags:
  -h, --help            help for status
  -o, --output string   format to display results (available=[text, json]) (default "text")

grype db update

Download and install the latest vulnerability database.

Usage:
  grype db update [flags]

Flags:
  -h, --help   help for update

grype explain

Ask grype to explain a set of findings.

Usage:
  grype explain --id [VULNERABILITY ID] [flags]

Flags:
  -h, --help             help for explain
      --id stringArray   CVE IDs to explain

grype version

Show version information.

Usage:
  grype version [flags]

Flags:
  -h, --help            help for version
  -o, --output string   the format to show the results (allowable: [text json]) (default "text")

6.2 - Syft Command Line Reference

Generate a packaged-based Software Bill Of Materials (SBOM) from container images and filesystems

Usage:
  syft [SOURCE] [flags]
  syft [command]

Examples:
  syft scan alpine:latest                                a summary of discovered packages
  syft scan alpine:latest -o json                        show all possible cataloging details
  syft scan alpine:latest -o cyclonedx                   show a CycloneDX formatted SBOM
  syft scan alpine:latest -o cyclonedx-json              show a CycloneDX JSON formatted SBOM
  syft scan alpine:latest -o spdx                        show a SPDX 2.3 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx@2.2                    show a SPDX 2.2 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx-json                   show a SPDX 2.3 JSON formatted SBOM
  syft scan alpine:latest -o spdx-json@2.2               show a SPDX 2.2 JSON formatted SBOM
  syft scan alpine:latest -vv                            show verbose debug information
  syft scan alpine:latest -o template -t my_format.tmpl  show a SBOM formatted according to given template file

  Supports the following image sources:
    syft scan yourrepo/yourimage:tag     defaults to using images from a Docker daemon. If Docker is not present, the image is pulled directly from the registry.
    syft scan path/to/a/file/or/dir      a Docker tar, OCI tar, OCI directory, SIF container, or generic filesystem directory

  You can also explicitly specify the scheme to use:
    syft scan docker:yourrepo/yourimage:tag            explicitly use the Docker daemon
    syft scan podman:yourrepo/yourimage:tag            explicitly use the Podman daemon
    syft scan registry:yourrepo/yourimage:tag          pull image directly from a registry (no container runtime required)
    syft scan docker-archive:path/to/yourimage.tar     use a tarball from disk for archives created from "docker save"
    syft scan oci-archive:path/to/yourimage.tar        use a tarball from disk for OCI archives (from Skopeo or otherwise)
    syft scan oci-dir:path/to/yourimage                read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    syft scan singularity:path/to/yourimage.sif        read directly from a Singularity Image Format (SIF) container on disk
    syft scan dir:path/to/yourproject                  read directly from a path on disk (any directory)
    syft scan file:path/to/yourproject/file            read directly from a path on disk (any single file)


Available Commands:
  attest      Generate an SBOM as an attestation for the given [SOURCE] container image
  cataloger   Show available catalogers and configuration
  completion  Generate the autocompletion script for the specified shell
  config      show the syft configuration
  convert     Convert between SBOM formats
  help        Help about any command
  login       Log in to a registry
  scan        Generate an SBOM
  version     show version information

Flags:
      --base-path string                          base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
  -c, --config stringArray                        syft configuration file(s) to use
      --enrich stringArray                        enable package data enrichment from local and online sources (options: all, golang, java, javascript)
      --exclude stringArray                       exclude paths from being scanned using a glob expression
      --file string                               file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
      --from stringArray                          specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
  -h, --help                                      help for syft
  -o, --output stringArray                        report output format (<format>=<file> to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json purls spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
      --override-default-catalogers stringArray   set the base set of catalogers to use (defaults to 'image' or 'directory' depending on the scan source)
      --parallelism int                           number of cataloger workers to run in parallel
      --platform string                           an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')
      --profile stringArray                       configuration profiles to use
  -q, --quiet                                     suppress all logging output
  -s, --scope string                              selection of layers to catalog, options=[squashed all-layers deep-squashed] (default "squashed")
      --select-catalogers stringArray             add, remove, and filter the catalogers to be used
      --source-name string                        set the name of the target being analyzed
      --source-supplier string                    the organization that supplied the component, which often may be the manufacturer, distributor, or repackager
      --source-version string                     set the version of the target being analyzed
  -t, --template string                           specify the path to a Go template file
  -v, --verbose count                             increase verbosity (-v = info, -vv = debug)
      --version                                   version for syft

Use "syft [command] --help" for more information about a command.

syft attest

Generate a packaged-based Software Bill Of Materials (SBOM) from a container image as the predicate of an in-toto attestation that will be uploaded to the image registry.

Usage:
  syft attest --output [FORMAT] <IMAGE> [flags]

Examples:
  syft attest --output [FORMAT] alpine:latest            defaults to using images from a Docker daemon. If Docker is not present, the image is pulled directly from the registry

  You can also explicitly specify the scheme to use:
    syft attest docker:yourrepo/yourimage:tag            explicitly use the Docker daemon
    syft attest podman:yourrepo/yourimage:tag            explicitly use the Podman daemon
    syft attest registry:yourrepo/yourimage:tag          pull image directly from a registry (no container runtime required)
    syft attest docker-archive:path/to/yourimage.tar     use a tarball from disk for archives created from "docker save"
    syft attest oci-archive:path/to/yourimage.tar        use a tarball from disk for OCI archives (from Skopeo or otherwise)
    syft attest oci-dir:path/to/yourimage                read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    syft attest singularity:path/to/yourimage.sif        read directly from a Singularity Image Format (SIF) container on disk


Flags:
      --base-path string                          base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
      --enrich stringArray                        enable package data enrichment from local and online sources (options: all, golang, java, javascript)
      --exclude stringArray                       exclude paths from being scanned using a glob expression
      --from stringArray                          specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
  -h, --help                                      help for attest
  -k, --key string                                the key to use for the attestation
  -o, --output stringArray                        report output format (<format>=<file> to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json purls spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-json])
      --override-default-catalogers stringArray   set the base set of catalogers to use (defaults to 'image' or 'directory' depending on the scan source)
      --parallelism int                           number of cataloger workers to run in parallel
      --platform string                           an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')
  -s, --scope string                              selection of layers to catalog, options=[squashed all-layers deep-squashed] (default "squashed")
      --select-catalogers stringArray             add, remove, and filter the catalogers to be used
      --source-name string                        set the name of the target being analyzed
      --source-supplier string                    the organization that supplied the component, which often may be the manufacturer, distributor, or repackager
      --source-version string                     set the version of the target being analyzed

syft cataloger list

List available catalogers.

Usage:
  syft cataloger list [OPTIONS] [flags]

Flags:
  -h, --help                                      help for list
  -o, --output string                             format to output the cataloger list (available: table, json)
      --override-default-catalogers stringArray   override the default catalogers with an expression (default [all])
      --select-catalogers stringArray             select catalogers with an expression
  -s, --show-hidden                               show catalogers that have been de-selected

syft config

Show the syft configuration.

Usage:
  syft config [flags]
  syft config [command]

Available Commands:
  locations   shows all locations and the order in which syft will look for a configuration file

Flags:
  -h, --help   help for config
      --load   load and validate the syft configuration

syft convert

[Experimental] Convert SBOM files to, and from, SPDX, CycloneDX and Syft’s format. For more info about data loss between formats see https://github.com/anchore/syft/wiki/format-conversion.

Usage:
  syft convert [SOURCE-SBOM] -o [FORMAT] [flags]

Examples:
  syft convert img.syft.json -o spdx-json                      convert a syft SBOM to spdx-json, output goes to stdout
  syft convert img.syft.json -o cyclonedx-json=img.cdx.json    convert a syft SBOM to CycloneDX, output is written to the file "img.cdx.json"
  syft convert - -o spdx-json                                  convert an SBOM from STDIN to spdx-json


Flags:
      --file string          file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
  -h, --help                 help for convert
  -o, --output stringArray   report output format (<format>=<file> to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json purls spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
  -t, --template string      specify the path to a Go template file

syft login

Log in to a registry.

Usage:
  syft login [OPTIONS] [SERVER] [flags]

Examples:
  # Log in to reg.example.com
  syft login reg.example.com -u AzureDiamond -p hunter2

Flags:
  -h, --help              help for login
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

syft scan

Generate a packaged-based Software Bill Of Materials (SBOM) from container images and filesystems.

Usage:
  syft scan [SOURCE] [flags]

Examples:
  syft scan alpine:latest                                a summary of discovered packages
  syft scan alpine:latest -o json                        show all possible cataloging details
  syft scan alpine:latest -o cyclonedx                   show a CycloneDX formatted SBOM
  syft scan alpine:latest -o cyclonedx-json              show a CycloneDX JSON formatted SBOM
  syft scan alpine:latest -o spdx                        show a SPDX 2.3 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx@2.2                    show a SPDX 2.2 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx-json                   show a SPDX 2.3 JSON formatted SBOM
  syft scan alpine:latest -o spdx-json@2.2               show a SPDX 2.2 JSON formatted SBOM
  syft scan alpine:latest -vv                            show verbose debug information
  syft scan alpine:latest -o template -t my_format.tmpl  show a SBOM formatted according to given template file

  Supports the following image sources:
    syft scan yourrepo/yourimage:tag     defaults to using images from a Docker daemon. If Docker is not present, the image is pulled directly from the registry.
    syft scan path/to/a/file/or/dir      a Docker tar, OCI tar, OCI directory, SIF container, or generic filesystem directory

  You can also explicitly specify the scheme to use:
    syft scan docker:yourrepo/yourimage:tag            explicitly use the Docker daemon
    syft scan podman:yourrepo/yourimage:tag            explicitly use the Podman daemon
    syft scan registry:yourrepo/yourimage:tag          pull image directly from a registry (no container runtime required)
    syft scan docker-archive:path/to/yourimage.tar     use a tarball from disk for archives created from "docker save"
    syft scan oci-archive:path/to/yourimage.tar        use a tarball from disk for OCI archives (from Skopeo or otherwise)
    syft scan oci-dir:path/to/yourimage                read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    syft scan singularity:path/to/yourimage.sif        read directly from a Singularity Image Format (SIF) container on disk
    syft scan dir:path/to/yourproject                  read directly from a path on disk (any directory)
    syft scan file:path/to/yourproject/file            read directly from a path on disk (any single file)


Flags:
      --base-path string                          base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
      --enrich stringArray                        enable package data enrichment from local and online sources (options: all, golang, java, javascript)
      --exclude stringArray                       exclude paths from being scanned using a glob expression
      --file string                               file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
      --from stringArray                          specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
  -h, --help                                      help for scan
  -o, --output stringArray                        report output format (<format>=<file> to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json purls spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
      --override-default-catalogers stringArray   set the base set of catalogers to use (defaults to 'image' or 'directory' depending on the scan source)
      --parallelism int                           number of cataloger workers to run in parallel
      --platform string                           an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')
  -s, --scope string                              selection of layers to catalog, options=[squashed all-layers deep-squashed] (default "squashed")
      --select-catalogers stringArray             add, remove, and filter the catalogers to be used
      --source-name string                        set the name of the target being analyzed
      --source-supplier string                    the organization that supplied the component, which often may be the manufacturer, distributor, or repackager
      --source-version string                     set the version of the target being analyzed
  -t, --template string                           specify the path to a Go template file

syft version

Show version information.

Usage:
  syft version [flags]

Flags:
  -h, --help            help for version
  -o, --output string   the format to show the results (allowable: [text json]) (default "text")

6.3 - Grype Default Configuration

Grype searches for configuration files in the following locations, in order:

  1. ./.grype.yaml - current working directory
  2. ./.grype/config.yaml - app subdirectory in current working directory
  3. ~/.grype.yaml - home directory
  4. $XDG_CONFIG_HOME/grype/config.yaml - XDG config directory

The configuration file can use either .yaml or .yml extensions. The first configuration file found will be used.

log:
  # suppress all logging output (env: GRYPE_LOG_QUIET)
  quiet: false

  # explicitly set the logging level (available: [error warn info debug trace]) (env: GRYPE_LOG_LEVEL)
  level: "warn"

  # file path to write logs to (env: GRYPE_LOG_FILE)
  file: ""

dev:
  # capture resource profiling data (available: [cpu, mem]) (env: GRYPE_DEV_PROFILE)
  profile: ""

  db:
    # (env: GRYPE_DEV_DB_DEBUG)
    debug: false

# the output format of the vulnerability report (options: table, template, json, cyclonedx)
# when using template as the output type, you must also provide a value for 'output-template-file' (env: GRYPE_OUTPUT)
output: []

# if using template output, you must provide a path to a Go template file
# see https://github.com/anchore/grype#using-templates for more information on template output
# the default path to the template file is the current working directory
# output-template-file: .grype/html.tmpl
#
# write output report to a file (default is to write to stdout) (env: GRYPE_FILE)
file: ""

# pretty-print output (env: GRYPE_PRETTY)
pretty: false

# distro to match against in the format: <distro>:<version> (env: GRYPE_DISTRO)
distro: ""

# generate CPEs for packages with no CPE data (env: GRYPE_ADD_CPES_IF_NONE)
add-cpes-if-none: false

# specify the path to a Go template file (requires 'template' output to be selected) (env: GRYPE_OUTPUT_TEMPLATE_FILE)
output-template-file: ""

# enable/disable checking for application updates on startup (env: GRYPE_CHECK_FOR_APP_UPDATE)
check-for-app-update: true

# ignore matches for vulnerabilities that are not fixed (env: GRYPE_ONLY_FIXED)
only-fixed: false

# ignore matches for vulnerabilities that are fixed (env: GRYPE_ONLY_NOTFIXED)
only-notfixed: false

# ignore matches for vulnerabilities with specified comma separated fix states, options=[fixed not-fixed unknown wont-fix] (env: GRYPE_IGNORE_WONTFIX)
ignore-wontfix: ""

# an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux') (env: GRYPE_PLATFORM)
platform: ""

search:
  # selection of layers to analyze, options=[squashed all-layers deep-squashed] (env: GRYPE_SEARCH_SCOPE)
  scope: "squashed"

  # search within archives that do not contain a file index to search against (tar, tar.gz, tar.bz2, etc)
  # note: enabling this may result in a performance impact since all discovered compressed tars will be decompressed
  # note: for now this only applies to the java package cataloger (env: GRYPE_SEARCH_UNINDEXED_ARCHIVES)
  unindexed-archives: false

  # search within archives that do contain a file index to search against (zip)
  # note: for now this only applies to the java package cataloger (env: GRYPE_SEARCH_INDEXED_ARCHIVES)
  indexed-archives: true

# A list of vulnerability ignore rules, one or more property may be specified and all matching vulnerabilities will be ignored.
# This is the full set of supported rule fields:
#   - vulnerability: CVE-2008-4318
#     fix-state: unknown
#     package:
#       name: libcurl
#       version: 1.5.1
#       type: npm
#       location: "/usr/local/lib/node_modules/**"
#
# VEX fields apply when Grype reads vex data:
#   - vex-status: not_affected
#     vex-justification: vulnerable_code_not_present
ignore: []

# a list of globs to exclude from scanning, for example:
#   - '/etc/**'
#   - './out/**/*.json'
# same as --exclude (env: GRYPE_EXCLUDE)
exclude: []

external-sources:
  # enable Grype searching network source for additional information (env: GRYPE_EXTERNAL_SOURCES_ENABLE)
  enable: false

  maven:
    # search for Maven artifacts by SHA1 (env: GRYPE_EXTERNAL_SOURCES_MAVEN_SEARCH_MAVEN_UPSTREAM)
    search-maven-upstream: true

    # base URL of the Maven repository to search (env: GRYPE_EXTERNAL_SOURCES_MAVEN_BASE_URL)
    base-url: "https://search.maven.org/solrsearch/select"

    # (env: GRYPE_EXTERNAL_SOURCES_MAVEN_RATE_LIMIT)
    rate-limit: 300ms

match:
  java:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_JAVA_USING_CPES)
    using-cpes: false

  jvm:
    # (env: GRYPE_MATCH_JVM_USING_CPES)
    using-cpes: true

  dotnet:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_DOTNET_USING_CPES)
    using-cpes: false

  golang:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_GOLANG_USING_CPES)
    using-cpes: false

    # use CPE matching to find vulnerabilities for the Go standard library (env: GRYPE_MATCH_GOLANG_ALWAYS_USE_CPE_FOR_STDLIB)
    always-use-cpe-for-stdlib: true

    # allow comparison between main module pseudo-versions (e.g. v0.0.0-20240413-2b432cf643...) (env: GRYPE_MATCH_GOLANG_ALLOW_MAIN_MODULE_PSEUDO_VERSION_COMPARISON)
    allow-main-module-pseudo-version-comparison: false

  javascript:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_JAVASCRIPT_USING_CPES)
    using-cpes: false

  python:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_PYTHON_USING_CPES)
    using-cpes: false

  ruby:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_RUBY_USING_CPES)
    using-cpes: false

  rust:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_RUST_USING_CPES)
    using-cpes: false

  stock:
    # use CPE matching to find vulnerabilities (env: GRYPE_MATCH_STOCK_USING_CPES)
    using-cpes: true

# upon scanning, if a severity is found at or above the given severity then the return code will be 1
# default is unset which will skip this validation (options: negligible, low, medium, high, critical) (env: GRYPE_FAIL_ON_SEVERITY)
fail-on-severity: ""

registry:
  # skip TLS verification when communicating with the registry (env: GRYPE_REGISTRY_INSECURE_SKIP_TLS_VERIFY)
  insecure-skip-tls-verify: false

  # use http instead of https when connecting to the registry (env: GRYPE_REGISTRY_INSECURE_USE_HTTP)
  insecure-use-http: false

  # Authentication credentials for specific registries. Each entry describes authentication for a specific authority:
  # - authority: the registry authority URL the URL to the registry (e.g. "docker.io", "localhost:5000", etc.) (env: SYFT_REGISTRY_AUTH_AUTHORITY)
  #  username: a username if using basic credentials (env: SYFT_REGISTRY_AUTH_USERNAME)
  #  password: a corresponding password (env: SYFT_REGISTRY_AUTH_PASSWORD)
  #  token: a token if using token-based authentication, mutually exclusive with username/password (env: SYFT_REGISTRY_AUTH_TOKEN)
  #  tls-cert: filepath to the client certificate used for TLS authentication to the registry (env: SYFT_REGISTRY_AUTH_TLS_CERT)
  #  tls-key: filepath to the client key used for TLS authentication to the registry (env: SYFT_REGISTRY_AUTH_TLS_KEY)
  auth: []

  # filepath to a CA certificate (or directory containing *.crt, *.cert, *.pem) used to generate the client certificate (env: GRYPE_REGISTRY_CA_CERT)
  ca-cert: ""

# show suppressed/ignored vulnerabilities in the output (only supported with table output format) (env: GRYPE_SHOW_SUPPRESSED)
show-suppressed: false

# orient results by CVE instead of the original vulnerability ID when possible (env: GRYPE_BY_CVE)
by-cve: false

# sort the match results with the given strategy, options=[package severity epss risk kev vulnerability] (env: GRYPE_SORT_BY)
sort-by: "risk"

# same as --name; set the name of the target being analyzed (env: GRYPE_NAME)
name: ""

# allows users to specify which image source should be used to generate the sbom
# valid values are: registry, docker, podman (env: GRYPE_DEFAULT_IMAGE_PULL_SOURCE)
default-image-pull-source: ""

# a list of VEX documents to consider when producing scanning results (env: GRYPE_VEX_DOCUMENTS)
vex-documents: []

# VEX statuses to consider as ignored rules (env: GRYPE_VEX_ADD)
vex-add: []

# match kernel-header packages with upstream kernel as kernel vulnerabilities (env: GRYPE_MATCH_UPSTREAM_KERNEL_HEADERS)
match-upstream-kernel-headers: false

fix-channel:
  redhat-eus:
    # whether fixes from this channel should be considered, options are "never", "always", or "auto" (conditionally applied based on SBOM data) (env: GRYPE_FIX_CHANNEL_REDHAT_EUS_APPLY)
    apply: "auto"

    # (env: GRYPE_FIX_CHANNEL_REDHAT_EUS_VERSIONS)
    versions: ">= 8.0"

# (env: GRYPE_TIMESTAMP)
timestamp: true

db:
  # location to write the vulnerability database cache (env: GRYPE_DB_CACHE_DIR)
  cache-dir: "~.cache~grype~db"

  # URL of the vulnerability database (env: GRYPE_DB_UPDATE_URL)
  update-url: "https://grype.anchore.io/databases"

  # certificate to trust download the database and listing file (env: GRYPE_DB_CA_CERT)
  ca-cert: ""

  # check for database updates on execution (env: GRYPE_DB_AUTO_UPDATE)
  auto-update: true

  # validate the database matches the known hash each execution (env: GRYPE_DB_VALIDATE_BY_HASH_ON_START)
  validate-by-hash-on-start: true

  # ensure db build is no older than the max-allowed-built-age (env: GRYPE_DB_VALIDATE_AGE)
  validate-age: true

  # Max allowed age for vulnerability database,
  # age being the time since it was built
  # Default max age is 120h (or five days) (env: GRYPE_DB_MAX_ALLOWED_BUILT_AGE)
  max-allowed-built-age: 120h0m0s

  # fail the scan if unable to check for database updates (env: GRYPE_DB_REQUIRE_UPDATE_CHECK)
  require-update-check: false

  # Timeout for downloading GRYPE_DB_UPDATE_URL to see if the database needs to be downloaded
  # This file is ~156KiB as of 2024-04-17 so the download should be quick; adjust as needed (env: GRYPE_DB_UPDATE_AVAILABLE_TIMEOUT)
  update-available-timeout: 30s

  # Timeout for downloading actual vulnerability DB
  # The DB is ~156MB as of 2024-04-17 so slower connections may exceed the default timeout; adjust as needed (env: GRYPE_DB_UPDATE_DOWNLOAD_TIMEOUT)
  update-download-timeout: 5m0s

  # Maximum frequency to check for vulnerability database updates (env: GRYPE_DB_MAX_UPDATE_CHECK_FREQUENCY)
  max-update-check-frequency: 2h0m0s

exp:

6.4 - Syft Default Configuration

Syft searches for configuration files in the following locations, in order:

  1. ./.syft.yaml - current working directory
  2. ./.syft/config.yaml - app subdirectory in current working directory
  3. ~/.syft.yaml - home directory
  4. $XDG_CONFIG_HOME/syft/config.yaml - XDG config directory

The configuration file can use either .yaml or .yml extensions. The first configuration file found will be used.

log:
  # suppress all logging output (env: SYFT_LOG_QUIET)
  quiet: false

  # increase verbosity (-v = info, -vv = debug) (env: SYFT_LOG_VERBOSITY)
  verbosity: 0

  # explicitly set the logging level (available: [error warn info debug trace]) (env: SYFT_LOG_LEVEL)
  level: "warn"

  # file path to write logs to (env: SYFT_LOG_FILE)
  file: ""

dev:
  # capture resource profiling data (available: [cpu, mem]) (env: SYFT_DEV_PROFILE)
  profile: ""

# the configuration file(s) used to load application configuration (env: SYFT_CONFIG)
config: ""

# the output format(s) of the SBOM report (options: syft-table, syft-text, syft-json, spdx-json, ...)
# to specify multiple output files in differing formats, use a list:
# output:
#   - "syft-json=<syft-json-output-file>"
#   - "spdx-json=<spdx-json-output-file>" (env: SYFT_OUTPUT)
output:
  - "syft-table"

# file to write the default report output to (default is STDOUT) (env: SYFT_LEGACYFILE)
legacyFile: ""

format:
  # default value for all formats that support the "pretty" option (default is unset) (env: SYFT_FORMAT_PRETTY)
  pretty:

  template:
    # path to the template file to use when rendering the output with the template output format.
    # Note that all template paths are based on the current syft-json schema (env: SYFT_FORMAT_TEMPLATE_PATH)
    path: ""

    # if true, uses the go structs for the syft-json format for templating.
    # if false, uses the syft-json output for templating (which follows the syft JSON schema exactly).
    #
    # Note: long term support for this option is not guaranteed (it may change or break at any time) (env: SYFT_FORMAT_TEMPLATE_LEGACY)
    legacy: false

  json:
    # transform any syft-json output to conform to an approximation of the v11.0.1 schema. This includes:
    # - using the package metadata type names from before v12 of the JSON schema (changed in https://github.com/anchore/syft/pull/1983)
    #
    # Note: this will still include package types and fields that were added at or after json schema v12. This means
    # that output might not strictly be json schema v11 compliant, however, for consumers that require time to port
    # over to the final syft 1.0 json output this option can be used to ease the transition.
    #
    # Note: long term support for this option is not guaranteed (it may change or break at any time) (env: SYFT_FORMAT_JSON_LEGACY)
    legacy: false

    # include space indentation and newlines
    # note: inherits default value from 'format.pretty' or 'false' if parent is unset (env: SYFT_FORMAT_JSON_PRETTY)
    pretty:

  spdx-json:
    # include space indentation and newlines
    # note: inherits default value from 'format.pretty' or 'false' if parent is unset (env: SYFT_FORMAT_SPDX_JSON_PRETTY)
    pretty:

  cyclonedx-json:
    # include space indentation and newlines
    # note: inherits default value from 'format.pretty' or 'false' if parent is unset (env: SYFT_FORMAT_CYCLONEDX_JSON_PRETTY)
    pretty:

  cyclonedx-xml:
    # include space indentation and newlines
    # note: inherits default value from 'format.pretty' or 'false' if parent is unset (env: SYFT_FORMAT_CYCLONEDX_XML_PRETTY)
    pretty:

# whether to check for an application update on start up or not (env: SYFT_CHECK_FOR_APP_UPDATE)
check-for-app-update: true

# enable one or more package catalogers (env: SYFT_CATALOGERS)
catalogers: []

# set the base set of catalogers to use (defaults to 'image' or 'directory' depending on the scan source) (env: SYFT_DEFAULT_CATALOGERS)
default-catalogers: []

# add, remove, and filter the catalogers to be used (env: SYFT_SELECT_CATALOGERS)
select-catalogers: []

package:
  # search within archives that do not contain a file index to search against (tar, tar.gz, tar.bz2, etc)
  # note: enabling this may result in a performance impact since all discovered compressed tars will be decompressed
  # note: for now this only applies to the java package cataloger (env: SYFT_PACKAGE_SEARCH_UNINDEXED_ARCHIVES)
  search-unindexed-archives: false

  # search within archives that do contain a file index to search against (zip)
  # note: for now this only applies to the java package cataloger (env: SYFT_PACKAGE_SEARCH_INDEXED_ARCHIVES)
  search-indexed-archives: true

  # allows users to exclude synthetic binary packages from the sbom
  # these packages are removed if an overlap with a non-synthetic package is found (env: SYFT_PACKAGE_EXCLUDE_BINARY_OVERLAP_BY_OWNERSHIP)
  exclude-binary-overlap-by-ownership: true

license:
  # include the content of licenses in the SBOM for a given syft scan; valid values are: [all unknown none] (env: SYFT_LICENSE_CONTENT)
  content: "none"

  # adjust the percent as a fraction of the total text, in normalized words, that
  # matches any valid license for the given inputs, expressed as a percentage across all of the licenses matched. (env: SYFT_LICENSE_COVERAGE)
  coverage: 75

file:
  metadata:
    # select which files should be captured by the file-metadata cataloger and included in the SBOM.
    # Options include:
    #  - "all": capture all files from the search space
    #  - "owned-by-package": capture only files owned by packages
    #  - "none", "": do not capture any files (env: SYFT_FILE_METADATA_SELECTION)
    selection: "owned-by-package"

    # the file digest algorithms to use when cataloging files (options: "md5", "sha1", "sha224", "sha256", "sha384", "sha512") (env: SYFT_FILE_METADATA_DIGESTS)
    digests:
      - "sha1"
      - "sha256"

  content:
    # skip searching a file entirely if it is above the given size (default = 1MB; unit = bytes) (env: SYFT_FILE_CONTENT_SKIP_FILES_ABOVE_SIZE)
    skip-files-above-size: 256000

    # file globs for the cataloger to match on (env: SYFT_FILE_CONTENT_GLOBS)
    globs: []

  executable:
    # file globs for the cataloger to match on (env: SYFT_FILE_EXECUTABLE_GLOBS)
    globs: []

# selection of layers to catalog, options=[squashed all-layers deep-squashed] (env: SYFT_SCOPE)
scope: "squashed"

# number of cataloger workers to run in parallel
# by default, when set to 0: this will be based on runtime.NumCPU * 4, if set to less than 0 it will be unbounded (env: SYFT_PARALLELISM)
parallelism: 0

relationships:
  # include package-to-file relationships that indicate which files are owned by which packages (env: SYFT_RELATIONSHIPS_PACKAGE_FILE_OWNERSHIP)
  package-file-ownership: true

  # include package-to-package relationships that indicate one package is owned by another due to files claimed to be owned by one package are also evidence of another package's existence (env: SYFT_RELATIONSHIPS_PACKAGE_FILE_OWNERSHIP_OVERLAP)
  package-file-ownership-overlap: true

compliance:
  # action to take when a package is missing a name (env: SYFT_COMPLIANCE_MISSING_NAME)
  missing-name: "drop"

  # action to take when a package is missing a version (env: SYFT_COMPLIANCE_MISSING_VERSION)
  missing-version: "stub"

# Enable data enrichment operations, which can utilize services such as Maven Central and NPM.
# By default all enrichment is disabled, use: all to enable everything.
# Available options are: all, golang, java, javascript (env: SYFT_ENRICH)
enrich: []

dotnet:
  # only keep dep.json packages which an executable on disk is found. The package is also included if a DLL is found for any child package, even if the package itself does not have a DLL. (env: SYFT_DOTNET_DEP_PACKAGES_MUST_HAVE_DLL)
  dep-packages-must-have-dll: false

  # only keep dep.json packages which have a runtime/resource DLL claimed in the deps.json targets section (but not necessarily found on disk). The package is also included if any child package claims a DLL, even if the package itself does not claim a DLL. (env: SYFT_DOTNET_DEP_PACKAGES_MUST_CLAIM_DLL)
  dep-packages-must-claim-dll: true

  # treat DLL claims or on-disk evidence for child packages as DLL claims or on-disk evidence for any parent package (env: SYFT_DOTNET_PROPAGATE_DLL_CLAIMS_TO_PARENTS)
  propagate-dll-claims-to-parents: true

  # show all packages from the deps.json if bundling tooling is present as a dependency (e.g. ILRepack) (env: SYFT_DOTNET_RELAX_DLL_CLAIMS_WHEN_BUNDLING_DETECTED)
  relax-dll-claims-when-bundling-detected: true

golang:
  # search for go package licences in the GOPATH of the system running Syft, note that this is outside the
  # container filesystem and potentially outside the root of a local directory scan (env: SYFT_GOLANG_SEARCH_LOCAL_MOD_CACHE_LICENSES)
  search-local-mod-cache-licenses:

  # specify an explicit go mod cache directory, if unset this defaults to $GOPATH/pkg/mod or $HOME/go/pkg/mod (env: SYFT_GOLANG_LOCAL_MOD_CACHE_DIR)
  local-mod-cache-dir: "~go~pkg~mod"

  # search for go package licences in the vendor folder on the system running Syft, note that this is outside the
  # container filesystem and potentially outside the root of a local directory scan (env: SYFT_GOLANG_SEARCH_LOCAL_VENDOR_LICENSES)
  search-local-vendor-licenses:

  # specify an explicit go vendor directory, if unset this defaults to ./vendor (env: SYFT_GOLANG_LOCAL_VENDOR_DIR)
  local-vendor-dir: ""

  # search for go package licences by retrieving the package from a network proxy (env: SYFT_GOLANG_SEARCH_REMOTE_LICENSES)
  search-remote-licenses:

  # remote proxy to use when retrieving go packages from the network,
  # if unset this defaults to $GOPROXY followed by https://proxy.golang.org (env: SYFT_GOLANG_PROXY)
  proxy: "https://proxy.golang.org,direct"

  # specifies packages which should not be fetched by proxy
  # if unset this defaults to $GONOPROXY (env: SYFT_GOLANG_NO_PROXY)
  no-proxy: ""

  main-module-version:
    # look for LD flags that appear to be setting a version (e.g. -X main.version=1.0.0) (env: SYFT_GOLANG_MAIN_MODULE_VERSION_FROM_LD_FLAGS)
    from-ld-flags: true

    # search for semver-like strings in the binary contents (env: SYFT_GOLANG_MAIN_MODULE_VERSION_FROM_CONTENTS)
    from-contents: false

    # use the build settings (e.g. vcs.version & vcs.time) to craft a v0 pseudo version
    # (e.g. v0.0.0-20220308212642-53e6d0aaf6fb) when a more accurate version cannot be found otherwise (env: SYFT_GOLANG_MAIN_MODULE_VERSION_FROM_BUILD_SETTINGS)
    from-build-settings: true

java:
  # enables Syft to use the network to fetch version and license information for packages when
  # a parent or imported pom file is not found in the local maven repository.
  # the pom files are downloaded from the remote Maven repository at 'maven-url' (env: SYFT_JAVA_USE_NETWORK)
  use-network:

  # use the local Maven repository to retrieve pom files. When Maven is installed and was previously used
  # for building the software that is being scanned, then most pom files will be available in this
  # repository on the local file system. this greatly speeds up scans. when all pom files are available
  # in the local repository, then 'use-network' is not needed.
  # TIP: If you want to download all required pom files to the local repository without running a full
  # build, run 'mvn help:effective-pom' before performing the scan with syft. (env: SYFT_JAVA_USE_MAVEN_LOCAL_REPOSITORY)
  use-maven-local-repository:

  # override the default location of the local Maven repository.
  # the default is the subdirectory '.m2/repository' in your home directory (env: SYFT_JAVA_MAVEN_LOCAL_REPOSITORY_DIR)
  maven-local-repository-dir: "~.m2~repository"

  # maven repository to use, defaults to Maven central (env: SYFT_JAVA_MAVEN_URL)
  maven-url: "https://repo1.maven.org/maven2"

  # depth to recursively resolve parent POMs, no limit if <= 0 (env: SYFT_JAVA_MAX_PARENT_RECURSIVE_DEPTH)
  max-parent-recursive-depth: 0

  # resolve transient dependencies such as those defined in a dependency's POM on Maven central (env: SYFT_JAVA_RESOLVE_TRANSITIVE_DEPENDENCIES)
  resolve-transitive-dependencies: false

javascript:
  # enables Syft to use the network to fill in more detailed license information (env: SYFT_JAVASCRIPT_SEARCH_REMOTE_LICENSES)
  search-remote-licenses:

  # base NPM url to use (env: SYFT_JAVASCRIPT_NPM_BASE_URL)
  npm-base-url: ""

  # include development-scoped dependencies (env: SYFT_JAVASCRIPT_INCLUDE_DEV_DEPENDENCIES)
  include-dev-dependencies:

linux-kernel:
  # whether to catalog linux kernel modules found within lib/modules/** directories (env: SYFT_LINUX_KERNEL_CATALOG_MODULES)
  catalog-modules: true

nix:
  # enumerate all files owned by packages found within Nix store paths (env: SYFT_NIX_CAPTURE_OWNED_FILES)
  capture-owned-files: false

python:
  # when running across entries in requirements.txt that do not specify a specific version
  # (e.g. "sqlalchemy >= 1.0.0, <= 2.0.0, != 3.0.0, <= 3.0.0"), attempt to guess what the version could
  # be based on the version requirements specified (e.g. "1.0.0"). When enabled the lowest expressible version
  # when given an arbitrary constraint will be used (even if that version may not be available/published). (env: SYFT_PYTHON_GUESS_UNPINNED_REQUIREMENTS)
  guess-unpinned-requirements: false

registry:
  # skip TLS verification when communicating with the registry (env: SYFT_REGISTRY_INSECURE_SKIP_TLS_VERIFY)
  insecure-skip-tls-verify: false

  # use http instead of https when connecting to the registry (env: SYFT_REGISTRY_INSECURE_USE_HTTP)
  insecure-use-http: false

  # Authentication credentials for specific registries. Each entry describes authentication for a specific authority:
  # - authority: the registry authority URL the URL to the registry (e.g. "docker.io", "localhost:5000", etc.) (env: SYFT_REGISTRY_AUTH_AUTHORITY)
  #  username: a username if using basic credentials (env: SYFT_REGISTRY_AUTH_USERNAME)
  #  password: a corresponding password (env: SYFT_REGISTRY_AUTH_PASSWORD)
  #  token: a token if using token-based authentication, mutually exclusive with username/password (env: SYFT_REGISTRY_AUTH_TOKEN)
  #  tls-cert: filepath to the client certificate used for TLS authentication to the registry (env: SYFT_REGISTRY_AUTH_TLS_CERT)
  #  tls-key: filepath to the client key used for TLS authentication to the registry (env: SYFT_REGISTRY_AUTH_TLS_KEY)
  auth: []

  # filepath to a CA certificate (or directory containing *.crt, *.cert, *.pem) used to generate the client certificate (env: SYFT_REGISTRY_CA_CERT)
  ca-cert: ""

# specify the source behavior to use (e.g. docker, registry, oci-dir, ...) (env: SYFT_FROM)
from: []

# an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux') (env: SYFT_PLATFORM)
platform: ""

source:
  # set the name of the target being analyzed (env: SYFT_SOURCE_NAME)
  name: ""

  # set the version of the target being analyzed (env: SYFT_SOURCE_VERSION)
  version: ""

  # the organization that supplied the component, which often may be the manufacturer, distributor, or repackager (env: SYFT_SOURCE_SUPPLIER)
  supplier: ""

  # (env: SYFT_SOURCE_SOURCE)
  source: ""

  # base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory (env: SYFT_SOURCE_BASE_PATH)
  base-path: ""

  file:
    # the file digest algorithms to use on the scanned file (options: "md5", "sha1", "sha224", "sha256", "sha384", "sha512") (env: SYFT_SOURCE_FILE_DIGESTS)
    digests:
      - "SHA-256"

  image:
    # allows users to specify which image source should be used to generate the sbom
    # valid values are: registry, docker, podman (env: SYFT_SOURCE_IMAGE_DEFAULT_PULL_SOURCE)
    default-pull-source: ""

    # (env: SYFT_SOURCE_IMAGE_MAX_LAYER_SIZE)
    max-layer-size: ""

# exclude paths from being scanned using a glob expression (env: SYFT_EXCLUDE)
exclude: []

unknowns:
  # remove unknown errors on files with discovered packages (env: SYFT_UNKNOWNS_REMOVE_WHEN_PACKAGES_DEFINED)
  remove-when-packages-defined: true

  # include executables without any identified packages (env: SYFT_UNKNOWNS_EXECUTABLES_WITHOUT_PACKAGES)
  executables-without-packages: true

  # include archives which were not expanded and searched (env: SYFT_UNKNOWNS_UNEXPANDED_ARCHIVES)
  unexpanded-archives: true

cache:
  # root directory to cache any downloaded content; empty string will use an in-memory cache (env: SYFT_CACHE_DIR)
  dir: "~.cache~syft"

  # time to live for cached data; setting this to 0 will disable caching entirely (env: SYFT_CACHE_TTL)
  ttl: "7d"

# show catalogers that have been de-selected (env: SYFT_SHOW_HIDDEN)
show-hidden: false

attest:
  # the key to use for the attestation (env: SYFT_ATTEST_KEY)
  key: ""

  # password to decrypt to given private key
  # additionally responds to COSIGN_PASSWORD env var (env: SYFT_ATTEST_PASSWORD)
  password: ""

6.5 - Configuration Reference

Configuration patterns and options used across all Anchore OSS tools

All Anchore open source tools (Syft, Grype, Grant) share the same configuration system. This guide explains how to configure these tools using command-line flags, environment variables, and configuration files.

Configuration precedence

When you configure a tool, settings are applied in a specific order. If the same setting is specified in multiple places, the tool uses the value from the highest-priority source:

  1. Command-line arguments (highest priority)
  2. Environment variables
  3. Configuration file
  4. Default values (lowest priority)

For example, if you set the log level using all three methods, the command-line flag overrides the environment variable, which overrides the config file value.

Viewing your configuration

To see available configuration options and current settings:

  • syft --help — shows all command-line flags
  • syft config — prints a complete sample configuration file
  • syft config --load — displays your current active configuration

Replace syft with the tool you’re using (grype, grant, etc.).

Using environment variables

Every configuration option can be set via environment variable. The variable name follows the path to the setting in the configuration file.

Example: To enable pretty-printed JSON output, the config file setting is:

format:
  json:
    pretty: true

The path from root to this value is formatjsonpretty, so the environment variable is:

export SYFT_FORMAT_JSON_PRETTY=true

The pattern is: <TOOL>_<PATH>_<TO>_<SETTING> where:

  • <TOOL> is the uppercase tool name (SYFT, GRYPE, GRANT)
  • Path segments are joined with underscores
  • All letters are uppercase

More examples:

# Set log level to debug
export SYFT_LOG_LEVEL=debug

# Configure output format
export GRYPE_OUTPUT=json

# Set registry credentials
export SYFT_REGISTRY_AUTH_USERNAME=myuser

Using a configuration file

Configuration files use YAML format. The tool searches these locations in order and uses the first file it finds:

  1. .syft.yaml (in current directory)
  2. .syft/config.yaml (in current directory)
  3. ~/.syft.yaml (in home directory)
  4. <XDG_CONFIG_HOME>/syft/config.yaml (typically ~/.config/syft/config.yaml)

Replace syft with your tool name (grype, grant, etc.).

7 - About

About Anchore OSS and its community

7.1 - OSS Team

Meet the team behind the tools

Anchore Open Source Team

Faces!

7.2 - Events

Anchore OSS Community Events and Meetings

Open Source Live Streams

Almost every Thursday the OSS team holds a “Gardening” live stream on the Anchore YouTube channel. Each week, we announce what time the live stream is happening in the Announcements on Discourse.

The streams are recorded and archived in our Live stream playlist.

Community Meetings

We hold open meetings with the community, on alternate Thursdays. These are on Zoom, and are not recorded or streamed. There is an optional agenda which can be filled in. Everyone is welcome. A webcam is not required.

Anchore Events

Anchore has a separate Events page, for announcing industry & corporate events, and webinars.

7.3 - OSS Adopters

Adopters of Anchore Open Source Tools

Our tools are used by organisations and developer teams of all sizes. Below is a small sample of users of our tools, in public GitHub repositories.

No adopters data found. Check your data file.

More organisations below are all adopters of our tools, in public GitHub repositories.

Syft

Repository Stars
  derailed / k9s 31025
  kubescape / kubescape 10979
  anchore / grype 10629
  deepfence / ThreatMapper 5142
  zarf-dev / zarf 1651
  vdaas / vald 1636
  helm / chart-testing 1561
  lunasec-io / lunasec 1456
  openclarity / openclarity 1427
  guacsec / guac 1406
  SAP / jenkins-library 800
  helm / chart-releaser 760
  safedep / vet 729
  in-toto / witness 494
  xeol-io / xeol 409
  project-stacker / stacker 289
  slsa-framework / slsa-verifier 282
  ckotzbauer / sbom-operator 206
  gitpod-io / leeway 169
  go-sigma / sigma 167
  docker / sbom-cli-plugin 156
  vulncheck-oss / cli 139
  agntcy / dir 108
  anchore / grant 104
  ckotzbauer / vulnerability-operator 85
  wolfi-dev / wolfictl 67
  agntcy / workflow-srv-mgr 60
  Checkmarx / ast-cli 57
  bottlerocket-os / bottlerocket-sdk 56
  sammcj / mcp-devtools 55
  anchore / grype-db 54

Grype

Repository Stars
  derailed / k9s 31025
  kubescape / kubescape 10979
  deepfence / ThreatMapper 5142
  zarf-dev / zarf 1651
  vdaas / vald 1636
  lunasec-io / lunasec 1456
  openclarity / openclarity 1427
  xeol-io / xeol 409
  slsa-framework / slsa-verifier 282
  gitpod-io / leeway 169
  ckotzbauer / vulnerability-operator 85
  wolfi-dev / wolfictl 67
  sammcj / mcp-devtools 55
  anchore / grype-db 54

SBOM Action

Repository Stars
  n8n-io / n8n 136966
  caddyserver / caddy 66730
  ultralytics / ultralytics 45473
  grafana / k6 28717
  grafana / loki 26408
  SigNoz / signoz 23479
  cilium / cilium 22428
  jaegertracing / jaeger 21847
  getsops / sops 19369
  nats-io / nats-server 18185
  stackblitz-labs / bolt.diy 17813
  goreleaser / goreleaser 15102
  App-vNext / Polly 13956
  kubescape / kubescape 10979
  orhun / git-cliff 10777
  anchore / grype 10629
  loft-sh / vcluster 10585
  dexidp / dex 10175
  fission / fission 8737
  Workiva / go-datastructures 7837
  anchore / syft 7598
  fluxcd / flux2 7409
  k8sgpt-ai / k8sgpt 6938
  kubevela / kubevela 6834
  gopasspw / gopass 6462
  podman-desktop / podman-desktop 6450
  external-secrets / external-secrets 5817
  open-telemetry / opentelemetry-collector 5773
  inventree / InvenTree 5721
  apache / nifi 5660
  domaindrivendev / Swashbuckle.AspNetCore 5407
  fluxcd / flagger 5152
  nginx / kubernetes-ingress 4817
  grafana / tempo 4738
  jenkins-x / jx 4664
  openbao / openbao 4482
  openfga / openfga 4087
  cerbos / cerbos 4039
  modelcontextprotocol / registry 3589
  version-fox / vfox 3529
  orhun / binsider 3403
  mpromonet / webrtc-streamer 3389
  orhun / kmon 2782
  dragonflyoss / dragonfly 2772
  akuity / kargo 2694
  kube-vip / kube-vip 2531
  IBM / mcp-context-forge 2412
  goreleaser / nfpm 2395
  ory / polis 2137
  badtuxx / girus-cli 2103
  mpromonet / v4l2rtspserver 1969
  projectcapsule / capsule 1925
  artifacthub / hub 1905
  ublue-os / bluefin 1887
  nginx / nginx-prometheus-exporter 1855
  stefanprodan / timoni 1852
  keptn / keptn 1789
  regclient / regclient 1632
  kubewall / kubewall 1573
  helm / chart-testing 1561
  kubeshop / testkube 1494
  flux-iac / tofu-controller 1486
  project-copacetic / copacetic 1424
  guacsec / guac 1406
  OWASP / SecurityShepherd 1402
  orhun / systeroid 1384
  charmbracelet / wishlist 1371
  trueforge-org / truecharts 1270
  dimonomid / nerdlog 1261
  aserto-dev / topaz 1257
  containerd / runwasi 1208
  abhimanyu003 / sttr 1182
  kitops-ml / kitops 1180
  stacklok / toolhive 1164
  k8gb-io / k8gb 1074
  minicli / minicli 1063
  lensesio / stream-reactor 1038
  sigstore / gitsign 1020
  jonrau1 / ElectricEye 1010
  gnolang / gno 989
  orhun / rustypaste 971
  open-cluster-management-io / ocm 957
  controlplaneio / simulator 956
  cBioPortal / cbioportal 853
  percona / pmm 838
  intigriti / misconfig-mapper 816
  updatecli / updatecli 792
  kluctl / kluctl 788
  helm / chart-releaser 760
  open-feature / flagd 758
  orhun / halp 750
  poweradmin / poweradmin 729
  flux-subsystem-argo / flamingo 706
  caarlos0 / svu 697
  getprobo / probo 686
  opea-project / GenAIExamples 682
  nuxeo / nuxeo 673
  nginx / nginx-gateway-fabric 668
  glasskube / distr 647
  falcosecurity / falcosidekick 619
  orhun / linuxwave 601
  devops-kung-fu / bomber 576
  epinio / epinio 559
  editorconfig-checker / editorconfig-checker 548
  microsoft / call-center-ai 531
  clemlesne / scrape-it-now 525
  in-toto / witness 494
  caioricciuti / ch-ui 463
  kubestellar / kubestellar 463
  fluxcd / helm-controller 457
  anchore / quill 455
  kyverno / chainsaw 437
  retracedhq / retraced 412
  keptn / lifecycle-toolkit 400
  open-telemetry / opentelemetry-collector-releases 388
  k8sgpt-ai / k8sgpt-operator 387
  pcasteran / terraform-graph-beautifier 387
  controlplaneio / netassert 377
  justeattakeaway / httpclient-interception 376
  tbckr / sgpt 370
  NLeSC / mcfly 365
  controlplaneio-fluxcd / flux-operator 355
  mindersec / minder 349
  ublue-os / aurora 341
  wanghaisheng / tiktoka-studio-uploader 331
  jkroepke / openvpn-auth-oauth2 329
  ahmetb / gen-crd-api-reference-docs 325
  rad-security / kbom 318
  Lissy93 / domain-locker 313
  caarlos0 / domain_exporter 313
  stefanprodan / kustomizer 296
  martincostello / xunit-logging 293
  avisi-cloud / structurizr-site-generatr 293
  home-operations / containers 292
  kexa-io / Kexa 290
  compozy / compozy 290
  ahoy-cli / ahoy 281
  notaryproject / ratify 278
  udx / wp-stateless 268
  gatewayd-io / gatewayd 266
  spr-networks / super 266
  sgl-project / ome 265
  fluxcd / kustomize-controller 265
  fluxcd / source-controller 257
  nicholas-fedor / watchtower 251
  martincostello / sqllocaldb 251
  open-feature / open-feature-operator 251
  digitalghost-dev / premier-league 246
  KWasm / kwasm-operator 237
  au2001 / icloud-passwords-firefox 236
  mitre / heimdall2 235
  FDio / govpp 232
  micro-lc / micro-lc 221
  Hyperledger-TWGC / tape 220
  hazcod / ransomwhere 212
  SchwarzIT / go-template 200
  mostafa / xk6-kafka 193
  snyk / parlay 191
  fluxcd / image-automation-controller 187
  muhlba91 / pulumi-proxmoxve 184
  defenseunicorns / pepr 181
  dirien / minectl 178
  plgd-dev / hub 173
  opea-project / GenAIComps 172
  cerberauth / vulnapi 172
  roots / trellis-cli 169
  rond-authz / rond 162
  mitre / saf 162
  fluxcd / notification-controller 162
  docker / sbom-cli-plugin 156
  chainguard-dev / incert 156
  soraro / kurt 154
  jauderho / dockerfiles 154
  elastic / harp 152
  stacklok / frizbee 150
  jkroepke / access-log-exporter 147
  sigstore / policy-controller 142
  kaansk / shomon 131
  laoshanxi / app-mesh 128
  philips-software / amp-devcontainer 125
  openimsdk / chat 125
  falcosecurity / falcosidekick-ui 124
  Workiva / built_redux 123
  OpenUnison / openunison-k8s 123
  Hive-Academy / Anubis-MCP 122
  hemilabs / heminetwork 122
  asymmetric-research / solana-exporter 119
  holos-run / holos 116
  fluxcd / image-reflector-controller 116
  dirien / minecraft-prometheus-exporter 116
  bomctl / bomctl 115
  homeall / caddy-reverse-proxy-cloudflare 109
  civiform / civiform 109
  html2rss / html2rss-web 108
  SAP / terraform-provider-btp 106
  descope / descopecli 103
  raffis / gitops-zombies 103
  sigstore / timestamp-authority 102
  IAreKyleW00t / docker-caddy-cloudflare 101
  ossf / sbom-everywhere 101
  autobrr / mkbrr 101
  raffis / mongodb-query-exporter 101
  shopware / shopware-cli 98
  salrashid123 / gce_metadata_server 98
  caarlos0 / twitter-cleaner 97
  pteich / elastic-query-export 96
  dwisiswant0 / unch 94
  martincostello / openapi-extensions 92
  actinia-org / actinia-core 92
  caddyserver / gateway 92
  OpenZeppelin / openzeppelin-relayer 89
  AlbrechtL / openwrt-docker 89
  OpenZeppelin / openzeppelin-monitor 88
  caarlos0 / jsonfmt 88
  kyverno / kyverno-json 86
  cardinalhq / lakerunner 85
  microsoft / terraform-provider-fabric 85
  intelops / compage 85
  openfga / cli 82
  schednex-ai / schednex 81
  0x61nas / aarty 81
  erfianugrah / revista-3 80
  some-natalie / kubernoodles 80
  Workiva / opentelemetry-dart 79
  mitre / vulcan 78
  devops-kung-fu / hookz 78
  sigstore / cosign-gatekeeper-provider 78
  certonid / certonid 77
  PurpleBooth / git-mit 76
  wimpysworld / stream-sprout 76
  cpanato / github_actions_exporter 76
  fystack / mpcium 74
  Workiva / dart_dev 74
  gearnode / privatebin 74
  crashappsec / github-analyzer 72
  shini4i / argo-watcher 69
  alegrey91 / fwdctl 69
  phoban01 / cue-flux-controller 69
  stackabletech / spark-k8s-operator 66
  Workiva / state_machine 65
  tektronix / tm_devices 65
  mchmarny / vimp 65
  sigstore / helm-sigstore 65
  saas-factory-labs / Saas-Factory 64
  Workiva / dart_codemod 64
  SigNoz / signoz-otel-collector 64
  ICTU / quality-time 63
  anchore / chronicle 63
  peak-scale / sops-operator 63
  gembaadvantage / uplift 63
  yurishkuro / microsim 62
  tuannvm / mcp-trino 60
  opensearch-project / opensearch-migrations 60
  redhat-certification / chart-verifier 59
  muhlba91 / external-dns-provider-adguard 59
  ilijamt / vault-plugin-secrets-gitlab 59
  gopasspw / git-credential-gopass 58
  stackabletech / trino-operator 58
  goreleaser / example-supply-chain 58
  metal-stack / firewall-controller 57
  grafana / grafana-opentelemetry-dotnet 57
  apigee / apigeecli 57
  theparanoids / crypki 57
  go-faster / oteldb 57
  nginx / nginx-asg-sync 57
  ultralytics / thop 56
  ublue-os / bluefin-lts 55
  theopenlane / core 55
  JSchmie / ScrAIbe 54
  akuity / kargo-render 54
  sapcc / ntp_exporter 54
  engity-com / bifroest 54
  spinframework / runtime-class-manager 54
  dirien / pulumi-fly 53
  FalcoSuessgott / vault-kubernetes-kms 52
  justeattakeaway / JustSaying 51
  teler-sh / teler-proxy 51
  xmlking / grpc-starter-kit 50
  philips-labs / slsa-provenance-action 50

Scan Action

Repository Stars
  ClickHouse / ClickHouse 42822
  airbytehq / airbyte 19470
  bitwarden / server 17139
  docker-mailserver / docker-mailserver 17053
  ory / hydra 16505
  goreleaser / goreleaser 15102
  elastic / logstash 14628
  wazuh / wazuh 13461
  Unstructured-IO / unstructured 12634
  ory / kratos 12294
  bitwarden / clients 11220
  cookieY / Yearning 8763
  flowable / flowable-engine 8706
  gopasspw / gopass 6462
  photoview / photoview 6128
  fastrepl / hyprnote 6082
  apache / nifi 5660
  0xERR0R / blocky 5601
  nuclio / nuclio 5572
  ory / keto 5111
  freedomofpress / dangerzone 4239
  ory / oathkeeper 3426
  chaskiq / chaskiq 3400
  determined-ai / determined 3187
  deepseek-ai / DreamCraft3D 2969
  buildpacks / pack 2799
  akuity / kargo 2694
  sakai135 / wsl-vpnkit 2639
  submariner-io / submariner 2568
  Checkmarx / kics 2469
  onekey-sec / unblob 2354
  11notes / docker-kms 2010
  nginx / nginx-prometheus-exporter 1855
  cloudfoundry / cli 1844
  GIScience / openrouteservice 1711
  mlrun / mlrun 1588
  openremote / openremote 1510
  TheresAFewConors / Sooty 1425
  py-pdf / fpdf2 1363
  wahyd4 / aria2-ariang-docker 1093
  jonrau1 / ElectricEye 1010
  mixcore / mix.core 873
  kanisterio / kanister 840
  Unstructured-IO / unstructured-api 808
  mendhak / docker-http-https-echo 727
  voxpupuli / puppetboard 726
  kool-dev / kool 708
  Threagile / threagile 692
  getprobo / probo 686
  hipages / php-fpm_exporter 681
  nuxeo / nuxeo 673
  nginx / nginx-gateway-fabric 668
  estahn / k8s-image-swapper 611
  ThomasVitale / cloud-native-spring-in-action 538
  shenxn / protonmail-bridge-docker 534
  opentracing-contrib / nginx-opentracing 507
  bitwarden / self-host 506
  grafana / grafana-image-renderer 437
  BallAerospace / COSMOS 372
  bitwarden / sdk-sm 336
  wanghaisheng / tiktoka-studio-uploader 331
  rad-security / kbom 318
  interledger / rafiki 315
  adrianbrad / queue 314
  home-operations / containers 292
  RAJANAGORI / Nightingale 288
  banzaicloud / thanos-operator 281
  cnoe-io / idpbuilder 275
  udx / wp-stateless 268
  waldo-vision / waldo 254
  Secure-Compliance-Solutions-LLC / GVM-Docker 251
  tarampampam / mikrotik-hosts-parser 248
  digitalghost-dev / premier-league 246
  sstarcher / helm-exporter 246
  istio-ecosystem / authservice 236
  signalfx / splunk-otel-collector 223
  buildpacks / lifecycle 198
  defenseunicorns / pepr 181
  righettod / toolbox-pentest-web 166
  MustacheCase / zanadir 165
  11notes / docker-socket-proxy 164
  ilteoood / docker-surfshark 161
  OpenC3 / cosmos 156
  jauderho / dockerfiles 154
  jedisct1 / dnscrypt-server-docker 145
  artefactory / NLPretext 140
  michelin / kstreamplify 132
  submariner-io / lighthouse 130
  11notes / docker-adguard 122
  11notes / docker-kms-gui 119
  submariner-io / submariner-operator 119
  11notes / docker-traefik 115
  Soneji / docker-chromium 115
  alex1989hu / kubelet-serving-cert-approver 113
  banzaicloud / jwt-to-rbac 113
  DataDog / datadog-lambda-extension 109
  azinchen / nordvpn 108
  anweiss / cddl 106
  cfpb / hmda-platform 104
  madereddy / noisy 104
  WeblateOrg / docker 103
  michelin / ns4kafka 94
  Chr157i4n / PyTmcStepper 92
  HHS / simpler-grants-gov 91
  OpenZeppelin / openzeppelin-relayer 89
  tarampampam / tinifier 89
  OpenZeppelin / openzeppelin-monitor 88
  bitwarden / mcp-server 86
  UKHomeOffice / kd 85
  HariSekhon / GitHub-Actions 81
  some-natalie / kubernoodles 80
  ThomasVitale / spring-cloud-gateway-resilience-security-observability 77
  wimpysworld / stream-sprout 76
  astrolabsoftware / fink-broker 72
  werbot / lime 72
  Ortus-Solutions / docker-commandbox 66
  tektronix / tm_devices 65
  ortus-boxlang / BoxLang 65
  mchmarny / vimp 65
  XGovFormBuilder / digital-form-builder 64
  analysys / ans-android-sdk 64
  pegasystems / docker-pega-web-ready 61
  gopasspw / gopass-jsonapi 59
  redhat-certification / chart-verifier 59
  Altinity / ClickHouse 59
  datagrok-ai / public 58
  theparanoids / crypki 57
  submariner-io / shipyard 56
  kube-tarian / tarian 56
  cogini / phoenix_container_example 55
  cogini / phoenix_container_example_old 55
  singlestore-labs / singlestoredb-dev-image 55
  JSchmie / ScrAIbe 54
  ryaneorth / k8s-scheduled-volume-snapshotter 54
  michelin / suricate 52
  SmartTokenLabs / attestation 51
  adlnet / CATAPULT 50

Generated using github-dependents-info, by Nicolas Vuillamy"

7.4 - Discussion

Official Anchore OSS online discussion

Official platforms

Below are platforms maintained and monitored by Anchore OSS Team staff.

Discourse

We have an official community Discourse for discussion of the Anchore OSS tools.

Anchore Community Discourse

Video

We post OSS and Anchore Enterprise related content on our YouTube channel.

Anchore YouTube Channel

Social

Find and engage with us on various social media platforms.

Mastodon BlueSky X
Syft @syft@fosstodon.org @syftproject.bsky.social @syftproject
Grype @grype@fosstodon.org @grypeproject.bsky.social @grypeproject
Anchore @anchore@mstdn.business @anchore.com @anchore

7.5 - Documentation Style Guide

Style guide for writing Anchore OSS documentation

This style guide is for the Anchore OSS documentation. The style guide helps contributors to write documentation that readers can understand quickly and correctly.

The Anchore OSS docs aim for:

  • Consistency in style and terminology, so that readers can expect certain structures and conventions. Readers don’t have to keep re-learning how to use the documentation or questioning whether they’ve understood something correctly.
  • Clear, concise writing so that readers can quickly find and understand the information they need.

Use standard American spelling

Use American spelling rather than Commonwealth or British spelling. Refer to Merriam-Webster’s Collegiate Dictionary, Eleventh Edition.

Use capital letters sparingly

Some hints:

  • Capitalize only the first letter of each heading within the page. (That is, use sentence case.)
  • Capitalize (almost) every word in page titles. (That is, use title case.) The little words like “and”, “in”, etc, don’t get a capital letter.
  • In page content, use capitals only for brand names, like Syft, Anchore, and so on. See more about brand names below.
  • Don’t use capital letters to emphasize words.

Spell out abbreviations and acronyms on first use

Always spell out the full term for every abbreviation or acronym the first time you use it on the page. Don’t assume people know what an abbreviation or acronym means, even if it seems like common knowledge.

Example: “To run Grype locally in a virtual machine (VM)”

Use contractions if you want to

For example, it’s fine to write “it’s” instead of “it is”.

Use full, correct brand names

When referring to a product or brand, use the full name. Capitalize the name as the product owners do in the product documentation. Do not use abbreviations even if they’re in common use, unless the product owner has sanctioned the abbreviation.

Use this Instead of this
Anchore anchore
Kubernetes k8s
GitHub github

Be consistent with punctuation

Use punctuation consistently within a page. For example, if you use a period (full stop) after every item in list, then use a period on all other lists on the page.

Check the other pages if you’re unsure about a particular convention.

Examples:

  • Most pages in the Anchore OSS docs use a period at the end of every list item.
  • There is no period at the end of the page subtitle and the subtitle need not be a full sentence. (The subtitle comes from the description in the front matter of each page.)

Use active voice rather than passive voice

Passive voice is often confusing, as it’s not clear who should perform the action.

Use active voice Instead of passive voice
You can configure Grype to Grype can be configured to
Add the directory to your path The directory should be added to your path

Use simple present tense

Avoid future tense (“will”) and complex syntax such as conjunctive mood (“would”, “should”).

Use simple present tense Instead of future tense or complex syntax
The following command provisions a virtual machine The following command will provision a virtual machine
If you add this configuration element, the system is open to the Internet If you added this configuration element, the system would be open to the Internet

Exception: Use future tense if it’s necessary to convey the correct meaning. This requirement is rare.

Address the audience directly

Using “we” in a sentence can be confusing, because the reader may not know whether they’re part of the “we” you’re describing.

For example, compare the following two statements:

  • “In this release we’ve added many new features.”
  • “In this tutorial we build a flying saucer.”

The words “the developer” or “the user” can be ambiguous. For example, if the reader is building a product that also has users, then the reader does not know whether you’re referring to the reader or the users of their product.

Address the reader directly Instead of "we", "the user", or "the developer"
Include the directory in your path The user must make sure that the directory is included in their path
In this tutorial you build a flying saucer In this tutorial we build a flying saucer

Use short, simple sentences

Keep sentences short. Short sentences are easier to read than long ones. Below are some tips for writing short sentences.

Use fewer words instead of many words that convey the same meaning
Use this Instead of this
You can use It is also possible to use
You can You are able to
Split a single long sentence into two or more shorter ones
Use this Instead of this
You do not need a running GKE cluster. The deployment process creates a cluster for you You do not need a running GKE cluster, because the deployment process creates a cluster for you
Use a list instead of a long sentence showing various options
Use this Instead of this

To scan a container for vulnerabilities:

  1. Package the software in an OCI container.
  2. Upload the container to an online registry.
  3. Run Grype with the container name as a parameter.
To scan a container, you must package the software in an OCI container, upload the container to an online registry, and run Grype with the container name as a parameter.

Avoid too much text styling

Use bold text when referring to UI controls or other UI elements.

Use code style for:

  • filenames, directories, and paths
  • inline code and commands
  • object field names

Avoid using bold text or capital letters for emphasis. If a page has too much textual highlighting it becomes confusing and even annoying.

Use angle brackets for placeholders

For example:

  • export SYFT_PARALLELISM=<number>
  • --email <your email address>

Style your images

The Anchore OSS docs recognize Bootstrap classes to style images and other content.

The following code snippet shows the typical styling that makes an image show up nicely on the page:

<!-- for wide images -->
<img src="/images/my-image.png" alt="My image" class="mt-3 mb-3 border rounded" />

<!-- for tall images -->
<img src="/images/my-image.png" alt="My image" class="mt-3 mb-3 border rounded" style="width: 100%; max-width: 30em" />

To see some examples of styled images, take a look at the Kubeflow OAuth setup page.

For more help, see the guide to Bootstrap image styling and the Bootstrap utilities, such as borders.

A detailed style guide

The Google Developer Documentation Style Guide contains detailed information about specific aspects of writing clear, readable, succinct documentation for a developer audience.

Next steps

8 - Release Notes

Information about recent Anchore OSS releases

The following pages show the release notes for each of our open source SBOM and vulnerability scanning tools:

We also have releases for our GitHub actions:

8.1 - Syft Release Notes

Anchore Syft Release Notes

8.1.1 - v1.32.0

Release notes for syft v1.32.0

Release Notes

Version v1.32.0

Added Features

Bug Fixes

  • When scanning the FFmpeg binary with Syft a new package is now added [#3988 #3994 @popey]
  • Warn loudly if SQLite driver is not present when needed [#3234 #4150 @kzantow]

Additional Changes

  • Update dependencies to use go.yaml.in/yaml [#4157 @n-bes]

(Full Changelog)

8.1.2 - v1.31.0

Release notes for syft v1.31.0

Release Notes

Version v1.31.0

Added Features

  • Option to set PackageSupplier in root of SPDX document generated by CLI [#3098 #4131 @spiffcs]

Bug Fixes

  • closed reader during java binary detection [#4129 @kzantow]
  • support multiple letters in openssl patch version [#4106 @honigbot]
  • Can not have license ID [#1964 #4132 @spiffcs]
  • Syft sometimes reports URL for license value when scanning JARs with a URL in Bundle-License field of manifest [#3186]

(Full Changelog)

8.1.3 - v1.30.0

Release notes for syft v1.30.0

Release Notes

Version v1.30.0

Added Features

Bug Fixes

  • fix: update nondeterministic Java archive cataloging and improve groupID [#3521 #4118 @kzantow]

(Full Changelog)

8.1.4 - v1.29.1

Release notes for syft v1.29.1

Release Notes

Version v1.29.1

Bug Fixes

(Full Changelog)

8.1.5 - v1.29.0

Release notes for syft v1.29.0

Release Notes

Version v1.29.0

Added Features

Additional Changes

(Full Changelog)

8.1.6 - v1.28.0

Release notes for syft v1.28.0

Release Notes

Version v1.28.0

Added Features

Additional Changes

(Full Changelog)

8.1.7 - v1.27.1

Release notes for syft v1.27.1

Release Notes

Version v1.27.1

Bug Fixes

Additional Changes

(Full Changelog)

8.1.8 - v1.27.0

Release notes for syft v1.27.0

Release Notes

Version v1.27.0

Added Features

Bug Fixes

  • Remove CPE product candidates for phf, prometheus, hyper and Rust crates [#3967 @jayvdb]
  • Remove CPE product candidates for opentelemetry and redis Rust crates [#3962 @jayvdb]
  • Harden Container Runtime with Non-Root User [#3941 @MikeTheCyberGuy]
  • terraform provider lock entries should not require constraints [#3934 @ghouscht]
  • sbom cataloger returning upstream package [#3662 #3981 @kzantow]
  • Syft missing md5 sums and list data for dpkg packages under status.d/ [#3912]
  • Failure to detect dependency relationships between Python packages [#3958 #3965 @christoph-blessing]
  • Heavy memory consumption when directory scanning deb source [#3928 #3953 @kzantow]
  • In versions 1.25.0 and later, graalvm-native-image-cataloger adds 3-6 hours to Syft [#3942 #3944 @kzantow]
  • Syft incorrectly reports multiple APKs as parents of symlinked files [#3847 #3923 @luhring]

(Full Changelog)

A HUGE thank you to @rezmoss for his help identifying and solving an issue causing excessive time and memory consumption with large numbers of symlinks! ❤️

8.1.9 - v1.26.1

Release notes for syft v1.26.1

Release Notes

Version v1.26.1

Bug Fixes

(Full Changelog)

8.1.10 - v1.26.0

Release notes for syft v1.26.0

Release Notes

Version v1.26.0

Added Features

Bug Fixes

  • pkg.JavaArchive.PomProperties is being populated even though no pom.properties file was present for analysis [#3922 @wagoodman]
  • syft 1.24.0 debug container - wget fails TLS [#3891 #3915 @spiffcs]

(Full Changelog)

8.1.11 - v1.25.1

Release notes for syft v1.25.1

Release Notes

Version v1.25.1

Additional Changes

(Full Changelog)

8.1.12 - v1.25.0

Release notes for syft v1.25.0

Release Notes

Version v1.25.0

Added Features

Bug Fixes

(Full Changelog)

8.1.13 - v1.24.0

Release notes for syft v1.24.0

Release Notes

Version v1.24.0

Added Features

Bug Fixes

  • update license sort to be stable with contents field [#3860 @spiffcs]
  • Improve detection of erlang binary in alpine Linux [#3839 @avodotiiets]
  • Do not search for main module versions within binary contents by default [#3874 @wagoodman]
  • dpkg license improvement for non SPDX licenses [#3090 #3888 @spiffcs]
  • CycloneDX group field not symmetrically handled by encoder/decoders [#2981 #3853 @kzantow]
  • Syft crash [signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x123a0da] [#3872 #3875 @wagoodman]
  • Syft 1.23.1 shows version (devel) for grafana 12.0.0 [#3864]
  • .NET cataloger does not always pair up PE binaries and deps.json packages, resulting in duplicate packages on some runs [#3866 #3869 @wagoodman]
  • Propagate error in FileSourceProvider instead of warn log [#3831 #3845 @Rupikz]
  • Update github.com/Masterminds/semver package [#3829 #3836 @popey]
  • go-module-file-cataloger fails if symlinks in path [#3614 #3783 @VictorHuu]
  • Support fluent-bit some versions of arm/s390x images [#3793 #3817 @VictorHuu]

Additional Changes

(Full Changelog)

8.1.14 - v1.23.1

Release notes for syft v1.23.1

Release Notes

Version v1.23.1

Additional Changes

(Full Changelog)

8.1.15 - v1.23.0

Release notes for syft v1.23.0

Release Notes

Version v1.23.0

Added Features

Bug Fixes

(Full Changelog)

8.1.16 - v1.22.0

Release notes for syft v1.22.0

Release Notes

Version v1.22.0

Added Features

Bug Fixes

  • Dotnet-Portable-Executable-Cataloger uses wrong component version for dotnet runtime libraries [#3282 #3768 @wagoodman]
  • Dotnet deps cataloger returns “wrong” dotnet-framework dependencies and misses out on the runtime (for applications) [#2347 #3768 @wagoodman]
  • .NET deps.json should be considered as installation evidence [#3570 #3563 @wagoodman]
  • Dotnet PE binary cataloger is detecting false positives [#3469 #3563 @wagoodman]
  • Long Processing Time in dpkg-db-cataloger with all-layers Option (Syft 1.20.0) [#3683 #3636 @kzantow]

(Full Changelog)

8.1.17 - v1.21.0

Release notes for syft v1.21.0

Release Notes

Version v1.21.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.18 - v1.20.0

Release notes for syft v1.20.0

Release Notes

Version v1.20.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.19 - v1.19.0

Release notes for syft v1.19.0

Release Notes

Version v1.19.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.20 - v1.18.1

Release notes for syft v1.18.1

Release Notes

Version v1.18.1

Bug Fixes

  • Runtime Error with Syft on Singularity .sif file (panic: index out of range) [#3390]
  • SPDX expressions are lost from CycloneDX if they contain extra parenthesis [#3441 #3517 @willmurphyscode]

Additional Changes

  • migrate syft to use anchore fork of archiver without replace [#3516 @spiffcs]

(Full Changelog)

8.1.21 - v1.18.0

Release notes for syft v1.18.0

Release Notes

Version v1.18.0

Added Features

Bug Fixes

  • fix order of rust dependencies and support git sources in Cargo.lock dependencies [#3502 @willmurphyscode]
  • Use file indexer directly when scanning with file source [#3333 @adammcclenaghan]
  • Remove incorrect power-user help text that only image sources are supported [#2046]
  • Invalid SPDX: missing copyright text [#3346 #3495 @spiffcs]
  • Scanning a source tree with duplicate conanfile.txt dependencies generates multiple components [#3403]

(Full Changelog)

8.1.22 - v1.17.0

Release notes for syft v1.17.0

Release Notes

Version v1.17.0

Added Features

Bug Fixes

Additional Changes

  • doc: Add official Syft logo license information [#3421 @popey]

(Full Changelog)

8.1.23 - v1.16.0

Release notes for syft v1.16.0

Release Notes

Version v1.16.0

Added Features

Bug Fixes

  • add support for dependencies and purl for Native Image SBOMs [#3399 @rudsberg]
  • stop bubbling fileResolver errors from binary cataloger [#3410 @spiffcs]
  • malformed pom.xml may cause recursive loop [#3391 @kzantow]
  • syft convert: broken link in help - documentation no longer existing [#3143 #3407 @Makefolder]

(Full Changelog)

8.1.24 - v1.15.0

Release notes for syft v1.15.0

Release Notes

Version v1.15.0

Added Features

  • Merge config files hierarchically and add support for config profiles [#3337 @kzantow]
  • Enable cargo-auditable-binary-cataloger for files/directories [#3376 @ariel-miculas]
  • Improve mariadb binary classifer to detect older versions [#3052]
  • Look for dpkg status file at additional globs [#2692 #3373 @njv299]
  • Emit relationships for Java dependencies [#3189 #3363 @kzantow]

(Full Changelog)

8.1.25 - v1.14.2

Release notes for syft v1.14.2

Release Notes

Version v1.14.2

Bug Fixes

Additional Changes

(Full Changelog)

8.1.26 - v1.14.1

Release notes for syft v1.14.1

Release Notes

Version v1.14.1

Bug Fixes

(Full Changelog)

8.1.27 - v1.14.0

Release notes for syft v1.14.0

Release Notes

Version v1.14.0

Added Features

Bug Fixes

  • performance: instantiate license check scanner to prevent memory leak [#3290 @govrin]
  • Parse package.json with non-standard fields in ‘author’ section [#3300 @nuada]
  • make failed CPE validation correctly return error [#2762 @willmurphyscode]
  • Improve subpath to mount matching [#3269 @cdupuis]

Additional Changes

(Full Changelog)

8.1.28 - v1.13.0

Release notes for syft v1.13.0

Release Notes

Version v1.13.0

Added Features

Bug Fixes

  • OpenJDK CPEs [#2422 #3217 @wagoodman]
  • SBOM generated from poetry lock file contains no license information on any dependencies [#3204]
  • Scanning a folder with a jar archive with no metadata creates a SPDX package without versionInfo (Non-NTIA compliant) [#2039 #3257 @wagoodman]
  • Using replace in a go.mod creates a SPDX package without versionInfo (Non-NTIA compliant) [#2038 #3257 @wagoodman]
  • Command make add-snippet can fail in some cases [#3249]

(Full Changelog)

8.1.29 - v1.12.2

Release notes for syft v1.12.2

Release Notes

Version v1.12.2

Added Features

Bug Fixes

  • Fix improper decoding of SPDX license expressions in the CycloneDX format [#3175 @NyanKiyoshi]
  • improve generated cpes for binaries with existing classifiers [#3169 @westonsteimel]
  • improve known CPEs and set NVD as source for all current binary classifiers [#3167 @westonsteimel]
  • Respond to authoratative CPEs from catalogers [#3166 @wagoodman]
  • Set cataloger names within package cataloger task [#3165 @wagoodman]
  • use official CPE for curl binary cataloger [#3164 @westonsteimel]
  • Fix ELF package correlations [#3151 @wagoodman]
  • no space left and Could not retrieve mirrorlist in test [#3181 #3190 @wagoodman]
  • Multiple versions of libssl3 and libcrypto3 present in SBOM while only one version is installed [#3195]
  • CycloneDX convertion into Syft improperly handles SPDX licenses [#3172]
  • Syft Cause stack overflow [goroutine stack exceeds 1000000000-byte limit] [#3163 #3170 @kzantow]
  • Mysql binary detection version incorrect for 8.0.x [#3141 #3142 @kzantow]

Additional Changes

(Full Changelog)

8.1.30 - v1.11.1

Release notes for syft v1.11.1

Release Notes

Version v1.11.1

Bug Fixes

(Full Changelog)

8.1.31 - v1.11.0

Release notes for syft v1.11.0

Release Notes

Version v1.11.0

Added Features

Bug Fixes

Additional Changes

  • rather than have a hard max recursive depth - syft should detect parent pom cycles [#2284 #2769 @GijsCalis]
  • increase java purl generation test coverage [#3110 @westonsteimel]
  • Updated PackageSupplier to type Organization for JAR files [#3093 @harippriyas]
  • Ensure accurate java main artifact name retrieval for multi-JARs and refine fallback approach [#3054 @dor-hayun]

(Full Changelog)

8.1.32 - v1.10.0

Release notes for syft v1.10.0

Release Notes

Version v1.10.0

Added Features

Bug Fixes

Additional Changes

  • add debug logging for errors reading RPM files [#3051 @kzantow]

(Full Changelog)

8.1.33 - v1.9.0

Release notes for syft v1.9.0

Release Notes

Version v1.9.0

Added Features

Bug Fixes

(Full Changelog)

8.1.34 - v1.8.0

Release notes for syft v1.8.0

Release Notes

Version v1.8.0

Added Features

Bug Fixes

(Full Changelog)

8.1.35 - v1.7.0

Release notes for syft v1.7.0

Release Notes

Version v1.7.0

Added Features

Bug Fixes

(Full Changelog)

8.1.36 - v1.6.0

Release notes for syft v1.6.0

Release Notes

Version v1.6.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.37 - v1.5.0

Release notes for syft v1.5.0

Release Notes

Version v1.5.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.38 - v1.4.1

Release notes for syft v1.4.1

Release Notes

Version v1.4.1

Bug Fixes

  • Fix redundant package deletions when considering ELF packages [#2862 @wagoodman]

(Full Changelog)

8.1.39 - v1.4.0

Release notes for syft v1.4.0

Release Notes

Version v1.4.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.40 - v1.3.0

Release notes for syft v1.3.0

Release Notes

Version v1.3.0

Added Features

Bug Fixes

(Full Changelog)

8.1.41 - v1.2.0

Release notes for syft v1.2.0

Release Notes

Version v1.2.0

Added Features

Bug Fixes

(Full Changelog)

8.1.42 - v1.1.1

Release notes for syft v1.1.1

Release Notes

Version v1.1.1

Bug Fixes

(Full Changelog)

8.1.43 - v1.1.0

Release notes for syft v1.1.0

Release Notes

Version v1.1.0

Added Features

Bug Fixes

(Full Changelog)

8.1.44 - v1.0.1

Release notes for syft v1.0.1

Release Notes

Version v1.0.1

Bug Fixes

(Full Changelog)

8.1.45 - v1.0.0

Release notes for syft v1.0.0

Release Notes

Version v1.0.0

🎉 Checkout the blog post about v1!

Added Features

Bug Fixes

(Full Changelog)

8.1.46 - v0.105.1

Release notes for syft v0.105.1

Release Notes

Version v0.105.1

Bug Fixes

Additional Changes

(Full Changelog)

8.1.47 - v0.105.0

Release notes for syft v0.105.0

Release Notes

Version v0.105.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.48 - v0.104.0

Release notes for syft v0.104.0

Release Notes

Version v0.104.0

Added Features

Bug Fixes

Breaking Changes

(Full Changelog)

8.1.49 - v0.103.1

Release notes for syft v0.103.1

Release Notes

Version v0.103.1

Security Fixes

  • Bump archiver and stereoscope to address path traversal issues [#2570 @wagoodman]

Bug Fixes

Breaking Changes

(Full Changelog)

8.1.50 - v0.102.0

Release notes for syft v0.102.0

Release Notes

Version v0.102.0

Added Features

Bug Fixes

Breaking Changes

Additional Changes

(Full Changelog)

8.1.51 - v0.101.1

Release notes for syft v0.101.1

Release Notes

Version v0.101.1

Bug Fixes

(Full Changelog)

8.1.52 - v0.101.0

Release notes for syft v0.101.0

Release Notes

Version v0.101.0

Security Fixes

Added Features

Bug Fixes

(Full Changelog)

8.1.53 - v0.100.0

Release notes for syft v0.100.0

Release Notes

Version v0.100.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.1.54 - v0.99.0

Release notes for syft v0.99.0

Release Notes

Version v0.99.0

Added Features

  • Look for a maven version in a pom from a parent dependency management… [#2423 @coheigea]
  • Adding the ability to retrieve remote licenses for yarn.lock [#2338 @coheigea]
  • Retrieve remote licenses using pom.properties when there is no pom.xml [#2315 @coheigea]
  • Add the option to retrieve remote licenses for projects defined in a … [#2409 @coheigea]
  • Parse Python licenses from LicenseFile entry in the Wheel Metadata [#2331 @coheigea]
  • Add binary classifier for the ERLang interpreter [#2417 @LaurentGoderre]
  • Parse Python licenses from LicenseExpression entry in the Wheel Metadata [#2431 @coheigea]
  • Add binary classifier for Julia lang [#2427 @LaurentGoderre]
  • Add binary detection for PHP composer [#2432 @LaurentGoderre]

Bug Fixes

Breaking Changes

Additional Changes

(Full Changelog)

8.1.55 - v0.98.0

Release notes for syft v0.98.0

Release Notes

Version v0.98.0

Added Features

Bug Fixes

Breaking Changes

Additional Changes

(Full Changelog)

Special Thanks

Thanks @duanemay and @whalelines for the enhanced binary classifier support 👍

8.1.56 - v0.97.1

Release notes for syft v0.97.1

Release Notes

Version v0.97.1

Bug Fixes

  • Syft does not use HTTP proxy when downloading the Docker image itself [#2203 #2336 @anchore-actions-token-generator]

Additional Changes

(Full Changelog)

8.1.57 - v0.97.0

Release notes for syft v0.97.0

Release Notes

Version v0.97.0

Added Features

  • Add license for golang stdlib package [#2317 @coheigea]
  • Fall back to searching maven central using groupIDFromJavaMetadata [#2295 @coheigea]

Bug Fixes

  • Refine license search from groupIDFromJavaMetadata to account for artfactId in the groupId [#2313 @coheigea]
  • capture content written to stdout outside of report [#2324 @kzantow]
  • add manual groupid mappings for org.apache.velocity jars [#2327 @westonsteimel]
  • skip maven bundle plugin logic if vendor id and symbolic name match [#2326 @westonsteimel]
  • cataloger dpkg-db-cataloger not working [#2323]

Breaking Changes

Additional Changes

  • Export syft-json format package metadata type helper [#2328 @wagoodman]
  • Add dotnet-portable-executable-cataloger to README [#2322 @noqcks]

(Full Changelog)

8.1.58 - v0.96.0

Release notes for syft v0.96.0

Release Notes

Version v0.96.0

Added Features

  • Check maven central as well for licenses in parents poms for nested jars [#2302 @coheigea]
  • store image annotations inside the SBOM [#2267 #2294 @noqcks]
  • Support parsing license information in Maven projects via parent poms [#2103]

Bug Fixes

(Full Changelog)

8.1.59 - v0.95.0

Release notes for syft v0.95.0

Release Notes

Version v0.95.0

Added Features

  • Use case-insensitive matching for Go license files [#2286 @miquella]
  • Add conaninfo.txt parser to detect conan packages in docker images [#2234 @Pro]
  • Perform case insensitive matching on Java License files [#2235 @coheigea]
  • Read a license from a parent pom stored in Maven Central [#2228 @coheigea]
  • Add PURLs when scanning Gradle lock files [#2278 @robbiev]

Bug Fixes

Breaking Changes

Additional Changes

(Full Changelog)

8.1.60 - v0.94.0

Release notes for syft v0.94.0

Release Notes

Version v0.94.0

Added Features

Bug Fixes

(Full Changelog)

8.1.61 - v0.93.0

Release notes for syft v0.93.0

Release Notes

Version v0.93.0

Added Features

  • Parse license from the pom.xml if not contained in the manifest [#2115 @coheigea]
  • Add Golang STD library package given a Golang binary has been discovered compiled with that go binary [#1853 #2195 @spiffcs]
  • Improve –output CLI help and deprecate –file [#2165 #2187 @sharief007]

Bug Fixes

Additional Changes

(Full Changelog)

8.1.62 - v0.92.0

Release notes for syft v0.92.0

Release Notes

Version v0.92.0

Added Features

  • Support for multiple image refs of same sha in OCI layout [#1544]

Bug Fixes

Additional Changes

(Full Changelog)

8.1.63 - v0.91.0

Release notes for syft v0.91.0

Release Notes

Version v0.91.0

Added Features

Bug Fixes

  • Allow CycloneDX json input with no components [#2127 @ahoz]
  • Prevent errors from clobbering terminal [#2161 @kzantow]
  • Using syft as a go library to decode a syft json has incomplete data [#2069 #2083 @kzantow]
  • SBOMs are not the same on multiple runs of syft [#1944]

Additional Changes

(Full Changelog)

8.1.64 - v0.90.0

Release notes for syft v0.90.0

Release Notes

Version v0.90.0

v0.90.0 (2023-09-11)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.1.65 - v0.89.0

Release notes for syft v0.89.0

Release Notes

Version v0.89.0

v0.89.0 (2023-08-31)

Full Changelog

Added Features

Bug Fixes

8.1.66 - v0.88.0

Release notes for syft v0.88.0

Release Notes

Version v0.88.0

v0.88.0 (2023-08-25)

Full Changelog

Added Features

Bug Fixes

8.1.67 - v0.87.1

Release notes for syft v0.87.1

Release Notes

Version v0.87.1

v0.87.1 (2023-08-17)

Full Changelog

Bug Fixes

8.1.68 - v0.87.0

Release notes for syft v0.87.0

Release Notes

Version v0.87.0

v0.87.0 (2023-08-14)

Full Changelog

Added Features

Bug Fixes

8.1.69 - v0.86.1

Release notes for syft v0.86.1

Release Notes

Version v0.86.1

v0.86.1 (2023-07-31)

Full Changelog

Bug Fixes

  • Source requires default image name as user input for unparsable reference [PR #1979] [kzantow]

8.1.70 - v0.86.0

Release notes for syft v0.86.0

Release Notes

Version v0.86.0

v0.86.0 (2023-07-31)

Full Changelog

Added Features

Bug Fixes

  • Fix panic condition on docker pull failure [PR #1968] [wagoodman]
  • Syft reports the “minimum required version” of .NET assemblies rather than the “assembly version” [Issue #1799] [PR #1943] [luhring]
  • Grype cannot read SPDX documents generated by SPDX-maven-plugin [PR #1969] [spiffcs]

Breaking Changes

8.1.71 - v0.85.0

Release notes for syft v0.85.0

Release Notes

Version v0.85.0

v0.85.0 (2023-07-12)

Full Changelog

Added Features

Bug Fixes

Breaking Changes

Additional Changes

  • chore: update iterations to protect against race [PR #1927] [spiffcs]
  • fix: background reader apart from global handler for testing [PR #1929] [spiffcs]

8.1.72 - v0.84.1

Release notes for syft v0.84.1

Release Notes

Version v0.84.1

v0.84.1 (2023-06-29)

Full Changelog

Bug Fixes

Additional Changes

8.1.73 - v0.84.0

Release notes for syft v0.84.0

Release Notes

Version v0.84.0

v0.84.0 (2023-06-20)

Full Changelog

Breaking Changes

Additional Changes

8.1.74 - v0.83.1

Release notes for syft v0.83.1

Release Notes

Version v0.83.1

v0.83.1 (2023-06-14)

Full Changelog

Bug Fixes

8.1.75 - v0.83.0

Release notes for syft v0.83.0

Release Notes

Version v0.83.0

v0.83.0 (2023-06-05)

Full Changelog

Added Features

  • Add new ‘–source-version’ and ‘–source-name’ options to set the name and version of the target being analyzed for reference in resulting syft-json format SBOMs (more formats will support these flags soon). [Issue #1399] [PR #1859] [kzantow]
  • Add scope to POM properties [PR #1779] [jneate]
  • Accept main.version ldflags even without vcs [PR #1855] [deitch]

Bug Fixes

Deprecated Features

Additional Changes

8.1.76 - v0.82.0

Release notes for syft v0.82.0

Release Notes

Version v0.82.0

v0.82.0 (2023-05-23)

Full Changelog

Added Features

Bug Fixes

  • Fix a problem in the license parsing logic that may result in a panic [PR #1839]
  • Return all relevant error messages if an image retrieval fails when a scheme is specified [PR #1801] [FrimIdan]
  • Fix a problem with PNPM scanning where v6 lockfiles might result in duplicated packages [Issue #1762] [PR #1778] [kzantow]

8.1.77 - v0.81.0

Release notes for syft v0.81.0

Release Notes

Version v0.81.0

v0.81.0 (2023-05-22)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.1.78 - v0.80.0

Release notes for syft v0.80.0

Release Notes

Version v0.80.0

v0.80.0 (2023-05-05)

Full Changelog

Added Features

Bug Fixes

Deprecated Features

8.1.79 - v0.79.0

Release notes for syft v0.79.0

Release Notes

Version v0.79.0

v0.79.0 (2023-04-21)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.1.80 - v0.78.0

Release notes for syft v0.78.0

Release Notes

Version v0.78.0

v0.78.0 (2023-04-17)

Full Changelog

Added Features

Bug Fixes

8.1.81 - v0.77.0

Release notes for syft v0.77.0

Release Notes

Version v0.77.0

v0.77.0 (2023-04-11)

Full Changelog

Added Features

8.1.82 - v0.76.1

Release notes for syft v0.76.1

Release Notes

Version v0.76.1

v0.76.1 (2023-04-05)

Full Changelog

Added Features

8.1.83 - v0.76.0

Release notes for syft v0.76.0

Release Notes

Version v0.76.0

v0.76.0 (2023-03-31)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.1.84 - v0.75.0

Release notes for syft v0.75.0

Release Notes

Version v0.75.0

v0.75.0 (2023-03-13)

Full Changelog

Added Features

Bug Fixes

8.1.85 - v0.74.1

Release notes for syft v0.74.1

Release Notes

Version v0.74.1

v0.74.1 (2023-03-09)

Full Changelog

Bug Fixes

8.1.86 - v0.74.0

Release notes for syft v0.74.0

Release Notes

Version v0.74.0

(v0.74.0) (2023-03-02)

Full Changelog

Added Features

Bug Fixes

8.1.87 - v0.72.1

Release notes for syft v0.72.1

Release Notes

Version v0.72.1

v0.72.1 (2023-02-22)

Full Changelog

Added Features

Bug Fixes

  • Encountering “cycle during symlink resolution” with syft version 0.71.0 onwards [Issue #1586]

8.1.88 - v0.73.0

Release notes for syft v0.73.0

Release Notes

Version v0.73.0

v0.73.0 (2023-02-22)

Full Changelog

Added Features

Bug Fixes

8.1.89 - v0.72.0

Release notes for syft v0.72.0

Release Notes

Version v0.72.0

v0.72.0 (2023-02-16)

Full Changelog

Added Features

Bug Fixes

8.1.90 - v0.71.0

Release notes for syft v0.71.0

Release Notes

Version v0.71.0

v0.71.0 (2023-02-09)

Full Changelog

Added Features

Bug Fixes

8.1.91 - v0.70.0

Release notes for syft v0.70.0

Release Notes

Version v0.70.0

v0.70.0 (2023-02-03)

Full Changelog

Added Features

Bug Fixes

Security

8.1.92 - v0.69.1

Release notes for syft v0.69.1

Release Notes

Version v0.69.1

v0.69.1 (2023-01-31)

Full Changelog

Changes

8.1.93 - v0.69.0

Release notes for syft v0.69.0

Release Notes

Version v0.69.0

v0.69.0 (2023-01-30)

Full Changelog

Added Features

Bug Fixes

8.1.94 - v0.68.1

Release notes for syft v0.68.1

Release Notes

Version v0.68.1

v0.68.1 (2023-01-25)

Full Changelog

Bug Fixes

Additional Changes

8.1.95 - v0.68.0

Release notes for syft v0.68.0

Release Notes

Version v0.68.0

v0.68.0 (2023-01-20)

Full Changelog

Added Features

Bug Fixes

  • Relax error conditions for catalogers [PR #1492] [wagoodman]
  • Always set the package ID for java packages [PR #1493] [wagoodman]
  • Fix panic in APK version specifier handling [PR #1494] [luhring]
  • ZERO npm dependencies discovered if any npm dependency has an array as a license [Issue #1479]
  • Syft panics on APK parsing when Dependencies or Provides holds an empty string [Issue #1483]

8.1.96 - v0.66.2

Release notes for syft v0.66.2

Release Notes

Version v0.66.2

v0.66.2 (2023-01-17)

Full Changelog

Bug Fixes

  • update dependency golang.org/x/text [Issue #1457]
  • syft is now throwing panic with version 0.66.1 [Issue #1462]

8.1.97 - v0.66.1

Release notes for syft v0.66.1

Release Notes

Version v0.66.1

v0.66.1 (2023-01-12)

Full Changelog

Bug Fixes

8.1.98 - v0.66.0

Release notes for syft v0.66.0

Release Notes

Version v0.66.0

v0.66.0 (2023-01-12)

Full Changelog

Added Features

  • Catalog Erlang/Elixir artifacts using “rebar” and “mix” package managers [Issue #1071] [@cpendery]
  • Catalog PHP binary runtimes [Issue #1429] [@witchcraze]
  • Catalog Apache HTTP binary runtimes [Issue #1440] [@witchcraze]
  • Catalog redis binary runtimes [Issue #1437] [@noqcks]
  • Increase the speed of cataloger stage [Issue #1353] [@Mikcl]
  • Add the origin field to the output format of syftjson [PR #1327] [@asi-cider]

Bug Fixes

  • A duplicate file in tar archive causes read to fail [Issue #1400] [@kzantow]

8.1.99 - v0.65.0

Release notes for syft v0.65.0

Release Notes

Version v0.65.0

v0.65.0 (2023-01-04)

Full Changelog

Added Features

Bug Fixes

8.1.100 - v0.64.0

Release notes for syft v0.64.0

Release Notes

Version v0.64.0

v0.64.0 (2022-12-23)

Full Changelog

Added Features

  • License parsing for Java [PR #1385]
  • Integration or association of binary and package [Issue #1411]
  • Include go.sum h1 digest information in checksums [Issue #1277]

Bug Fixes

  • Clean package names found in python catalogers [PR #1417] [wagoodman]
  • FilesAnalyzed wrong and missing SHA1 for files [Issue #1396]
  • Binary executables identified as “library” type in CycloneDX [Issue #1402]
  • Excessive “unable to read golang buildinfo error=not a Go executable file” warnings in versions after v0.62.1 [Issue #1403]
  • Binary java detection [Issue #1410]

8.1.101 - v0.63.0

Release notes for syft v0.63.0

Release Notes

Version v0.63.0

v0.63.0 (2022-12-12)

Full Changelog

Added Features

Bug Fixes

8.1.102 - v0.62.3

Release notes for syft v0.62.3

Release Notes

Version v0.62.3

v0.62.3 (2022-11-30)

Full Changelog

Added Features

Bug Fixes

  • Recover from bad parsing of golang binary [PR #1371] [wagoodman]
  • panic: runtime error: index out of range [0] with length 0 [Issue #1094]
  • Syft finds no apks for some images with apks [Issue #1354]

8.1.103 - v0.62.2

Release notes for syft v0.62.2

Release Notes

Version v0.62.2

v0.62.2 (2022-11-28)

Full Changelog

Bug Fixes

  • SPDX-json output differs between cli and golang implementation [Issue #1213]
  • Python cataloging fails to remove some non-version characters from version string [Issue #1360]
  • Haskell Cabal packages crash syft [Issue #1362]
  • Panic case for alpm on windows has a correct error case [Issue #1094]

8.1.104 - v0.62.1

Release notes for syft v0.62.1

Release Notes

Version v0.62.1

v0.62.1 (2022-11-21)

Full Changelog

Bug Fixes

8.1.105 - v0.62.0

Release notes for syft v0.62.0

Release Notes

Version v0.62.0

v0.62.0 (2022-11-18)

Full Changelog

Added Features

Bug Fixes

  • Don’t replace : with - in docker SPDX namespaces [Issue #1111]

8.1.106 - v0.61.0

Release notes for syft v0.61.0

Release Notes

Version v0.61.0

v0.61.0 (2022-11-18)

Full Changelog

Added Features

  • Add support for map fields in CycloneDX (XML and JSON) [Issue #1032]
  • Dependency’s MIT license not picked up when scanning package-lock.json [Issue #1113]
  • Support SPDX 2.3 [Issue #1292]
  • Add support for dependency relationships for alpine (apk) [PR #1063]

Bug Fixes

  • Normalize alpm md5 refs [PR #1333] [wagoodman]
  • APK Metadata decoding should be backwards compatible [PR #1341] [wagoodman]
  • Add spdx relationship encoding for dependencies [PR #1342] [wagoodman]
  • v0.3.0 SPDX SBOM Does Not Have Unique SPDXID Package IDs [Issue #923]
  • Missing licenses and “skipping encoding of unsupported property: syft:metadata:goBuildSetting” [Issue #1007]
  • System independent build not possible [Issue #1084]
  • Dependency’s MIT license not picked up when scanning package-lock.json [Issue #1113]
  • No packages discovered in SIF when image source not specified [Issue #1189]
  • syft packages panics on OCI archive creation [Issue #1318]
  • Missing metadata in syft-json artifacts crashes grype [Issue #1334]
  • CPE for amazoncorretto:19.0.1-al2 is incorrect [Issue #1337]

8.1.107 - v0.60.3

Release notes for syft v0.60.3

Release Notes

Version v0.60.3

v0.60.3 (2022-11-03)

Full Changelog

8.1.108 - v0.60.2

Release notes for syft v0.60.2

Release Notes

Version v0.60.2

v0.60.2 (2022-11-02)

Full Changelog

8.1.109 - v0.60.1

Release notes for syft v0.60.1

Release Notes

Version v0.60.1

v0.60.1 (2022-11-01)

Full Changelog

Added Features

  • Remove the docker installation from the release process [Issue #577]
  • Include go binary h1 digests in SPDX [Issue #1261]

Bug Fixes

  • A malformed Python RECORD file stops Syft processing [Issue #1012]
  • Deprecated SPDX license (GFDL* and BSD-2-Clause-NetBSD) [Issue #1179]
  • Update SPDX license list to 3.18 [Issue #1245]
  • Versions not printed out properly from maven pom.xml [Issue #1251]
  • syft attest –output cyclonedx-json incompatible with cosign [Issue #1268]
  • Create SBOM file will have suffix in modules name [Issue #1275]

8.1.110 - v0.59.0

Release notes for syft v0.59.0

Release Notes

Version v0.59.0

Full Changelog

Added Features

Bug Fixes

  • Update requires to use list; remove field [PR #1234] [spiffcs]
  • Deprecated SPDX license (GFDL* and BSD-2-Clause-NetBSD) [Issue #1179]
  • SPDX JSON has external reference category of PACKAGE_MANAGER instead of PACKAGE-MANAGER [Issue #1236]
  • Follow symlinks when searching for globs in all-layers scope [PR #1221] [kzantow]

8.1.111 - v0.58.0

Release notes for syft v0.58.0

Release Notes

Version v0.58.0

Full Changelog

Added Features

  • Add support for cpp conan.lock files [PR #1230]
  • Adding file checksum field in SPDX documents [Issue #1226]

Bug Fixes

8.1.112 - v0.57.0

Release notes for syft v0.57.0

Release Notes

Version v0.57.0

Full Changelog

Added Features

  • Consistent sorting for SPDX JSON output [Issue #1213]

Bug Fixes

8.1.113 - v0.56.0

Release notes for syft v0.56.0

Release Notes

Version v0.56.0

Full Changelog

Added Features

  • Add flag to disable Syft hitting toolbox-data.anchore.io [Issue #1185]

Bug Fixes

8.1.114 - v0.55.0

Release notes for syft v0.55.0

Release Notes

Version v0.55.0

v0.55.0 (2022-08-29)

Full Changelog

Added Features

Bug Fixes

  • Java-Cataloger produces empty entries for cyclonedx output [Issue #466]
  • No licenses included in scan with yarn.lock [Issue #845]
  • syft convert -o option erroring out [Issue #1095]

8.1.115 - v0.54.0

Release notes for syft v0.54.0

Release Notes

Version v0.54.0

v0.54.0 (2022-08-17)

Full Changelog

Added Features

  • Assume :latest tag implicitly [Issue #411]
  • Add ‘rpm modularity’ to rpm records generated by syft [Issue #1145]

Bug Fixes

  • Empty metadata while decoding should be allowed [PR #1154] [wagoodman]
  • Add PHP Composer dev dependencies [Issue #773]
  • opaque error when scanning an image in github registry [Issue #790]
  • javascript-lock-cataloger not detect and parse yarn.lock file [Issue #798]
  • Distro identification fails for dir: scheme when identityFiles not in scope. [Issue #814]
  • podman report not working [Issue #893]
  • Parsing yarn.lock fails to identify the currect package and version combinations [Issue #925]
  • gemspecs going unreported [Issue #960]
  • json SPDX invalid format [Issue #992]
  • Docker configuration issue on release [Issue #1126]
  • Can’t configure off-by-default cataloger without using –all [Issue #1141]

8.1.116 - v0.53.4

Release notes for syft v0.53.4

Release Notes

Version v0.53.4

v0.53.4 (2022-08-03)

Full Changelog

8.1.117 - v0.53.3

Release notes for syft v0.53.3

Release Notes

Version v0.53.3

v0.53.3 (2022-08-03)

Full Changelog

Bug Fixes

8.1.118 - v0.53.2

Release notes for syft v0.53.2

Release Notes

Version v0.53.2

v0.53.2 (2022-08-02)

Full Changelog

Bug Fixes

8.1.119 - v0.53.1

Release notes for syft v0.53.1

Release Notes

Version v0.53.1

v0.53.1 (2022-08-02)

Full Changelog

Added Features

  • Singularity Image Format (SIF) support [Issue #937]

8.1.120 - v0.53.0

Release notes for syft v0.53.0

Release Notes

Version v0.53.0

v0.53.0 (2022-08-02)

Full Changelog

Added Features

  • Add support for auditable Rust binaries [Issue #1108]

Bug Fixes

  • WARN unable to convert relationship from CycloneDX 1.3 JSON [Issue #980]
  • purls not generated for unknown types [Issue #1118]

8.1.121 - v0.52.0

Release notes for syft v0.52.0

Release Notes

Version v0.52.0

v0.52.0 (2022-07-21)

Full Changelog

Added Features

Bug Fixes

  • Unable to build binary on ppc64le architecture [Issue #1097]

8.1.122 - v0.51.0

Release notes for syft v0.51.0

Release Notes

Version v0.51.0

v0.51.0 (2022-07-11)

Full Changelog

Added Features

  • Syft ignore docker images [Issue #670]
  • feat: add support for cocoapods (Swift/Objective-C) [Issue #815]
  • An option to limit to a single filesystem (like -xdev) [Issue #674]
  • Add Gentoo Linux support [Issue #998]
  • Update README.md with information about syft choco package [Issue #1028]

Bug Fixes

  • syft attest cmd is not exporting output to file [Issue #1061]
  • Name is duplicated into Package URL Namespace when Go module path has one element [Issue #1091]
  • fix: unintended artifactRelationship records of type ownership-by-file-overlap are being reported [Issue 1077]

8.1.123 - v0.50.0

Release notes for syft v0.50.0

Release Notes

Version v0.50.0

v0.50.0 (2022-07-06)

Full Changelog

Added Features

  • Add a dockerized workflow for local dev [Issue #1042]
  • add flag for image scanning to use all catalogers rather than just some [Issue #1049]
  • feat: add Conan (C/C++) support [Issue #1082]

Bug Fixes

  • composer.json isn’t parsed for packages [Issue #1064]
  • Source pom.xml cataloger Namespace error [Issue #1075]
  • unintended artifactRelationship records of type ownership-by-file-overlap are being reported in SBOMs generated against current fedora container imges [Issue #1077]

8.1.124 - v0.49.0

Release notes for syft v0.49.0

Release Notes

Version v0.49.0

v0.49.0 (2022-06-24)

Full Changelog

Added Features

  • Allow user-defined output formats [Issue #152]
  • Add ability to enable/disable package catalogers [Issue #465]
  • Catalog packages from source pom.xml during directory scans [Issue #676]
  • Enable/disable SBOM generation for specific language types [Issue #840]
  • Add support for Mariner distroless images [Issue #1044]

Bug Fixes

  • No results for rpm packages when run against version 9.x of redhat/almalinux [Issue #1030]
  • Updates parsing of yarn.lock to use resolved URLs [PR #926]

8.1.125 - v0.48.1

Release notes for syft v0.48.1

Release Notes

Version v0.48.1

v0.48.1 (2022-06-16)

Full Changelog

Bug Fixes

8.1.126 - v0.48.0

Release notes for syft v0.48.0

Release Notes

Version v0.48.0

v0.48.0 (2022-06-16)

Full Changelog

Added Features

  • Add Pacman (Arch linux package manager) support [Issue #241]

Bug Fixes

8.1.127 - v0.47.0

Release notes for syft v0.47.0

Release Notes

Version v0.47.0

v0.47.0 (2022-06-09)

Full Changelog

Added Features

  • Support newer versions of ‘rpm’ that use Sqlite for the db instead of BerkeleyDB [Issue #469]
  • Support ’ndb’ rpm database format used in rpmdb 4.15+ [Issue #504]
  • Amazon Linux 2022 [Issue #838]
  • Specify the “main module” in Go binary metadata for packages [Issue #908]
  • Make Syft available in the Nix Package Store (nixpkgs) [Issue #1019]

Bug Fixes

  • Version is [not provided] when encoding to most formats [Issue #1010]
  • Panic from Syft cyclonedx format method [Issue #1014

8.1.128 - v0.46.3

Release notes for syft v0.46.3

Release Notes

Version v0.46.3

v0.46.3 (2022-05-26)

Full Changelog

Bug Fixes

  • Longer CPEs for golang modules to avoid false positives [PR #1006] [jonasagx]
  • Package.json cataloger malformed licences dropping package [Issue #1008]

8.1.129 - v0.46.2

Release notes for syft v0.46.2

Release Notes

Version v0.46.2

v0.46.2 (2022-05-23)

Full Changelog

Bug Fixes

8.1.130 - v0.46.1

Release notes for syft v0.46.1

Release Notes

Version v0.46.1

v0.46.1 (2022-05-16)

Bug Fixes

  • Fix Cyclone-DX output so only valid enum values are produced. Add integration tests to cover validation. [PR #967] [Christopher Phillips]

Full Changelog

8.1.131 - v0.46.0

Release notes for syft v0.46.0

Release Notes

Version v0.46.0

v0.46.0 (2022-05-12)

Full Changelog

Added Features

Bug Fixes

  • Fix github-json output option [PR #967] [StevenMaude]
  • Clearing Go main module version makes creating a CycloneDX 1.3 JSON document difficult [Issue #959]
  • WARN golang cataloger: failed to read buildinfo [Issue #978]

8.1.132 - v0.45.1

Release notes for syft v0.45.1

Release Notes

Version v0.45.1

v0.45.1 (2022-05-03)

Full Changelog

Bug Fixes

  • reduce noise of log output at the info level [PR #976] [luhring]
  • fix Illegal character encoding in CylconeDX-XML. [Issue #918]
  • update golang crypto library dependency [Issue #972]

8.1.133 - v0.45.0

Release notes for syft v0.45.0

Release Notes

Version v0.45.0

v0.45.0 (2022-04-29)

Full Changelog

Added Features

  • Preserve package IDs on Syft JSON SBOM decode [PR #963] [wagoodman]
  • refactor command package to remove globals and add dependency injection [PR #965] [spiffcs]

Bug Fixes

  • Decoding of sparse CycloneDX does not set language [Issue #953]

8.1.134 - v0.44.1

Release notes for syft v0.44.1

Release Notes

Version v0.44.1

v0.44.1 (2022-04-15)

Full Changelog

Bug Fixes

  • Invalid SPDXID (contains an underscore) [Issue #949]
  • Invalid SPDXID (contains a slash) [Issue #952]

8.1.135 - v0.44.0

Release notes for syft v0.44.0

Release Notes

Version v0.44.0

v0.44.0 (2022-04-12)

Full Changelog

Added Features

  • Detect Java Namespaces/Group IDs by hash [Issue #887]
  • Add additional Vendors for Springframework [PR #947 ]

8.1.136 - v0.43.2

Release notes for syft v0.43.2

Release Notes

Version v0.43.2

v0.43.2 (2022-04-06)

Full Changelog

Bug Fixes

  • Pulls from private DockerHub repo fails with 0.43.0 when working with 0.42.4 [Issue #936]

8.1.137 - v0.43.0

Release notes for syft v0.43.0

Release Notes

Version v0.43.0

v0.43.0 (2022-03-31)

Full Changelog

Added Features

Bug Fixes

  • Pull from DockerHub fails for public images when using SSO [PR #928] [wagoodman]
  • Panic in DirectoryResolver indexPath due to null info parameter [Issue #872]

8.1.138 - v0.42.4

Release notes for syft v0.42.4

Release Notes

Version v0.42.4

v0.42.4 (2022-03-24)

Full Changelog

Bug Fixes

8.1.139 - v0.42.3

Release notes for syft v0.42.3

Release Notes

Version v0.42.3

v0.42.3 (2022-03-23)

Full Changelog

Bug Fixes

8.1.140 - v0.42.2

Release notes for syft v0.42.2

Release Notes

Version v0.42.2

v0.42.2 (2022-03-22)

Full Changelog

Added Features

8.1.141 - v0.42.1

Release notes for syft v0.42.1

Release Notes

Version v0.42.1

v0.42.1 (2022-03-21)

Full Changelog

Bug Fixes

8.1.142 - v0.42.0

Release notes for syft v0.42.0

Release Notes

Version v0.42.0

v0.42.0 (2022-03-17)

Full Changelog

Added Features

Bug Fixes

  • Fix panic when CycloneDX BOM missing metadata.component [#895] [kzantow]

8.1.143 - v0.41.6

Release notes for syft v0.41.6

Release Notes

Version v0.41.6

v0.41.6 (2022-03-16)

Full Changelog

Bug Fixes

8.1.144 - v0.41.5

Release notes for syft v0.41.5

Release Notes

Version v0.41.5

v0.41.5 (2022-03-15)

Full Changelog

Bug Fixes

8.1.145 - v0.41.4

Release notes for syft v0.41.4

Release Notes

Version v0.41.4

v0.41.4 (2022-03-11)

Full Changelog

Added Features

Bug Fixes

  • Correct CycloneDX distro decoding, test relationships [PR #745] [kzantow]
  • RPM Epoch should be optional in the json schema [PR #880] [wagoodman]
  • syft packages fails to catalog golang binary’s modules for binary built with vendored modules [Issue #871] [fg-j]

8.1.146 - v0.41.1

Release notes for syft v0.41.1

Release Notes

Version v0.41.1

v0.41.1 (2022-03-08)

Full Changelog

Bug Fixes

8.1.147 - v0.41.0

Release notes for syft v0.41.0

Release Notes

Version v0.41.0

v0.41.0 (2022-03-07)

Full Changelog

Added Features

Bug Fixes

8.1.148 - v0.40.1

Release notes for syft v0.40.1

Release Notes

Version v0.40.1

v0.40.1 (2022-03-04)

Full Changelog

Bug Fixes

8.1.149 - v0.40.0

Release notes for syft v0.40.0

Release Notes

Version v0.40.0

v0.40.0 (2022-03-02)

Full Changelog

Added Features

  • Add support for multiple CPEs in CycloneDX [Issue #818]
  • Use syft property namespace in CycloneDX [Issue #842]

Bug Fixes

  • Wrong digest used for in-toto statement subject when using Docker daemon source [Issue #855]

8.1.150 - v0.39.3

Release notes for syft v0.39.3

Release Notes

Version v0.39.3

v0.39.3 (2022-02-26)

Full Changelog

Added Features

  • Allow for CPE strings that can later be sanitized [PR #844] [wagoodman]
  • Ability to sign or attest the generated SBOM [Issue #510]

Bug Fixes

  • Resolve symlinks when fetching file contents [PR #782] [wagoodman]
  • Add exception for handlebars java package to generate nodejs CPE [PR #837] [wagoodman]
  • Do not generate empty CPEs for non-compliant CPE fields [PR #850] [spiffcs]
  • unable to catalog dpkg package=/var/lib/dpkg/status [Issue #733]
  • Deduplicate docker image manifests [Issue #825]
  • scan crash with panic: runtime error: index out of range [1] with length 1 when parsing invalid formatted requirements.txt file [Issue #831]

8.1.151 - v0.38.0

Release notes for syft v0.38.0

Release Notes

Version v0.38.0

v0.38.0 (2022-02-15)

Full Changelog

Added Features

Bug Fixes

  • use SYFT_LOG_FILE env var [PR #805] [jonasagx]
  • Syft stuck on some images (also affecting grype) [Issue #764]
  • Missing the metadata field for Kubernetes pod usage [Issue #787]

8.1.152 - v0.37.10

Release notes for syft v0.37.10

Release Notes

Version v0.37.10

v0.37.10 (2022-02-08)

Full Changelog

Added Features

  • Add distro information to package URLs for OS packages [PR #754] [wagoodman]
  • Encode upstream qualifier on OS package pURLs [PR #769] [wagoodman]
  • Extract language and package type from pURLs on SBOM decode [PR #777] [wagoodman]
  • Update SPDX license list to 3.16 [PR #801] [kzantow]
  • Extend CycloneDX presenters with syft-specific values [Issue #154]
  • Extend CycloneDX presenter with dependency graph [Issue #155]

8.1.153 - v0.36.0

Release notes for syft v0.36.0

Release Notes

Version v0.36.0

v0.36.0 (2022-01-19)

Full Changelog

Added Features

Bug Fixes

  • Missing checksums for other than Linux in 0.35.0 release [Issue #739]
  • Add support for “file” source type in syftjson unmarshaling [PR #750]

Docker images

  • docker pull anchore/syft:v0.36.0

8.1.154 - v0.35.1

Release notes for syft v0.35.1

Release Notes

Version v0.35.1

v0.35.1 (2022-01-10)

Full Changelog

  • Update Containerd dependency to fix GHSA-mvff-h3cj-wj9c

Docker images

  • docker pull anchore/syft:v0.35.1

8.1.155 - v0.35.0

Release notes for syft v0.35.0

Release Notes

Version v0.35.0

v0.35.0 (2022-01-07)

Full Changelog

Added Features

Bug Fixes

  • Failed to parse CPE - unbind formatted string [Issue #426]
  • Unable to catalog .jar files on Windows [Issue #683]
  • Generating invalid CPEs for debs and rpms with epochs [Issue #712]

Docker images

  • docker pull anchore/syft:v0.35.0

8.1.156 - v0.34.0

Release notes for syft v0.34.0

Release Notes

Version v0.34.0

v0.34.0 (2021-12-22)

Full Changelog

Added Features

Bug Fixes

  • Misleading error message when oci-archive scheme used on non-OCI archives [Issue #701]

8.1.157 - v0.33.0

Release notes for syft v0.33.0

Release Notes

Version v0.33.0

v0.33.0 (2021-12-16)

Full Changelog

Bug Fixes

  • Cataloging large images is taking too long [Issue #688]

Docker images

  • docker pull anchore/syft:v0.33.0

8.1.158 - v0.32.2

Release notes for syft v0.32.2

Release Notes

Version v0.32.2

v0.32.2 (2021-12-14)

Full Changelog

Bug Fixes

  • Handle extra empty lines in Java manifest parsing [PR #687] [luhring]
  • Installation via install.sh on Mac M1 is not working [Issue #684]
  • Prefer warning over erroring out when parsing java manifests [PR #688] [wagoodman]

Docker images

  • docker pull anchore/syft:v0.32.2

8.1.159 - v0.32.1

Release notes for syft v0.32.1

Release Notes

Version v0.32.1

v0.32.1 (2021-12-14)

Full Changelog

Bug Fixes

  • Missing versions for java packages [Issue #666]
  • Hang when encountering symlink (in /run/udev/) to a character device (in /dev/) [Issue #665]
  • Indexing should ignore non-regular files [Issue #615]

Docker images

  • docker pull anchore/syft:v0.32.1

8.1.160 - v0.32.0

Release notes for syft v0.32.0

Release Notes

Version v0.32.0

v0.32.0 (2021-12-08)

Full Changelog

Added Features

Bug Fixes

Docker images

  • docker pull anchore/syft:v0.32.0

8.1.161 - v0.31.0

Release notes for syft v0.31.0

Release Notes

Version v0.31.0

v0.31.0 (2021-12-03)

Full Changelog

Added Features

  • Catalog archive contents for single-file input [PR #637] [wagoodman]
  • Promote cataloging task pattern [Issue #554]
  • Prefer artifact relationships over package relationships [Issue #556]
  • Media type for Syft SBoM JSON format [Issue #612]
  • Support for PHP/composer installed.json files [Issue #642]

Bug Fixes

  • SPDX2.2 JSON format should not use UUID random [Issue #622]

Docker images

  • docker pull anchore/syft:v0.31.0

8.1.162 - v0.30.1

Release notes for syft v0.30.1

Release Notes

Version v0.30.1

v0.30.1 (2021-11-15)

Full Changelog

Added Features

  • support external registry configuration [Issue #502]
  • Allow cataloging from a single file [Issue #541]

Bug Fixes

  • Analysis of “docker” image fails [Issue #287]
  • Indexing blocked on named pipe [Issue #568]
  • Syft indexing should ignore non-regular files [Issue #615]
  • Go module with AllLayers only giving RealPath information [Issue #619]

Docker images

  • docker pull anchore/syft:v0.30.1

8.1.163 - v0.29.0

Release notes for syft v0.29.0

Release Notes

Version v0.29.0

v0.29.0 (2021-10-31)

Full Changelog

Added Features

  • Stabilize package identifier based on contents [Issue #363]
  • Unhide auto-completion command [Issue #594]

Docker images

  • docker pull anchore/syft:v0.29.0

8.1.164 - v0.28.0

Release notes for syft v0.28.0

Release Notes

Version v0.28.0

v0.28.0 (2021-10-28)

Full Changelog

Added Features

Docker images

  • docker pull anchore/syft:v0.28.0

8.1.165 - v0.27.0

Release notes for syft v0.27.0

Release Notes

Version v0.27.0

v0.27.0 (2021-10-21)

Full Changelog

Added Features

Docker images

  • docker pull anchore/syft:v0.27.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.27

8.1.166 - v0.26.0

Release notes for syft v0.26.0

Release Notes

Version v0.26.0

v0.26.0 (2021-10-15)

Full Changelog

Implemented enhancements:

  • Capture additional go package data #540
  • provide github-action #340

Fixed bugs:

  • Remove go and rust catalogers from image cataloger set #464

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:v0.26.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.26

8.1.167 - v0.25.0

Release notes for syft v0.25.0

Release Notes

Version v0.25.0

v0.25.0 (2021-10-07)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • SPDX output is not consistently sorted #522 (spiffcs)
  • Missing/incorrect SPDX fields: DocumentName, DocumentNamespace #528 (spiffcs)
  • Allow file digests instances to be optional for alpine metadata #531 (wagoodman)
  • Stable sort package CPE array (JSON and SPDX) #522 (spiffcs)
  • Remove go and rust catalogers from image cataloger set #539 (spiffcs)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:v0.25.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.25

8.1.168 - v0.24.1

Release notes for syft v0.24.1

Release Notes

Version v0.24.1

v0.24.1 (2021-09-27)

Full Changelog

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:v0.24.1
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.24

8.1.169 - v0.24.0

Release notes for syft v0.24.0

Release Notes

Version v0.24.0

v0.24.0 (2021-09-23)

Full Changelog

Implemented enhancements:

  • Populate Files and Relationship fields for spdx-json output #507 (spiffcs)

Fixed bugs:

  • Filter out CPE product candidates that are asterisks #513 (wagoodman)
  • lower log file permissions to 0644 #511 (spiffcs)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:v0.24.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.24

8.1.170 - v0.23.0

Release notes for syft v0.23.0

Release Notes

Version v0.23.0

v0.23.0 (2021-09-13)

Full Changelog

Implemented enhancements:

  • Allow syft to populate distro data for all types #499
  • Add directory source to power-user subcommand #467 (houdini91)
  • Updated the distro package to include SLES #489 (Toure)
  • Modify CPE vendor candidate generation approach #484 (wagoodman)

Fixed bugs:

  • Distro not detected for centos:6 #429
  • On a purl a name must be a percent-encoded string #351
  • Cataloging root dir takes a very long time #119

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:v0.23.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.23

8.1.171 - v0.21.0

Release notes for syft v0.21.0

Release Notes

Version v0.21.0

v0.21.0 (2021-08-20)

Full Changelog

Implemented enhancements:

  • Add Pipenv support (Pipfile.lock) #242

Fixed bugs:

  • Only “top level” lock files should be inspected for NPM packages #431

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.21.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.21

8.1.172 - v0.20.0

Release notes for syft v0.20.0

Release Notes

Version v0.20.0

v0.20.0 (2021-08-18)

Full Changelog

Implemented enhancements:

  • Enhance CPE generation to improve downstream matching in grype #471
  • Add option to enable http connection to registries #482 (kzantow)

Fixed bugs:

  • Running syft without arguments doesn’t display help text #454
  • Use of asterisk in CPEs leading to many false positives in vulnerability matching in grype #396
  • Fix directory resolver indexer to report one progressable object #457 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.20.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.20

8.1.173 - v0.19.1

Release notes for syft v0.19.1

Release Notes

Version v0.19.1

v0.19.1 (2021-06-30)

Full Changelog

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.19.1
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.19

8.1.174 - v0.19.0

Release notes for syft v0.19.0

Release Notes

Version v0.19.0

v0.19.0 (2021-06-29)

Full Changelog

Enhancements:

  • Support Scanning a root filesystem #283

Fixed bugs:

  • Disk space not freed after syft command #416

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.19.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.19

8.1.175 - v0.18.0

Release notes for syft v0.18.0

Release Notes

Version v0.18.0

v0.18.0 (2021-06-29)

Full Changelog

Implemented enhancements:

  • Add support for SPDX SBOM format #213
  • Split UI from event handling #448 (wagoodman)

Fixed bugs:

  • Disk space not freed after syft command #416

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.18.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.18

8.1.176 - v0.17.1

Release notes for syft v0.17.1

Release Notes

Version v0.17.1

v0.17.1 (2021-06-19)

Full Changelog

Fixed bugs:

  • Incorrect version detection for NPM packages found via yarn.lock #430

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.17.1
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.17

8.1.177 - v0.17.0

Release notes for syft v0.17.0

Release Notes

Version v0.17.0

v0.17.0 (2021-06-04)

Full Changelog

Implemented enhancements:

  • Improve discovery of app.jar packaging (self-executing Jars) #413
  • Report Epoch in RPM version #408

Fixed bugs:

  • How to join the Anchore Community Slack? #423

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.17.0
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.17

8.1.178 - v0.16.1

Release notes for syft v0.16.1

Release Notes

Version v0.16.1

v0.16.1 (2021-05-25)

Full Changelog

Implemented enhancements:

  • Add all package metadata types slice for use in downstream testing #418
  • Add config option for import timeout #421 (luhring)

Fixed bugs:

  • Allow registry auth config without authority value #420 (luhring)
  • Fix go mod tidy release problem #422 (luhring)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.16.1
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.16

8.1.179 - v0.15.2

Release notes for syft v0.15.2

Release Notes

Version v0.15.2

v0.15.2 (2021-05-12)

Full Changelog

Fixed bugs:

  • Close all ReadClosers explicitly retrieved from resolvers #414 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.15.2
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.15

8.1.180 - v0.15.1

Release notes for syft v0.15.1

Release Notes

Version v0.15.1

v0.15.1 (2021-04-22)

Full Changelog

Implemented enhancements:

  • Account for known mappings of package name to CPE products #393
  • Implement binary package identification #372
  • Report package DB verification metadata #371
  • Implement selective “retrieve files” cataloger #369
  • Add hyphen replacement in CPE generator #361
  • Cataloger for Rust crates from Cargo.lock #338
  • Add file metadata cataloger #335
  • Introduce an additional command line switch so that syft command understands I am passing a directory #277
  • Add for known bad CPE field combinations for jenkins package #405 (wagoodman)
  • Add additional cases for categorizing jenkins package type by group id #404 (wagoodman)
  • Enhance CPE generation for java GroupId and filtering #402 (wagoodman)
  • Add hyphen replacement logic for CPE generation #397 (wagoodman)
  • Add ability to pull images directly from a registry #378 (wagoodman)
  • Add secrets cataloger #362

Fixed bugs:

  • Using pom groupId leading to bad CPEs for plugins, leading to false positives #395
  • Registry credentials should require username and password #385
  • Malformed Python package metadata can cause parse failure #365
  • Java cataloger missing packages when parsing partially fails #349
  • Syft BOM ordering is not always consistent #331
  • Update parent pom persistence with regard to shaded jars #403 (wagoodman)
  • Refactor pom properties handling relative to parent package #392 (wagoodman)
  • Safely join paths derived from archive headers #386 (wagoodman)
  • Add manifest + repo digests on registry source #382 (wagoodman)
  • Ensure credentials are not HTML encoded #368 (wagoodman)
  • Ensure pkg.Catalog path index deduplicates real vs virtual paths #356 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/syft:latest
  • docker pull anchore/syft:v0.15.1
  • docker pull anchore/syft:v0
  • docker pull anchore/syft:v0.15

8.1.181 - v0.14.0

Release notes for syft v0.14.0

Release Notes

Version v0.14.0

v0.14.0 (2021-03-20)

Full Changelog

Implemented enhancements:

  • Add Docker image to release process #344 (wagoodman)
  • Added Photon OS to the list of distros #341 (thehh1974)
  • Add distroless image identification #44

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.1.182 - v0.13.1

Release notes for syft v0.13.1

Release Notes

Version v0.13.1

v0.13.1 (2021-02-26)

Full Changelog

Fixed bugs:

  • Ignore ownership for shared copyright resources #334 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.183 - v0.13.0

Release notes for syft v0.13.0

Release Notes

Version v0.13.0

v0.13.0 (2021-02-25)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Failure when working on odoo:latest #309
  • global incremental ID creates issues for consumers #166

* This Changelog was automatically generated by github_changelog_generator

8.1.184 - v0.12.7

Release notes for syft v0.12.7

Release Notes

Version v0.12.7

v0.12.7 (2021-02-17)

Full Changelog

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.1.185 - v0.12.6

Release notes for syft v0.12.6

Release Notes

Version v0.12.6

v0.12.6 (2021-02-05)

Full Changelog

Fixed bugs:

  • Missing support for path prefixes during import to Anchore API #315

* This Changelog was automatically generated by github_changelog_generator

8.1.186 - v0.12.5

Release notes for syft v0.12.5

Release Notes

Version v0.12.5

v0.12.5 (2021-02-01)

Full Changelog

Fixed bugs:

  • Bring in fix from stereoscope for zero-layers panic #316 (luhring)

* This Changelog was automatically generated by github_changelog_generator

8.1.187 - v0.12.4

Release notes for syft v0.12.4

Release Notes

Version v0.12.4

v0.12.4 (2021-01-27)

Full Changelog

Fixed bugs:

  • SIGSEGV in discoverPkgsFromPomProperties on parsing Java pom.properties #252

* This Changelog was automatically generated by github_changelog_generator

8.1.188 - v0.12.3

Release notes for syft v0.12.3

Release Notes

Version v0.12.3

v0.12.3 (2021-01-22)

Full Changelog

Fixed bugs:

  • Partial package.json files lead to empty packages in output #311 (luhring)

* This Changelog was automatically generated by github_changelog_generator

8.1.189 - v0.12.2

Release notes for syft v0.12.2

Release Notes

Version v0.12.2

v0.12.2 (2021-01-06)

Full Changelog

Fixed bugs:

  • Prefer real paths over those with links for glob results #308 (wagoodman)
  • Duplicate reference readers for duplicate location resolutions #307 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.190 - v0.12.1

Release notes for syft v0.12.1

Release Notes

Version v0.12.1

v0.12.1 (2021-01-05)

Full Changelog

Fixed bugs:

  • Update gemspec glob to include named nested specification directories #306 (wagoodman)
  • Add HasPath() to Resolver interface for existence check #305 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.191 - v0.12.0

Release notes for syft v0.12.0

Release Notes

Version v0.12.0

v0.12.0 (2021-01-04)

Full Changelog

Implemented enhancements:

  • Bump stereoscope to pull in content API refactors #299 (wagoodman)

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.1.192 - v0.11.1

Release notes for syft v0.11.1

Release Notes

Version v0.11.1

v0.11.1 (2020-12-23)

Full Changelog

Fixed bugs:

  • Handle site packages based on which egg file is parsed #303 (luhring)
  • Python runtime is not a Python package itself, ignore it #301 (alfredodeza)

* This Changelog was automatically generated by github_changelog_generator

8.1.193 - v0.11.0

Release notes for syft v0.11.0

Release Notes

Version v0.11.0

v0.11.0 (2020-12-18)

Full Changelog

Implemented enhancements:

  • Update dpkg license to only include single-word entries #298 (wagoodman)
  • Incorporate import changes + add image overwrite option #294 (wagoodman)
  • Improve performance of the python cataloger #290 (wagoodman)
  • Sort generated CPEs by specificity #289 (luhring)
  • Upload SBOM results to Anchore Engine #38

Fixed bugs:

  • Python egg-info may be a directory or file, Syft only looks for directories #295

* This Changelog was automatically generated by github_changelog_generator

8.1.194 - v0.10.0

Release notes for syft v0.10.0

Release Notes

Version v0.10.0

v0.10.0 (2020-12-10)

Full Changelog

Enhancements:

  • Include in JSON output the raw manifest (and digest) from registry if available or a computed manifest (and digest) #272
  • Add support for uploading SBOM results to Anchore Engine #38

* This Changelog was automatically generated by github_changelog_generator

8.1.195 - v0.9.2

Release notes for syft v0.9.2

Release Notes

Version v0.9.2

v0.9.2 (2020-12-03)

Full Changelog

Fixed bugs:

  • Unable to pull/analyze docker image as of 0.9.0 #284

* This Changelog was automatically generated by github_changelog_generator

8.1.196 - v0.9.1

Release notes for syft v0.9.1

Release Notes

Version v0.9.1

v0.9.1 (2020-12-02)

Full Changelog

Implemented enhancements:

  • Include CPEs with elements from POM GroupId fields #279 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.197 - v0.9.0

Release notes for syft v0.9.0

Release Notes

Version v0.9.0

v0.9.0 (2020-11-30)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Update stereoscope version to fix opaque directory merge issue #278 (luhring)
  • Our project’s Docker image kills syft and grype #264 (luhring)

* This Changelog was automatically generated by github_changelog_generator

8.1.198 - v0.8.0

Release notes for syft v0.8.0

Release Notes

Version v0.8.0

v0.8.0 (2020-11-17)

Full Changelog

Enhancements:

  • Add JSON document import #266

Fixed bugs:

  • Incorrect version parsing from certain java package names in syft 5.0 and newer #255
  • Unable to parse license field for certain npm dependencies #253

* This Changelog was automatically generated by github_changelog_generator

8.1.199 - v0.7.1

Release notes for syft v0.7.1

Release Notes

Version v0.7.1

v0.7.1 (2020-11-12)

Full Changelog

Fixed bugs:

  • Add source to packages found by RPMdb cataloger #263 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.200 - v0.7.0

Release notes for syft v0.7.0

Release Notes

Version v0.7.0

v0.7.0 (2020-11-11)

Full Changelog

Implemented enhancements:

  • Add identified distro and version to output for JSON presenter #169
  • Add signed and notarized ZIP release asset #261 (luhring)
  • Include ID_LIKE when parsing distro information #256

Fixed bugs:

  • Cataloging python packages errors out if “top_level.txt” entry is missing #259

* This Changelog was automatically generated by github_changelog_generator

8.1.201 - v0.6.0

Release notes for syft v0.6.0

Release Notes

Version v0.6.0

v0.6.0 (2020-11-10)

Full Changelog

Implemented enhancements:

  • Add identified distro and version to output for JSON presenter #169
  • Add RPM file info sourced from the RPM DB #251 (wagoodman)

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.1.202 - v0.5.1

Release notes for syft v0.5.1

Release Notes

Version v0.5.1

v0.5.1 (2020-11-04)

Full Changelog

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.1.203 - v0.5.0

Release notes for syft v0.5.0

Release Notes

Version v0.5.0

v0.5.0 (2020-10-30)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Java cataloger doesn’t scan the top-level directory during glob matching for pom and nested archives #238
  • Java cataloger reporting packages without name and version #220
  • Java cataloger miscellaneous fixes #245 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.204 - v0.4.1

Release notes for syft v0.4.1

Release Notes

Version v0.4.1

v0.4.1 (2020-10-26)

Full Changelog

Fixed bugs:

  • errors+failures parsing package.json files #230
  • Update doublestar to include fix for open dirs issue #240 (luhring)

* This Changelog was automatically generated by github_changelog_generator

8.1.205 - v0.4.0

Release notes for syft v0.4.0

Release Notes

Version v0.4.0

v0.4.0 (2020-10-23)

Full Changelog

Implemented enhancements:

  • Enhance python cataloger to be image/directory aware #205
  • Add support for package.json #200
  • Enable CodeQL Security Scan #222 (VinodAnandan)

Fixed bugs:

  • Reduce number of open files while processing nested java archives #227 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.206 - v0.3.0

Release notes for syft v0.3.0

Release Notes

Version v0.3.0

v0.3.0 (2020-10-15)

Full Changelog

Implemented enhancements:

  • Update install script arguments for proper argument processing #211 (wagoodman)
  • Run checks on PRs from forks #210 (wagoodman)
  • Fix acceptance tests & add notification upon failures #204 (wagoodman)
  • Add homepage field as output to the gemspec metadata #214

Fixed bugs:

  • Cataloger apkdb-cataloger failed to parse entries #212
  • Allow for gemspec metadata fields to be optional #218 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

8.1.207 - v0.2.0

Release notes for syft v0.2.0

Release Notes

Version v0.2.0

v0.2.0 (2020-10-08)

Full Changelog

Implemented enhancements:

  • Support cataloging gemspec files #197
  • Fix acceptance tests & add notification upon failures #204 (wagoodman)

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.1.208 - v0.1.0

Release notes for syft v0.1.0

Release Notes

Version v0.1.0

First Release! :tada:

8.1.209 - v0.1.0-beta.5

Release notes for syft v0.1.0-beta.5

Release Notes

Version v0.1.0-beta.5

v0.1.0-beta.5 (2020-09-26)

Full Changelog

Implemented enhancements:

  • Integrate the changelog generator into the release pipeline #182
  • Test DependencyTrack can utilize the CycloneDX report #161
  • Extend CycloneDx to use pURL #160
  • Add auto-changelog generation #159
  • JSON output for version details #122
  • Normalize the json image/dir source #180 (wagoodman)
  • Remove duplicate rows from the summary table #179 (wagoodman)
  • Add OCI support + use URI schemes #178 (wagoodman)

Fixed bugs:

Closed issues:

  • Expand matching of requirements.txt #167
  • Document release process #132
  • Add arch distro identification #49
  • Add suse distro identification #48

* This Changelog was automatically generated by github_changelog_generator

8.1.210 - v0.1.0-beta.4

Release notes for syft v0.1.0-beta.4

Release Notes

Version v0.1.0-beta.4

676544b use token on release 647c806 Add install script + brew tap (#138) 89dc415 Add badges (#137) ac9141e add issue template (#135) 21aa32c Merge pull request #134 from anchore/issue-69 2adbe75 docs: add contributing guidelines

8.1.211 - v0.1.0-beta.3

Release notes for syft v0.1.0-beta.3

Release Notes

Version v0.1.0-beta.3

2d452bf Add inline-comparison as acceptance test (#130) 4c7784d Add shell completion script (#131) 86d3336 Add macos quarantine to readme (#129) a3a3e38 replace master with main (#128) fa5d2b5 fix readme installation notice 817ce61 Add detailed location info to json artifact (#127) dc8dfc8 fix panic on top-level log (#125) f855a38 pull all commits on checkout for release to build changelog (#126) bfc5dd8 replace fetching->loading and reading->parsing in UI (#124) 70e6732 Add poetry cataloger (#121) e2a874a finalize json output & add schema (#118) 2560266 Initial README (#120) 8fe59c6 bump stereoscope for docker pull + add UI elements for pull status (#117) 78515da replace zap logger with logrus (#116) 076d5c2 fix ui handlers to write before first event 5320280 show message when no packages are discovered (#115) c67e17a Merge pull request #114 from anchore/issue-111 04a1c91 java: fallback to manifest.ImplTitle when there is no name bb81c0b tests: java cataloger tests for selecting name e397659 pull in fix for bounds check progress formatting values in etui 271ba35 Export UI handlers for reuse in other tools (#113) 857f41b Merge pull request #112 from anchore/ignore-prerelease-versions ad1a72c ignore prerelease verions when uploading version file on release bc69382 Merge pull request #110 from anchore/issue-8 caecce9 tests: update integration tests to include yarn packages 713f660 cataloger: update controller to use javascript (vs. npm) d79cece tests: verify new yarn.lock parser 5790474 pkg: define the Yarn package type 67fb132 cataloger: implement the yarn.lock parser 146b4bd cataloger: rename npm to javascript to accommodate yarn parser

8.1.212 - v0.1.0-beta.2

Release notes for syft v0.1.0-beta.2

Release Notes

Version v0.1.0-beta.2

06f8355 finalize update check URL

8.1.213 - v0.1.0-beta.1

Release notes for syft v0.1.0-beta.1

Release Notes

Version v0.1.0-beta.1

8.2 - Grype Release Notes

Anchore Grype Release Notes

8.2.1 - v0.99.1

Release notes for grype v0.99.1

Release Notes

Version v0.99.1

Bug Fixes

  • Present fix available version in grype JSON output [#2905 @wagoodman]
  • detect patch numbers in fuzzy version comparison [#2844 @willmurphyscode]
  • Make timestamp in output configurable (so that results are more reproducible) [#522 #2724 @gabetrau]
  • Grype .98 misidentifies the container package version [#2884]

(Full Changelog)

8.2.2 - v0.99.0

Release notes for grype v0.99.0

Release Notes

Version v0.99.0

Added Features

Bug Fixes

Breaking Changes

(Full Changelog)

8.2.3 - v0.98.0

Release notes for grype v0.98.0

Release Notes

Version v0.98.0

Added Features

  • move debian 13 (trixie) to released and debian 14 (forky) to testing/sid/unstable [#2861 @westonsteimel]

(Full Changelog)

8.2.4 - v0.97.2

Release notes for grype v0.97.2

Release Notes

Version v0.97.2

Grype v0.97.2

Added Features

Bug Fixes

  • fix: update syft’s nondeterministic Java archive purl and improve groupID for better matching [#3521 #4118 @kzantow]

(Full Changelog)

8.2.5 - v0.97.1

Release notes for grype v0.97.1

Release Notes

Version v0.97.1

Bug Fixes

  • Multiple EUS advisories where only some are fixed result in unexpected vulnerabilities [#2840 #2841 @kzantow]

(Full Changelog)

8.2.6 - v0.97.0

Release notes for grype v0.97.0

Release Notes

Version v0.97.0

Added Features

Bug Fixes

  • Error scanning snap “unsupported source: source.SnapMetadata” [#2819 #2821 @kzantow]

Additional Changes

(Full Changelog)

8.2.7 - v0.96.1

Release notes for grype v0.96.1

Release Notes

Version v0.96.1

Syft Improvments

  • Update to latest version of syft v1.29.0

Performance Improvements

(Full Changelog)

8.2.8 - v0.96.0

Release notes for grype v0.96.0

Release Notes

Version v0.96.0

Added Features

  • Added the EPSS score and KEV indications as CycloneDX vulnerabilities.ratings entries [#2695 #2765 @AlinaPodoba]

Bug Fixes

  • The go run and go install broken due to useless redirect directive in go.mod [#2777 #2780 @stefanb]
  • EPSS implementation using percentile instead of percent probability [#2778 #2785 @wagoodman]
  • Latest version of grype with V6 schema lists incorrect URL for v6 database [#2513]

Additional Changes

(Full Changelog)

8.2.9 - v0.95.0

Release notes for grype v0.95.0

Release Notes

Version v0.95.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.2.10 - v0.94.0

Release notes for grype v0.94.0

Release Notes

Version v0.94.0

Added Features

Bug Fixes

  • Nonroot can’t load local docker image with docker socket bind [#2721 #2723 @kzantow]
  • “Harden Container Runtime with Non-Root User” breaks –output usage [#2720 #2723 @kzantow]

(Full Changelog)

8.2.11 - v0.93.0

Release notes for grype v0.93.0

Release Notes

Version v0.93.0

Added Features

Bug Fixes

  • Harden Container Runtime with Non-Root User [#2716 @wagoodman]
  • valid cpes in db search output [#2706 @westonsteimel]
  • Always show results with json output for db search commands [#2692 @wagoodman]
  • False positive: CVE-2025-5702 reported with High severity on glibc 2.34 (wrong severity and affected version) [#2718]

(Full Changelog)

8.2.12 - v0.92.2

Release notes for grype v0.92.2

Release Notes

Version v0.92.2

Bug Fixes

Additional Changes

(Full Changelog)

8.2.13 - v0.92.1

Release notes for grype v0.92.1

Release Notes

Version v0.92.1

(Full Changelog)

8.2.14 - v0.92.0

Release notes for grype v0.92.0

Release Notes

Version v0.92.0

Added Features

Bug Fixes

  • adjust namespace translation logic to be v5 compatible [#2634 @westonsteimel]
  • fall back to fuzzy constraint units [#2651 @willmurphyscode]
  • adjust version prefix check when excluding overlapping packages [#2653 @westonsteimel]
  • Dropping group from npm package names leads to false positives [#2554 #2645 @kzantow]
  • Potential regression in CVE detection from 0.87.0 (v5 schema) to 0.88.0 (v6 schema) for go-module detection [#2642]
  • Removal of temporary files not working on Windows [#2233 #2657 @popey]
  • @jridgewell/gen-mapping incorrectly attributed GHSA-8rmg-jf7p-4p22 [#1886 #2645 @kzantow]
  • Vulnerability reported on @group/name dependency when actual vulnerability exists on name dependency [#1701 #2645 @kzantow]
  • Grype false negatives in versions v0.88.0 and later leading to missed critical vulnerabilities [#2628 #2645 @kzantow]
  • PHP pecl redis mixes with redis project itself and creates false positive cve [#1804]
  • False Positive: Openssl CVE-2022-2068, CVE-2022-1292, CVE-2021-3711 in SUSE Enterprise 15 SP5 [#1729]
  • Grype does not handle purl file input with packages from different distributions [#2630 #2639 @chovanecadam]
  • grype pkg:golang/k8s.io/ingress-nginx@v1.11.2 does not show cve [#2580 #2586 @goatwu1993]

(Full Changelog)

8.2.15 - v0.91.2

Release notes for grype v0.91.2

Release Notes

Version v0.91.2

Bug Fixes

(Full Changelog)

8.2.16 - v0.91.1

Release notes for grype v0.91.1

Release Notes

Version v0.91.1

Bug Fixes

Additional Changes

  • add timing info to log output [#2597 @kzantow]
  • Replace os.ReadDir with afero.ReadDir for consistency [#2579 @joe-ton]

(Full Changelog)

8.2.17 - v0.91.0

Release notes for grype v0.91.0

Release Notes

Version v0.91.0

Added Features

  • Add v5 namespace emulation to db search output [#2539 @wagoodman]
  • Add CVSS metrics in search JSON output [#2568 @wagoodman]
  • Exit with a different return code for a failed scan [#1922]

Bug Fixes

(Full Changelog)

8.2.18 - v0.90.0

Release notes for grype v0.90.0

Release Notes

Version v0.90.0

Added Features

(Full Changelog)

8.2.19 - v0.89.1

Release notes for grype v0.89.1

Release Notes

Version v0.89.1

Bug Fixes

(Full Changelog)

8.2.20 - v0.89.0

Release notes for grype v0.89.0

Release Notes

Version v0.89.0

[!IMPORTANT] As of Grype v0.88.0, the listing file which hosts the URLs of databases to download has migrated from https://toolbox-data.anchore.io/grype/databases/listing.json to https://grype.anchore.io/databases/v6/latest.json.

Added Features

Bug Fixes

  • Check for vulnerability database update failed with unsupported protocol scheme when referencing local file [#2507 #2508 @wagoodman]

(Full Changelog)

8.2.21 - v0.88.0

Release notes for grype v0.88.0

Release Notes

Version v0.88.0

[!IMPORTANT] With #2126 the listing file which hosts the URLs of databases to download has migrated from https://toolbox-data.anchore.io/grype/databases/listing.json to https://grype.anchore.io/databases/v6/latest.json.

Added Features

Bug Fixes

  • fix golang 1.24 versions when not semver compliant [#2486 @xnox]
  • error out on maven search rate limiting [#2460 @luhring]
  • CPE search failed when considering target software for unknown package type [#2434 #2438 @westonsteimel]
  • Grype Does Not Clean TMPDIR When Running in a Docker Container [#2500]
  • GetMavenPackageBySha can be rate limited by maven central, grype will silently fail which results in inconsistent scan results [#2383]
  • Grype exits with error on JSON output with PURL input [#2360]
  • Removal of temporary files not working on Windows [#2233 #2439 @kzantow]
  • grype db status reports “valid” when the DB is missing [#2077 #2439 @kzantow]
  • grype db status doesn’t always check the db’s checksum and validity [#1648 #2439 @kzantow]
  • False positive of CVE-2023-45853 on apt zlib1g/now 1:1.2.13.dfsg-1 package [#2412 #2474 @westonsteimel]
  • GHSA-93ww-43rr-79v3 / CVE-2024-10039 does not get patched version [#2408]
  • “grype config” output swaps comments for search-indexed-archives / search-unindexed-archives [#2409 #2414 @spiffcs]

Breaking Changes

Additional Changes

(Full Changelog)

8.2.22 - v0.87.0

Release notes for grype v0.87.0

Release Notes

Version v0.87.0

Added Features

Bug Fixes

  • fix upstream match for linux-.-headers-. [#2320 @barnuri]
  • external-sources: throttle requests to maven central to avoid being rate limited for large sets of java dependencies [#2384 @rawlingsj]
  • Clean up config help text [#2347 @wagoodman]

(Full Changelog)

8.2.23 - v0.86.1

Release notes for grype v0.86.1

Release Notes

Version v0.86.1

Security Fixes

Bug Fixes

Additional Changes

  • move v5-specific interfaces and implementations to the v5 package [#2322 @kzantow]
  • Fix broken link to cosign documentation [#2321 @uaqben]

(Full Changelog)

8.2.24 - v0.86.0

Release notes for grype v0.86.0

Release Notes

Version v0.86.0

Added Features

Bug Fixes

  • ignore linux-aws-headers-._ as well like linux-headers-._ [#2295 @barnuri]

Breaking Changes

Additional Changes

  • refactor v5-specific code out of core packages [#2299 @kzantow]

(Full Changelog)

8.2.25 - v0.85.0

Release notes for grype v0.85.0

Release Notes

Version v0.85.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.2.26 - v0.84.0

Release notes for grype v0.84.0

Release Notes

Version v0.84.0

Added Features

Bug Fixes

Additional Changes

  • update Syft to v1.16.0 [#2237 @anchore-actions-token-generator]

(Full Changelog)

8.2.27 - v0.83.0

Release notes for grype v0.83.0

Release Notes

Version v0.83.0

Added Features

(Full Changelog)

8.2.28 - v0.82.2

Release notes for grype v0.82.2

Release Notes

Version v0.82.2

Bug Fixes

  • azurelinux considered as comprehensive distro [#2197 @westonsteimel]
  • Java archive cataloger performance in 0.82.x much slower than 0.81.0 [#2200]

Additional Changes

(Full Changelog)

8.2.29 - v0.82.1

Release notes for grype v0.82.1

Release Notes

Version v0.82.1

Bug Fixes

Additional Changes

(Full Changelog)

8.2.30 - v0.82.0

Release notes for grype v0.82.0

Release Notes

Version v0.82.0

Added Features

  • performance: only check for a new DB once every 2 hours (configurable) [#2148 @wagoodman]
  • wordpress-plugin support [#1553 @disc]

Bug Fixes

Breaking Changes

Additional Changes

  • Add a space following the “Name:” label in html.tmpl [#2155 @deftdawg]

(Full Changelog)

8.2.31 - v0.81.0

Release notes for grype v0.81.0

Release Notes

Version v0.81.0

Added Features

(Full Changelog)

8.2.32 - v0.80.2

Release notes for grype v0.80.2

Release Notes

Version v0.80.2

Bug Fixes

Additional Changes

(Full Changelog)

8.2.33 - v0.80.1

Release notes for grype v0.80.1

Release Notes

Version v0.80.1

Bug Fixes

Additional Changes

  • Update Syft to 1.12.2 [#2108]

(Full Changelog)

8.2.34 - v0.80.0

Release notes for grype v0.80.0

Release Notes

Version v0.80.0

Added Features

Bug Fixes

  • correctly close the db file in v4/v5 stores [#2066 @AndreiStefanie]
  • Grype panics with a nil pointer dereference error when given an empty string argument [#2063 #2064 @lucasrod16]
  • Ignoring search results when CPE is not set in the SBOM [#2039 #2040 @aeg]
  • “No vulnerability database update available” when actually the check for an update was unsuccessful [#310 #1247 @shanedell]
  • CycloneDX output metadata.properties set to null instead of empty array or omitted [#1759]

Additional Changes

(Full Changelog)

8.2.35 - v0.79.6

Release notes for grype v0.79.6

Release Notes

Version v0.79.6

Bug Fixes

(Full Changelog)

8.2.36 - v0.79.5

Release notes for grype v0.79.5

Release Notes

Version v0.79.5

Bug Fixes

Additional Changes

(Full Changelog)

8.2.37 - v0.79.4

Release notes for grype v0.79.4

Release Notes

Version v0.79.4

Bug Fixes

Additional Changes

  • update Syft to v1.10.0 [#2019 @anchore-actions-token-generator]

(Full Changelog)

8.2.38 - v0.79.3

Release notes for grype v0.79.3

Release Notes

Version v0.79.3

Bug Fixes

  • correct logic checking cpe target software component against package type [#1658 @westonsteimel]

Additional Changes

(Full Changelog)

8.2.39 - v0.79.2

Release notes for grype v0.79.2

Release Notes

Version v0.79.2

Bug Fixes

  • use location RealPath not String() for match sorting [#1950 @luhring]

(Full Changelog)

8.2.40 - v0.79.1

Release notes for grype v0.79.1

Release Notes

Version v0.79.1

Updates

  • update CI to install golang at the latest version [#1949 @spiffcs]
  • Grype is now built with the latest version of Golang at v1.22.x. This resolves a few security findings that would have been flagged against the v0.79.0 binary for using an older version of the Golang standard library.

(Full Changelog)

8.2.41 - v0.79.0

Release notes for grype v0.79.0

Release Notes

Version v0.79.0

Added Features

Bug Fixes

(Full Changelog)

8.2.42 - v0.78.0

Release notes for grype v0.78.0

Release Notes

Version v0.78.0

Added Features

Bug Fixes

  • ask catalog for package, rather than type asserting [#1857 @willmurphyscode]
  • Disable TUI for simple commands [#1872 @wagoodman]
  • False Positive: CVE-2023-42282 not affected in SUSE ecosystem [#1813]
  • False positive GHSA-jr9c-h74f-2v28/CVE-2022-0905 reported for Non-vulnerable Gitea version [#1416]

Additional Changes

(Full Changelog)

8.2.43 - v0.77.4

Release notes for grype v0.77.4

Release Notes

Version v0.77.4

Additional Changes

(Full Changelog)

8.2.44 - v0.77.3

Release notes for grype v0.77.3

Release Notes

Version v0.77.3

Additional Changes

  • Remove providers’ pull information from DB metadata file [#1846 @asomya]

(Full Changelog)

8.2.45 - v0.77.2

Release notes for grype v0.77.2

Release Notes

Version v0.77.2

Bug Fixes

(Full Changelog)

8.2.46 - v0.77.1

Release notes for grype v0.77.1

Release Notes

Version v0.77.1

Additional Changes

(Full Changelog)

8.2.47 - v0.77.0

Release notes for grype v0.77.0

Release Notes

Version v0.77.0

Added Features

  • add linux and libc-dev headers ignore rules for debian packages [#1809 @zhill]
  • use Go main module version when possible [#1797 @luhring]

Additional Changes

  • Add providers’ pull date to DB metadata structure [#1795 @asomya]
  • config: add config opt in golang pseudo version main module comparison [#1816 @spiffcs]

(Full Changelog)

8.2.48 - v0.76.0

Release notes for grype v0.76.0

Release Notes

Version v0.76.0

Added Features

Bug Fixes

  • Disable matching kernel vulnerabilities by default for indirect matches against the ‘kernel-headers’ packages [#1762 #1787 @zhill]

Additional Changes

(Full Changelog)

8.2.49 - v0.75.0

Release notes for grype v0.75.0

Release Notes

Version v0.75.0

Added Features

Bug Fixes

  • use “path/filepath” to build file path [#1767 @seiyab]
  • Suppress warnings when matching go packages with devel version [#1752 @wagoodman]
  • not showing poco CVEs from syft generated sbom [#1737]

(Full Changelog)

8.2.50 - v0.74.7

Release notes for grype v0.74.7

Release Notes

Version v0.74.7

Bug Fixes

Additional Changes

  • update Syft to v0.105.1 [#1728]

(Full Changelog)

8.2.51 - v0.74.6

Release notes for grype v0.74.6

Release Notes

Version v0.74.6

Bug Fixes

(Full Changelog)

8.2.52 - v0.74.5

Release notes for grype v0.74.5

Release Notes

Version v0.74.5

Additional Changes

(Full Changelog)

8.2.53 - v0.74.4

Release notes for grype v0.74.4

Release Notes

Version v0.74.4

Security Fixes

(Full Changelog)

8.2.54 - v0.74.3

Release notes for grype v0.74.3

Release Notes

Version v0.74.3

Bug Fixes

Additional Changes

(Full Changelog)

8.2.55 - v0.74.2

Release notes for grype v0.74.2

Release Notes

Version v0.74.2

Additional Changes

  • update Syft to v0.101.1 [#1669 @anchore-actions-token-generator]

(Full Changelog)

8.2.56 - v0.74.1

Release notes for grype v0.74.1

Release Notes

Version v0.74.1

Security Fixes

Additional Changes

  • fix logging configuration in tests [#1655 @plavy]
  • Update Syft to 0.101.0 [#1663]

(Full Changelog)

8.2.57 - v0.74.0

Release notes for grype v0.74.0

Release Notes

Version v0.74.0

Added Features

  • Vulnerabilities marked as fixed in distro packages should be reported as fixed for all contained packages too [#1236 #1603 @luhring]

Bug Fixes

  • Parameter quiet is ignored in configuration file [#1645 #1646 @plavy]
  • 401 unauthorized pulling from public registry [#1637]

Additional Changes

  • Update Syft to 0.100.0 [#1649]

(Full Changelog)

8.2.58 - v0.73.5

Release notes for grype v0.73.5

Release Notes

Version v0.73.5

Additional Changes

(Full Changelog)

8.2.59 - v0.73.4

Release notes for grype v0.73.4

Release Notes

Version v0.73.4

Additional Changes

(Full Changelog)

8.2.60 - v0.73.3

Release notes for grype v0.73.3

Release Notes

Version v0.73.3

Additional Changes

  • update Syft to v0.97.1 [#1610 @anchore-actions-token-generator]

(Full Changelog)

8.2.61 - v0.73.2

Release notes for grype v0.73.2

Release Notes

Version v0.73.2

Bug Fixes

(Full Changelog)

8.2.62 - v0.73.1

Release notes for grype v0.73.1

Release Notes

Version v0.73.1

Bug Fixes

Additional Changes

  • avoid allocations with (*regexp.Regexp).MatchString [#1592 @Juneezee]

(Full Changelog)

8.2.63 - v0.73.0

Release notes for grype v0.73.0

Release Notes

Version v0.73.0

Added Features

Bug Fixes

  • Enable setting golang CPE config using env var [#1585 @willmurphyscode]
  • Incorrect version comparisons for maven packages [#1526 #1571 @spiffcs]
  • Grype fails to detect postgresql jdbc driver CVEs when scanning .jar [#1482]

Additional Changes

(Full Changelog)

8.2.64 - v0.72.0

Release notes for grype v0.72.0

Release Notes

Version v0.72.0

Added Features

  • Add –ignore-states flag for ignoring findings with specific fix states [#1473 @jhebden-gl]
  • Implement checksum & artifact signing [#1513 #1535 @hibare]

Bug Fixes

(Full Changelog)

8.2.65 - v0.71.0

Release notes for grype v0.71.0

Release Notes

Version v0.71.0

Added Features

(Full Changelog)

8.2.66 - v0.70.0

Release notes for grype v0.70.0

Release Notes

Version v0.70.0

Added Features

  • Update Syft to v0.93.0 + enable golang stdlib matching [#1550 @spiffcs ]

Bug Fixes

(Full Changelog)

8.2.67 - v0.69.1

Release notes for grype v0.69.1

Release Notes

Version v0.69.1

Bug Fixes

Additional Changes

(Full Changelog)

8.2.68 - v0.69.0

Release notes for grype v0.69.0

Release Notes

Version v0.69.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.2.69 - v0.68.1

Release notes for grype v0.68.1

Release Notes

Version v0.68.1

v0.68.1 (2023-09-15)

Full Changelog

Bug Fixes

  • Version output was not including supported db schema [PR #1494] [kzantow]

8.2.70 - v0.68.0

Release notes for grype v0.68.0

Release Notes

Version v0.68.0

v0.68.0 (2023-09-14)

Full Changelog

Added Features

  • Ignore/add match results based on OpenVEX documents [PR #1397] [puerco]
  • Introduce exit code failure option for db update check [PR #1463] [devfbe]

Bug Fixes

8.2.71 - v0.67.0

Release notes for grype v0.67.0

Release Notes

Version v0.67.0

v0.67.0 (2023-09-11)

Full Changelog

Additional Changes

8.2.72 - v0.66.0

Release notes for grype v0.66.0

Release Notes

Version v0.66.0

v0.66.0 (2023-08-31)

Full Changelog

Added Features

Bug Fixes

Additional Changes

  • Update Syft to 0.89.0

8.2.73 - v0.65.2

Release notes for grype v0.65.2

Release Notes

Version v0.65.2

v0.65.2 (2023-08-17)

Full Changelog

Additional Changes

8.2.74 - v0.65.1

Release notes for grype v0.65.1

Release Notes

Version v0.65.1

v0.65.1 (2023-08-04)

Full Changelog

Bug Fixes

  • Grype cannot read SPDX documents generated by SPDX-maven-plugin [Issue #1306]

8.2.75 - v0.65.0

Release notes for grype v0.65.0

Release Notes

Version v0.65.0

v0.65.0 (2023-07-31)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.2.76 - v0.64.2

Release notes for grype v0.64.2

Release Notes

Version v0.64.2

v0.64.2 (2023-07-20)

Full Changelog

Bug Fixes

8.2.77 - v0.64.1

Release notes for grype v0.64.1

Release Notes

Version v0.64.1

v0.64.1 (2023-07-17)

Full Changelog

Bug Fixes

Additional Changes

8.2.78 - v0.64.0

Release notes for grype v0.64.0

Release Notes

Version v0.64.0

v0.64.0 (2023-07-13)

Full Changelog

Added Features

  • You can now list multiple output formats and files to write to disk with one command, like Syft: “-o format1=file1 -o format1=file2” [Issue #648] [PR #1346] [olivierboudet]

Bug Fixes

  • Correctly detect format of CycloneDX XML SBOM with no components [Issue #1005]
  • Fix vulnerability summary counts to be less confusing. [Issue #1360]

Additional Changes

8.2.79 - v0.63.1

Release notes for grype v0.63.1

Release Notes

Version v0.63.1

v0.63.1 (2023-06-30)

Full Changelog

Bug Fixes

8.2.80 - v0.63.0

Release notes for grype v0.63.0

Release Notes

Version v0.63.0

v0.63.0 (2023-06-21)

Full Changelog

Added Features

  • Always include the specific package name and version used in the vulnerability search in the matchDetails section of the output [PR #1339] [westonsteimel]
  • Expose Go template file that produces the table report [Issue #629] [PR #1343] [jneate]
  • Add a folder for community Go templates (see templates/README.md for more details) [Issue #1316]

Breaking Changes

8.2.81 - v0.62.3

Release notes for grype v0.62.3

Release Notes

Version v0.62.3

v0.62.3 (2023-06-05)

Full Changelog

Bug Fixes

8.2.82 - v0.62.2

Release notes for grype v0.62.2

Release Notes

Version v0.62.2

v0.62.2 (2023-05-26)

Full Changelog

8.2.83 - v0.62.1

Release notes for grype v0.62.1

Release Notes

Version v0.62.1

v0.62.1 (2023-05-24)

Full Changelog

Bug Fixes

  • Updated syft to v0.82.0 to address license parsing logic that may result in a panic [PR #1313]

8.2.84 - v0.62.0

Release notes for grype v0.62.0

Release Notes

Version v0.62.0

v0.62.0 (2023-05-22)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.2.85 - v0.61.1

Release notes for grype v0.61.1

Release Notes

Version v0.61.1

v0.61.1 (2023-04-21)

Full Changelog

Bug Fixes

  • :grey_question: Parsing dpkg status: extracting key-value from line: usr/lib/os-release err: cannot parse field [Issue #1195]
  • Grype suggesting to upgrade to a version already used. [Issue #1209]

Additional Changes

8.2.86 - v0.61.0

Release notes for grype v0.61.0

Release Notes

Version v0.61.0

v0.61.0 (2023-04-04)

Full Changelog

Added Features

Additional Changes

8.2.87 - v0.60.0

Release notes for grype v0.60.0

Release Notes

Version v0.60.0

v0.60.0 (2023-03-28)

Full Changelog

Added Features

Additional Changes

8.2.88 - v0.59.1

Release notes for grype v0.59.1

Release Notes

Version v0.59.1

v0.59.1 (2023-03-09)

Full Changelog

Bug Fixes

8.2.89 - v0.59.0

Release notes for grype v0.59.0

Release Notes

Version v0.59.0

v0.59.0 (2023-03-03)

Full Changelog

Added Features

Additional Changes

8.2.90 - v0.58.0

Release notes for grype v0.58.0

Release Notes

Version v0.58.0

v0.58.0 (2023-03-02)

Full Changelog

Security Fixes

  • chore(deps): bump github.com/hashicorp/go-getter from 1.6.2 to 1.7.0 [PR #1134] [dependabot]

Added Features

Bug Fixes

Additional Changes

8.2.91 - v0.57.1

Release notes for grype v0.57.1

Release Notes

Version v0.57.1

v0.57.1 (2023-02-16)

Full Changelog

8.2.92 - v0.57.0

Release notes for grype v0.57.0

Release Notes

Version v0.57.0

Updates

  • Update to latest syft for faster indexing and SBOM generation when consuming source and not using the SBOM as an input

Full Changelog

Bug Fixes

  • regression: Grype 0.54.0 does not find vulnerabilities in Nodejs runtime itself anymore [Issue #1043]

Additional Changes

8.2.93 - v0.56.0

Release notes for grype v0.56.0

Release Notes

Version v0.56.0

v0.56.0 (2023-01-26)

Full Changelog

Added Features

Bug Fixes

8.2.94 - v0.55.0

Release notes for grype v0.55.0

Release Notes

Version v0.55.0

v0.55.0 (2023-01-04)

Full Changelog

Added Features

  • add documentation about air gap installation support [Issue #509]
  • Include Syft’s cyclonedx component properties in Grype output [Issue #951]

Bug Fixes

  • OWASP dependency track is not listing vulnerabilities (cyclone dx format) from grype , syft is working however [Issue #796]
  • Failure scanning images with arch variant (e.g. arm/v7) [Issue #831]
  • Unnecessarily escaped output in CycloneDX [Issue #959]
  • SBOM cataloger and ownership-by-file-overlap relationships for packages [Issue #1044]

8.2.95 - v0.54.0

Release notes for grype v0.54.0

Release Notes

Version v0.54.0

v0.54.0 (2022-12-13)

Full Changelog

Added Features

  • reporting the relevant CVE number when GHSA is reported [Issue #204]
  • Add official support for ppc64le [Issue #404]

Bug Fixes

  • False positive: redis vuln associated to somewhat unrelated python dependency [Issue #491]
  • False flagging [Issue #800]
  • grype db update error [Issue #846]
  • Grype debug image no longer contains busybox [Issue #1010]

8.2.96 - v0.53.1

Release notes for grype v0.53.1

Release Notes

Version v0.53.1

v0.53.1 (2022-11-21)

Full Changelog

8.2.97 - v0.53.0

Release notes for grype v0.53.0

Release Notes

Version v0.53.0

v0.53.0 (2022-11-18)

Full Changelog

Added Features

  • Enable the Scorecard Github Action and badge [Issue #926]
  • Update Grype to use use syft v0.62.0

8.2.98 - v0.52.0

Release notes for grype v0.52.0

Release Notes

Version v0.52.0

v0.52.0 (2022-11-03)

Full Changelog

Added Features

  • Show all vulnerabilities, even suppressed [Issue #887]
  • Ubuntu: Add as a Vulnerability Specification Source [Issue #958]

Bug Fixes

  • Grype inconsistence output squashed and all-layers representation [Issue #894]
  • Grype doesn’t find CVE-2022-3358 [Issue #954]
  • Not applying Alpine secdb data correctly for “edge” [Issue #964]
  • Incorrect artifact entry in json report for grype v0.51.0 [Issue #967]

8.2.99 - v0.51.0

Release notes for grype v0.51.0

Release Notes

Version v0.51.0

v0.51.0 (2022-10-17)

Full Changelog

Features

  • Upgrade to a new vulnerability database schema v5 [PR #944]

Bug Fixes

  • Grype is not reporting CVE-2018-1270 [Issue #237]
  • Grype does not recognize Debian fix for CVE-2022-37434 [Issue #900]
  • grype cannot be used, because modify syft CycloneDX format json result file. [Issue #953]

8.2.100 - v0.50.2

Release notes for grype v0.50.2

Release Notes

Version v0.50.2

(Unreleased) (2022-09-20)

Full Changelog

Added Features

  • Add distro information into the CPE generation process [Issue #141]
  • allow development installations via install.sh [Issue #253]

8.2.101 - v0.50.1

Release notes for grype v0.50.1

Release Notes

Version v0.50.1

Full Changelog

Bug Fix

  • Pin syft version to latest release to resolve pseudo version conflict

8.2.102 - v0.50.0

Release notes for grype v0.50.0

Release Notes

Version v0.50.0

Full Changelog

Added Features

  • 0.49.0 docker image does not support arm64 [Issue #916]
  • review rpm packages [[Issue #570](https://github.com/anchore/grype/issues/570

8.2.103 - v0.49.0

Release notes for grype v0.49.0

Release Notes

Version v0.49.0

(Unreleased) (2022-09-01)

Full Changelog

Added Features

  • add basic instructions for compiling binaries to install readme [Issue #581]
  • How can grype scan manually installed dependencies? [Issue #651]
  • Flag to disable db check and update [Issue #878]

Bug Fixes

  • Java CVEs not detected from sparse CycloneDX SBOM [Issue #723]
  • Add support to bci images [Issue #740]
  • failed to catalog: could not fetch image (only on v0.47.0) [Issue #882]

8.2.104 - v0.48.0

Release notes for grype v0.48.0

Release Notes

Version v0.48.0

v0.48.0 (2022-08-24)

Full Changelog

Added Features

  • enhancement: add support for s390x arch [Issue #719]
  • More accurate “no OS distribution” messaging [Issue #748]

Fixed Bugs

  • disable CPE match filtering based on target software component for java packages [PR #889]

8.2.105 - v0.47.0

Release notes for grype v0.47.0

Release Notes

Version v0.47.0

v0.47.0 (2022-08-17)

Full Changelog

Security

  • Grype v0.46.0 reports a Critical vulnerability CVE-2022-35929 on itself [Issue #880]

Bug Fixes

  • GRYPE_DB_AUTO_UPDATE=false no longer works [Issue #870]

8.2.106 - v0.46.0

Release notes for grype v0.46.0

Release Notes

Version v0.46.0

v0.46.0 (2022-08-04)

Full Changelog

Added Features

  • ux: db: update: append more information about the next update [Issue #754]
  • update syft to use latest version [v0.53.4]

8.2.107 - v0.45.0

Release notes for grype v0.45.0

Release Notes

Version v0.45.0

v0.45.0 (2022-08-03)

Full Changelog

Added Features

  • Accept simple package list as input [Issue #516]
  • Request vulnerability data by a single cpe string [Issue #757]

Bug Fixes

  • grype db diff default case inverted [Issue #844]
  • Grype slow on parallel execution [Issue #855]
  • Concurrent gyrpe runs result in SQLITE_BUSY error [Issue #859]

8.2.108 - v0.44.0

Release notes for grype v0.44.0

Release Notes

Version v0.44.0

v0.44.0 (2022-07-25)

Full Changelog

Added Features

  • Filter CPE matches by target SW to reduce FPs [Issue #390]
  • Support ARM32 (linux/armv7) architecture [Issue #595]

8.2.109 - v0.43.0

Release notes for grype v0.43.0

Release Notes

Version v0.43.0

v0.43.0 (2022-07-18)

Full Changelog

Added Features

  • Remove matching for main go module matcher [PR #829]
  • Add –only-notfixed to complete the existing and useful –only-fixed [Issue #824]

Bug Fixes

  • Cannot concurrently access sqlite DB within a single process [Issue #155]
  • False positive of CVE-2020-16250 and CVE-2020-16251 [Issue #712]

8.2.110 - v0.42.0

Release notes for grype v0.42.0

Release Notes

Version v0.42.0

v0.42.0 (2022-07-11)

Full Changelog

Added Features

Bug Fixes

  • panic: runtime error: index out of range [0] with length 0 [Issue #821]

8.2.111 - v0.41.0

Release notes for grype v0.41.0

Release Notes

Version v0.41.0

v0.41.0 (2022-07-06)

Full Changelog

Features

  • Upgrade to a new vulnerability database schema v4 [PR #803]

Bug Fixes

  • Grype Busy Box Vulnerabilities resolved [Issue #510]
  • Vulnerabilities now reported under php (composer) [Issue #797]
  • Grype outputs listed properly [Issue #801]
  • Grype db update command now shows spinner [Issue #805]

8.2.112 - v0.40.1

Release notes for grype v0.40.1

Release Notes

Version v0.40.1

v0.40.1 (2022-06-24)

Full Changelog

Features

Bug Fixes

  • grype fixed version cyclonedxjson [Issue #762]
  • Include php in Grype supported languages [Issue #792]

8.2.113 - v0.40.0

Release notes for grype v0.40.0

Release Notes

Version v0.40.0

v0.40.0 (2022-06-17)

Full Changelog

Added Features

  • Be clear about version and data staleness [Issue #240]
  • Add a dockerized workflow for local dev [Issue #782]
  • Update grype documentation to include golang [Issue #787]

Bug Fixes

  • “Matcher failed to parse version” when scanning a Ruby project using bundler 2.2.0 or newer [Issue #767]
  • GHSA-x24g-9w7v-vprh included in grype 0.38.0 [Issue #779]
  • Template pipelines don’t seem to work in 0.39.0 [Issue #784]

8.2.114 - v0.39.0

Release notes for grype v0.39.0

Release Notes

Version v0.39.0

v0.39.0 (2022-06-09)

Full Changelog

Features

  • Support newer versions of ‘rpm’ that use Sqlite for the db instead of BerkeleyDB [Issue #469]

Bug Fixes

  • Template errors don’t lead to non-zero exit status [Issue #623]
  • Issues with Grype’s handling of template output for invalid templates [Issue #625]
  • Grype reports some critical Vault CVE on itself [Issue #676]

8.2.115 - v0.38.0

Release notes for grype v0.38.0

Release Notes

Version v0.38.0

v0.38.0 (2022-05-23)

Full Changelog

Added Features

8.2.116 - v0.37.0

Release notes for grype v0.37.0

Release Notes

Version v0.37.0

v0.37.0 (2022-05-13)

Full Changelog

Added Features

Security Fixes

Bug Fixes

  • Unable to determine the OS distribution (Ubuntu 20.04.4 LTS) [Issue #684]

8.2.117 - v0.36.1

Release notes for grype v0.36.1

Release Notes

Version v0.36.1

v0.36.1 (2022-05-03)

Update grype to use syft v0.45.1 and reduce info level logging overload

Full Changelog

8.2.118 - v0.36.0

Release notes for grype v0.36.0

Release Notes

Version v0.36.0

v0.36.0 (2022-04-29)

Full Changelog

Added Features

  • Add support for cyclonedx 1.4 and VEX [Issue #591]
  • Read attestation file, validate attestation, produce vulnerability report [Issue #644]

Bug Fixes

  • Panic while running scan on directory [Issue #715]

8.2.119 - v0.35.0

Release notes for grype v0.35.0

Release Notes

Version v0.35.0

v0.35.0 (2022-04-13)

Full Changelog

Added Features

  • Indicate location of vulnerability [Issue #561]
  • Optional External Data Source Reference for Maven Packages [Issue #711]

Bug Fixes

  • False positive (critical) on GHSA-8v27-2fg9-7h62 [Issue #632]
  • False Positive on CVE-2020-36518 [Issue #692]
  • Matches should be sorted by package name for template output [Issue #696]
  • panic: runtime error: invalid memory address or nil pointer dereference [Issue #702]

8.2.120 - v0.34.7

Release notes for grype v0.34.7

Release Notes

Version v0.34.7

v0.34.7 (2022-03-24)

Full Changelog

Bug Fixes

8.2.121 - v0.34.6

Release notes for grype v0.34.6

Release Notes

Version v0.34.6

v0.34.5 (2022-03-23)

Full Changelog

Bug Fixes

8.2.122 - v0.34.4

Release notes for grype v0.34.4

Release Notes

Version v0.34.4

v0.34.4 (2022-03-21)

Full Changelog

Bug Fixes

8.2.123 - v0.34.3

Release notes for grype v0.34.3

Release Notes

Version v0.34.3

v0.34.3 (2022-03-16)

Full Changelog

Bug Fixes

  • Panic: runtime error - when utilizing the vulnerability scanner on an cyclonedx sbom file input [Issue #669] [kzantow]

8.2.124 - v0.34.1

Release notes for grype v0.34.1

Release Notes

Version v0.34.1

v0.34.1 (2022-03-15)

Full Changelog

Added Features

Bug Fixes

  • Issue in Installation. err: anchore/grype err hash_sha256_verify unable to find checksum [Issue #577] [spiffcs]

8.2.125 - v0.33.1

Release notes for grype v0.33.1

Release Notes

Version v0.33.1

v0.33.1 (2022-02-27)

Full Changelog

Bug Fixes

8.2.126 - v0.33.0

Release notes for grype v0.33.0

Release Notes

Version v0.33.0

v0.33.0 (2022-02-15)

Full Changelog

Added Features

Bug Fixes

8.2.127 - v0.32.0

Release notes for grype v0.32.0

Release Notes

Version v0.32.0

v0.32.0 (2022-01-20)

Full Changelog

Features

  • Upgrade Grype to latest version of syft. See full release for details.

Bug Fixes

  • Error scanning SBOM from file: unsupported package metadata type: file [Issue #592]

Docker images

  • docker pull anchore/grype:v0.32.0

8.2.128 - v0.31.1

Release notes for grype v0.31.1

Release Notes

Version v0.31.1

v0.31.1 (2022-01-11)

Full Changelog

Added Features

  • Update Containerd dependency to fix GHSA-mvff-h3cj-wj9c

Bug Fixes

  • Grype installation contains vulnerability GHSA-mvff-h3cj-wj9c [Issue #583]

Docker images

  • docker pull anchore/grype:v0.31.1

8.2.129 - v0.30.0

Release notes for grype v0.30.0

Release Notes

Version v0.30.0

v0.30.0 (2022-01-09)

Full Changelog

Added Features

Docker images

  • docker pull anchore/grype:v0.30.0

8.2.130 - v0.29.0

Release notes for grype v0.29.0

Release Notes

Version v0.29.0

v0.29.0 (2022-01-07)

Full Changelog

Added Features

Bug Fixes

  • ability to go install “github.com/anchore/grype” [Issue #568]

Docker images

  • docker pull anchore/grype:v0.29.0

8.2.131 - v0.28.0

Release notes for grype v0.28.0

Release Notes

Version v0.28.0

v0.28.0 (2021-12-22)

Full Changelog

Added Features

Bug Fixes

  • Java packages sometimes missing version information [Issue #504]
  • False positives cases for CVE-2021-44228 [Issue #552]
  • Error when scanning a single file (e.g. zip, war, etc.) and using JSON output format [Issue #554]
  • MacOS install fails using GNU coreutils version of cp [Issue #560]

Docker images

  • docker pull anchore/grype:v0.28.0

8.2.132 - v0.27.3

Release notes for grype v0.27.3

Release Notes

Version v0.27.3

v0.27.3 (2021-12-16)

Full Changelog

Bug Fixes

  • Panic when a package has been added to a catalog multiple times [Issue #548]

Docker images

  • docker pull anchore/grype:v0.27.3

8.2.133 - v0.27.2

Release notes for grype v0.27.2

Release Notes

Version v0.27.2

v0.27.2 (2021-12-14)

Full Changelog

Bug Fixes

  • Index out of range while scanning Java webapps [Issue #538]

Docker images

  • docker pull anchore/grype:v0.27.2

8.2.134 - v0.27.1

Release notes for grype v0.27.1

Release Notes

Version v0.27.1

v0.27.1 (2021-12-14)

Full Changelog

Bug Fixes

  • panic: runtime error: invalid memory address or nil pointer dereference (deb package parsing) [Issue #523]
  • panic: runtime error: invalid memory address or nil pointer dereference (go binary parsing) [Issue #526]

Docker images

  • docker pull anchore/grype:v0.27.1

8.2.135 - v0.27.0

Release notes for grype v0.27.0

Release Notes

Version v0.27.0

v0.27.0 (2021-12-08)

Full Changelog

Added Features

Docker images

  • docker pull anchore/grype:v0.27.0

8.2.136 - v0.26.1

Release notes for grype v0.26.1

Release Notes

Version v0.26.1

v0.26.1 (2021-12-03)

Full Changelog

Added Features

Docker images

  • docker pull anchore/grype:v0.26.1

8.2.137 - v0.25.1

Release notes for grype v0.25.1

Release Notes

Version v0.25.1

Full Changelog

  • Update grype to use the latest grype-db so correct namespace for rocky linux distributions is used in vulnerability matching [PR #501]

Docker images

  • docker pull anchore/grype:0.25.1

8.2.138 - v0.25.0

Release notes for grype v0.25.0

Release Notes

Version v0.25.0

Full Changelog

Added Features

  • Use existing registry authentication such as Docker config [Issue #478]
  • Add Rocky Linux Support[PR #500]

Docker images

  • docker pull anchore/grype:0.25.0

8.2.139 - v0.24.1

Release notes for grype v0.24.1

Release Notes

Version v0.24.1

v0.24.1 (2021-11-05)

Full Changelog

Bug Fixes

  • Unable to invoke grype as an external process since 0.8.0 [Issue #267]
  • Homebrew - Tapping fails: Formulae require at least a URL on Apple M1 [Issue #401]

Docker images

  • docker pull anchore/grype:0.24.1

8.2.140 - v0.24.0

Release notes for grype v0.24.0

Release Notes

Version v0.24.0

v0.24.0 (2021-10-25)

Full Changelog

Added Features

Bug Fixes

  • Cannot handle Syft SBOM for directory scans [Issue #298]
  • False positive for package version appended with a release number (e.g. 1.5.1-r1) [Issue #427]
  • Image parsing hang if finds a directory with name ending in space [Issue #460]
  • Scan against container generating error and usage prompt on finding vulnerability [Issue #461]

Docker images

  • docker pull anchore/grype:v0.24.0-amd64
  • docker pull anchore/grype:v0-amd64
  • docker pull anchore/grype:v0.24-amd64
  • docker pull anchore/grype:v0.24.0-arm64v8
  • docker pull anchore/grype:v0-arm64v8
  • docker pull anchore/grype:v0.24-arm64v8

8.2.141 - v0.23.0

Release notes for grype v0.23.0

Release Notes

Version v0.23.0

v0.23.0 (2021-10-06)

Full Changelog

Implemented enhancements:

  • add an option to output the report into a file rather than redirecting the output #207

Fixed bugs:

  • Cannot handle Syft SBOM for directory scans #298

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:v0.23.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.23

8.2.142 - v0.22.0

Release notes for grype v0.22.0

Release Notes

Version v0.22.0

v0.22.0 (2021-09-30)

Full Changelog

Implemented enhancements:

  • Ability to ignore vulnerability matches (to help manage false positives) #198

Fixed bugs:

  • False positives for perl-* packages in centos:8 images #437

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.22.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.22

8.2.143 - v0.21.0

Release notes for grype v0.21.0

Release Notes

Version v0.21.0

v0.21.0 (2021-09-28)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Grype raise error: “failed to catalog: failed to parse CPE” #417

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.21.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.21

8.2.144 - v0.20.0

Release notes for grype v0.20.0

Release Notes

Version v0.20.0

v0.20.0 (2021-09-23)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • False positive on Centos/Rhel openjdk package #419
  • Java group ID not found resulting in missed results #378
  • False positive on sentry and other libs #280
  • update log file permissions to 0644 #422 (spiffcs)
  • Update KB constraint to not satisfy if raw constraint is empty. #421 (Vijay-P)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.20.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.20

8.2.145 - v0.19.0

Release notes for grype v0.19.0

Release Notes

Version v0.19.0

v0.19.0 (2021-09-14)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • False positive core.jar (CVE-2020-15235, CVE-2020-15505, CVE-2020-15506, CVE-2020-15507) #342
  • False positives for javax.mail #341
  • False positives in Python package “redis” confused with Redis server #307
  • False positive - Python Libraries mistaken for other Software #212

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.19.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.19

8.2.146 - v0.18.0

Release notes for grype v0.18.0

Release Notes

Version v0.18.0

v0.18.0 (2021-09-13)

Full Changelog

Implemented enhancements:

  • bump syft to the newest 0.23.0 version #414 (spiffcs)

Fixed bugs:

  • Alpine matching should include source indirection matching #343
  • Ensure that virtual path is reported for java archives. #393 (dakaneye)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.18.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.18

8.2.147 - v0.17.0

Release notes for grype v0.17.0

Release Notes

Version v0.17.0

v0.17.0 (2021-08-25)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Reporting vulnerabilities for NPM dependencies from lock files that should be excluded #385
  • False positive perl-Pod-Escapes vulns, RHEL7 #376
  • RPM matcher not always properly detecting package name from source RPM #374

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.17.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.17

8.2.148 - v0.16.0

Release notes for grype v0.16.0

Release Notes

Version v0.16.0

v0.16.0 (2021-08-18)

Full Changelog

Implemented enhancements:

  • Grype is not consistent when scaning dir on disk #338
  • Add option for accessing registries without HTTPS #334
  • Incorporate CPE generation enhancements #375 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.16.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.16

8.2.149 - v0.15.0

Release notes for grype v0.15.0

Release Notes

Version v0.15.0

v0.15.0 (2021-07-14)

Full Changelog

Implemented enhancements:

  • Add NVD CVSS scores to grype json output for matches on the vendor record #314
  • Vendor metadata for vulnerability fixes is missing #276

Fixed bugs:

  • cyclonedx reports a score of 0 if CVE has no CVSS #366
  • cyclonedx doesn’t report severity if feed has no CVSS #364
  • Pipelines allow unclean go.sum files that block our release pipeline #358
  • Panic during directory scan #353
  • CycloneDX Document struct returns empty Components list when parsing CycloneDX XML output #345
  • Add vendor-provided CVSS scores to vulnerability match records where available #287
  • There should always be links associated with a vulnerability #189
  • Show no value in table output for unknown fixes #350 (luhring)
  • Fix RPM epoch comparison logic #331 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.15.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.15

8.2.150 - v0.13.0

Release notes for grype v0.13.0

Release Notes

Version v0.13.0

v0.13.0 (2021-06-02)

Full Changelog

Implemented enhancements:

  • Add NVD CVSS scores to grype json output for matches on the vendor record #314
  • Add Vendor metadata for vulnerability fixes #276

Fixed bugs:

  • Replace links to Slack channels with public signup link #325 (luhring)
  • There should always be links associated with a vulnerability #189
  • Add vendor-provided CVSS scores to vulnerability match records where available #287

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.13.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.13

8.2.151 - v0.12.1

Release notes for grype v0.12.1

Release Notes

Version v0.12.1

v0.12.1 (2021-05-25)

Full Changelog

Implemented enhancements:

  • Allow registry auth config without authority value #322 (luhring)
  • Add java virtual path to package metadata #320 (wagoodman)
  • Show limited package metadata in json presenter #319 (wagoodman)
  • json output should be sorted #245
  • Expose the explicit record source for each match #283
  • Add database information to the JSON output #270
  • Add DB information to json descriptor block #302 (wagoodman)
  • Add grype db namespace indication in match details #299 (wagoodman)

Fixed bugs:

  • Alpine matching should use NVD as primary source #281
  • Vulnerability check should be more “greedy” #252
  • Allow registry auth config without authority value #322 (luhring)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.12.1
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.12

8.2.152 - v0.11.0

Release notes for grype v0.11.0

Release Notes

Version v0.11.0

v0.11.0 (2021-04-22)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • CycloneDX format is broken in 0.7.0 #288
  • Safely join paths derived from tar headers #294 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.11.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.11

8.2.153 - v0.10.2

Release notes for grype v0.10.2

Release Notes

Version v0.10.2

v0.10.2 (2021-04-14)

Full Changelog

Implemented enhancements:

  • Report the repo digests in the JSON output source section #269
  • Ability to pull image directly from a registry (without the Docker daemon) #264
  • Allow user-defined output formats #251
  • Pull in syft v0.14.0 and further decouple presenters from Syft #263 (wagoodman)
  • Upgrade grype-db to schema v2 #255

Fixed bugs:

  • Status text column not consistently aligned #289
  • Cannot handle downgrading grype versions with different DB schemas #271
  • CPEs in JSON output should be a formatted string #268
  • Private registry and password not working with special chars #254
  • Align status text column with that of Syft handlers #292 (luhring)
  • Stage DB file within directory named by schema version #272 (wagoodman)

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.10.2
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.10

8.2.154 - v0.9.0

Release notes for grype v0.9.0

Release Notes

Version v0.9.0

v0.9.0 (2021-03-25)

Full Changelog

Implemented enhancements:

  • Grype Docker Image #227

Fixed bugs:

  • Dockerfile for Grype #249
  • Reporting “exponent has no digits” on go case #246

* This Changelog was automatically generated by github_changelog_generator

Docker images

  • docker pull anchore/grype:latest
  • docker pull anchore/grype:v0.9.0
  • docker pull anchore/grype:v0
  • docker pull anchore/grype:v0.9

8.2.155 - v0.8.0

Release notes for grype v0.8.0

Release Notes

Version v0.8.0

v0.8.0 (2021-03-15)

Full Changelog

Implemented enhancements:

  • Refactor constraint expression parser to allow for quoted versions #234 (wagoodman)

Fixed bugs:

  • Can’t use syft JSON output as input #235
  • Reporting “exponent has no digits” on go case #246

* This Changelog was automatically generated by github_changelog_generator

8.2.156 - v0.7.0

Release notes for grype v0.7.0

Release Notes

Version v0.7.0

v0.7.0 (2021-01-27)

Full Changelog

Implemented enhancements:

  • Decouple grype from syft-specific data structures #220
  • Update to syft v0.12.4 #233 (luhring)

* This Changelog was automatically generated by github_changelog_generator

8.2.157 - v0.6.1

Release notes for grype v0.6.1

Release Notes

Version v0.6.1

v0.6.1 (2020-12-08)

Full Changelog

Fixed bugs:

  • UBI-based images do not generate any vulnerabilities #221

* This Changelog was automatically generated by github_changelog_generator

8.2.158 - v0.6.0

Release notes for grype v0.6.0

Release Notes

Version v0.6.0

v0.6.0 (2020-12-03)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • False negatives in finding CVEs in jar files #209

* This Changelog was automatically generated by github_changelog_generator

8.2.159 - v0.5.0

Release notes for grype v0.5.0

Release Notes

Version v0.5.0

v0.5.0 (2020-11-20)

Full Changelog

Implemented enhancements:

  • Option to use an SBOM input document instead of invoking syft’s cataloging functionality #196
  • Remove CPE generation (rely on static CPEa from syft instead) #213 (wagoodman)

Fixed bugs:

  • can’t brew install 0.3.0 on mac #203
  • “failed to catalog” error when scanning Python apps #200
  • Remove powershell description from completion command #211 (KeisukeYamashita)

* This Changelog was automatically generated by github_changelog_generator

8.2.160 - v0.4.0

Release notes for grype v0.4.0

Release Notes

Version v0.4.0

v0.4.0 (2020-11-12)

Full Changelog

Implemented enhancements:

Fixed bugs:

  • Updates for macOS release process #201 (luhring)
  • Remove darwin target from primary build entry #199 (luhring)

* This Changelog was automatically generated by github_changelog_generator

8.2.161 - v0.3.0

Release notes for grype v0.3.0

Release Notes

Version v0.3.0

v0.3.0 (2020-11-05)

Full Changelog

Implemented enhancements:

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.2.162 - v0.2.0

Release notes for grype v0.2.0

Release Notes

Version v0.2.0

v0.2.0 (2020-10-23)

Full Changelog

Implemented enhancements:

Closed issues:

  • Enable auto pre-release goreleaser flag in release pipeline #119

* This Changelog was automatically generated by github_changelog_generator

8.2.163 - v0.1.0

Release notes for grype v0.1.0

Release Notes

Version v0.1.0

First Release! :tada:

8.2.164 - v0.1.0-beta.11

Release notes for grype v0.1.0-beta.11

Release Notes

Version v0.1.0-beta.11

v0.1.0-beta.11 (2020-09-26)

Full Changelog

Implemented enhancements:

  • Integrate the changelog generator into the release pipeline #165

Fixed bugs:

* This Changelog was automatically generated by github_changelog_generator

8.2.165 - v0.1.0-beta.10

Release notes for grype v0.1.0-beta.10

Release Notes

Version v0.1.0-beta.10

f13b9a7 Use latest versions of anchore repos (#164) 326afa3 Add OCI support + use URI schemes (#160) 9f6301b Change root of JSON presenter to a mapping (instead of a sequence) (#163) b2715ff Update high level docs (#162) ed9f9bc remove duplicate rows from the summary table (#161)

8.2.166 - v0.1.0-beta.9

Release notes for grype v0.1.0-beta.9

Release Notes

Version v0.1.0-beta.9

ec493d5 Merge pull request #159 from anchore/update-testutils 578afab update go.mod and go.sum c73a337 fix replacement of results with matches (#158) f0f8f4b add –fail-on threshold support (#156) 0397206 Merge pull request #154 from anchore/issue-148 ca19b08 presenter: cyclonedx shouldn’t eat up errors 7b71401 cyclonedx tests: update BD name to use grype instead of syft 2d44839 presenter: cyclonedx document updates to pass schema validation 4f78b57 presenter: cyclonedx vulnerability schema fixes 2b8dfc2 temporary bump of go deps for testing 0fb5080 presenter: add new golden files for cyclonedx tests 46f3948 presenter: remove unneeded golden files 3de06ce presenter: join dir+img presesnter tests for cyclonedx 298a801 tests: update CycloneDX presenters with new namespaces 80d494b presenter: add xmlns for bd and v namespaces in cyclonedx output 3a57218 ci: hook the cyclonedx validation into CircleCI 57d777c tests: add cyclonedx schema check

8.2.167 - v0.1.0-beta.8

Release notes for grype v0.1.0-beta.8

Release Notes

Version v0.1.0-beta.8

2c1ddbe Merge pull request #152 from anchore/fix-json-keys cb437b6 Change kebab case to camelCase, use updated syft version ca8ac61 Rename Result object to Matches (#153) ad7d9d5 Merge pull request #151 from anchore/fix-version-json-output-casing 9fa5064 Fix json keys to be camel case instead of kebab 293368e Shell completion via Cobra utility (#149) 0f97081 add positional argument validation (#150)

8.2.168 - v0.1.0-beta.7

Release notes for grype v0.1.0-beta.7

Release Notes

Version v0.1.0-beta.7

1338850 Add fixed-in-version to the presenters (#147) bd50ffc Change search key json output to a map (#146) c0efed5 Merge pull request #143 from anchore/issue-39 c768955 presenter: cyclonedx tests 8fc7efd result: add a helper to get packages by ID 444b191 presenter: set the options to hook CycloneDX output 48c3c2a presenter: add a cyclonedx presenter 8e8ad48 dependencies: update to latest syft and include uuid b77e023 Merge pull request #137 from anchore/issue-94 d2949a2 matcher: add duplicate to demonstrate they don’t show up 89f8ac4 test: update integration to match new SearchMatches 46f614d tests: json presenter output updated 5428cc2 presenter: json to use a string for the search key, not a map 2d7af0b matchers: use strings for SearchKeys 87c267f matchers: cpe should prevent duplicates by not adding already present CPEs b8a4183 vuln matches should include search matches 651751f simplify version cmd + add json option (#139) be6a7ea Update README.md to highlight supported distros and languages (#135) 8757b47 Merge pull request #136 from anchore/issue-py-setup b0c6dc2 test: update scope.FilesByGlob, it is now part of Resolver b8e9431 dependencies: bump to latest syft that includes setup.py support 618672a matcher: use pkg.PythonSetupPkg as well 3836626 add demo gif (#134) d3987d7 Update modules (#127) 66b2512 Merge pull request #124 from anchore/issue-91 b237bf9 test: fuzzyConstraint needs a hint now, update tests 75b3537 version: use hint if provided 84684f2 test: add examples of crazy PEP440 rules 0399e08 version: use the new PythonFormat 41147df test: update integration validation for python packages with Python format 0618d1d github is picky about the issue template file extension d0b03fa add slack links to issue selection (#123) a34bf6e Merge pull request #122 from nwl/readme-fixes f2ce94b Replaced stray syft entries with grype 93e39a7 Merge pull request #120 from anchore/readme-install-fix 2caa0d2 docs: emphasize installation methods before features and getting started 89a6201 Disable prerelease version update check (#118) 12b2296 Add future ideas + beta warning to README (#114) 8052fa6 Update installation method (#117)

8.2.169 - v0.1.0-beta.6

Release notes for grype v0.1.0-beta.6

Release Notes

Version v0.1.0-beta.6

cbd6060 Add installer script + brew tap (#116) 457cd29 Add badges (#115) 219d8bc Use warn instead of error for packages with no matchers (#113) 50d7251 add issue templates (#112) 4596701 Merge pull request #110 from anchore/issue-35 9ece1f5 docs: add contributing guidelines

8.2.170 - v0.1.0-beta.5

Release notes for grype v0.1.0-beta.5

Release Notes

Version v0.1.0-beta.5

56b9576 Add inline-comparison as acceptance test (#106) f98e3cd replace search key from table with severity (#107) 37ceb17 Add shell completion script (#109) 2ccdefd Add poetry to package types (#108) 30d72dd fix spaces alignment on etui c1fdaba Adding additional detail to README (#103) f1ad989 replace master with main (#104) 6de7e40 finalize the json output (no schema yet) (#102) 76ff973 Merge pull request #99 from anchore/issue-18 5d057db cpe: update tests to match new ANY in product name d8da43b test: update integration tests for alpine e4689c6 matcher: add apk matcher unit tests 44767fc result: add a Count() helper method 4476fc9 broaden cpe matcher + modify alpine matcher a9bf268 integration tests for corner case cff46b8 add apk to controller e0db0c1 test: add integration corner cases for Alpine 905cae5 matcher: add APK support 317b383 match: add APK matcher type 5147985 add description and cvss metadata to v1 schema (#100) 4e6eb13 fix panic on top-level log (#97) 81eab4e pull all commits on checkout for release to build changelog (#98) f3756d0 change default scope to squashed (from all-layers) (#95) 0cfca60 Merge pull request #83 from anchore/initial-docs 57d73a5 docs: update README with sections and DB information 2cd127b Update pkg type (#87) e1f4c54 bump syft for docker pull + UI elements for pull status (#81) 5261e4a Merge pull request #84 from anchore/help-error c581a45 cmd: display help menu when no args are passed in - skip the error 87e6dc0 Merge pull request #82 from anchore/log-fix b214c29 cmd: fix log identifier for stereoscope fb8f3d8 restore log source after etui exit 11731fa replace zap logger with logrus (#80) 861883c pull in fix for bounds check progress formatting values in etui

8.2.171 - v0.1.0-beta.4

Release notes for grype v0.1.0-beta.4

Release Notes

Version v0.1.0-beta.4

8.2.172 - v0.1.0-beta.3

Release notes for grype v0.1.0-beta.3

Release Notes

Version v0.1.0-beta.3

8.2.173 - v0.1.0-beta.2

Release notes for grype v0.1.0-beta.2

Release Notes

Version v0.1.0-beta.2

8.2.174 - v0.1.0-beta.1

Release notes for grype v0.1.0-beta.1

Release Notes

Version v0.1.0-beta.1

8.3 - Grant Release Notes

Anchore Grant Release Notes

8.3.1 - v0.2.9

Release notes for grant v0.2.9

Release Notes

Version v0.2.9

(Full Changelog)

8.3.2 - v0.2.8

Release notes for grant v0.2.8

Release Notes

Version v0.2.8

Additional Changes

(Full Changelog)

8.3.3 - v0.2.7

Release notes for grant v0.2.7

Release Notes

Version v0.2.7

Additional Changes

(Full Changelog)

8.3.4 - v0.2.6

Release notes for grant v0.2.6

Release Notes

Version v0.2.6

Updates

(Full Changelog)

8.3.5 - v0.2.5

Release notes for grant v0.2.5

Release Notes

Version v0.2.5

Additional Changes

(Full Changelog)

8.3.6 - v0.2.4

Release notes for grant v0.2.4

Release Notes

Version v0.2.4

Additional Changes

(Full Changelog)

8.3.7 - v0.2.3

Release notes for grant v0.2.3

Release Notes

Version v0.2.3

Additional Changes

(Full Changelog)

8.3.8 - v0.2.2

Release notes for grant v0.2.2

Release Notes

Version v0.2.2

Grant v0.2.2

Special thanks to @NyanKiyoshi and @psududemike for the contributions surrounding fixing #101.

Please file an issue or reach out on the issue board tagging @spiffcs if you need support, feature requests, bug fixes, or have ideas for future features and PR.

Bug Fixes

Additional Changes

(Full Changelog)

8.3.9 - v0.2.1

Release notes for grant v0.2.1

Release Notes

Version v0.2.1

Additional Changes

  • Add SBOM generation and checksums signing to release [#55 @spiffcs]
  • Update Syft to v1.8.0

(Full Changelog)

8.3.10 - v0.2.0

Release notes for grant v0.2.0

Release Notes

Version v0.2.0

Feature Changes

(Full Changelog)

8.3.11 - v0.1.3

Release notes for grant v0.1.3

Release Notes

Version v0.1.3

Bug Fixes

Additional Changes

(Full Changelog)

8.3.12 - v0.1.2

Release notes for grant v0.1.2

Release Notes

Version v0.1.2

Additional Changes

(Full Changelog)

8.3.13 - v0.1.1

Release notes for grant v0.1.1

Release Notes

Version v0.1.1

Grant – License information is just an SBOM away v0.1.0

Grant is a new tool from the Anchore team that can view and check licenses from a given software bill of material.

Features

  • Users can supply an SBOM to grant and obtain a license violation report
  • Grant also can take an image or directory input, generate an SBOM, and then use those results as part of the license check.
  • list all the licenses found for a given container image or directory
  • Grant also has the ability to recognize licenses passed to it as a part of its input.
  • Given some text, grant can recognize a license and compare it to the provided configuration along with the SBOM or other supplied containers
  • Licenses are checked against the SPDX license list found here: https://spdx.org/licenses/.

Additional Changes

  • chore: update automatic release flow for v0.1.1 release [#29 @spiffcs]
  • chore: update code static analysis path [#27 @spiffcs]

(Full Changelog)

8.3.14 - v0.1.0

Release notes for grant v0.1.0

Release Notes

Version v0.1.0

Grant – License information is just an SBOM away v0.1.0 (INTERNAL-PRE-RELEASE)

Grant is a new tool from the Anchore team that can view and check licenses from a given software bill of material.

Features

  • Users can supply an SBOM to grant and obtain a license violation report
  • Grant also can take an image or directory input, generate an SBOM, and then use those results as part of the license check.
  • list all the licenses found for a given container image or directory
  • Grant also has the ability to recognize licenses passed to it as a part of its input.
  • Given some text, grant can recognize a license and compare it to the provided configuration along with the SBOM or other supplied containers
  • Licenses are checked against the SPDX license list found here: https://spdx.org/licenses/.

8.3.15 - v0.0.1

Release notes for grant v0.0.1

Release Notes

Version v0.0.1

Initial release of no code

8.4 - Grype-db Release Notes

Anchore Grype-db Release Notes

8.4.1 - v0.42.0

Release notes for grype-db v0.42.0

Release Notes

Version v0.42.0

Added Features

(Full Changelog)

8.4.2 - v0.41.0

Release notes for grype-db v0.41.0

Release Notes

Version v0.41.0

Added Features

Bug Fixes

  • Use results db explicitly in build [#683 @wagoodman]
  • Validate only the results.db file [#682 @wagoodman]
  • Some APK vulnerabilities are no longer reported by grype in the latest grype-db [#681]

(Full Changelog)

8.4.3 - v0.40.0

Release notes for grype-db v0.40.0

Release Notes

Version v0.40.0

Added Features

(Full Changelog)

8.4.4 - v0.39.0

Release notes for grype-db v0.39.0

Release Notes

Version v0.39.0

Added Features

Bug Fixes

Additional Changes

  • move to pyyaml-include 2.x, keep legacy CWD-relative !include [#642 @jamestexas]

(Full Changelog)

8.4.5 - v0.38.0

Release notes for grype-db v0.38.0

Release Notes

Version v0.38.0

Added Features

(Full Changelog)

8.4.6 - v0.37.0

Release notes for grype-db v0.37.0

Release Notes

Version v0.37.0

Added Features

(Full Changelog)

8.4.7 - v0.36.1

Release notes for grype-db v0.36.1

Release Notes

Version v0.36.1

Bug Fixes

  • update generated mapping code for trixie [#626 @anchore-actions-token-generator]

(Full Changelog)

8.4.8 - v0.36.0

Release notes for grype-db v0.36.0

Release Notes

Version v0.36.0

Added Features

  • move debian 13 (trixie) to released and debian 14 (forky) to testing/sid/unstable [#628 @westonsteimel]

Additional Changes

(Full Changelog)

8.4.9 - v0.35.0

Release notes for grype-db v0.35.0

Release Notes

Version v0.35.0

Added Features

Bug Fixes

(Full Changelog)

8.4.10 - v0.34.1

Release notes for grype-db v0.34.1

Release Notes

Version v0.34.1

(Full Changelog)

8.4.11 - v0.34.0

Release notes for grype-db v0.34.0

Release Notes

Version v0.34.0

Added Features

Bug Fixes

  • Version 5 vulnerability database no longer getting updates [#578]

Additional Changes

(Full Changelog)

8.4.12 - v0.33.1

Release notes for grype-db v0.33.1

Release Notes

Version v0.33.1

Bug Fixes

(Full Changelog)

8.4.13 - v0.33.0

Release notes for grype-db v0.33.0

Release Notes

Version v0.33.0

Added Features

Additional Changes

(Full Changelog)

8.4.14 - v0.32.0

Release notes for grype-db v0.32.0

Release Notes

Version v0.32.0

Added Features

Additional Changes

  • add option to always publish databases under their schema direc… [#552 @asomya]

(Full Changelog)

8.4.15 - v0.31.0

Release notes for grype-db v0.31.0

Release Notes

Version v0.31.0

Added Features

Bug Fixes

(Full Changelog)

8.4.16 - v0.30.1

Release notes for grype-db v0.30.1

Release Notes

Version v0.30.1

Added Features

Additional Changes

(Full Changelog)

8.4.17 - v0.29.0

Release notes for grype-db v0.29.0

Release Notes

Version v0.29.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.4.18 - v0.28.0

Release notes for grype-db v0.28.0

Release Notes

Version v0.28.0

Added Features

  • Change DB publish workflow to account for V6 [#387]

Bug Fixes

Additional Changes

(Full Changelog)

8.4.19 - v0.27.4

Release notes for grype-db v0.27.4

Release Notes

Version v0.27.4

(Full Changelog)

8.4.20 - v0.27.3

Release notes for grype-db v0.27.3

Release Notes

Version v0.27.3

Bug Fixes

(Full Changelog)

8.4.21 - v0.27.2

Release notes for grype-db v0.27.2

Release Notes

Version v0.27.2

Additional Changes

  • Consider all providers and edge cases when determining earliest data timestamp [#441 @wagoodman]
  • Ignore NVD data age when crafting DB timestamp [#440 @wagoodman]

(Full Changelog)

8.4.22 - v0.27.1

Release notes for grype-db v0.27.1

Release Notes

Version v0.27.1

Additional Changes

(Full Changelog)

8.4.23 - v0.27.0

Release notes for grype-db v0.27.0

Release Notes

Version v0.27.0

Added Features

(Full Changelog)

8.4.24 - v0.26.0

Release notes for grype-db v0.26.0

Release Notes

Version v0.26.0

Added Features

(Full Changelog)

8.4.25 - v0.25.1

Release notes for grype-db v0.25.1

Release Notes

Version v0.25.1

(Full Changelog)

8.4.26 - v0.25.0

Release notes for grype-db v0.25.0

Release Notes

Version v0.25.0

Added Features

(Full Changelog)

8.4.27 - v0.24.1

Release notes for grype-db v0.24.1

Release Notes

Version v0.24.1

Additional Changes

(Full Changelog)

8.4.28 - v0.24.0

Release notes for grype-db v0.24.0

Release Notes

Version v0.24.0

Added Features

(Full Changelog)

8.4.29 - v0.23.4

Release notes for grype-db v0.23.4

Release Notes

Version v0.23.4

Bug Fixes

Additional Changes

(Full Changelog)

8.4.30 - v0.23.3

Release notes for grype-db v0.23.3

Release Notes

Version v0.23.3

Additional Changes

(Full Changelog)

8.4.31 - v0.23.2

Release notes for grype-db v0.23.2

Release Notes

Version v0.23.2

(Full Changelog)

8.4.32 - v0.23.1

Release notes for grype-db v0.23.1

Release Notes

Version v0.23.1

Bug Fixes

  • All DB updates from Daily DB publisher uses the same built date since job #467 [#315]

Additional Changes

(Full Changelog)

8.4.33 - v0.23.0

Release notes for grype-db v0.23.0

Release Notes

Version v0.23.0

Added Features

  • Capture the dates for the last successful pull of each vunnel provider in the grype-db metadata.json file [#255 #306 @asomya]

(Full Changelog)

8.4.34 - v0.22.1

Release notes for grype-db v0.22.1

Release Notes

Version v0.22.1

Additional Changes

  • Remove providers’ pull information from DB metadata file [#303 @asomya]
  • bumping grype version [#304 @asomya]
  • remove vunnel and update yardstick in grype-db [#299 @spiffcs]

(Full Changelog)

8.4.35 - v0.22.0

Release notes for grype-db v0.22.0

Release Notes

Version v0.22.0

Added Features

  • Capture the dates for the last successful pull of each vunnel provider in the grype-db metadata.json file [#255 #292 @asomya]

(Full Changelog)

8.4.36 - v0.21.1

Release notes for grype-db v0.21.1

Release Notes

Version v0.21.1

Additional Changes

(Full Changelog)

8.4.37 - v0.21.0

Release notes for grype-db v0.21.0

Release Notes

Version v0.21.0

v0.21.0 (2024-03-27)

Full Changelog

Added Features

  • feat: add –results-only switch to grype-db cache backup [PR #268] [asomya]

Additional Changes

8.4.38 - v0.20.1

Release notes for grype-db v0.20.1

Release Notes

Version v0.20.1

v0.20.1 (2024-03-12)

Full Changelog

8.4.39 - v0.20.0

Release notes for grype-db v0.20.0

Release Notes

Version v0.20.0

v0.20.0 (2024-03-11)

Full Changelog

Added Features

Additional Changes

8.4.40 - v0.19.6

Release notes for grype-db v0.19.6

Release Notes

Version v0.19.6

v0.19.6 (2024-02-16)

Full Changelog

Security Fixes

8.4.41 - v0.19.5

Release notes for grype-db v0.19.5

Release Notes

Version v0.19.5

v0.19.5 (2024-01-26)

Full Changelog

Bug Fixes

8.4.42 - v0.19.4

Release notes for grype-db v0.19.4

Release Notes

Version v0.19.4

v0.19.4 (2024-01-18)

Full Changelog

Additional Changes

8.4.43 - v0.19.3

Release notes for grype-db v0.19.3

Release Notes

Version v0.19.3

v0.19.3 (2023-12-07)

Full Changelog

Additional Changes

8.4.44 - v0.19.2

Release notes for grype-db v0.19.2

Release Notes

Version v0.19.2

v0.19.2 (2023-11-09)

Full Changelog

Bug Fixes

Additional Changes

8.4.45 - v0.19.1

Release notes for grype-db v0.19.1

Release Notes

Version v0.19.1

v0.19.1 (2023-08-25)

Full Changelog

Bug Fixes

8.4.46 - v0.19.0

Release notes for grype-db v0.19.0

Release Notes

Version v0.19.0

v0.19.0 (2023-07-11)

Full Changelog

8.4.47 - v0.18.0

Release notes for grype-db v0.18.0

Release Notes

Version v0.18.0

v0.18.0 (2023-05-26)

Full Changelog

8.4.48 - v0.17.0

Release notes for grype-db v0.17.0

Release Notes

Version v0.17.0

v0.17.0 (2023-05-24)

Full Changelog

Added Features

8.4.49 - v0.16.0

Release notes for grype-db v0.16.0

Release Notes

Version v0.16.0

v0.16.0 (2023-05-22)

Full Changelog

Added Features

8.4.50 - v0.15.4

Release notes for grype-db v0.15.4

Release Notes

Version v0.15.4

v0.15.4 (2023-04-27)

Full Changelog

Bug Fixes

8.4.51 - v0.15.3

Release notes for grype-db v0.15.3

Release Notes

Version v0.15.3

v0.15.3 (2023-04-21)

Full Changelog

Additional Changes

8.4.52 - v0.15.2

Release notes for grype-db v0.15.2

Release Notes

Version v0.15.2

v0.15.2 (2023-03-28)

Full Changelog

Additional Changes

8.4.53 - v0.15.1

Release notes for grype-db v0.15.1

Release Notes

Version v0.15.1

v0.15.1 (2023-03-22)

Full Changelog

8.4.54 - v0.15.0

Release notes for grype-db v0.15.0

Release Notes

Version v0.15.0

v0.15.0 (2023-03-22)

Full Changelog

Added Features

Bug Fixes

Additional Changes

8.4.55 - v0.14.2

Release notes for grype-db v0.14.2

Release Notes

Version v0.14.2

v0.14.2 (2023-03-10)

Full Changelog

Bug Fixes

  • Remove depending on package types for version constraint enforcement [PR #67] [wagoodman]

Additional Changes

8.4.56 - v0.14.1

Release notes for grype-db v0.14.1

Release Notes

Version v0.14.1

v0.14.1 (2023-03-07)

Full Changelog

Additional Changes

8.4.57 - v0.14.0

Release notes for grype-db v0.14.0

Release Notes

Version v0.14.0

v0.14.0 (2023-02-16)

Full Changelog

Added Features

Additional Changes

8.5 - Vunnel Release Notes

Anchore Vunnel Release Notes

8.5.1 - v0.40.0

Release notes for vunnel v0.40.0

Release Notes

Version v0.40.0

Added Features

  • Add support for annotated openvex with observed fix dates [#885 @wagoodman]

Bug Fixes

  • Remove old CSAF archives when downloading new ones [#883 @wagoodman]

(Full Changelog)

8.5.2 - v0.39.2

Release notes for vunnel v0.39.2

Release Notes

Version v0.39.2

Bug Fixes

  • Update RHEL parser to account for missing module in CSAF product tree [#882 @wagoodman]

(Full Changelog)

8.5.3 - v0.39.1

Release notes for vunnel v0.39.1

Release Notes

Version v0.39.1

Bug Fixes

  • Use context managers for provider and parser resource cleanup [#881 @wagoodman]

(Full Changelog)

8.5.4 - v0.39.0

Release notes for vunnel v0.39.0

Release Notes

Version v0.39.0

Added Features

Bug Fixes

(Full Changelog)

8.5.5 - v0.38.3

Release notes for vunnel v0.38.3

Release Notes

Version v0.38.3

Bug Fixes

  • Process all NVD records to ensure a fix date is associated [#878 @wagoodman]

(Full Changelog)

8.5.6 - v0.38.2

Release notes for vunnel v0.38.2

Release Notes

Version v0.38.2

Bug Fixes

Additional Changes

  • Add nocase statements to schema (remove from queries) [#876 @wagoodman]

(Full Changelog)

8.5.7 - v0.38.1

Release notes for vunnel v0.38.1

Release Notes

Version v0.38.1

Bug Fixes

  • Ensure fetching entries from the fixdates db is case insensitive [#873 @wagoodman]

(Full Changelog)

8.5.8 - v0.38.0

Release notes for vunnel v0.38.0

Release Notes

Version v0.38.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.5.9 - v0.37.0

Release notes for vunnel v0.37.0

Release Notes

Version v0.37.0

Added Features

Additional Changes

(Full Changelog)

8.5.10 - v0.36.0

Release notes for vunnel v0.36.0

Release Notes

Version v0.36.0

Added Features

  • Add configuration to bypass RHEL hydra API failures [#819 @wagoodman]

Bug Fixes

(Full Changelog)

8.5.11 - v0.35.1

Release notes for vunnel v0.35.1

Release Notes

Version v0.35.1

Bug Fixes

(Full Changelog)

8.5.12 - v0.35.0

Release notes for vunnel v0.35.0

Release Notes

Version v0.35.0

Added Features

(Full Changelog)

8.5.13 - v0.34.2

Release notes for vunnel v0.34.2

Release Notes

Version v0.34.2

Bug Fixes

(Full Changelog)

8.5.14 - v0.34.1

Release notes for vunnel v0.34.1

Release Notes

Version v0.34.1

Additional Changes

(Full Changelog)

8.5.15 - v0.34.0

Release notes for vunnel v0.34.0

Release Notes

Version v0.34.0

Added Features

(Full Changelog)

8.5.16 - v0.33.0

Release notes for vunnel v0.33.0

Release Notes

Version v0.33.0

Added Features

(Full Changelog)

8.5.17 - v0.32.0

Release notes for vunnel v0.32.0

Release Notes

Version v0.32.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.5.18 - v0.31.0

Release notes for vunnel v0.31.0

Release Notes

Version v0.31.0

Added Features

(Full Changelog)

8.5.19 - v0.30.0

Release notes for vunnel v0.30.0

Release Notes

Version v0.30.0

Added Features

Additional Changes

(Full Changelog)

8.5.20 - v0.29.0

Release notes for vunnel v0.29.0

Release Notes

Version v0.29.0

Added Features

(Full Changelog)

8.5.21 - v0.28.0

Release notes for vunnel v0.28.0

Release Notes

Version v0.28.0

Added Features

Additional Changes

  • doc: Updates for the Slack to Discourse migration [#662 @popey]

(Full Changelog)

8.5.22 - v0.27.0

Release notes for vunnel v0.27.0

Release Notes

Version v0.27.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.5.23 - v0.26.2

Release notes for vunnel v0.26.2

Release Notes

Version v0.26.2

Bug Fixes

(Full Changelog)

8.5.24 - v0.26.1

Release notes for vunnel v0.26.1

Release Notes

Version v0.26.1

Bug Fixes

  • hack: prevent more debian package-specific priorities from overriding upstream severity [#622 @joshbressers]

(Full Changelog)

8.5.25 - v0.26.0

Release notes for vunnel v0.26.0

Release Notes

Version v0.26.0

Added Features

  • Add support for reading result DBs for Debian provider [#613 @wagoodman]

(Full Changelog)

8.5.26 - v0.25.0

Release notes for vunnel v0.25.0

Release Notes

Version v0.25.0

Added Features

(Full Changelog)

8.5.27 - v0.24.0

Release notes for vunnel v0.24.0

Release Notes

Version v0.24.0

Added Features

(Full Changelog)

8.5.28 - v0.23.2

Release notes for vunnel v0.23.2

Release Notes

Version v0.23.2

Bug Fixes

(Full Changelog)

8.5.29 - v0.23.1

Release notes for vunnel v0.23.1

Release Notes

Version v0.23.1

Bug Fixes

  • update vunnel provider date and option to skip listing check [#578 @asomya]

(Full Changelog)

8.5.30 - v0.23.0

Release notes for vunnel v0.23.0

Release Notes

Version v0.23.0

Added Features

(Full Changelog)

8.5.31 - v0.22.2

Release notes for vunnel v0.22.2

Release Notes

Version v0.22.2

Bug Fixes

(Full Changelog)

8.5.32 - v0.22.1

Release notes for vunnel v0.22.1

Release Notes

Version v0.22.1

Bug Fixes

  • Keep original import timestamp on results archive import [#560 @wagoodman]

(Full Changelog)

8.5.33 - v0.22.0

Release notes for vunnel v0.22.0

Release Notes

Version v0.22.0

Added Features

(Full Changelog)

8.5.34 - v0.21.2

Release notes for vunnel v0.21.2

Release Notes

Version v0.21.2

Bug Fixes

(Full Changelog)

8.5.35 - v0.21.1

Release notes for vunnel v0.21.1

Release Notes

Version v0.21.1

Bug Fixes

(Full Changelog)

8.5.36 - v0.21.0

Release notes for vunnel v0.21.0

Release Notes

Version v0.21.0

Added Features

(Full Changelog)

8.5.37 - v0.20.0

Release notes for vunnel v0.20.0

Release Notes

Version v0.20.0

Added Features

(Full Changelog)

8.5.38 - v0.19.0

Release notes for vunnel v0.19.0

Release Notes

Version v0.19.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.5.39 - v0.18.5

Release notes for vunnel v0.18.5

Release Notes

Version v0.18.5

Bug Fixes

  • improve the ubuntu provider to emit vuln rows for out of support entries [#477 @westonsteimel]

(Full Changelog)

8.5.40 - v0.18.4

Release notes for vunnel v0.18.4

Release Notes

Version v0.18.4

Bug Fixes

Additional Changes

(Full Changelog)

8.5.41 - v0.18.3

Release notes for vunnel v0.18.3

Release Notes

Version v0.18.3

Additional Changes

  • disable auto merging of dependabot PRs [#456 @westonsteimel]
  • Bump urllib3 from 2.0.5 to 2.0.7 (#454)
  • Bump jinja2 from 3.1.2 to 3.1.3 (#455)

(Full Changelog)

8.5.42 - v0.18.2

Release notes for vunnel v0.18.2

Release Notes

Version v0.18.2

Bug Fixes

Additional changes

(Full Changelog)

8.5.43 - v0.18.1

Release notes for vunnel v0.18.1

Release Notes

Version v0.18.1

Bug Fixes

(Full Changelog)

8.5.44 - v0.18.0

Release notes for vunnel v0.18.0

Release Notes

Version v0.18.0

Added Features

Bug Fixes

Additional Changes

(Full Changelog)

8.5.45 - v0.17.12

Release notes for vunnel v0.17.12

Release Notes

Version v0.17.12

Bug Fixes

(Full Changelog)

8.5.46 - v0.17.11

Release notes for vunnel v0.17.11

Release Notes

Version v0.17.11

Bug Fixes

(Full Changelog)

8.5.47 - v0.17.10

Release notes for vunnel v0.17.10

Release Notes

Version v0.17.10

Bug Fixes

(Full Changelog)

8.5.48 - v0.17.9

Release notes for vunnel v0.17.9

Release Notes

Version v0.17.9

Bug Fixes

  • Disallow all bare try-except clauses [#310]

Additional Changes

(Full Changelog)

8.5.49 - v0.17.8

Release notes for vunnel v0.17.8

Release Notes

Version v0.17.8

Bug Fixes

(Full Changelog)

8.5.50 - v0.17.7

Release notes for vunnel v0.17.7

Release Notes

Version v0.17.7

Bug Fixes

(Full Changelog)

8.5.51 - v0.17.6

Release notes for vunnel v0.17.6

Release Notes

Version v0.17.6

Additional Changes

(Full Changelog)

8.5.52 - v0.17.5

Release notes for vunnel v0.17.5

Release Notes

Version v0.17.5

Bug Fixes

Additional Changes

  • introduce http get wrapper; use it in mariner provider [#376 @willmurphyscode]
  • Move nightly quality gate to be roughly after the latest DB build [#381 @wagoodman]
  • Only ask for release on quality gate step [#378 @wagoodman]

(Full Changelog)

8.5.53 - v0.17.4

Release notes for vunnel v0.17.4

Release Notes

Version v0.17.4

Additional Changes

(Full Changelog)

8.5.54 - v0.17.3

Release notes for vunnel v0.17.3

Release Notes

Version v0.17.3

Additional Changes

(Full Changelog)

8.5.55 - v0.17.2

Release notes for vunnel v0.17.2

Release Notes

Version v0.17.2

Bug Fixes

  • align retry timeout for NVD requests with the rate limit rolling window [#321 @westonsteimel]

Additional Changes

(Full Changelog)

8.5.56 - v0.17.1

Release notes for vunnel v0.17.1

Release Notes

Version v0.17.1

Bug Fixes

  • Revert #284 + fix namespace resolution for quality gate testing [#307 @wagoodman]

Additional Changes

(Full Changelog)

8.5.57 - v0.17.0

Release notes for vunnel v0.17.0

Release Notes

Version v0.17.0

v0.17.0 (2023-09-27)

Full Changelog

Added Features

8.5.58 - v0.16.0

Release notes for vunnel v0.16.0

Release Notes

Version v0.16.0

v0.16.0 (2023-09-20)

Added Features

Full Changelog

8.5.59 - v0.15.3

Release notes for vunnel v0.15.3

Release Notes

Version v0.15.3

v0.15.3 (2023-08-29)

Full Changelog

Bug Fixes

8.5.60 - v0.15.2

Release notes for vunnel v0.15.2

Release Notes

Version v0.15.2

v0.15.2 (2023-07-27)

Full Changelog

Bug Fixes

  • grype showing disputed CVE in Mariner 2.0 [Issue #246]

8.5.61 - v0.15.1

Release notes for vunnel v0.15.1

Release Notes

Version v0.15.1

v0.15.1 (2023-07-18)

Full Changelog

Bug Fixes

8.5.62 - v0.15.0

Release notes for vunnel v0.15.0

Release Notes

Version v0.15.0

v0.15.0 (2023-07-11)

Full Changelog

Added Features

8.5.63 - v0.14.0

Release notes for vunnel v0.14.0

Release Notes

Version v0.14.0

v0.14.0 (2023-07-03)

Full Changelog

8.5.64 - v0.13.0

Release notes for vunnel v0.13.0

Release Notes

Version v0.13.0

v0.13.0 (2023-06-30)

Full Changelog

8.5.65 - v0.12.2

Release notes for vunnel v0.12.2

Release Notes

Version v0.12.2

v0.12.2 (2023-06-29)

Full Changelog

Bug Fixes

8.5.66 - v0.12.1

Release notes for vunnel v0.12.1

Release Notes

Version v0.12.1

Full Changelog: https://github.com/anchore/vunnel/compare/v0.12.0...v0.12.1

Bug Fixes

8.5.67 - v0.12.0

Release notes for vunnel v0.12.0

Release Notes

Version v0.12.0

v0.12.0 (2023-05-26)

Full Changelog

8.5.68 - v0.11.0

Release notes for vunnel v0.11.0

Release Notes

Version v0.11.0

v0.11.0 (2023-05-24)

Full Changelog

Added Features

8.5.69 - v0.10.0

Release notes for vunnel v0.10.0

Release Notes

Version v0.10.0

v0.10.0 (2023-05-02)

Full Changelog

8.5.70 - v0.9.0

Release notes for vunnel v0.9.0

Release Notes

Version v0.9.0

v0.9.0 (2023-04-27)

Full Changelog

Added Features

Bug Fixes

8.5.71 - v0.8.1

Release notes for vunnel v0.8.1

Release Notes

Version v0.8.1

v0.8.1 (2023-03-28)

Full Changelog

Features

Additional Changes

8.5.72 - v0.8.0

Release notes for vunnel v0.8.0

Release Notes

Version v0.8.0

v0.8.0 (2023-03-28)

Full Changelog

Bug Fixes

  • Fix workspace schema to be correct relative to actual 1.0 datashape [PR #128] [wagoodman]

Additional Changes

8.5.73 - v0.7.0

Release notes for vunnel v0.7.0

Release Notes

Version v0.7.0

v0.7.0 (2023-03-21)

Full Changelog

Added Features

8.5.74 - v0.6.0

Release notes for vunnel v0.6.0

Release Notes

Version v0.6.0

v0.6.0 (2023-03-14)

Full Changelog

Additional Changes

8.5.75 - v0.5.0

Release notes for vunnel v0.5.0

Release Notes

Version v0.5.0

v0.5.0 (2023-03-13)

Full Changelog

Added Features

8.5.76 - v0.4.0

Release notes for vunnel v0.4.0

Release Notes

Version v0.4.0

v0.4.0 (2023-03-10)

Full Changelog

Added Features

Bug Fixes

  • Disallow existing input to be deleted via configuration [PR #71] [wagoodman]

Additional Changes

8.5.77 - v0.3.4

Release notes for vunnel v0.3.4

Release Notes

Version v0.3.4

v0.3.4 (2023-02-06)

Full Changelog

Bug Fixes

8.5.78 - v0.3.3

Release notes for vunnel v0.3.3

Release Notes

Version v0.3.3

v0.3.3 (2023-01-31)

Full Changelog

Bug Fixes

Additional Changes

8.5.79 - v0.3.2

Release notes for vunnel v0.3.2

Release Notes

Version v0.3.2

v0.3.2 (2023-01-30)

Full Changelog

• fix: remove flawed skip_if_exists logic [PR #53] [westonsteimel]

8.5.80 - v0.3.1

Release notes for vunnel v0.3.1

Release Notes

Version v0.3.1

v0.3.1 (2023-01-30)

Full Changelog

Bug Fixes

8.5.81 - v0.3.0

Release notes for vunnel v0.3.0

Release Notes

Version v0.3.0

v0.3.0 (2023-01-30)

Full Changelog

Added Features

  • ubuntu provider git url should be configurable [Issue #48]

Bug Fixes

8.5.82 - v0.2.0

Release notes for vunnel v0.2.0

Release Notes

Version v0.2.0

v0.2.0 (2023-01-17)

Full Changelog

Added Features

Bug Fixes

8.5.83 - v0.1.4

Release notes for vunnel v0.1.4

Release Notes

Version v0.1.4

v0.1.4 (2023-01-13)

Full Changelog

8.5.84 - v0.1.3

Release notes for vunnel v0.1.3

Release Notes

Version v0.1.3

v0.1.3 (2023-01-12)

Full Changelog

Bug Fixes

8.5.85 - v0.1.2

Release notes for vunnel v0.1.2

Release Notes

Version v0.1.2

v0.1.2 (2023-01-11)

Full Changelog

Bug Fixes

8.5.86 - v0.1.1

Release notes for vunnel v0.1.1

Release Notes

Version v0.1.1

v0.1.1 (2023-01-10)

Full Changelog

8.5.87 - v0.1.0

Release notes for vunnel v0.1.0

Release Notes

Version v0.1.0

v0.1.0 (2023-01-10)

Full Changelog

Added Features

  • Port remaining feed drivers from enterprise [Issue #3]

Bug Fixes

  • NVD provider taking a long time even when results are cached [Issue #9]

8.6 - Sbom-action Release Notes

Anchore Sbom-action Release Notes

8.6.1 - v0.20.5

Release notes for sbom-action v0.20.5

Release Notes

Version v0.20.5

Changes in v0.20.5

  • Update Syft to v1.31.0 (#531)

8.6.2 - v0.20.4

Release notes for sbom-action v0.20.4

Release Notes

Version v0.20.4

Changes in v0.20.4

  • chore: update Syft to v1.29.0 (#529)

8.6.3 - v0.20.3

Release notes for sbom-action v0.20.3

Release Notes

Version v0.20.3

Changes in v0.20.3

  • Fix: Strip emojis from correlator before using github APIs (#527) [AndrewHendry]

8.6.4 - v0.20.2

Release notes for sbom-action v0.20.2

Release Notes

Version v0.20.2

Changes in v0.20.2

  • Update Syft to v1.28.0 (#526)

8.6.5 - v0.20.1

Release notes for sbom-action v0.20.1

Release Notes

Version v0.20.1

Changes in v0.20.1

  • Update Syft to v1.27.1 (#525)

8.6.6 - v0.20.0

Release notes for sbom-action v0.20.0

Release Notes

Version v0.20.0

Changes in v0.20.0

  • chore(deps): update Syft to v1.24.0 (#522)

8.6.7 - v0.19.0

Release notes for sbom-action v0.19.0

Release Notes

Version v0.19.0

Changes in v0.19.0

  • chore(deps): update Syft to v1.23.0 (#521)
  • chore(deps): bump peter-evans/create-pull-request from 7.0.6 to 7.0.8 (#519)
  • chore(deps): bump cross-spawn (#514)

8.6.8 - v0.18.0

Release notes for sbom-action v0.18.0

Release Notes

Version v0.18.0

Changes in v0.18.0

8.6.9 - v0.17.9

Release notes for sbom-action v0.17.9

Release Notes

Version v0.17.9

Changes in v0.17.9

8.6.10 - v0.17.8

Release notes for sbom-action v0.17.8

Release Notes

Version v0.17.8

Changes in v0.17.8

8.6.11 - v0.17.7

Release notes for sbom-action v0.17.7

Release Notes

Version v0.17.7

Changes in v0.17.7

8.6.12 - v0.17.6

Release notes for sbom-action v0.17.6

Release Notes

Version v0.17.6

Changes in v0.17.6

8.6.13 - v0.17.5

Release notes for sbom-action v0.17.5

Release Notes

Version v0.17.5

Changes in v0.17.5

8.6.14 - v0.17.4

Release notes for sbom-action v0.17.4

Release Notes

Version v0.17.4

Changes in v0.17.4

8.6.15 - v0.17.3

Release notes for sbom-action v0.17.3

Release Notes

Version v0.17.3

Changes in v0.17.3

8.6.16 - v0.17.2

Release notes for sbom-action v0.17.2

Release Notes

Version v0.17.2

Changes in v0.17.2

8.6.17 - v0.17.1

Release notes for sbom-action v0.17.1

Release Notes

Version v0.17.1

Changes in v0.17.1

8.6.18 - v0.17.0

Release notes for sbom-action v0.17.0

Release Notes

Version v0.17.0

Changes in v0.17.0

8.6.19 - v0.16.1

Release notes for sbom-action v0.16.1

Release Notes

Version v0.16.1

Changes in v0.16.1

  • fix: workaround windows install issue (#477) [willmurphyscode]
  • fix: allow users to properly use the file input over the default path value (#471) [komish]
  • chore(deps): update Syft to v1.5.0 (#470) [anchore-actions-token-generator]
  • docs: notes for matrix and required permissions (#469) [kzantow]
  • chore(deps): bump actions/checkout from 4.1.5 to 4.1.6 (#466) [dependabot]

8.6.20 - v0.16.0

Release notes for sbom-action v0.16.0

Release Notes

Version v0.16.0

Changes in v0.16.0

  • Update Syft to v1.4.1 (#465)
  • Update GitHub artifact client (#463) [kzantow]

NOTE: if you are using this action within a matrix build and see failures attempting to upload artifacts with duplicate names, you will need to set the artifact-name to be unique based on the matrix properties (an example here). This is due to a change to use a newer GitHub API which no longer allows artifacts with duplicate names.

8.6.21 - v0.15.11

Release notes for sbom-action v0.15.11

Release Notes

Version v0.15.11

Changes in v0.15.11

  • chore(deps): update Syft to v1.3.0 (#456) [anchore-actions-token-generator]
  • chore: remove outdated snapshot workflow (#457) [spiffcs]
  • fix: don’t pass in a separate env. This makes it impossible to pass env vars via the action context to syft. (#455) [iNoahNothing]

8.6.22 - v0.15.10

Release notes for sbom-action v0.15.10

Release Notes

Version v0.15.10

Changes in v0.15.10

  • Update Syft to v1.1.0 (#454)
  • Bump Node to v20 on download-syft/publish-sbom actions (#448) [ViacheslavKudinov]

8.6.23 - v0.15.9

Release notes for sbom-action v0.15.9

Release Notes

Version v0.15.9

Changes in v0.15.9

8.6.24 - v0.15.8

Release notes for sbom-action v0.15.8

Release Notes

Version v0.15.8

Changes in v0.15.8

8.6.25 - v0.15.7

Release notes for sbom-action v0.15.7

Release Notes

Version v0.15.7

Changes in v0.15.7

  • chore: migrate action to use node v20.11.0 (Iron) FROM node v16.x.x (#440) [spiffcs]

8.6.26 - v0.15.6

Release notes for sbom-action v0.15.6

Release Notes

Version v0.15.6

Changes in v0.15.6

8.6.27 - v0.15.5

Release notes for sbom-action v0.15.5

Release Notes

Version v0.15.5

Changes in v0.15.5

8.6.28 - v0.15.4

Release notes for sbom-action v0.15.4

Release Notes

Version v0.15.4

Changes in v0.15.4

8.6.29 - v0.15.3

Release notes for sbom-action v0.15.3

Release Notes

Version v0.15.3

Changes in v0.15.3

8.6.30 - v0.15.2

Release notes for sbom-action v0.15.2

Release Notes

Version v0.15.2

Changes in v0.15.2

8.6.31 - v0.15.1

Release notes for sbom-action v0.15.1

Release Notes

Version v0.15.1

Changes in v0.15.1

8.6.32 - v0.15.0

Release notes for sbom-action v0.15.0

Release Notes

Version v0.15.0

Changes in v0.14.4

Breaking Changes

  • Previously, running on Windows required WSL. Now, running on Windows expects to be run on native windows (#426) [willmurphyscode].

Other Changes

8.6.33 - v0.14.3

Release notes for sbom-action v0.14.3

Release Notes

Version v0.14.3

Changes in v0.14.3

8.6.34 - v0.14.2

Release notes for sbom-action v0.14.2

Release Notes

Version v0.14.2

Changes in v0.14.2

  • Update Syft to v0.80.0 (#415)
  • Make sure all invalid artifact name characters are replaced #396 (#417) [lts-po]
  • Ensure SBOM is copied to output-file (#411) [gszr]

8.6.35 - v0.14.1

Release notes for sbom-action v0.14.1

Release Notes

Version v0.14.1

Changes in v0.14.1

8.6.36 - v0.13.4

Release notes for sbom-action v0.13.4

Release Notes

Version v0.13.4

Changes in v0.13.4

8.6.37 - v0.13.3

Release notes for sbom-action v0.13.3

Release Notes

Version v0.13.3

Changes in v0.13.3

8.6.38 - v0.13.2

Release notes for sbom-action v0.13.2

Release Notes

Version v0.13.2

Changes in v0.13.2

8.6.39 - v0.13.1

Release notes for sbom-action v0.13.1

Release Notes

Version v0.13.1

Changes in v0.13.1

8.6.40 - v0.13.0

Release notes for sbom-action v0.13.0

Release Notes

Version v0.13.0

Changes in v0.13.0

  • Allow type “file:…” to enable creation of SBOMs from tar and other package formats (#357) [malt3]
  • Update Syft to v0.59.0 (#371) [anchore-actions-token-generator]
  • Update dependencies and node version (#372) [kzantow]

8.6.41 - v0.12.0

Release notes for sbom-action v0.12.0

Release Notes

Version v0.12.0

Changes in v0.12.0

8.6.42 - v0.11.0

Release notes for sbom-action v0.11.0

Release Notes

Version v0.11.0

Changes in v0.11.0

  • Update GitHub Snapshot to use correlator (#259) kzantow

8.6.43 - v0.10.0

Release notes for sbom-action v0.10.0

Release Notes

Version v0.10.0

Changes in v0.10.0

  • Update Syft to v0.43.2 (#225)
  • Improve SBOM format handling (#235)

8.6.44 - v0.9.0

Release notes for sbom-action v0.9.0

Release Notes

Version v0.9.0

Changes in v0.9.0

  • Add syft-version input to download-syft action (#228)

🐛 Bug Fixes

  • Don’t use JSON.stringify for logging purposes (#236)

8.6.45 - v0.8.0

Release notes for sbom-action v0.8.0

Release Notes

Version v0.8.0

Changes in v0.8.0

  • Specify the Syft version to use (#126)
  • Add support for GitHub dependency snapshot API (#201)

8.6.46 - v0.7.0

Release notes for sbom-action v0.7.0

Release Notes

Version v0.7.0

Changes in v0.7.0

  • Bump Syft to 0.40.1 (#206)

8.6.47 - v0.6.0

Release notes for sbom-action v0.6.0

Release Notes

Version v0.6.0

Changes in v0.6.0

  • Bump Syft to 0.33.0 (#163)

8.6.48 - v0.5.0

Release notes for sbom-action v0.5.0

Release Notes

Version v0.5.0

Changes in v0.5.0

  • Bump Syft to 0.32.0 (#158)
  • Bump multiple NPM dependencies

8.6.49 - v0.4.0

Release notes for sbom-action v0.4.0

Release Notes

Version v0.4.0

Changes in v0.4.0

  • Update Syft version to 0.26.0 (#111)
  • Update @actions/core (#101)
  • Bump @types/node from 16.10.2 to 16.10.3 (#92)
  • Bump eslint-plugin-jest from 24.5.2 to 25.0.1 (#100)
  • Bump jest from 27.2.4 to 27.2.5 (#96)
  • Bump @octokit/webhooks-types from 4.8.2 to 4.12.0 (#98)
  • Bump @octokit/webhooks from 9.15.1 to 9.17.0 (#99)

8.6.50 - v0.3.0

Release notes for sbom-action v0.3.0

Release Notes

Version v0.3.0

Changes in v0.3.0

🚀 Features

  • Add support for running on Windows via WSL (#97)

8.6.51 - v0.2.0

Release notes for sbom-action v0.2.0

Release Notes

Version v0.2.0

Changes in v0.2.0

  • Update Syft to 0.25.0 (#95)

8.6.52 - v0.1.0

Release notes for sbom-action v0.1.0

Release Notes

Version v0.1.0

Initial release of SBOM action 🎉

Integrates software bill of material (SBOM) scanning into your GitHub action workflow!

8.7 - Scan-action Release Notes

Anchore Scan-action Release Notes

8.7.1 - v6.5.1

Release notes for scan-action v6.5.1

Release Notes

Version v6.5.1

New in scan-action v6.5.1

  • Update Grype to v0.97.1 (#495)

8.7.2 - v6.5.0

Release notes for scan-action v6.5.0

Release Notes

Version v6.5.0

New in scan-action v6.5.0

8.7.3 - v6.4.0

Release notes for scan-action v6.4.0

Release Notes

Version v6.4.0

New in scan-action v6.4.0

  • Update Grype to v0.95.0 (#486)
  • chore(deps-dev): bump eslint from 9.30.0 to 9.30.1 (#485)
  • chore(deps-dev): bump lint-staged from 16.1.0 to 16.1.2 (#476)
  • chore(deps-dev): bump jest from 30.0.0 to 30.0.3 (#481)
  • chore(deps-dev): bump prettier from 3.5.3 to 3.6.2 (#483)
  • chore(deps-dev): bump eslint from 9.28.0 to 9.30.0 (#484)

8.7.4 - v6.3.0

Release notes for scan-action v6.3.0

Release Notes

Version v6.3.0

New in scan-action v6.3.0

  • Update Grype to v0.94.0 (#470)

8.7.5 - v6.2.0

Release notes for scan-action v6.2.0

Release Notes

Version v6.2.0

New in scan-action v6.2.0

  • feat: update Scan action to use grype db v6 (#462) [spiffcs]

8.7.6 - v6.1.0

Release notes for scan-action v6.1.0

Release Notes

Version v6.1.0

New in scan-action v6.1.0

8.7.7 - v6.0.0

Release notes for scan-action v6.0.0

Release Notes

Version v6.0.0

New in scan-action v6.0.0

Breaking Change

  • feat: add output-file option, default to random directory output in temp (#346) [kzantow]

The action no longer generates files in your working directory by default, instead you should use the action outputs: ${{ steps.<id>.outputs.sarif }} where the <id> needs to match the id you configured to reference the scan-action, e.g.:

      - uses: anchore/scan-action[@v6](https://github.com/v6)
        id: scan
        ...
      - uses: github/codeql-action/upload-sarif[@v3](https://github.com/v3)
        with:
          sarif_file: ${{ steps.scan.outputs.sarif }}

Other Changes

8.7.8 - v5.3.0

Release notes for scan-action v5.3.0

Release Notes

Version v5.3.0

New in scan-action v5.3.0

8.7.9 - v5.2.1

Release notes for scan-action v5.2.1

Release Notes

Version v5.2.1

New in scan-action v5.2.1

8.7.10 - v5.2.0

Release notes for scan-action v5.2.0

Release Notes

Version v5.2.0

New in scan-action v5.2.0

8.7.11 - v5.1.0

Release notes for scan-action v5.1.0

Release Notes

Version v5.1.0

New in scan-action v5.1.0

8.7.12 - v5.0.1

Release notes for scan-action v5.0.1

Release Notes

Version v5.0.1

New in scan-action v5.0.1

8.7.13 - v5.0.0

Release notes for scan-action v5.0.0

Release Notes

Version v5.0.0

New in scan-action v5.0.0

🚀 Features

  • feat: short-lived grype-db cache (#348) [kzantow] Note: with this release grype is no longer installed on $PATH. We suspect the changes here could break a number of users of the action who have learned to expect Grype be installed on $PATH.

8.7.14 - v4.1.2

Release notes for scan-action v4.1.2

Release Notes

Version v4.1.2

New in scan-action v4.1.2

8.7.15 - v4.1.1

Release notes for scan-action v4.1.1

Release Notes

Version v4.1.1

New in scan-action v4.1.1

8.7.16 - v4.1.0

Release notes for scan-action v4.1.0

Release Notes

Version v4.1.0

New in scan-action v4.1.0

8.7.17 - v4.0.0

Release notes for scan-action v4.0.0

Release Notes

Version v4.0.0

New in scan-action v4.0.0

8.7.18 - v3.6.4

Release notes for scan-action v3.6.4

Release Notes

Version v3.6.4

New in scan-action v3.6.4

8.7.19 - v3.6.3

Release notes for scan-action v3.6.3

Release Notes

Version v3.6.3

New in scan-action v3.6.3

  • chore: migrate action to use node v20.11.0 (Iron) FROM node v16.x.x (#278) [spiffcs]

8.7.20 - v3.6.2

Release notes for scan-action v3.6.2

Release Notes

Version v3.6.2

New in scan-action v3.6.2

8.7.21 - v3.6.1

Release notes for scan-action v3.6.1

Release Notes

Version v3.6.1

New in scan-action v3.6.1

8.7.22 - v3.6.0

Release notes for scan-action v3.6.0

Release Notes

Version v3.6.0

New in scan-action v3.6.0

8.7.23 - v3.5.0

Release notes for scan-action v3.5.0

Release Notes

Version v3.5.0

New in scan-action v3.5.0

8.7.24 - v3.4.0

Release notes for scan-action v3.4.0

Release Notes

Version v3.4.0

New in scan-action v3.4.0

8.7.25 - v3.3.8

Release notes for scan-action v3.3.8

Release Notes

Version v3.3.8

New in scan-action v3.3.8

8.7.26 - v3.3.7

Release notes for scan-action v3.3.7

Release Notes

Version v3.3.7

New in scan-action v3.3.7

🐛 Bug Fixes

8.7.27 - v3.3.6

Release notes for scan-action v3.3.6

Release Notes

Version v3.3.6

New in scan-action v3.3.6

8.7.28 - v3.3.5

Release notes for scan-action v3.3.5

Release Notes

Version v3.3.5

New in scan-action v3.3.5

8.7.29 - v3.3.4

Release notes for scan-action v3.3.4

Release Notes

Version v3.3.4

New in scan-action v3.3.4

  • Update Grype to v0.56.0 (#205)

8.7.30 - v3.3.3

Release notes for scan-action v3.3.3

Release Notes

Version v3.3.3

New in scan-action v3.3.3

8.7.31 - v3.3.2

Release notes for scan-action v3.3.2

Release Notes

Version v3.3.2

New in scan-action v3.3.2

  • Include process environment into grype execution (#202) [erhan- + kzantow]

8.7.32 - v3.3.1

Release notes for scan-action v3.3.1

Release Notes

Version v3.3.1

New in scan-action v3.3.1

8.7.33 - v3.3.0

Release notes for scan-action v3.3.0

Release Notes

Version v3.3.0

New in scan-action v3.3.0

8.7.34 - v3.2.5

Release notes for scan-action v3.2.5

Release Notes

Version v3.2.5

New in scan-action v3.2.5

  • Update node versions to v16 from v12 (#176) [spiffcs]
  • Update Grype to v0.38.0 (#173)

8.7.35 - v3.2.4

Release notes for scan-action v3.2.4

Release Notes

Version v3.2.4

New in scan-action v3.2.4

  • Update Grype to v0.34.7 (#163)
  • More closely align parameters with sbom-action (#158)

8.7.36 - v3.2.3

Release notes for scan-action v3.2.3

Release Notes

Version v3.2.3

New in scan-action v3.2.3

  • Support SBOM input for scanning (#154) [@harmw]

8.7.37 - v3.2.2

Release notes for scan-action v3.2.2

Release Notes

Version v3.2.2

New in scan-action v3.2.2

  • Add sub-action to download Grype (#152)
  • Update Grype to 0.34.4 to fix a nil pointer in SARIF generation (#151)

8.7.38 - v3.2.1

Release notes for scan-action v3.2.1

Release Notes

Version v3.2.1

New in scan-action v3.2.1

  • Remove SARIF processing (#148)

8.7.39 - v3.2.0

Release notes for scan-action v3.2.0

Release Notes

Version v3.2.0

New in scan-action v3.2.0

  • Update Grype to 0.27.3 (#136)
  • Output Grype stderr to action logs (#137)
  • Readme should point to CONTRIBUTING.md (#126)
  • Improve documentation (#125)

8.7.40 - v3.1.0

Release notes for scan-action v3.1.0

Release Notes

Version v3.1.0

New in scan-action v3.1.0

  • Update Grype to 0.22.0 - this includes the ability to ignore vulnerability matches (#121)

8.7.41 - v3.0.0

Release notes for scan-action v3.0.0

Release Notes

Version v3.0.0

New in scan-action v3.0.0

  • Upgrade to Grype to 0.17.0 and add tests #102 (#112) (#118)
  • Improve SARIF output #114 (#115)
  • Change default behavior so action fails on medium (and higher) severities (#86)
  • Respect verbosity from action to call Grype (#82)

8.7.42 - v2.0.4

Release notes for scan-action v2.0.4

Release Notes

Version v2.0.4

New in scan-action v2.0.4

  • bump grype to 0.7.0 (#81)

8.7.43 - 2.0.3

Release notes for scan-action 2.0.3

Release Notes

Version 2.0.3

New in scan-action 2.0.3

  • bump grype to 0.6.1 (#79)
  • Halt execution when invalid options are provided (#76)
  • bump grype to 0.5.0 (#75)

8.7.44 - v2.0.2

Release notes for scan-action v2.0.2

Release Notes

Version v2.0.2

Minor bug-fix release:

8.7.45 - v2.0.1

Release notes for scan-action v2.0.1

Release Notes

Version v2.0.1

Minor bug-fix release.

Fixes:

  • Removes unnecessary constraint in deduplication for SARIF reporting
  • Allows defining and referencing the location of the SARIF report file
  • Fixes multiple instances where undefined items in the reporting would break scanning

8.7.46 - v2.0.0

Release notes for scan-action v2.0.0

Release Notes

Version v2.0.0

New major version of scan action based on new Grype tool from Anchore that is much faster for scanning compared to v1.x and adds some new capabilities and more metadata about the matches.

  • Significantly faster performance for scans
  • New vulnerabilities output format is the JSON output from Grype directly
  • Adds support for scanning directories as well as Docker containers, so you can do the same checks pre-and post-build of the container.
  • Supports Automatic Code Scanning/SARIF for exposing results via your repository’s Security tab.

This is a breaking change from v1.x, as indicated by the major version revision:

  1. Use image input parameter Instead of image-reference
  2. dockerfile-path is no longer supported and not necessary for the vulnerability scans
  3. custom-policy-path is no longer supported
  4. include-app-packages is no longer necessary or supported. Application packages are on by default and will receive vulnerability matches.
  5. Outputs:
    1. billofmaterials is no longer output. V2 is focused on vulnerability scanning and another action may be introduced for BoM support with its own options/config.
    2. policycheck is no longer output

8.7.47 - v1.0.9

Release notes for scan-action v1.0.9

Release Notes

Version v1.0.9

Update to Anchore Engine 0.8.1

8.7.48 - v1.0.8

Release notes for scan-action v1.0.8

Release Notes

Version v1.0.8

Update to Anchore Engine 0.8.0

8.7.49 - v1.0.7

Release notes for scan-action v1.0.7

Release Notes

Version v1.0.7

Update to Anchore Engine 0.7.3

8.7.50 - 1.0.6

Release notes for scan-action 1.0.6

Release Notes

Version 1.0.6

Adds optional support for integration with GitHub code scanning.

8.7.51 - 1.0.5

Release notes for scan-action 1.0.5

Release Notes

Version 1.0.5

Update Anchore Engine to v0.7.2

8.7.52 - v1.0.4

Release notes for scan-action v1.0.4

Release Notes

Version v1.0.4

8.7.53 - v1.0.3

Release notes for scan-action v1.0.3

Release Notes

Version v1.0.3

8.7.54 - v1.0.2

Release notes for scan-action v1.0.2

Release Notes

Version v1.0.2

Update to v0.6.1 of anchore-engine

8.7.55 - v1.0.1

Release notes for scan-action v1.0.1

Release Notes

Version v1.0.1

Bumps version of anchore used to v0.6.0 as well as adding an input parameter to enable overriding the Anchore inline scan version. Other updates are internal optimizations, test improvements, and code cleanup.

8.7.56 - v1.0.0

Release notes for scan-action v1.0.0

Release Notes

Version v1.0.0

First release of the scan action

8.7.57 - v1.0.0-RC0

Release notes for scan-action v1.0.0-RC0

Release Notes

Version v1.0.0-RC0

Initial release candidate for v1.0.0 of the anchore-engine scan action.

8.8 - Stereoscope Release Notes

Anchore Stereoscope Release Notes

8.8.1 - v0.1.10

Release notes for stereoscope v0.1.10

Release Notes

Version v0.1.10

Dependency Updates

  • bump github.com/stretchr/testify from 1.11.0 to 1.11.1 [#449 @dependabot]
  • bump github.com/docker/cli from 28.3.3+incompatible to 28.4.0+incompatible [#452 @dependabot]
  • bump github.com/spf13/afero from 1.14.0 to 1.15.0 [#450 @dependabot]
  • bump golang.org/x/crypto from 0.41.0 to 0.42.0 [#451 @dependabot]
  • bump github.com/docker/docker from 28.3.3+incompatible to 28.4.0+incompatible [#453 @dependabot]
  • bump github.com/ulikunitz/xz from 0.5.12 to 0.5.15 [#447 @dependabot]
  • bump actions/setup-go from 5.5.0 to 6.0.0 in /.github/actions/bootstrap [#448 @dependabot]

Bug Fix

  • handling of variant in platform string and image config [#455 @mathrock]

(Full Changelog)

8.8.2 - v0.1.9

Release notes for stereoscope v0.1.9

Release Notes

Version v0.1.9

Dependency Updates

8.8.3 - v0.1.8

Release notes for stereoscope v0.1.8

Release Notes

Version v0.1.8

Bug Fixes

Dependency Updates

  • bump github.com/docker/docker from 28.3.2+incompatible to 28.3.3+incompatible [#432 @dependabot]

(Full Changelog)

8.8.4 - v0.1.7

Release notes for stereoscope v0.1.7

Release Notes

Version v0.1.7

Bug Fixes

  • lazyBoundedReadCloser correctly close/seek [#431 @kzantow]

Dependency Updates

  • bump github.com/docker/cli from 28.3.0+incompatible to 28.3.2+incompatible [#426 @dependabot]
  • bump golang.org/x/crypto from 0.39.0 to 0.40.0 [#424 @dependabot]
  • bump github.com/bmatcuk/doublestar/v4 from 4.8.1 to 4.9.0 [#425 @dependabot]
  • bump github.com/docker/docker from 28.2.2+incompatible to 28.3.2+incompatible [#427 @dependabot]
  • bump marocchino/sticky-pull-request-comment from 2.9.3 to 2.9.4 in /.github/workflows [#429 @dependabot]

(Full Changelog)

8.8.5 - v0.1.6

Release notes for stereoscope v0.1.6

Release Notes

Version v0.1.6

Dependency Updates

  • bump golang.org/x/crypto from 0.38.0 to 0.39.0 [#414 @dependabot]
  • bump github.com/google/go-containerregistry from 0.20.5 to 0.20.6 [#416 @dependabot]
  • bump github.com/sergi/go-diff from 1.3.1 to 1.4.0 [#415 @dependabot]
  • bump github.com/docker/cli from 28.2.2+incompatible to 28.3.0+incompatible [#420 @dependabot]

(Full Changelog)

8.8.6 - v0.1.5

Release notes for stereoscope v0.1.5

Release Notes

Version v0.1.5

Bug Fixes

Dependency Updates

  • bump github.com/docker/cli from 28.1.1+incompatible to 28.2.2+incompatible [#410 @dependabot]
  • bump github.com/google/go-containerregistry from 0.20.3 to 0.20.5 [#407 @dependabot]
  • bump golang.org/x/crypto from 0.37.0 to 0.38.0 [#405 @dependabot]
  • bump actions/setup-go from 5.4.0 to 5.5.0 in /.github/actions/bootstrap [#406 @dependabot]

Additional Changes

  • add ability to associate opener and layer separately [#408 @wagoodman]

(Full Changelog)

8.8.7 - v0.1.4

Release notes for stereoscope v0.1.4

Release Notes

Version v0.1.4

Dependency Updates

  • bump github.com/docker/docker from 28.0.4+incompatible to 28.1.1+incompatible [#403 @dependabot]
  • bump github.com/docker/cli from 28.0.4+incompatible to 28.1.1+incompatible [#402 @dependabot]
  • bump marocchino/sticky-pull-request-comment from 2.9.1 to 2.9.2 in /.github/workflows [#399 @dependabot]
  • bump golang.org/x/crypto from 0.36.0 to 0.37.0 [#398 @dependabot]
  • bump github.com/gabriel-vasile/mimetype from 1.4.8 to 1.4.9 [#404 @dependabot]

(Full Changelog)

8.8.8 - v0.1.3

Release notes for stereoscope v0.1.3

Release Notes

Version v0.1.3

Additional Changes

(Full Changelog)

8.8.9 - v0.1.2

Release notes for stereoscope v0.1.2

Release Notes

Version v0.1.2

Dependency Updates

  • bump github.com/docker/docker from 28.0.2+incompatible to 28.0.4+incompatible [#396 @dependabot]
  • bump github.com/sylabs/sif/v2 from 2.20.2 to 2.21.1 [#376 @dependabot]
  • bump github.com/google/go-containerregistry from 0.20.2 to 0.20.3 [#359 @dependabot]
  • bump github.com/docker/cli from 28.0.1+incompatible to 28.0.2+incompatible [#392 @dependabot]
  • bump github.com/containerd/containerd from 1.7.26 to 1.7.27 [#384 @dependabot]
  • bump actions/setup-go from 5.3.0 to 5.4.0 in /.github/actions/bootstrap [#389 @dependabot]
  • bump actions/cache from 4.2.2 to 4.2.3 in /.github/actions/bootstrap [#390 @dependabot]
  • bump github.com/docker/docker from 28.0.1+incompatible to 28.0.2+incompatible [#393 @dependabot]
  • bump 8398a7/action-slack from 3.16.2 to 3.18.0 in /.github/workflows [#394 @dependabot]
  • bump github.com/sylabs/squashfs from 1.0.5 to 1.0.6 [#385 @dependabot]
  • bump github.com/spf13/afero from 1.12.0 to 1.14.0 [#386 @dependabot]
  • bump actions/cache from 4.2.2 to 4.2.3 in /.github/workflows [#388 @dependabot]

Additional Changes

(Full Changelog)

8.8.10 - v0.1.0

Release notes for stereoscope v0.1.0

Release Notes

Version v0.1.0

Added Features

Bug Fixes

Dependency Updates

  • Bump runners and dependabot config [#356 @wagoodman]
  • bump github.com/docker/docker from 27.5.1+incompatible to 28.0.1+incompatible [#374 @dependabot]
  • bump github.com/google/go-cmp from 0.6.0 to 0.7.0 [#368 @dependabot]
  • bump golang.org/x/crypto from 0.33.0 to 0.36.0 [#378 @dependabot]
  • bump github.com/awslabs/amazon-ecr-credential-helper/ecr-login from 0.0.0-20220517224237-e6f29200ae04 to 0.9.1 [#364 @dependabot]
  • bump actions/cache from 4.2.0 to 4.2.2 in /.github/workflows [#371 @dependabot]
  • bump actions/cache from 4.2.0 to 4.2.2 in /.github/actions/bootstrap [#372 @dependabot]
  • bump github.com/docker/cli from 27.5.1+incompatible to 28.0.1+incompatible [#375 @dependabot]
  • bump github.com/containerd/containerd from 1.7.25 to 1.7.26 [#373 @dependabot]
  • bump github.com/opencontainers/image-spec from 1.1.0 to 1.1.1 [#377 @dependabot]
  • bump golang.org/x/net from 0.33.0 to 0.36.0 [#380 @dependabot]
  • bump golang.org/x/crypto from 0.32.0 to 0.33.0 [#357 @dependabot]
  • bump github.com/bmatcuk/doublestar/v4 from 4.8.0 to 4.8.1 [#360 @dependabot]
  • bump github.com/docker/cli from 27.5.0+incompatible to 27.5.1+incompatible [#358 @dependabot]
  • bump github.com/containerd/containerd from 1.7.24 to 1.7.25 [#361 @dependabot]
  • bump the workflows group in /.github/actions/bootstrap with 2 updates [#350 @dependabot]
  • bump github.com/docker/docker from 27.4.1+incompatible to 27.5.1+incompatible [#347 @dependabot]
  • bump github.com/bmatcuk/doublestar/v4 from 4.7.1 to 4.8.0 [#344 @dependabot]
  • bump github.com/docker/cli from 27.4.1+incompatible to 27.5.0+incompatible [#346 @dependabot]

Additional Changes

  • Replace manual map clearing loop with built-in clear() [#352 @rezmoss]

(Full Changelog)

8.8.11 - v0.0.13

Release notes for stereoscope v0.0.13

Release Notes

Version v0.0.13

Dependency Updates

  • bump github.com/spf13/afero from 1.11.0 to 1.12.0 [#339 @dependabot]
  • bump marocchino/sticky-pull-request-comment from 2.9.0 to 2.9.1 in the workflows group [#342 @dependabot]

Additional Changes

  • containerd handle localhost and ports in registry hosts [#334 @chrisplo]

(Full Changelog)

8.8.12 - v0.0.12

Release notes for stereoscope v0.0.12

Release Notes

Version v0.0.12

Bug Fixes

  • Add more strict verifications when user provides a platform [#336 @wagoodman]

Dependency Updates

  • bump github.com/gabriel-vasile/mimetype from 1.4.7 to 1.4.8 in the go group [#337 @dependabot]
  • bump golang.org/x/crypto from 0.31.0 to 0.32.0 [#338 @dependabot]
  • bump the go group across 1 directory with 3 updates [#335 @dependabot]

(Full Changelog)

8.8.13 - v0.0.11

Release notes for stereoscope v0.0.11

Release Notes

Version v0.0.11

Dependency Updates

  • bump github.com/docker/docker from 27.3.1+incompatible to 27.4.0+incompatible [#327 @dependabot]
  • bump the go group with 2 updates [#331 @dependabot]
  • bump github.com/docker/cli from 27.3.1+incompatible to 27.4.0+incompatible [#328 @dependabot]

(Full Changelog)

8.8.14 - v0.0.10

Release notes for stereoscope v0.0.10

Release Notes

Version v0.0.10

Dependency Updates

(Full Changelog)

8.8.15 - v0.0.9

Release notes for stereoscope v0.0.9

Release Notes

Version v0.0.9

Dependency Updates

(Full Changelog)

8.8.16 - v0.0.8

Release notes for stereoscope v0.0.8

Release Notes

Version v0.0.8

Dependency Updates

  • bump github.com/adrg/xdg from 0.5.1 to 0.5.3 in the go group across 1 directory [#318 @dependabot]
  • bump crazy-max/ghaction-setup-containerd from 3.0.0 to 3.1.0 in the workflows group [#316 @dependabot]

Additional Changes

(Full Changelog)

8.8.17 - v0.0.5

Release notes for stereoscope v0.0.5

Release Notes

Version v0.0.5

Dependency Updates

  • bump github.com/sylabs/sif/v2 from 2.19.1 to 2.19.2 in the go group [#313 @dependabot]
  • bump github.com/adrg/xdg from 0.5.0 to 0.5.1 in the go group [#310 @dependabot]

(Full Changelog)

8.8.18 - v0.0.4

Release notes for stereoscope v0.0.4

Release Notes

Version v0.0.4

Additional Changes

(Full Changelog)

8.8.19 - v0.0.3

Release notes for stereoscope v0.0.3

Release Notes

Version v0.0.3

Additional Changes

(Full Changelog)

8.8.20 - v0.0.2

Release notes for stereoscope v0.0.2

Release Notes

Version v0.0.2

Bug Fixes

Additional Changes

(Full Changelog)

8.8.21 - v0.0.1

Release notes for stereoscope v0.0.1

Release Notes

Version v0.0.1

Security Fixes

Full Changelog: https://github.com/anchore/stereoscope/commits/v0.0.1

9 - Glossary

Definitions of terms used in software security, SBOM generation, and vulnerability scanning

A

Artifact

In Syft’s JSON output format, “artifacts” refers to the array of software packages discovered during scanning. Each artifact represents a single package (library, application, OS package, etc.) with its metadata, version, licenses, locations, and identifiers like CPE and PURL. This is distinct from general software artifacts like binaries or container images.

Related documentation: Working with Syft JSON

Attestation

A cryptographically signed statement about a software artifact that provides verifiable claims about its properties, such as provenance, build process, or security scan results. Attestations establish trust in the software supply chain by allowing you to verify that an SBOM truly represents a specific artifact or that vulnerability scan results are authentic.

Why it matters: Attestations enable you to verify the authenticity and integrity of SBOMs generated by Syft and vulnerability reports from Grype, ensuring they haven’t been tampered with.

C

Cataloger

A cataloger is a component within Syft that specializes in discovering and extracting package information from specific ecosystems or file formats. Each cataloger knows how to find and parse packages for a particular type (e.g., apk-cataloger for Alpine packages, npm-cataloger for Node.js packages). When Syft scans a target, it runs multiple catalogers to comprehensively discover all software components.

Why it matters: The foundBy field in Syft’s JSON output tells you which cataloger discovered each package, which can help debug why certain packages appear in your SBOM or troubleshoot scanning issues.

Related documentation: Working with Syft JSON

Container image

A lightweight, standalone, executable package that includes everything needed to run a piece of software, including the code, runtime, system tools, libraries, and settings. Container images are built from layers and typically run using container runtimes like Docker or containerd. See also OCI.

Why it matters: Both Syft and Grype can scan container images directly without requiring them to be running. Syft generates SBOMs from container images, and Grype scans them for vulnerabilities.

Related documentation: SBOM Generation, Vulnerability Scanning

CPE

Common Platform Enumeration (CPE) is a standardized method for describing and identifying software applications, operating systems, and hardware devices. CPEs are used in vulnerability databases to match software components with known vulnerabilities.

Formats:

  • URI binding: cpe:/{part}:{vendor}:{product}:{version}:{update}:{edition}:{language}
  • Formatted string: cpe:2.3:{part}:{vendor}:{product}:{version}:{update}:{edition}:{language}:{sw_edition}:{target_sw}:{target_hw}:{other}
  • Well-Formed Name (WFN): cpe:2.3:wfn:[attributes]

Examples:

  • cpe:/a:mozilla:firefox:68.0::~~~en-us~~
  • cpe:2.3:a:microsoft:internet_explorer:8.0.6001:beta:*:*:*:*:*:*
  • wfn:[part="a", vendor="microsoft", product="internet_explorer",version="8\.0\.6001", update="beta", edition=ANY, language=ANY]

Why it matters: Syft generates CPEs for discovered packages (from the NVD dictionary or synthetic generation), which Grype then uses to match packages against vulnerability data. Understanding CPEs helps you troubleshoot why certain vulnerabilities are or aren’t being detected relative to vulnerabilities from NVD.

External resources:

Related documentation: Working with Syft JSON

CVE

Common Vulnerabilities and Exposures (CVE) is a standardized identifier for publicly known security vulnerabilities. Each CVE ID uniquely identifies a specific vulnerability and provides a common reference point for discussing and tracking security issues.

Format example: CVE-2024-12345

Why it matters: Grype reports vulnerabilities by their CVE IDs, making it easy to research specific issues, understand their impact, and find remediation guidance. Each match in a Grype scan references one or more CVE IDs.

External resources:

Related documentation: Vulnerability Scanning

CVSS

Common Vulnerability Scoring System (CVSS) is an open framework for communicating the characteristics and severity of software vulnerabilities. CVSS (base) scores range from 0.0 to 10.0, with higher scores indicating more severe vulnerabilities.

Severity ranges:

  • None: 0.0
  • Low: 0.1-3.9
  • Medium: 4.0-6.9
  • High: 7.0-8.9
  • Critical: 9.0-10.0

There are more dimensions to CVSS, including Temporal and Environmental scores, but the Base score is the most commonly used as a way to quickly assess severity.

Why it matters: Grype uses CVSS scores to categorize vulnerability severity, helping you prioritize which issues to fix first. You can filter Grype results by severity level to focus on the most critical vulnerabilities.

External resources:

Related documentation: Vulnerability Scanning

CycloneDX

CycloneDX is an open-source standard for creating Software Bill of Materials (SBOMs), supporting JSON and XML representations.

Why it matters: Syft can generate SBOMs in CycloneDX format (-o cyclonedx-json or -o cyclonedx-xml), which is widely supported by security tools and compliance platforms. Grype can also scan CycloneDX SBOMs for vulnerabilities.

External resources:

Related documentation: SBOM Generation

D

Dependency

A software component that another piece of software relies on to function. Dependencies can be direct (explicitly required by your code) or transitive (required by your dependencies). Understanding and tracking dependencies is crucial for security and license compliance.

Why it matters: Syft catalogs both direct and transitive dependencies in your software, creating a complete inventory. Grype then scans all dependencies for vulnerabilities, not just your direct dependencies—important because transitive dependencies often contain hidden security risks.

Distro

Short for “distribution”, referring to a specific Linux distribution like Alpine, Ubuntu, Debian, or Red Hat. The distro information includes the distribution name and version (e.g., “alpine 3.18”).

Why it matters: Grype uses distro information to match OS packages against the correct vulnerability database. Syft automatically detects the distro from files like /etc/os-release and includes it in the SBOM, ensuring accurate vulnerability matching.

Related documentation: Working with Syft JSON

Docker

Docker is a platform for developing, shipping, and running applications in containers. While Docker is a specific implementation, the term is often used colloquially to refer to container technology in general. See Container image and OCI.

Why it matters: Syft and Grype can pull and scan images directly from Docker registries or analyze images in your local Docker daemon without needing Docker to be installed.

External resources:

E

Ecosystem

In software, an ecosystem refers to a package management system and its associated community, tools, and conventions. Examples include npm (JavaScript), PyPI (Python), Maven Central (Java), and RubyGems (Ruby). Different ecosystems have different package formats, naming conventions, and vulnerability data sources.

Why it matters: Syft supports dozens of package ecosystems, and each uses a different cataloger. The ecosystem determines how packages are identified (PURL type), which metadata is captured, and which vulnerability data sources Grype uses for matching.

Related documentation: SBOM Generation

EPSS

Exploit Prediction Scoring System (EPSS) is a data-driven framework that estimates the probability that a software vulnerability will be exploited in the wild within the next 30 days. EPSS scores range from 0 to 1 (or 0% to 100%), with higher scores indicating a greater likelihood of exploitation based on real-world threat intelligence.

Unlike CVSS which measures theoretical severity, EPSS predicts actual exploitation probability by analyzing factors like available exploits, social media activity, and observed attacks (among other signals).

Why it matters: EPSS helps you prioritize vulnerabilities more effectively than severity alone. A critical CVSS vulnerability with a low EPSS score might be less urgent than a medium severity issue with a high EPSS score. Grype can display EPSS scores alongside CVSS to help you focus remediation efforts on vulnerabilities that are both severe and likely to be exploited.

External resources:

Related documentation: Vulnerability Scanning

F

False positive

In the context of scanning for vulnerabilities, a false positive is a vulnerability-package match reported by a scanner that doesn’t actually affect the software package in question. False positives can occur due to incorrect CPE matching, version misidentification, or when a vulnerability applies to one variant of a package but not another.

Why it matters: When Grype reports a false positive, you can use VEX documents or Grype’s ignore rules to suppress it, preventing alert fatigue and focusing on real security issues.

False negative

In the context of scanning for vulnerabilities, a false negative occurs when a scanner fails to detect a vulnerability that actually affects a software package. False negatives can happen when vulnerability data is incomplete, when a package uses non-standard naming or versioning, when CPE or PURL identifiers don’t match correctly, or when the vulnerability database hasn’t been updated yet.

Why it matters: False negatives are more dangerous than false positives because they create a false sense of security. To minimize false negatives, keep Grype’s vulnerability database updated regularly and understand that no scanner catches 100% of vulnerabilities—defense in depth and multiple security controls are essential.

K

KEV

Known Exploited Vulnerability (KEV) is a designation for vulnerabilities that have been confirmed as actively exploited in real-world attacks. CISA (Cybersecurity and Infrastructure Security Agency) maintains the authoritative KEV catalog, which lists CVEs with evidence of active exploitation and provides binding operational directives for federal agencies.

The CISA KEV catalog includes:

  • CVE identifiers for exploited vulnerabilities
  • The product and vendor affected
  • A brief description of the vulnerability
  • Required remediation actions
  • Due dates for federal agencies to patch

Vulnerabilities are added to the KEV catalog based on reliable evidence of active exploitation, such as public reporting, threat intelligence, or incident response data.

Why it matters: KEV status is a strong signal for prioritization—these vulnerabilities are being actively exploited right now. When Grype identifies a vulnerability that’s on the CISA KEV list, you should treat it as urgent regardless of CVSS score. A medium-severity KEV vulnerability poses more immediate risk than a critical-severity vulnerability that’s never been exploited. Some organizations make KEV remediation mandatory within tight timeframes (e.g., 15 days for critical KEVs).

External resources:

Related documentation: Vulnerability Scanning

L

Layer

Container images are built as a series of filesystem layers, where each layer represents changes from a Dockerfile instruction. Layers are stacked together to create the final filesystem.

Why it matters: By default, Syft scans only the “squashed” view of an image (what you’d see if the container were running). Use --scope all-layers to scan all layers, which can reveal packages that were installed then deleted, potentially exposing vulnerabilities in build-time dependencies.

Related documentation: SBOM Generation

License

A legal instrument governing the use and distribution of software. Software licenses range from permissive (MIT, Apache) to copyleft (GPL) to proprietary.

Why it matters: Syft extracts license information from packages and includes it in SBOMs, helping you ensure compliance with open source licenses and identify packages with incompatible or restricted licenses.

M

Match

A match is a vulnerability finding in Grype’s output, representing a single package-vulnerability pair. Each match indicates that a specific package version is affected by a particular CVE.

Related documentation: Vulnerability Scanning

Matcher

A matcher is a component within Grype that compares package information against vulnerability data using specific matching strategies. Different matchers handle different package types or ecosystems (e.g., distro matcher for OS packages, language matcher for application dependencies).

Why it matters: Grype uses multiple matchers to ensure comprehensive vulnerability coverage. The matcher used for each finding is included in detailed output, helping you understand how the match was made.

N

NVD

National Vulnerability Database (NVD) is the U.S. government repository known software vulnerabilities. It provides comprehensive vulnerability information including CVE IDs, CVSS scores, and affected software configurations. The NVD is maintained by NIST.

Why it matters: The NVD is one of the primary vulnerability data sources used by Grype. Syft also uses the NVD’s CPE dictionary to generate CPEs for packages, enabling accurate vulnerability matching.

External resources:

Related documentation: Vulnerability Scanning

O

OCI

Open Container Initiative (OCI) is an open governance structure for creating industry standards around container formats and runtimes. The OCI Image Specification defines the standard format for container images, ensuring interoperability across different container tools and platforms.

Why it matters: Syft and Grype work with OCI-compliant images from any registry (Docker Hub, GitHub Container Registry, Amazon ECR, etc.), not just Docker images. They can read images in OCI layout format directly from disk.

External resources:

P

Package

A bundle of software that can be installed and managed by a package manager. Packages typically include the software itself, metadata (like version and dependencies), and installation instructions. Packages are the fundamental units tracked in an SBOM.

Why it matters: Every entry in a Syft-generated SBOM represents a package. Grype matches packages against vulnerability data to find security issues. Understanding what constitutes a “package” in different ecosystems helps you interpret SBOM contents.

Package manager

A tool that automates the process of installing, upgrading, configuring, and removing software packages. Examples include npm, pip, apt, yum, and Maven. Package managers maintain repositories of available packages and handle dependency resolution.

Why it matters: Syft discovers packages by reading package manager metadata files (like package.json, requirements.txt, or /var/lib/dpkg/status). Each package manager stores information differently, which is why Syft needs ecosystem-specific catalogers.

Provenance

Information about the origin and build process of a software artifact, including who built it, when, from what source code, and using what tools. Build provenance helps verify that software was built as expected and hasn’t been tampered with.

Why it matters: SBOMs generated by Syft during builds can be combined with provenance information to create comprehensive supply chain attestations, enabling you to verify both what’s in your software and how it was built.

External resources:

PURL

Package URL (PURL) is a standardized way to identify and locate software packages across different package managers and ecosystems. PURLs provide a uniform identifier that works across different systems.

Format: pkg:type/namespace/name@version?qualifiers#subpath

Example: pkg:npm/lodash@4.17.21

Why it matters: Syft generates PURLs for all discovered packages, and Grype uses PURLs as one of the primary identifiers for vulnerability matching. PURLs provide a consistent way to refer to packages across different SBOM formats.

External resources:

Related documentation: Working with Syft JSON

R

Relationship

In Syft’s JSON output, relationships describe connections between artifacts (packages), files, and sources (what was scanned). For example, a relationship might indicate that a file is “contained-by” a package, or that one package “depends-on” another.

Why it matters: Relationships provide the graph structure of your software, showing not just what packages exist but how they’re connected. This is essential for understanding dependency chains and reachability analysis.

Related documentation: Working with Syft JSON

S

SBOM

Software Bill of Materials (SBOM) is a comprehensive inventory of all components, libraries, and modules that make up a piece of software. Like a list of ingredients on food packaging, an SBOM provides transparency into what’s included in your software, enabling security analysis, license compliance, and supply chain risk management.

Why it matters: Syft generates SBOMs that you can use with Grype for vulnerability scanning, share with customers for transparency, or use for license compliance. SBOMs are becoming required by regulations and standards like Executive Order 14028.

External resources:

Related documentation: SBOM Generation

Severity

A classification of how serious a vulnerability is, typically based on CVSS scores. Common severity levels are Critical, High, Medium, Low, and Negligible (or None).

Why it matters: Grype reports vulnerability severity to help you prioritize remediation efforts. You can filter Grype output by severity (e.g., --fail-on high to fail CI builds for high or critical vulnerabilities).

Related documentation: Vulnerability Scanning

Software supply chain

The software supply chain encompasses all the components, processes, and steps involved in creating, building, and delivering software. This includes source code, dependencies, build tools, CI/CD pipelines, and distribution mechanisms. Securing the software supply chain helps prevent attacks that target the development and delivery process.

Why it matters: Syft and Grype are key tools in supply chain security. Syft provides visibility into what’s in your software (SBOM), and Grype identifies known vulnerabilities, helping you secure each link in the chain.

Source

In Syft’s JSON output, the “source” object describes what was scanned—whether it was a container image, directory, file archive, or other input. It includes details like image name, digest, and tags.

Why it matters: The source information helps you correlate SBOMs with specific artifacts, especially important when tracking multiple image versions or builds.

Related documentation: Working with Syft JSON

SPDX

Software Package Data Exchange (SPDX) is an open standard for communicating software bill of materials information, including components, licenses, copyrights, and security references. SPDX is an ISO/IEC standard (ISO/IEC 5962:2021) and supports multiple formats including JSON, YAML, XML, and tag-value.

Why it matters: Syft can generate SBOMs in SPDX format (-o spdx-json or -o spdx-tag-value), which is widely supported by compliance tools and required by many organizations and regulations. Grype can also scan SPDX SBOMs for vulnerabilities.

External resources:

Related documentation: SBOM Generation

Squash

The “squashed” view of a container image represents the final filesystem that would be visible if you ran the container. It’s the result of applying all image layers in sequence, where later layers can override or delete files from earlier layers.

Why it matters: Syft scans the squashed view by default (what you actually run), but you can use --scope all-layers to also see packages that existed in intermediate layers but were deleted before the final image.

Related documentation: SBOM Generation

V

VEX

Vulnerability Exploitability eXchange (VEX) is a series of formats for communicating information about the exploitability status of vulnerabilities in software products. VEX documents allow software vendors to provide context about whether identified vulnerabilities actually affect their product, helping users prioritize remediation efforts.

Why it matters: Grype can consume VEX documents to suppress false positives or provide additional context about vulnerabilities. When Grype reports a vulnerability that doesn’t actually affect your application, you can create a VEX document explaining why it’s not exploitable.

External resources:

Related documentation: Vulnerability Scanning

Vulnerability

A security weakness, flaw, or defect in software that can be exploited by an attacker to perform unauthorized actions, compromise systems, steal data, or cause harm. Vulnerabilities can arise from coding errors, design flaws, misconfigurations, or outdated dependencies with known security issues.

Not all vulnerabilities affect all users of a package. Whether a vulnerability impacts you depends on:

  • The specific version you’re using
  • Which features or code paths you actually invoke
  • Your deployment configuration and environment
  • Whether compensating security controls are in place

Why it matters: Grype identifies vulnerabilities in the packages discovered by Syft, enabling you to find and fix security issues before they can be exploited. Not all vulnerabilities are equally serious—use severity ratings (CVSS) and exploitation probability (EPSS) to prioritize fixes. Understanding the context of a vulnerability helps you assess real risk rather than just responding to every CVE.

External resources:

Related documentation: Vulnerability Scanning

Vulnerability database

A repository of known security vulnerabilities, their affected software versions, severity scores, and remediation information. Vulnerability databases aggregate data from multiple sources like NVD, security advisories, and vendor bulletins.

Why it matters: Grype downloads and maintains a local vulnerability database that’s updated daily. The database quality directly impacts scan accuracy—Grype uses curated, high-quality data from multiple providers to minimize false positives and false negatives.

Related documentation: Vulnerability Database

Vulnerability scanner

A tool that identifies known security vulnerabilities in software by comparing components against vulnerability databases. Vulnerability scanners like Grype analyze software artifacts (container images, filesystems, or SBOMs) and report potential security issues that should be addressed.

Why it matters: Grype is a vulnerability scanner that works seamlessly with Syft-generated SBOMs. You can scan images directly with Grype, or generate an SBOM with Syft first and scan it separately, enabling workflows where SBOMs are generated once and scanned multiple times as new vulnerabilities are discovered.

Related documentation: Vulnerability Scanning