| name | trivy-scan |
| description | Scan containers and filesystems for vulnerabilities with Trivy: trivy image, trivy fs, trivy repo, severity filtering, SARIF output, CI integration. Trigger: when using Trivy, trivy image, trivy fs, trivy scan, container vulnerability scan, trivy repo, CVE scanning, SBOM generation |
| version | 1 |
| argument-hint | [image|fs|repo|config|sbom] [target] [--severity HIGH,CRITICAL] |
| allowed-tools | ["bash","read","write","grep","glob"] |
Trivy Security Scanner
You are now operating in Trivy vulnerability scanning mode.
Installation
brew install trivy
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install trivy
docker run --rm aquasec/trivy:latest image alpine:3.18
trivy --version
trivy image --download-db-only
Container Image Scanning
trivy image nginx:latest
trivy image myapp:local
trivy image --severity HIGH,CRITICAL nginx:latest
trivy image --severity CRITICAL nginx:latest
trivy image --format json nginx:latest
trivy image --format sarif --output trivy-results.sarif nginx:latest
trivy image --format table nginx:latest
trivy image --ignore-unfixed nginx:latest
trivy image --severity HIGH,CRITICAL --ignore-unfixed nginx:latest
trivy image --username user --password pass myregistry.com/myapp:latest
docker save myapp:latest -o myapp.tar
trivy image --input myapp.tar
trivy image --exit-code 1 --severity HIGH,CRITICAL nginx:latest
Filesystem Scanning
trivy fs .
trivy fs /path/to/project
trivy fs --severity HIGH,CRITICAL .
trivy fs --format json . > trivy-fs-results.json
trivy fs --scanners vuln .
trivy fs --scanners vuln,secret .
trivy fs --scanners vuln,secret,misconfig .
trivy fs --exit-code 1 --severity HIGH,CRITICAL .
Repository Scanning
trivy repo https://github.com/myorg/myrepo
trivy repo --token $GITHUB_TOKEN https://github.com/myorg/private-repo
trivy repo .
trivy repo --branch main https://github.com/myorg/myrepo
trivy repo --commit abc1234 https://github.com/myorg/myrepo
Configuration/IaC Scanning
trivy config ./terraform/
trivy config ./k8s/
trivy config ./Dockerfile
trivy config ./charts/
trivy config ./cloudformation/
trivy config --severity HIGH,CRITICAL ./terraform/
trivy config --show-suppressed ./terraform/
SBOM (Software Bill of Materials)
trivy image --format cyclonedx --output sbom.json nginx:latest
trivy image --format spdx-json --output sbom.spdx.json nginx:latest
trivy fs --format cyclonedx --output sbom.json .
trivy sbom ./sbom.json
Severity Filtering and Thresholds
trivy image --severity HIGH,CRITICAL myapp:latest
trivy image --exit-code 1 --severity CRITICAL myapp:latest
trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:latest
trivy image --format json myapp:latest | \
jq '.Results[].Vulnerabilities | group_by(.Severity) | map({severity: .[0].Severity, count: length})'
echo "CVE-2023-1234" > .trivyignore
trivy image myapp:latest
cat > .trivyignore <<'EOF'
CVE-2023-1234
CVE-2023-5678
EOF
CI/CD Integration
GitHub Actions
name: Trivy Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
trivy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy container scan
uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:${{ github.sha }}
format: sarif
output: trivy-container.sarif
severity: HIGH,CRITICAL
exit-code: 1
ignore-unfixed: true
- name: Run Trivy filesystem scan
uses: aquasecurity/trivy-action@master
with:
scan-type: fs
scan-ref: .
format: sarif
output: trivy-fs.sarif
severity: HIGH,CRITICAL
- name: Upload container SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: trivy-container.sarif
- name: Upload filesystem SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: trivy-fs.sarif
Shell Script for CI Pipeline
#!/bin/bash
set -euo pipefail
IMAGE="myapp:${CI_COMMIT_SHA:-latest}"
SEVERITY="HIGH,CRITICAL"
EXIT_CODE=0
echo "=== Scanning container image: $IMAGE ==="
trivy image \
--severity "$SEVERITY" \
--ignore-unfixed \
--exit-code 1 \
--format sarif \
--output trivy-image.sarif \
"$IMAGE" || EXIT_CODE=$?
echo "=== Scanning filesystem ==="
trivy fs \
--severity "$SEVERITY" \
--scanners vuln,secret \
--exit-code 1 \
--format sarif \
--output trivy-fs.sarif \
. || EXIT_CODE=$?
echo "=== Scanning IaC configurations ==="
trivy config \
--severity "$SEVERITY" \
--exit-code 1 \
./terraform/ ./k8s/ || EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
echo "Trivy found vulnerabilities at severity $SEVERITY"
exit $EXIT_CODE
fi
echo "All Trivy scans passed"
Makefile Integration
TRIVY_SEVERITY ?= HIGH,CRITICAL
IMAGE_NAME ?= myapp:latest
.PHONY: scan-image scan-fs scan-config scan-all
scan-image:
trivy image --severity $(TRIVY_SEVERITY) --ignore-unfixed $(IMAGE_NAME)
scan-fs:
trivy fs --severity $(TRIVY_SEVERITY) --scanners vuln,secret .
scan-config:
trivy config --severity $(TRIVY_SEVERITY) ./terraform/ ./k8s/
scan-all: scan-image scan-fs scan-config
Interpreting Results
trivy image --format json myapp:latest | \
jq '.Results[].Vulnerabilities[] | select(.Severity == "CRITICAL") | {
VulnerabilityID: .VulnerabilityID,
PkgName: .PkgName,
InstalledVersion: .InstalledVersion,
FixedVersion: .FixedVersion,
Title: .Title
}'
trivy image --format json myapp:latest | \
jq '[.Results[].Vulnerabilities[]?.Severity] | group_by(.) | map({severity: .[0], count: length})'
trivy image --format json myapp:latest | \
jq '.Results[].Vulnerabilities[] | select(.FixedVersion != "") | {
id: .VulnerabilityID,
pkg: .PkgName,
installed: .InstalledVersion,
fixedIn: .FixedVersion
}'
Caching and Performance
TRIVY_CACHE_DIR=/tmp/trivy-cache trivy image myapp:latest
trivy image --download-db-only
trivy image --skip-db-update myapp:latest
trivy image --offline-scan myapp:latest
trivy image --clear-cache
Troubleshooting
trivy image --debug myapp:latest
trivy image --format json myapp:latest | jq '.SchemaVersion, .CreatedAt'
trivy image --no-progress myapp:latest