mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-09 22:30:46 -08:00
Compare commits
77 Commits
release/v0
...
v0.53.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c55b0e6cac | ||
|
|
654217a654 | ||
|
|
3d4ae8b5be | ||
|
|
55ccd06df4 | ||
|
|
14d71ba63c | ||
|
|
edc556b85e | ||
|
|
4f8b3996e4 | ||
|
|
137c916423 | ||
|
|
9e4927ee1e | ||
|
|
4be02bab8c | ||
|
|
e9fc3e3397 | ||
|
|
0ccdbfbb65 | ||
|
|
9045f24454 | ||
|
|
3d02a31b44 | ||
|
|
8d618e48a2 | ||
|
|
a76e3286c4 | ||
|
|
eb636c1b34 | ||
|
|
8d0ae1f5de | ||
|
|
de201dc772 | ||
|
|
979e118a9e | ||
|
|
648ead9553 | ||
|
|
7eabb92ec2 | ||
|
|
333087c9e8 | ||
|
|
6dff4223ed | ||
|
|
9dc8a2ba6b | ||
|
|
b58d42dc97 | ||
|
|
6469d37cce | ||
|
|
30bcb95350 | ||
|
|
e493fc931a | ||
|
|
983ac15f22 | ||
|
|
dfe757e37a | ||
|
|
f144e912d3 | ||
|
|
5ee4e9d30e | ||
|
|
f18d035ae1 | ||
|
|
1f8fca1fc7 | ||
|
|
2d85a003b2 | ||
|
|
417212e093 | ||
|
|
38b35dd3c8 | ||
|
|
eb6d0d9779 | ||
|
|
0af5730cbe | ||
|
|
c3192f061d | ||
|
|
ec68c9ab45 | ||
|
|
bc3741ae2c | ||
|
|
735aadf2d5 | ||
|
|
52f7aa54b5 | ||
|
|
d77d9ce384 | ||
|
|
55fa6109cd | ||
|
|
cd360dde20 | ||
|
|
08a428a084 | ||
|
|
04ed5edbaa | ||
|
|
fdf799e6a7 | ||
|
|
baa1216895 | ||
|
|
09e50ce6a8 | ||
|
|
6e7f62d2de | ||
|
|
1bdc135fe7 | ||
|
|
9b31697274 | ||
|
|
089b953462 | ||
|
|
cf5aa336e6 | ||
|
|
8491469f0b | ||
|
|
bb88937365 | ||
|
|
622c67b764 | ||
|
|
04af59c290 | ||
|
|
bb26445e3d | ||
|
|
72e20d765b | ||
|
|
e8d8af4504 | ||
|
|
63eb85a064 | ||
|
|
1e2db83e49 | ||
|
|
d4aea27881 | ||
|
|
faa9d92cfe | ||
|
|
7d083bc890 | ||
|
|
042d6b08c2 | ||
|
|
8141a137ba | ||
|
|
0bcfedbcaa | ||
|
|
02d540478d | ||
|
|
8dd076a768 | ||
|
|
bab16b88ad | ||
|
|
b7b8cdc9e9 |
2
.github/DISCUSSION_TEMPLATE/bugs.yml
vendored
2
.github/DISCUSSION_TEMPLATE/bugs.yml
vendored
@@ -116,7 +116,7 @@ body:
|
||||
label: Checklist
|
||||
description: Have you tried the following?
|
||||
options:
|
||||
- label: Run `trivy image --reset`
|
||||
- label: Run `trivy clean --all`
|
||||
- label: Read [the troubleshooting](https://aquasecurity.github.io/trivy/latest/docs/references/troubleshooting/)
|
||||
- type: markdown
|
||||
attributes:
|
||||
|
||||
3
.github/actions/trivy-triage/Makefile
vendored
Normal file
3
.github/actions/trivy-triage/Makefile
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
.PHONEY: test
|
||||
test: helpers.js helpers.test.js
|
||||
node --test helpers.test.js
|
||||
29
.github/actions/trivy-triage/action.yaml
vendored
Normal file
29
.github/actions/trivy-triage/action.yaml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
name: 'trivy-discussion-triage'
|
||||
description: 'automatic triage of Trivy discussions'
|
||||
inputs:
|
||||
discussion_num:
|
||||
description: 'Discussion number to triage'
|
||||
required: false
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Conditionally label discussions based on category and content
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const {detectDiscussionLabels, fetchDiscussion, labelDiscussion } = require('${{ github.action_path }}/helpers.js');
|
||||
const config = require('${{ github.action_path }}/config.json');
|
||||
discussionNum = parseInt(${{ inputs.discussion_num }});
|
||||
let discussion;
|
||||
if (discussionNum > 0) {
|
||||
discussion = (await fetchDiscussion(github, context.repo.owner, context.repo.repo, discussionNum)).repository.discussion;
|
||||
} else {
|
||||
discussion = context.payload.discussion;
|
||||
}
|
||||
const labels = detectDiscussionLabels(discussion, config.discussionLabels);
|
||||
if (labels.length > 0) {
|
||||
console.log(`Adding labels ${labels} to discussion ${discussion.node_id}`);
|
||||
labelDiscussion(github, discussion.node_id, labels);
|
||||
}
|
||||
14
.github/actions/trivy-triage/config.json
vendored
Normal file
14
.github/actions/trivy-triage/config.json
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"discussionLabels": {
|
||||
"Container Image":"LA_kwDOCsUTCM75TTQU",
|
||||
"Filesystem":"LA_kwDOCsUTCM75TTQX",
|
||||
"Git Repository":"LA_kwDOCsUTCM75TTQk",
|
||||
"Virtual Machine Image":"LA_kwDOCsUTCM8AAAABMpz1bw",
|
||||
"Kubernetes":"LA_kwDOCsUTCM75TTQv",
|
||||
"AWS":"LA_kwDOCsUTCM8AAAABMpz1aA",
|
||||
"Vulnerability":"LA_kwDOCsUTCM75TTPa",
|
||||
"Misconfiguration":"LA_kwDOCsUTCM75TTP8",
|
||||
"License":"LA_kwDOCsUTCM77ztRR",
|
||||
"Secret":"LA_kwDOCsUTCM75TTQL"
|
||||
}
|
||||
}
|
||||
70
.github/actions/trivy-triage/helpers.js
vendored
Normal file
70
.github/actions/trivy-triage/helpers.js
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
module.exports = {
|
||||
detectDiscussionLabels: (discussion, configDiscussionLabels) => {
|
||||
res = [];
|
||||
const discussionId = discussion.id;
|
||||
const category = discussion.category.name;
|
||||
const body = discussion.body;
|
||||
if (category !== "Ideas") {
|
||||
console.log(`skipping discussion with category ${category} and body ${body}`);
|
||||
return [];
|
||||
}
|
||||
const scannerPattern = /### Scanner\n\n(.+)/;
|
||||
const scannerFound = body.match(scannerPattern);
|
||||
if (scannerFound && scannerFound.length > 1) {
|
||||
res.push(configDiscussionLabels[scannerFound[1]]);
|
||||
}
|
||||
const targetPattern = /### Target\n\n(.+)/;
|
||||
const targetFound = body.match(targetPattern);
|
||||
if (targetFound && targetFound.length > 1) {
|
||||
res.push(configDiscussionLabels[targetFound[1]]);
|
||||
}
|
||||
return res;
|
||||
},
|
||||
fetchDiscussion: async (github, owner, repo, discussionNum) => {
|
||||
const query = `query Discussion ($owner: String!, $repo: String!, $discussion_num: Int!){
|
||||
repository(name: $repo, owner: $owner) {
|
||||
discussion(number: $discussion_num) {
|
||||
number,
|
||||
id,
|
||||
body,
|
||||
category {
|
||||
id,
|
||||
name
|
||||
},
|
||||
labels(first: 100) {
|
||||
edges {
|
||||
node {
|
||||
id,
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
const vars = {
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
discussion_num: discussionNum
|
||||
};
|
||||
return github.graphql(query, vars);
|
||||
},
|
||||
labelDiscussion: async (github, discussionId, labelIds) => {
|
||||
const query = `mutation AddLabels($labelId: ID!, $labelableId:ID!) {
|
||||
addLabelsToLabelable(
|
||||
input: {labelIds: [$labelId], labelableId: $labelableId}
|
||||
) {
|
||||
clientMutationId
|
||||
}
|
||||
}`;
|
||||
// TODO: add all labels in one call
|
||||
labelIds.forEach((labelId) => {
|
||||
const vars = {
|
||||
labelId: labelId,
|
||||
labelableId: discussionId
|
||||
};
|
||||
github.graphql(query, vars);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
87
.github/actions/trivy-triage/helpers.test.js
vendored
Normal file
87
.github/actions/trivy-triage/helpers.test.js
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const { describe, it } = require('node:test');
|
||||
const {detectDiscussionLabels} = require('./helpers.js');
|
||||
|
||||
const configDiscussionLabels = {
|
||||
"Container Image":"ContainerImageLabel",
|
||||
"Filesystem":"FilesystemLabel",
|
||||
"Vulnerability":"VulnerabilityLabel",
|
||||
"Misconfiguration":"MisconfigurationLabel",
|
||||
};
|
||||
|
||||
describe('trivy-triage', async function() {
|
||||
describe('detectDiscussionLabels', async function() {
|
||||
it('detect scanner label', async function() {
|
||||
const discussion = {
|
||||
body: 'hello hello\nbla bla.\n### Scanner\n\nVulnerability\n### Target\n\nContainer Image\nbye bye.',
|
||||
category: {
|
||||
name: 'Ideas'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(labels.includes('VulnerabilityLabel'));
|
||||
});
|
||||
it('detect target label', async function() {
|
||||
const discussion = {
|
||||
body: 'hello hello\nbla bla.\n### Scanner\n\nVulnerability\n### Target\n\nContainer Image\nbye bye.',
|
||||
category: {
|
||||
name: 'Ideas'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(labels.includes('ContainerImageLabel'));
|
||||
});
|
||||
it('detect label when it is first', async function() {
|
||||
const discussion = {
|
||||
body: '### Scanner\n\nVulnerability\n### Target\n\nContainer Image\nbye bye.',
|
||||
category: {
|
||||
name: 'Ideas'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(labels.includes('ContainerImageLabel'));
|
||||
});
|
||||
it('detect label when it is last', async function() {
|
||||
const discussion = {
|
||||
body: '### Scanner\n\nVulnerability\n### Target\n\nContainer Image',
|
||||
category: {
|
||||
name: 'Ideas'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(labels.includes('ContainerImageLabel'));
|
||||
});
|
||||
it('detect scanner and target labels', async function() {
|
||||
const discussion = {
|
||||
body: 'hello hello\nbla bla.\n### Scanner\n\nVulnerability\n### Target\n\nContainer Image\nbye bye.',
|
||||
category: {
|
||||
name: 'Ideas'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(labels.includes('ContainerImageLabel'));
|
||||
assert(labels.includes('VulnerabilityLabel'));
|
||||
});
|
||||
it('not detect other labels', async function() {
|
||||
const discussion = {
|
||||
body: 'hello hello\nbla bla.\n### Scanner\n\nVulnerability\n### Target\n\nContainer Image\nbye bye.',
|
||||
category: {
|
||||
name: 'Ideas'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(!labels.includes('FilesystemLabel'));
|
||||
assert(!labels.includes('MisconfigurationLabel'));
|
||||
});
|
||||
it('process only relevant categories', async function() {
|
||||
const discussion = {
|
||||
body: 'hello world',
|
||||
category: {
|
||||
name: 'Announcements'
|
||||
}
|
||||
};
|
||||
const labels = detectDiscussionLabels(discussion, configDiscussionLabels);
|
||||
assert(labels.length === 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
65
.github/actions/trivy-triage/testutils/discussion-payload-sample.json
vendored
Normal file
65
.github/actions/trivy-triage/testutils/discussion-payload-sample.json
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"active_lock_reason": null,
|
||||
"answer_chosen_at": null,
|
||||
"answer_chosen_by": null,
|
||||
"answer_html_url": null,
|
||||
"author_association": "OWNER",
|
||||
"body": "### Description\n\nlfdjs lfkdj dflsakjfd ';djk \r\nfadfd \r\nasdlkf \r\na;df \r\ndfsal;kfd ;akjl\n\n### Target\n\nContainer Image\n\n### Scanner\n\nMisconfiguration",
|
||||
"category": {
|
||||
"created_at": "2023-07-02T10:14:46.000+03:00",
|
||||
"description": "Share ideas for new features",
|
||||
"emoji": ":bulb:",
|
||||
"id": 39743708,
|
||||
"is_answerable": false,
|
||||
"name": "Ideas",
|
||||
"node_id": "DIC_kwDOE0GiPM4CXnDc",
|
||||
"repository_id": 323068476,
|
||||
"slug": "ideas",
|
||||
"updated_at": "2023-07-02T10:14:46.000+03:00"
|
||||
},
|
||||
"comments": 0,
|
||||
"created_at": "2023-09-11T08:40:11Z",
|
||||
"html_url": "https://github.com/itaysk/testactions/discussions/9",
|
||||
"id": 5614504,
|
||||
"locked": false,
|
||||
"node_id": "D_kwDOE0GiPM4AVauo",
|
||||
"number": 9,
|
||||
"reactions": {
|
||||
"+1": 0,
|
||||
"-1": 0,
|
||||
"confused": 0,
|
||||
"eyes": 0,
|
||||
"heart": 0,
|
||||
"hooray": 0,
|
||||
"laugh": 0,
|
||||
"rocket": 0,
|
||||
"total_count": 0,
|
||||
"url": "https://api.github.com/repos/itaysk/testactions/discussions/9/reactions"
|
||||
},
|
||||
"repository_url": "https://api.github.com/repos/itaysk/testactions",
|
||||
"state": "open",
|
||||
"state_reason": null,
|
||||
"timeline_url": "https://api.github.com/repos/itaysk/testactions/discussions/9/timeline",
|
||||
"title": "Title title",
|
||||
"updated_at": "2023-09-11T08:40:11Z",
|
||||
"user": {
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1161307?v=4",
|
||||
"events_url": "https://api.github.com/users/itaysk/events{/privacy}",
|
||||
"followers_url": "https://api.github.com/users/itaysk/followers",
|
||||
"following_url": "https://api.github.com/users/itaysk/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/itaysk/gists{/gist_id}",
|
||||
"gravatar_id": "",
|
||||
"html_url": "https://github.com/itaysk",
|
||||
"id": 1161307,
|
||||
"login": "itaysk",
|
||||
"node_id": "MDQ6VXNlcjExNjEzMDc=",
|
||||
"organizations_url": "https://api.github.com/users/itaysk/orgs",
|
||||
"received_events_url": "https://api.github.com/users/itaysk/received_events",
|
||||
"repos_url": "https://api.github.com/users/itaysk/repos",
|
||||
"site_admin": false,
|
||||
"starred_url": "https://api.github.com/users/itaysk/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/itaysk/subscriptions",
|
||||
"type": "User",
|
||||
"url": "https://api.github.com/users/itaysk"
|
||||
}
|
||||
}
|
||||
29
.github/actions/trivy-triage/testutils/fetchDiscussion.sh
vendored
Executable file
29
.github/actions/trivy-triage/testutils/fetchDiscussion.sh
vendored
Executable file
@@ -0,0 +1,29 @@
|
||||
#! /bin/bash
|
||||
# fetch discussion by discussion number
|
||||
# requires authenticated gh cli, assumes repo but current git repository
|
||||
# args:
|
||||
# $1: discussion number, e.g 123, required
|
||||
|
||||
discussion_num="$1"
|
||||
gh api graphql -F discussion_num="$discussion_num" -F repo="{repo}" -F owner="{owner}" -f query='
|
||||
query Discussion ($owner: String!, $repo: String!, $discussion_num: Int!){
|
||||
repository(name: $repo, owner: $owner) {
|
||||
discussion(number: $discussion_num) {
|
||||
number,
|
||||
id,
|
||||
body,
|
||||
category {
|
||||
id,
|
||||
name
|
||||
},
|
||||
labels(first: 100) {
|
||||
edges {
|
||||
node {
|
||||
id,
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}'
|
||||
16
.github/actions/trivy-triage/testutils/fetchLabels.sh
vendored
Executable file
16
.github/actions/trivy-triage/testutils/fetchLabels.sh
vendored
Executable file
@@ -0,0 +1,16 @@
|
||||
#! /bin/bash
|
||||
# fetch labels and their IDs
|
||||
# requires authenticated gh cli, assumes repo but current git repository
|
||||
|
||||
gh api graphql -F repo="{repo}" -F owner="{owner}" -f query='
|
||||
query GetLabelIds($owner: String!, $repo: String!) {
|
||||
repository(name: $repo, owner: $owner) {
|
||||
id
|
||||
labels(first: 100) {
|
||||
nodes {
|
||||
id
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}'
|
||||
16
.github/actions/trivy-triage/testutils/labelDiscussion.sh
vendored
Executable file
16
.github/actions/trivy-triage/testutils/labelDiscussion.sh
vendored
Executable file
@@ -0,0 +1,16 @@
|
||||
#! /bin/bash
|
||||
# add a label to a discussion
|
||||
# requires authenticated gh cli, assumes repo but current git repository
|
||||
# args:
|
||||
# $1: discussion ID (not number!), e.g DIC_kwDOE0GiPM4CXnDc, required
|
||||
# $2: label ID, e.g. MDU6TGFiZWwzNjIzNjY0MjQ=, required
|
||||
discussion_id="$1"
|
||||
label_id="$2"
|
||||
gh api graphql -F labelableId="$discussion_id" -F labelId="$label_id" -F repo="{repo}" -F owner="{owner}" -f query='
|
||||
mutation AddLabels($labelId: ID!, $labelableId:ID!) {
|
||||
addLabelsToLabelable(
|
||||
input: {labelIds: [$labelId], labelableId: $labelableId}
|
||||
) {
|
||||
clientMutationId
|
||||
}
|
||||
}'
|
||||
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@@ -21,6 +21,8 @@ updates:
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
ignore:
|
||||
- dependency-name: "github.com/aquasecurity/trivy-*" ## `trivy-*` dependencies are updated manually
|
||||
groups:
|
||||
aws:
|
||||
patterns:
|
||||
@@ -33,5 +35,7 @@ updates:
|
||||
patterns:
|
||||
- "github.com/testcontainers/*"
|
||||
common:
|
||||
exclude-patterns:
|
||||
- "github.com/aquasecurity/trivy-*"
|
||||
patterns:
|
||||
- "*"
|
||||
58
.github/workflows/backport.yaml
vendored
Normal file
58
.github/workflows/backport.yaml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Automatic Backporting
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
check_permission:
|
||||
name: Check comment author permissions
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
is_maintainer: ${{ steps.check_permission.outputs.is_maintainer }}
|
||||
steps:
|
||||
- name: Check permission
|
||||
id: check_permission
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
PERMISSION=$(gh api /repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission --jq '.permission')
|
||||
if [ "$PERMISSION" == "admin" ] || [ "$PERMISSION" == "write" ]; then
|
||||
echo "is_maintainer=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "is_maintainer=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
|
||||
backport:
|
||||
name: Backport PR
|
||||
needs: check_permission # run this job after checking permissions
|
||||
if: |
|
||||
needs.check_permission.outputs.is_maintainer == 'true' &&
|
||||
github.event.issue.pull_request &&
|
||||
github.event.issue.pull_request.merged_at != null &&
|
||||
startsWith(github.event.comment.body, '@aqua-bot backport release/')
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Extract branch name
|
||||
run: |
|
||||
BRANCH_NAME=$(echo ${{ github.event.comment.body }} | grep -oE '@aqua-bot backport\s+(\S+)' | awk '{print $3}')
|
||||
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
|
||||
|
||||
- name: Set up Git user
|
||||
run: |
|
||||
git config --global user.email "actions@github.com"
|
||||
git config --global user.name "GitHub Actions"
|
||||
|
||||
- name: Run backport script
|
||||
run: ./misc/backport/backport.sh ${{ env.BRANCH_NAME }} ${{ github.event.issue.number }}
|
||||
env:
|
||||
# Use ORG_REPO_TOKEN instead of GITHUB_TOKEN
|
||||
# This allows the created PR to trigger tests and other workflows
|
||||
GITHUB_TOKEN: ${{ secrets.ORG_REPO_TOKEN }}
|
||||
6
.github/workflows/bypass-test.yaml
vendored
6
.github/workflows/bypass-test.yaml
vendored
@@ -8,24 +8,26 @@ on:
|
||||
- 'docs/**'
|
||||
- 'mkdocs.yml'
|
||||
- 'LICENSE'
|
||||
- '.release-please-manifest.json'
|
||||
pull_request:
|
||||
paths:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- 'mkdocs.yml'
|
||||
- 'LICENSE'
|
||||
- '.release-please-manifest.json'
|
||||
jobs:
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ${{ matrix.operating-system }}
|
||||
strategy:
|
||||
matrix:
|
||||
operating-system: [ubuntu-latest, windows-latest, macos-latest]
|
||||
operating-system: [ubuntu-latest-m, windows-latest, macos-latest]
|
||||
steps:
|
||||
- run: 'echo "No test required"'
|
||||
|
||||
integration:
|
||||
name: Integration Test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-m
|
||||
steps:
|
||||
- run: 'echo "No test required"'
|
||||
31
.github/workflows/release-please.yaml
vendored
31
.github/workflows/release-please.yaml
vendored
@@ -50,12 +50,13 @@ jobs:
|
||||
run: |
|
||||
echo "version=$( echo "${{ github.event.head_commit.message }}" | sed 's/^release: v\([0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/' )" >> $GITHUB_OUTPUT
|
||||
echo "pr_number=$( echo "${{ github.event.head_commit.message }}" | sed 's/.*(\#\([0-9]\+\)).*$/\1/' )" >> $GITHUB_OUTPUT
|
||||
echo "release_branch=release/v$( echo "${{ github.event.head_commit.message }}" | sed 's/^release: v\([0-9]\+\.[0-9]\+\).*$/\1/' )" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Tag release
|
||||
if: ${{ steps.extract_info.outputs.version }}
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.ORG_REPO_TOKEN }}
|
||||
github-token: ${{ secrets.ORG_REPO_TOKEN }} # To trigger another workflow
|
||||
script: |
|
||||
await github.rest.git.createRef({
|
||||
owner: context.repo.owner,
|
||||
@@ -64,6 +65,32 @@ jobs:
|
||||
sha: context.sha
|
||||
});
|
||||
|
||||
# When v0.50.0 is released, a release branch "release/v0.50" is created.
|
||||
- name: Create release branch for patch versions
|
||||
if: ${{ endsWith(steps.extract_info.outputs.version, '.0') }}
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }} # Should not trigger the workflow again
|
||||
script: |
|
||||
const releaseBranch = '${{ steps.extract_info.outputs.release_branch }}';
|
||||
await github.rest.git.createRef({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
ref: `refs/heads/${releaseBranch}`,
|
||||
sha: context.sha
|
||||
});
|
||||
|
||||
|
||||
# Add release branch to rulesets to enable merge queue
|
||||
- name: Add release branch to rulesets
|
||||
if: ${{ endsWith(steps.extract_info.outputs.version, '.0') }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ORG_REPO_TOKEN }}
|
||||
shell: bash
|
||||
run: |
|
||||
RULESET_ID=$(gh api /repos/${{ github.repository }}/rulesets --jq '.[] | select(.name=="release") | .id')
|
||||
gh api /repos/${{ github.repository }}/rulesets/$RULESET_ID | jq '{conditions}' | jq '.conditions.ref_name.include += ["refs/heads/${{ steps.extract_info.outputs.release_branch }}"]' | gh api --method put --input - /repos/${{ github.repository }}/rulesets/$RULESET_ID
|
||||
|
||||
# Since skip-github-release is specified, googleapis/release-please-action doesn't delete the label from PR.
|
||||
# This label prevents the subsequent PRs from being created. Therefore, we need to delete it ourselves.
|
||||
# cf. https://github.com/googleapis/release-please?tab=readme-ov-file#release-please-bot-does-not-create-a-release-pr-why
|
||||
@@ -71,7 +98,7 @@ jobs:
|
||||
if: ${{ steps.extract_info.outputs.pr_number }}
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.ORG_REPO_TOKEN }}
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const prNumber = parseInt('${{ steps.extract_info.outputs.pr_number }}', 10);
|
||||
github.rest.issues.removeLabel({
|
||||
|
||||
15
.github/workflows/reusable-release.yaml
vendored
15
.github/workflows/reusable-release.yaml
vendored
@@ -19,7 +19,7 @@ env:
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-m
|
||||
env:
|
||||
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
||||
permissions:
|
||||
@@ -27,15 +27,6 @@ jobs:
|
||||
packages: write # For GHCR
|
||||
contents: read # Not required for public repositories, but for clarity
|
||||
steps:
|
||||
- name: Maximize build space
|
||||
uses: easimon/maximize-build-space@v10
|
||||
with:
|
||||
root-reserve-mb: 32768 # The Go cache (`~/.cache/go-build` and `~/go/pkg`) requires a lot of storage space.
|
||||
remove-android: 'true'
|
||||
remove-docker-images: 'true'
|
||||
remove-dotnet: 'true'
|
||||
remove-haskell: 'true'
|
||||
|
||||
- name: Cosign install
|
||||
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20
|
||||
|
||||
@@ -98,9 +89,9 @@ jobs:
|
||||
mkdir tmp
|
||||
|
||||
- name: GoReleaser
|
||||
uses: goreleaser/goreleaser-action@v5
|
||||
uses: goreleaser/goreleaser-action@v6
|
||||
with:
|
||||
version: v1.20.0
|
||||
version: v2.0.0
|
||||
args: release -f=${{ inputs.goreleaser_config}} ${{ inputs.goreleaser_options}}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ORG_REPO_TOKEN }}
|
||||
|
||||
1
.github/workflows/semantic-pr.yaml
vendored
1
.github/workflows/semantic-pr.yaml
vendored
@@ -29,7 +29,6 @@ jobs:
|
||||
chore
|
||||
revert
|
||||
release
|
||||
BREAKING
|
||||
|
||||
scopes: |
|
||||
vuln
|
||||
|
||||
59
.github/workflows/test.yaml
vendored
59
.github/workflows/test.yaml
vendored
@@ -6,6 +6,7 @@ on:
|
||||
- 'docs/**'
|
||||
- 'mkdocs.yml'
|
||||
- 'LICENSE'
|
||||
- '.release-please-manifest.json' ## don't run tests for release-please PRs
|
||||
merge_group:
|
||||
env:
|
||||
GO_VERSION: '1.22'
|
||||
@@ -15,18 +16,8 @@ jobs:
|
||||
runs-on: ${{ matrix.operating-system }}
|
||||
strategy:
|
||||
matrix:
|
||||
operating-system: [ubuntu-latest, windows-latest, macos-latest]
|
||||
operating-system: [ubuntu-latest-m, windows-latest, macos-latest]
|
||||
steps:
|
||||
- name: Maximize build space
|
||||
uses: easimon/maximize-build-space@v10
|
||||
with:
|
||||
root-reserve-mb: 32768 # The golangci-lint uses a lot of space.
|
||||
remove-android: "true"
|
||||
remove-docker-images: "true"
|
||||
remove-dotnet: "true"
|
||||
remove-haskell: "true"
|
||||
if: matrix.operating-system == 'ubuntu-latest'
|
||||
|
||||
- uses: actions/checkout@v4.1.6
|
||||
|
||||
- name: Set up Go
|
||||
@@ -40,7 +31,7 @@ jobs:
|
||||
echo "Run 'go mod tidy' and push it"
|
||||
exit 1
|
||||
fi
|
||||
if: matrix.operating-system == 'ubuntu-latest'
|
||||
if: matrix.operating-system == 'ubuntu-latest-m'
|
||||
|
||||
- name: Lint
|
||||
id: lint
|
||||
@@ -48,7 +39,7 @@ jobs:
|
||||
with:
|
||||
version: v1.58
|
||||
args: --verbose --out-format=line-number
|
||||
if: matrix.operating-system == 'ubuntu-latest'
|
||||
if: matrix.operating-system == 'ubuntu-latest-m'
|
||||
|
||||
- name: Check if linter failed
|
||||
run: |
|
||||
@@ -69,14 +60,14 @@ jobs:
|
||||
echo "Run 'mage docs:generate' and push it"
|
||||
exit 1
|
||||
fi
|
||||
if: matrix.operating-system == 'ubuntu-latest'
|
||||
if: matrix.operating-system == 'ubuntu-latest-m'
|
||||
|
||||
- name: Run unit tests
|
||||
run: mage test:unit
|
||||
|
||||
integration:
|
||||
name: Integration Test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-m
|
||||
steps:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v4.1.6
|
||||
@@ -96,17 +87,8 @@ jobs:
|
||||
|
||||
k8s-integration:
|
||||
name: K8s Integration Test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-m
|
||||
steps:
|
||||
- name: Maximize build space
|
||||
uses: easimon/maximize-build-space@v10
|
||||
with:
|
||||
root-reserve-mb: 32768 # The Go cache (`~/.cache/go-build` and `~/go/pkg`) requires a lot of storage space.
|
||||
remove-android: "true"
|
||||
remove-docker-images: "true"
|
||||
remove-dotnet: "true"
|
||||
remove-haskell: "true"
|
||||
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v4.1.6
|
||||
|
||||
@@ -147,17 +129,8 @@ jobs:
|
||||
|
||||
vm-test:
|
||||
name: VM Integration Test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-m
|
||||
steps:
|
||||
- name: Maximize build space
|
||||
uses: easimon/maximize-build-space@v10
|
||||
with:
|
||||
root-reserve-mb: 32768 # The Go cache (`~/.cache/go-build` and `~/go/pkg`) requires a lot of storage space.
|
||||
remove-android: 'true'
|
||||
remove-docker-images: 'true'
|
||||
remove-dotnet: 'true'
|
||||
remove-haskell: 'true'
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.1.6
|
||||
|
||||
@@ -178,20 +151,10 @@ jobs:
|
||||
runs-on: ${{ matrix.operating-system }}
|
||||
strategy:
|
||||
matrix:
|
||||
operating-system: [ubuntu-latest, windows-latest, macos-latest]
|
||||
operating-system: [ubuntu-latest-m, windows-latest, macos-latest]
|
||||
env:
|
||||
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
||||
steps:
|
||||
- name: Maximize build space
|
||||
uses: easimon/maximize-build-space@v10
|
||||
with:
|
||||
root-reserve-mb: 32768 # The Go cache (`~/.cache/go-build` and `~/go/pkg`) requires a lot of storage space.
|
||||
remove-android: 'true'
|
||||
remove-docker-images: 'true'
|
||||
remove-dotnet: 'true'
|
||||
remove-haskell: 'true'
|
||||
if: matrix.operating-system == 'ubuntu-latest'
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.1.6
|
||||
|
||||
@@ -213,7 +176,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Run GoReleaser
|
||||
uses: goreleaser/goreleaser-action@v5
|
||||
uses: goreleaser/goreleaser-action@v6
|
||||
with:
|
||||
version: v1.20.0
|
||||
version: v2.0.0
|
||||
args: build --snapshot --clean --timeout 90m ${{ steps.goreleaser_id.outputs.id }}
|
||||
|
||||
16
.github/workflows/triage.yaml
vendored
Normal file
16
.github/workflows/triage.yaml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: Triage Discussion
|
||||
on:
|
||||
discussion:
|
||||
types: [created]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
discussion_num:
|
||||
required: true
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/trivy-triage
|
||||
with:
|
||||
discussion_num: ${{ github.event.inputs.discussion_num }}
|
||||
@@ -1,4 +1,14 @@
|
||||
linters-settings:
|
||||
depguard:
|
||||
rules:
|
||||
main:
|
||||
list-mode: lax
|
||||
deny:
|
||||
# Cannot use gomodguard, which examines go.mod, as "golang.org/x/exp/slices" is not a module and doesn't appear in go.mod.
|
||||
- pkg: "golang.org/x/exp/slices"
|
||||
desc: "Use 'slices' instead"
|
||||
- pkg: "golang.org/x/exp/maps"
|
||||
desc: "Use 'maps' or 'github.com/samber/lo' instead"
|
||||
dupl:
|
||||
threshold: 100
|
||||
errcheck:
|
||||
@@ -74,13 +84,11 @@ linters-settings:
|
||||
ignore-generated-header: true
|
||||
testifylint:
|
||||
enable-all: true
|
||||
disable:
|
||||
- float-compare
|
||||
|
||||
linters:
|
||||
disable-all: true
|
||||
enable:
|
||||
- bodyclose
|
||||
- depguard
|
||||
- gci
|
||||
- goconst
|
||||
- gocritic
|
||||
|
||||
@@ -1 +1 @@
|
||||
{".":"0.52.0"}
|
||||
{".":"0.53.0"}
|
||||
|
||||
56
CHANGELOG.md
56
CHANGELOG.md
@@ -1,5 +1,61 @@
|
||||
# Changelog
|
||||
|
||||
## [0.53.0](https://github.com/aquasecurity/trivy/compare/v0.52.0...v0.53.0) (2024-07-01)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* **k8s:** node-collector dynamic commands support ([#6861](https://github.com/aquasecurity/trivy/issues/6861))
|
||||
* add clean subcommand ([#6993](https://github.com/aquasecurity/trivy/issues/6993))
|
||||
* **aws:** Remove aws subcommand ([#6995](https://github.com/aquasecurity/trivy/issues/6995))
|
||||
|
||||
### Features
|
||||
|
||||
* add clean subcommand ([#6993](https://github.com/aquasecurity/trivy/issues/6993)) ([8d0ae1f](https://github.com/aquasecurity/trivy/commit/8d0ae1f5de72d92a043dcd6b7c164d30e51b6047))
|
||||
* Add local ImageID to SARIF metadata ([#6522](https://github.com/aquasecurity/trivy/issues/6522)) ([f144e91](https://github.com/aquasecurity/trivy/commit/f144e912d34234f00b5a13b7a11a0019fa978b27))
|
||||
* add memory cache backend ([#7048](https://github.com/aquasecurity/trivy/issues/7048)) ([55ccd06](https://github.com/aquasecurity/trivy/commit/55ccd06df43f6ff28685f46d215ccb70f55916d2))
|
||||
* **aws:** Remove aws subcommand ([#6995](https://github.com/aquasecurity/trivy/issues/6995)) ([979e118](https://github.com/aquasecurity/trivy/commit/979e118a9e0ca8943bef9143f492d7eb1fd4d863))
|
||||
* **conda:** add licenses support for `environment.yml` files ([#6953](https://github.com/aquasecurity/trivy/issues/6953)) ([654217a](https://github.com/aquasecurity/trivy/commit/654217a65485ca0a07771ea61071977894eb4920))
|
||||
* **dart:** use first version of constraint for dependencies using SDK version ([#6239](https://github.com/aquasecurity/trivy/issues/6239)) ([042d6b0](https://github.com/aquasecurity/trivy/commit/042d6b08c283105c258a3dda98983b345a5305c3))
|
||||
* **image:** Set User-Agent header for Trivy container registry requests ([#6868](https://github.com/aquasecurity/trivy/issues/6868)) ([9b31697](https://github.com/aquasecurity/trivy/commit/9b31697274c8743d6e5a8f7a1a05daf60cd15910))
|
||||
* **java:** add support for `maven-metadata.xml` files for remote snapshot repositories. ([#6950](https://github.com/aquasecurity/trivy/issues/6950)) ([1f8fca1](https://github.com/aquasecurity/trivy/commit/1f8fca1fc77b989bb4e3ba820b297464dbdd825f))
|
||||
* **java:** add support for sbt projects using sbt-dependency-lock ([#6882](https://github.com/aquasecurity/trivy/issues/6882)) ([f18d035](https://github.com/aquasecurity/trivy/commit/f18d035ae13b281c96aa4ed69ca32e507d336e66))
|
||||
* **k8s:** node-collector dynamic commands support ([#6861](https://github.com/aquasecurity/trivy/issues/6861)) ([8d618e4](https://github.com/aquasecurity/trivy/commit/8d618e48a2f1b60c2e4c49cdd9deb8eb45c972b0))
|
||||
* **misconf:** add metadata to Cloud schema ([#6831](https://github.com/aquasecurity/trivy/issues/6831)) ([02d5404](https://github.com/aquasecurity/trivy/commit/02d540478d495416b50d7e8b187ff9f5bba41f45))
|
||||
* **misconf:** add support for AWS::EC2::SecurityGroupIngress/Egress ([#6755](https://github.com/aquasecurity/trivy/issues/6755)) ([55fa610](https://github.com/aquasecurity/trivy/commit/55fa6109cd0463fd3221aae41ca7b1d8c44ad430))
|
||||
* **misconf:** API Gateway V1 support for CloudFormation ([#6874](https://github.com/aquasecurity/trivy/issues/6874)) ([8491469](https://github.com/aquasecurity/trivy/commit/8491469f0b35bd9df706a433669f5b62239d4ef3))
|
||||
* **misconf:** support of selectors for all providers for Rego ([#6905](https://github.com/aquasecurity/trivy/issues/6905)) ([bc3741a](https://github.com/aquasecurity/trivy/commit/bc3741ae2c68cdd00fc0aef7e51985568b2eb78a))
|
||||
* **php:** add installed.json file support ([#4865](https://github.com/aquasecurity/trivy/issues/4865)) ([edc556b](https://github.com/aquasecurity/trivy/commit/edc556b85e3554c31e19b1ece189effb9ba2be12))
|
||||
* **plugin:** add support for nested archives ([#6845](https://github.com/aquasecurity/trivy/issues/6845)) ([622c67b](https://github.com/aquasecurity/trivy/commit/622c67b7647f94d0a0ca3acf711d8f847cdd8d98))
|
||||
* **sbom:** migrate to `CycloneDX v1.6` ([#6903](https://github.com/aquasecurity/trivy/issues/6903)) ([09e50ce](https://github.com/aquasecurity/trivy/commit/09e50ce6a82073ba62f1732d5aa0cd2701578693))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **c:** don't skip conan files from `file-patterns` and scan `.conan2` cache dir ([#6949](https://github.com/aquasecurity/trivy/issues/6949)) ([38b35dd](https://github.com/aquasecurity/trivy/commit/38b35dd3c804027e7a6e6a9d3c87b7ac333896c5))
|
||||
* **cli:** show info message only when --scanners is available ([#7032](https://github.com/aquasecurity/trivy/issues/7032)) ([e9fc3e3](https://github.com/aquasecurity/trivy/commit/e9fc3e3397564512038ddeca2adce0efcb3f93c5))
|
||||
* **cyclonedx:** trim non-URL info for `advisory.url` ([#6952](https://github.com/aquasecurity/trivy/issues/6952)) ([417212e](https://github.com/aquasecurity/trivy/commit/417212e0930aa52a27ebdc1b9370d2943ce0f8fa))
|
||||
* **debian:** take installed files from the origin layer ([#6849](https://github.com/aquasecurity/trivy/issues/6849)) ([089b953](https://github.com/aquasecurity/trivy/commit/089b953462260f01c40bdf588b2568ae0ef658bc))
|
||||
* **image:** parse `image.inspect.Created` field only for non-empty values ([#6948](https://github.com/aquasecurity/trivy/issues/6948)) ([0af5730](https://github.com/aquasecurity/trivy/commit/0af5730cbe56686417389c2fad643c1bdbb33999))
|
||||
* **license:** return license separation using separators `,`, `or`, etc. ([#6916](https://github.com/aquasecurity/trivy/issues/6916)) ([52f7aa5](https://github.com/aquasecurity/trivy/commit/52f7aa54b520a90a19736703f8ea63cc20fab104))
|
||||
* **misconf:** fix caching of modules in subdirectories ([#6814](https://github.com/aquasecurity/trivy/issues/6814)) ([0bcfedb](https://github.com/aquasecurity/trivy/commit/0bcfedbcaa9bbe30ee5ecade5b98e9ce3cc54c9b))
|
||||
* **misconf:** fix parsing of engine links and frameworks ([#6937](https://github.com/aquasecurity/trivy/issues/6937)) ([ec68c9a](https://github.com/aquasecurity/trivy/commit/ec68c9ab4580d057720179173d58734402c92af4))
|
||||
* **misconf:** handle source prefix to ignore ([#6945](https://github.com/aquasecurity/trivy/issues/6945)) ([c3192f0](https://github.com/aquasecurity/trivy/commit/c3192f061d7e84eaf38df8df7c879dc00b4ca137))
|
||||
* **misconf:** parsing numbers without fraction as int ([#6834](https://github.com/aquasecurity/trivy/issues/6834)) ([8141a13](https://github.com/aquasecurity/trivy/commit/8141a137ba50b553a9da877d95c7ccb491d041c6))
|
||||
* **nodejs:** fix infinite loop when package link from `package-lock.json` file is broken ([#6858](https://github.com/aquasecurity/trivy/issues/6858)) ([cf5aa33](https://github.com/aquasecurity/trivy/commit/cf5aa336e660e4c98481ebf8d15dd4e54c38581e))
|
||||
* **nodejs:** fix infinity loops for `pnpm` with cyclic imports ([#6857](https://github.com/aquasecurity/trivy/issues/6857)) ([7d083bc](https://github.com/aquasecurity/trivy/commit/7d083bc890eccc3bf32765c6d7e922cab2e2ef94))
|
||||
* **plugin:** respect `--insecure` ([#7022](https://github.com/aquasecurity/trivy/issues/7022)) ([3d02a31](https://github.com/aquasecurity/trivy/commit/3d02a31b44924f9e2495aae087f7ca9de3314db4))
|
||||
* **purl:** add missed os types ([#6955](https://github.com/aquasecurity/trivy/issues/6955)) ([2d85a00](https://github.com/aquasecurity/trivy/commit/2d85a003b22298d1101f84559f7c6b470f2b3909))
|
||||
* **python:** compare pkg names from `poetry.lock` and `pyproject.toml` in lowercase ([#6852](https://github.com/aquasecurity/trivy/issues/6852)) ([faa9d92](https://github.com/aquasecurity/trivy/commit/faa9d92cfeb8d924deda2dac583b6c97099c08d9))
|
||||
* **sbom:** don't overwrite `srcEpoch` when decoding SBOM files ([#6866](https://github.com/aquasecurity/trivy/issues/6866)) ([04af59c](https://github.com/aquasecurity/trivy/commit/04af59c2906bcfc7f7970b4e8f45a90f04313170))
|
||||
* **sbom:** fix panic when scanning SBOM file without root component into SBOM format ([#7051](https://github.com/aquasecurity/trivy/issues/7051)) ([3d4ae8b](https://github.com/aquasecurity/trivy/commit/3d4ae8b5be94cd9b00badeece8d86c2258b2cd90))
|
||||
* **sbom:** take pkg name from `purl` for maven pkgs ([#7008](https://github.com/aquasecurity/trivy/issues/7008)) ([a76e328](https://github.com/aquasecurity/trivy/commit/a76e3286c413de3dec55394fb41dd627dfee37ae))
|
||||
* **sbom:** use `purl` for `bitnami` pkg names ([#6982](https://github.com/aquasecurity/trivy/issues/6982)) ([7eabb92](https://github.com/aquasecurity/trivy/commit/7eabb92ec2e617300433445718be07ac74956454))
|
||||
* **sbom:** use package UIDs for uniqueness ([#7042](https://github.com/aquasecurity/trivy/issues/7042)) ([14d71ba](https://github.com/aquasecurity/trivy/commit/14d71ba63c39e51dd4179ba2d6002b46e1816e90))
|
||||
* **secret:** `Asymmetric Private Key` shouldn't start with space ([#6867](https://github.com/aquasecurity/trivy/issues/6867)) ([bb26445](https://github.com/aquasecurity/trivy/commit/bb26445e3df198df77930329f532ac5ab7a67af2))
|
||||
* **suse:** Add SLES 15.6 and Leap 15.6 ([#6964](https://github.com/aquasecurity/trivy/issues/6964)) ([5ee4e9d](https://github.com/aquasecurity/trivy/commit/5ee4e9d30ea814f60fd5705361cabf2e83a47a78))
|
||||
* use embedded when command path not found ([#7037](https://github.com/aquasecurity/trivy/issues/7037)) ([137c916](https://github.com/aquasecurity/trivy/commit/137c9164238ffd989a0c5ed24f23a55bbf341f6e))
|
||||
|
||||
## [0.52.0](https://github.com/aquasecurity/trivy/compare/v0.51.1...v0.52.0) (2024-06-03)
|
||||
|
||||
|
||||
|
||||
@@ -185,12 +185,20 @@ others:
|
||||
|
||||
The `<scope>` can be empty (e.g. if the change is a global or difficult to assign to a single component), in which case the parentheses are omitted.
|
||||
|
||||
**Breaking changes**
|
||||
|
||||
A PR, introducing a breaking API change, needs to append a `!` after the type/scope.
|
||||
|
||||
### Example titles
|
||||
|
||||
```
|
||||
feat(alma): add support for AlmaLinux
|
||||
```
|
||||
|
||||
```
|
||||
feat(vuln)!: delete the existing CLI flag
|
||||
```
|
||||
|
||||
```
|
||||
fix(oracle): handle advisories with ksplice versions
|
||||
```
|
||||
|
||||
59
docs/community/maintainer/backporting.md
Normal file
59
docs/community/maintainer/backporting.md
Normal file
@@ -0,0 +1,59 @@
|
||||
# Backporting Process
|
||||
|
||||
This document outlines the backporting process for Trivy, including when to create patch releases and how to perform the backporting.
|
||||
|
||||
## When to Create Patch Releases
|
||||
|
||||
In general, small changes should not be backported and should be included in the next minor release.
|
||||
However, patch releases should be made in the following cases:
|
||||
|
||||
* Fixes for HIGH or CRITICAL vulnerabilities in Trivy itself or Trivy's dependencies
|
||||
* Fixes for bugs that cause panic during Trivy execution or otherwise interfere with normal usage
|
||||
|
||||
In these cases, the fixes should be backported using the procedure [described below](#backporting-procedure).
|
||||
At the maintainer's discretion, other bug fixes may be included in the patch release containing these hotfixes.
|
||||
|
||||
## Versioning
|
||||
|
||||
Trivy follows [Semantic Versioning](https://semver.org/), using version numbers in the format MAJOR.MINOR.PATCH.
|
||||
When creating a patch release, the PATCH part of the version number is incremented.
|
||||
For example, if a fix is being distributed for v0.50.0, the patch release would be v0.50.1.
|
||||
|
||||
## Backporting Procedure
|
||||
|
||||
1. A release branch (e.g., `release/v0.50`) is automatically created when a new minor version is released.
|
||||
1. Create a pull request (PR) against the main branch with the necessary fixes. If the fixes are already merged into the main branch, skip this step.
|
||||
1. Once the PR with the fixes is merged, comment `@aqua-bot backport <release-branch>` on the PR (e.g., `@aqua-bot backport release/v0.50`). This will trigger the automated backporting process using GitHub Actions.
|
||||
1. The automated process will create a new PR with the backported changes. Ensure that all tests pass for this PR.
|
||||
1. Once the tests pass, merge the automatically created PR into the release branch.
|
||||
1. Merge [a release PR](release-flow.md) on the release branch and release the patch version.
|
||||
|
||||
!!! note
|
||||
Even if a conflict occurs, a PR is created by forceful commit, in which case the conflict should be resolved manually.
|
||||
If you want to re-run a backport of the same PR, close the existing PR, delete the branch and re-run it.
|
||||
|
||||
### Example
|
||||
To better understand the backporting procedure, let's walk through an example using the releases of v0.50.
|
||||
|
||||
```mermaid
|
||||
gitGraph:
|
||||
commit id:"Feature 1"
|
||||
commit id:"v0.50.0 release" tag:"v0.50.0"
|
||||
|
||||
branch "release/v0.50"
|
||||
|
||||
checkout main
|
||||
commit id:"Bugfix 1"
|
||||
|
||||
checkout "release/v0.50"
|
||||
cherry-pick id:"Bugfix 1"
|
||||
|
||||
checkout main
|
||||
commit id:"Feature 2"
|
||||
commit id:"Bugfix 2"
|
||||
commit id:"Feature 3"
|
||||
|
||||
checkout "release/v0.50"
|
||||
cherry-pick id:"Bugfix 2"
|
||||
commit id:"v0.50.1 release" tag:"v0.50.1"
|
||||
```
|
||||
@@ -35,9 +35,231 @@ to specify a built-in compliance report, select it by ID like `trivy --complianc
|
||||
For the list of built-in compliance reports, please see the relevant section:
|
||||
|
||||
- [Docker compliance](../target/container_image.md#compliance)
|
||||
- [Kubernetes compliance](../target/kubernetes.md#compliance)
|
||||
- [Kubernetes compliance](../target/kubernetes.md#compliance)
|
||||
- [AWS compliance](../target/aws.md#compliance)
|
||||
|
||||
## Contribute a Built-in Compliance Report
|
||||
|
||||
### Define a Compliance spec, based on CIS benchmark or other specs
|
||||
|
||||
Here is an example for CIS compliance report:
|
||||
|
||||
```yaml
|
||||
---
|
||||
spec:
|
||||
id: k8s-cis-1.23
|
||||
title: CIS Kubernetes Benchmarks v1.23
|
||||
description: CIS Kubernetes Benchmarks
|
||||
platform: k8s
|
||||
type: cis
|
||||
version: '1.23'
|
||||
relatedResources:
|
||||
- https://www.cisecurity.org/benchmark/kubernetes
|
||||
controls:
|
||||
- id: 1.1.1
|
||||
name: Ensure that the API server pod specification file permissions are set to
|
||||
600 or more restrictive
|
||||
description: Ensure that the API server pod specification file has permissions
|
||||
of 600 or more restrictive
|
||||
checks:
|
||||
- id: AVD-KCV-0073
|
||||
commands:
|
||||
- id: CMD-0001
|
||||
severity: HIGH
|
||||
|
||||
```
|
||||
|
||||
### Compliance ID
|
||||
|
||||
ID field is the name used to execute the compliance scan via trivy
|
||||
example:
|
||||
|
||||
```sh
|
||||
trivy k8s --compliance k8s-cis-1.23
|
||||
```
|
||||
|
||||
ID naming convention: {platform}-{type}-{version}
|
||||
|
||||
### Compliance Platform
|
||||
|
||||
The platform field specifies the type of platform on which to run this compliance report.
|
||||
Supported platforms:
|
||||
|
||||
- k8s (native kubernetes cluster)
|
||||
- eks (elastic kubernetes service)
|
||||
- aks (azure kubernetes service)
|
||||
- gke (google kubernetes engine)
|
||||
- rke2 (rancher kubernetes engine v2)
|
||||
- ocp (OpenShift Container Platform)
|
||||
- docker (docker engine)
|
||||
- aws (amazon web services)
|
||||
|
||||
### Compliance Type
|
||||
|
||||
The type field specifies the kind compliance report.
|
||||
|
||||
- cis (Center for Internet Security)
|
||||
- nsa (National Security Agency)
|
||||
- pss (Pod Security Standards)
|
||||
|
||||
### Compliance Version
|
||||
|
||||
The version field specifies the version of the compliance report.
|
||||
|
||||
- 1.23
|
||||
|
||||
### Compliance Check ID
|
||||
|
||||
Specify the check ID that needs to be evaluated based on the information collected from the command data output to assess the control.
|
||||
|
||||
Example of how to define check data under [checks folder](https://github.com/aquasecurity/trivy-checks/tree/main/checks):
|
||||
|
||||
```sh
|
||||
# METADATA
|
||||
# title: "Ensure that the --kubeconfig kubelet.conf file permissions are set to 600 or more restrictive"
|
||||
# description: "Ensure that the kubelet.conf file has permissions of 600 or more restrictive."
|
||||
# scope: package
|
||||
# schemas:
|
||||
# - input: schema["kubernetes"]
|
||||
# related_resources:
|
||||
# - https://www.cisecurity.org/benchmark/kubernetes
|
||||
# custom:
|
||||
# id: KCV0073
|
||||
# avd_id: AVD-KCV-0073
|
||||
# severity: HIGH
|
||||
# short_code: ensure-kubelet.conf-file-permissions-600-or-more-restrictive.
|
||||
# recommended_action: "Change the kubelet.conf file permissions to 600 or more restrictive if exist"
|
||||
# input:
|
||||
# selector:
|
||||
# - type: kubernetes
|
||||
package builtin.kubernetes.KCV0073
|
||||
|
||||
import data.lib.kubernetes
|
||||
|
||||
types := ["master", "worker"]
|
||||
|
||||
validate_kubelet_file_permission(sp) := {"kubeletConfFilePermissions": violation} {
|
||||
sp.kind == "NodeInfo"
|
||||
sp.type == types[_]
|
||||
violation := {permission | permission = sp.info.kubeletConfFilePermissions.values[_]; permission > 600}
|
||||
count(violation) > 0
|
||||
}
|
||||
|
||||
deny[res] {
|
||||
output := validate_kubelet_file_permission(input)
|
||||
msg := "Ensure that the --kubeconfig kubelet.conf file permissions are set to 600 or more restrictive"
|
||||
res := result.new(msg, output)
|
||||
}
|
||||
```
|
||||
|
||||
### Compliance Command ID
|
||||
|
||||
***Note:*** This field is not mandatory, it is relevant to k8s compliance report when node-collector is in use
|
||||
|
||||
Specify the command ID (#ref) that needs to be executed to collect the information required to evaluate the control.
|
||||
|
||||
Example of how to define command data under [commands folder](https://github.com/aquasecurity/trivy-checks/tree/main/commands)
|
||||
|
||||
```yaml
|
||||
---
|
||||
- id: CMD-0001
|
||||
key: kubeletConfFilePermissions
|
||||
title: kubelet.conf file permissions
|
||||
nodeType: worker
|
||||
audit: stat -c %a $kubelet.kubeconfig
|
||||
platfroms:
|
||||
- k8s
|
||||
- aks
|
||||
```
|
||||
|
||||
#### Command ID
|
||||
|
||||
Find the next command ID by running the command on [trivy-checks project](https://github.com/aquasecurity/trivy-checks).
|
||||
|
||||
```sh
|
||||
make command-id
|
||||
```
|
||||
|
||||
#### Command Key
|
||||
|
||||
- Re-use an existing key or specifiy a new one (make sure key name has no spaces)
|
||||
|
||||
Note: The key value should match the key name evaluated by the Rego check.
|
||||
|
||||
### Command Title
|
||||
|
||||
Represent the purpose of the command
|
||||
|
||||
### Command NodeType
|
||||
|
||||
Specify the node type on which the command is supposed to run.
|
||||
|
||||
- worker
|
||||
- master
|
||||
|
||||
### Command Audit
|
||||
|
||||
Specify here the shell command to be used please make sure to add error supression (2>/dev/null)
|
||||
|
||||
### Command Platforms
|
||||
|
||||
The list of platforms that support this command. Name should be taken from this list [Platforms](#compliance-platform)
|
||||
|
||||
### Command Config Files
|
||||
|
||||
The commands use a configuration file that helps obtain the paths to binaries and configuration files based on different platforms (e.g., Rancher, native Kubernetes, etc.).
|
||||
|
||||
For example:
|
||||
|
||||
```yaml
|
||||
kubelet:
|
||||
bins:
|
||||
- kubelet
|
||||
- hyperkube kubelet
|
||||
confs:
|
||||
- /etc/kubernetes/kubelet-config.yaml
|
||||
- /var/lib/kubelet/config.yaml
|
||||
```
|
||||
|
||||
### Commands Files Location
|
||||
|
||||
Currently checks files location are :`https://github.com/aquasecurity/trivy-checks/tree/main/checks`
|
||||
|
||||
Command files location: `https://github.com/aquasecurity/trivy-checks/tree/main/commands`
|
||||
under command file
|
||||
|
||||
Note: command config files will be located under `https://github.com/aquasecurity/trivy-checks/tree/main/commands` as well
|
||||
|
||||
### Node-collector output
|
||||
|
||||
The node collector will read commands and execute each command, and incorporate the output into the NodeInfo resource.
|
||||
|
||||
example:
|
||||
|
||||
```json
|
||||
{
|
||||
"apiVersion": "v1",
|
||||
"kind": "NodeInfo",
|
||||
"metadata": {
|
||||
"creationTimestamp": "2023-01-04T11:37:11+02:00"
|
||||
},
|
||||
"type": "master",
|
||||
"info": {
|
||||
"adminConfFileOwnership": {
|
||||
"values": [
|
||||
"root:root"
|
||||
]
|
||||
},
|
||||
"adminConfFilePermissions": {
|
||||
"values": [
|
||||
600
|
||||
]
|
||||
}
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Custom compliance
|
||||
|
||||
You can create your own custom compliance report. A compliance report is a simple YAML document in the following format:
|
||||
|
||||
@@ -9,52 +9,81 @@ The cache directory includes
|
||||
The cache option is common to all scanners.
|
||||
|
||||
## Clear Caches
|
||||
The `--clear-cache` option removes caches.
|
||||
`trivy clean` subcommand removes caches.
|
||||
|
||||
**The scan is not performed.**
|
||||
|
||||
```
|
||||
$ trivy image --clear-cache
|
||||
```bash
|
||||
$ trivy clean --scan-cache
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Result</summary>
|
||||
|
||||
```
|
||||
2019-11-15T15:13:26.209+0200 INFO Reopening vulnerability DB
|
||||
2019-11-15T15:13:26.209+0200 INFO Removing image caches...
|
||||
2024-06-21T21:58:21+04:00 INFO Removing scan cache...
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
If you want to delete cached vulnerability databases, use `--vuln-db`.
|
||||
You can also delete all caches with `--all`.
|
||||
See `trivy clean --help` for details.
|
||||
|
||||
## Cache Directory
|
||||
Specify where the cache is stored with `--cache-dir`.
|
||||
|
||||
```
|
||||
```bash
|
||||
$ trivy --cache-dir /tmp/trivy/ image python:3.4-alpine3.9
|
||||
```
|
||||
|
||||
## Cache Backend
|
||||
## Scan Cache Backend
|
||||
!!! warning "EXPERIMENTAL"
|
||||
This feature might change without preserving backwards compatibility.
|
||||
|
||||
Trivy supports local filesystem and Redis as the cache backend. This option is useful especially for client/server mode.
|
||||
Trivy utilizes a scan cache to store analysis results, such as package lists.
|
||||
It supports three types of backends for this cache:
|
||||
|
||||
Two options:
|
||||
|
||||
- `fs`
|
||||
- the cache path can be specified by `--cache-dir`
|
||||
- `redis://`
|
||||
- Local File System (`fs`)
|
||||
- The cache path can be specified by `--cache-dir`
|
||||
- Memory (`memory`)
|
||||
- Redis (`redis://`)
|
||||
- `redis://[HOST]:[PORT]`
|
||||
- TTL can be configured via `--cache-ttl`
|
||||
|
||||
### Local File System
|
||||
The local file system backend is the default choice for container and VM image scans.
|
||||
When scanning container images, it stores analysis results on a per-layer basis, using layer IDs as keys.
|
||||
This approach enables faster scans of the same container image or different images that share layers.
|
||||
|
||||
!!! note
|
||||
Internally, this backend uses [BoltDB][boltdb], which has an important limitation: only one process can access the cache at a time.
|
||||
Subsequent processes attempting to access the cache will be locked.
|
||||
For more details on this limitation, refer to the [troubleshooting guide][parallel-run].
|
||||
|
||||
### Memory
|
||||
The memory backend stores analysis results in memory, which means the cache is discarded when the process ends.
|
||||
This makes it useful in scenarios where caching is not required or desired.
|
||||
It serves as the default for repository, filesystem and SBOM scans and can also be employed for container image scans when caching is unnecessary.
|
||||
|
||||
To use the memory backend for a container image scan, you can use the following command:
|
||||
|
||||
```bash
|
||||
$ trivy image debian:11 --cache-backend memory
|
||||
```
|
||||
|
||||
### Redis
|
||||
|
||||
The Redis backend is particularly useful when you need to share the cache across multiple Trivy instances.
|
||||
You can set up Trivy to use a Redis backend with a command like this:
|
||||
|
||||
```bash
|
||||
$ trivy server --cache-backend redis://localhost:6379
|
||||
```
|
||||
|
||||
This approach allows for centralized caching, which can be beneficial in distributed or high-concurrency environments.
|
||||
|
||||
If you want to use TLS with Redis, you can enable it by specifying the `--redis-tls` flag.
|
||||
|
||||
```shell
|
||||
```bash
|
||||
$ trivy server --cache-backend redis://localhost:6379 --redis-tls
|
||||
```
|
||||
|
||||
@@ -71,6 +100,8 @@ $ trivy server --cache-backend redis://localhost:6379 \
|
||||
[trivy-db]: ./db.md#vulnerability-database
|
||||
[trivy-java-db]: ./db.md#java-index-database
|
||||
[misconf-checks]: ../scanner/misconfiguration/check/builtin.md
|
||||
[boltdb]: https://github.com/etcd-io/bbolt
|
||||
[parallel-run]: https://aquasecurity.github.io/trivy/v0.52/docs/references/troubleshooting/#running-in-parallel-takes-same-time-as-series-run
|
||||
|
||||
[^1]: Downloaded when scanning for vulnerabilities
|
||||
[^2]: Downloaded when scanning `jar/war/par/ear` files
|
||||
|
||||
@@ -78,8 +78,10 @@ $ trivy image --java-db-repository registry.gitlab.com/gitlab-org/security-produ
|
||||
`java-db-registry:latest` => `java-db-registry:latest`, but `java-db-registry` => `java-db-registry:1`.
|
||||
|
||||
## Remove DBs
|
||||
The `--reset` flag removes all caches and databases.
|
||||
"trivy clean" command removes caches and databases.
|
||||
|
||||
```
|
||||
$ trivy image --reset
|
||||
$ trivy clean --vuln-db --java-db
|
||||
2024-06-24T11:42:31+06:00 INFO Removing vulnerability database...
|
||||
2024-06-24T11:42:31+06:00 INFO Removing Java database...
|
||||
```
|
||||
@@ -64,6 +64,7 @@ The following languages are currently supported:
|
||||
| PHP | [composer.lock][composer-lock] |
|
||||
| Java | [pom.xml][pom-xml] |
|
||||
| | [*gradle.lockfile][gradle-lockfile] |
|
||||
| | [*.sbt.lock][sbt-lockfile] |
|
||||
| Dart | [pubspec.lock][pubspec-lock] |
|
||||
|
||||
This tree is the reverse of the dependency graph.
|
||||
@@ -447,5 +448,6 @@ $ trivy convert --format table --severity CRITICAL result.json
|
||||
[composer-lock]: ../coverage/language/php.md#composer
|
||||
[pom-xml]: ../coverage/language/java.md#pomxml
|
||||
[gradle-lockfile]: ../coverage/language/java.md#gradlelock
|
||||
[sbt-lockfile]: ../coverage/language/java.md#sbt
|
||||
[pubspec-lock]: ../coverage/language/dart.md#dart
|
||||
[cargo-binaries]: ../coverage/language/rust.md#binaries
|
||||
@@ -23,10 +23,11 @@ In order to detect dependencies, Trivy searches for `conan.lock`[^1].
|
||||
|
||||
### Licenses
|
||||
The Conan lock file doesn't contain any license information.
|
||||
To obtain licenses we parse the `conanfile.py` files from the [conan cache directory][conan-cache-dir].
|
||||
To obtain licenses we parse the `conanfile.py` files from the [conan v1 cache directory][conan-v1-cache-dir] and [conan v2 cache directory][conan-v2-cache-dir].
|
||||
To correctly detection licenses, ensure that the cache directory contains all dependencies used.
|
||||
|
||||
[conan-cache-dir]: https://docs.conan.io/1/mastering/custom_cache.html
|
||||
[conan-v1-cache-dir]: https://docs.conan.io/1/mastering/custom_cache.html
|
||||
[conan-v2-cache-dir]: https://docs.conan.io/2/reference/environment.html#conan-home
|
||||
[dependency-graph]: ../../configuration/reporting.md#show-origins-of-vulnerable-dependencies
|
||||
|
||||
[^1]: The local cache should contain the dependencies used. See [licenses](#licenses).
|
||||
|
||||
@@ -4,9 +4,9 @@ Trivy supports [Dart][dart].
|
||||
|
||||
The following scanners are supported.
|
||||
|
||||
| Package manager | SBOM | Vulnerability | License |
|
||||
|-------------------------| :---: | :-----------: |:-------:|
|
||||
| [Dart][dart-repository] | ✓ | ✓ | - |
|
||||
| Package manager | SBOM | Vulnerability | License |
|
||||
|-------------------------|:----:|:-------------:|:-------:|
|
||||
| [Dart][dart-repository] | ✓ | ✓ | - |
|
||||
|
||||
The following table provides an outline of the features Trivy offers.
|
||||
|
||||
@@ -21,6 +21,24 @@ In order to detect dependencies, Trivy searches for `pubspec.lock`.
|
||||
Trivy marks indirect dependencies, but `pubspec.lock` file doesn't have options to separate root and dev transitive dependencies.
|
||||
So Trivy includes all dependencies in report.
|
||||
|
||||
### SDK dependencies
|
||||
Dart uses version `0.0.0` for SDK dependencies (e.g. Flutter). It is not possible to accurately determine the versions of these dependencies.
|
||||
|
||||
Therefore, we use the first version of the constraint for the SDK.
|
||||
|
||||
For example in this case the version of `flutter` should be `3.3.0`:
|
||||
```yaml
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
sdks:
|
||||
dart: ">=2.18.0 <3.0.0"
|
||||
flutter: "^3.3.0"
|
||||
```
|
||||
|
||||
### Dependency tree
|
||||
To build `dependency tree` Trivy parses [cache directory][cache-directory]. Currently supported default directories and `PUB_CACHE` environment (absolute path only).
|
||||
!!! note
|
||||
Make sure the cache directory contains all the dependencies installed in your application. To download missing dependencies, use `dart pub get` command.
|
||||
|
||||
@@ -66,7 +66,7 @@ such as `go mod download`, `go mod tidy`, etc.
|
||||
Trivy traverses `$GOPATH/pkg/mod` and collects those extra information.
|
||||
|
||||
### Go binaries
|
||||
Trivy scans binaries built by Go.
|
||||
Trivy scans binaries built by Go, which include [module information](https://tip.golang.org/doc/go1.18#go-version).
|
||||
If there is a Go binary in your container image, Trivy automatically finds and scans it.
|
||||
|
||||
Also, you can scan your local binaries.
|
||||
|
||||
@@ -26,7 +26,8 @@ On the other hand, when the target is a post-build artifact, like a container im
|
||||
| | egg package[^1] | ✅ | ✅ | - | - |
|
||||
| | wheel package[^2] | ✅ | ✅ | - | - |
|
||||
| | conda package[^3] | ✅ | ✅ | - | - |
|
||||
| [PHP](php.md) | composer.lock | ✅ | ✅ | ✅ | ✅ |
|
||||
| [PHP](php.md) | composer.lock | - | - | ✅ | ✅ |
|
||||
| | installed.json | ✅ | ✅ | - | - |
|
||||
| [Node.js](nodejs.md) | package-lock.json | - | - | ✅ | ✅ |
|
||||
| | yarn.lock | - | - | ✅ | ✅ |
|
||||
| | pnpm-lock.yaml | - | - | ✅ | ✅ |
|
||||
@@ -38,6 +39,7 @@ On the other hand, when the target is a post-build artifact, like a container im
|
||||
| [Java](java.md) | JAR/WAR/PAR/EAR[^4] | ✅ | ✅ | - | - |
|
||||
| | pom.xml | - | - | ✅ | ✅ |
|
||||
| | *gradle.lockfile | - | - | ✅ | ✅ |
|
||||
| | *.sbt.lock | - | - | ✅ | ✅ |
|
||||
| [Go](golang.md) | Binaries built by Go | ✅ | ✅ | - | - |
|
||||
| | go.mod | - | - | ✅ | ✅ |
|
||||
| [Rust](rust.md) | Cargo.lock | ✅ | ✅ | ✅ | ✅ |
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Java
|
||||
Trivy supports three types of Java scanning: `JAR/WAR/PAR/EAR`, `pom.xml` and `*gradle.lockfile` files.
|
||||
Trivy supports four types of Java scanning: `JAR/WAR/PAR/EAR`, `pom.xml`, `*gradle.lockfile` and `*.sbt.lock` files.
|
||||
|
||||
Each artifact supports the following scanners:
|
||||
|
||||
@@ -8,6 +8,7 @@ Each artifact supports the following scanners:
|
||||
| JAR/WAR/PAR/EAR | ✓ | ✓ | - |
|
||||
| pom.xml | ✓ | ✓ | ✓ |
|
||||
| *gradle.lockfile | ✓ | ✓ | ✓ |
|
||||
| *.sbt.lock | ✓ | ✓ | - |
|
||||
|
||||
The following table provides an outline of the features Trivy offers.
|
||||
|
||||
@@ -16,6 +17,7 @@ The following table provides an outline of the features Trivy offers.
|
||||
| JAR/WAR/PAR/EAR | Trivy Java DB | Include | - | - |
|
||||
| pom.xml | Maven repository [^1] | Exclude | ✓ | ✓[^7] |
|
||||
| *gradle.lockfile | - | Exclude | ✓ | ✓ |
|
||||
| *.sbt.lock | - | Exclude | - | ✓ |
|
||||
|
||||
These may be enabled or disabled depending on the target.
|
||||
See [here](./index.md) for the detail.
|
||||
@@ -94,6 +96,15 @@ Trity also can detect licenses for dependencies.
|
||||
|
||||
Make sure that you have cache[^8] directory to find licenses from `*.pom` dependency files.
|
||||
|
||||
|
||||
## SBT
|
||||
|
||||
`build.sbt.lock` files only contain information about used dependencies. This requires a lockfile generated using the
|
||||
[sbt-dependency-lock][sbt-dependency-lock] plugin.
|
||||
|
||||
!!!note
|
||||
All necessary files are checked locally. SBT file scanning doesn't require internet access.
|
||||
|
||||
[^1]: Uses maven repository to get information about dependencies. Internet access required.
|
||||
[^2]: It means `*.jar`, `*.war`, `*.par` and `*.ear` file
|
||||
[^3]: `ArtifactID`, `GroupID` and `Version`
|
||||
@@ -106,4 +117,5 @@ Make sure that you have cache[^8] directory to find licenses from `*.pom` depend
|
||||
[dependency-graph]: ../../configuration/reporting.md#show-origins-of-vulnerable-dependencies
|
||||
[maven-invoker-plugin]: https://maven.apache.org/plugins/maven-invoker-plugin/usage.html
|
||||
[maven-central]: https://repo.maven.apache.org/maven2/
|
||||
[maven-pom-repos]: https://maven.apache.org/settings.html#repositories
|
||||
[maven-pom-repos]: https://maven.apache.org/settings.html#repositories
|
||||
[sbt-dependency-lock]: https://stringbean.github.io/sbt-dependency-lock
|
||||
|
||||
@@ -4,23 +4,27 @@ Trivy supports [Composer][composer], which is a tool for dependency management i
|
||||
|
||||
The following scanners are supported.
|
||||
|
||||
| Package manager | SBOM | Vulnerability | License |
|
||||
| --------------- | :---: | :-----------: | :-----: |
|
||||
| Composer | ✓ | ✓ | ✓ |
|
||||
| Package manager | SBOM | Vulnerability | License |
|
||||
|-----------------|:----:|:-------------:|:-------:|
|
||||
| Composer | ✓ | ✓ | ✓ |
|
||||
|
||||
The following table provides an outline of the features Trivy offers.
|
||||
|
||||
|
||||
| Package manager | File | Transitive dependencies | Dev dependencies | [Dependency graph][dependency-graph] | Position |
|
||||
|-----------------|---------------|:-----------------------:|:----------------:|:------------------------------------:|:--------:|
|
||||
| Composer | composer.lock | ✓ | Excluded | ✓ | ✓ |
|
||||
| Package manager | File | Transitive dependencies | Dev dependencies | [Dependency graph][dependency-graph] | Position |
|
||||
|-----------------|----------------|:-----------------------:|:----------------:|:------------------------------------:|:--------:|
|
||||
| Composer | composer.lock | ✓ | Excluded | ✓ | ✓ |
|
||||
| Composer | installed.json | ✓ | Excluded | - | ✓ |
|
||||
|
||||
## Composer
|
||||
## composer.lock
|
||||
In order to detect dependencies, Trivy searches for `composer.lock`.
|
||||
|
||||
Trivy also supports dependency trees; however, to display an accurate tree, it needs to know whether each package is a direct dependency of the project.
|
||||
Since this information is not included in `composer.lock`, Trivy parses `composer.json`, which should be located next to `composer.lock`.
|
||||
If you want to see the dependency tree, please ensure that `composer.json` is present.
|
||||
|
||||
## installed.json
|
||||
Trivy also supports dependency detection for `installed.json` files. By default, you can find this file at `path_to_app/vendor/composer/installed.json`.
|
||||
|
||||
[composer]: https://getcomposer.org/
|
||||
[dependency-graph]: ../../configuration/reporting.md#show-origins-of-vulnerable-dependencies
|
||||
@@ -6,31 +6,38 @@ Trivy supports the following scanners for Conda packages.
|
||||
|:-------------:|:---------:|
|
||||
| SBOM | ✓ |
|
||||
| Vulnerability | - |
|
||||
| License | ✓[^1] |
|
||||
| License | ✓ |
|
||||
|
||||
|
||||
## SBOM
|
||||
Trivy detects packages that have been installed with `Conda`.
|
||||
|
||||
## `<package>.json`
|
||||
### SBOM
|
||||
Trivy parses `<conda-root>/envs/<env>/conda-meta/<package>.json` files to find the dependencies installed in your env.
|
||||
|
||||
### `<package>.json`
|
||||
Trivy parses `<conda-root>/envs/<env>/conda-meta/<package>.json` files to find the version and license for the dependencies installed in your env.
|
||||
### License
|
||||
The `<package>.json` files contain package license information.
|
||||
Trivy includes licenses for the packages it finds without having to parse additional files.
|
||||
|
||||
### `environment.yml`[^2]
|
||||
Trivy supports parsing [environment.yml][environment.yml][^2] files to find dependency list.
|
||||
## `environment.yml`[^1]
|
||||
### SBOM
|
||||
Trivy supports parsing [environment.yml][environment.yml][^1] files to find dependency list.
|
||||
|
||||
!!! note
|
||||
License detection is currently not supported.
|
||||
|
||||
`environment.yml`[^2] files supports [version range][env-version-range]. We can't be sure about versions for these dependencies.
|
||||
Therefore, you need to use `conda env export` command to get dependency list in `Conda` default format before scanning `environment.yml`[^2] file.
|
||||
`environment.yml`[^1] files supports [version range][env-version-range]. We can't be sure about versions for these dependencies.
|
||||
Therefore, you need to use `conda env export` command to get dependency list in `Conda` default format before scanning `environment.yml`[^1] file.
|
||||
|
||||
!!! note
|
||||
For dependencies in a non-Conda format, Trivy doesn't include a version of them.
|
||||
|
||||
### License
|
||||
Trivy parses `conda-meta/<package>.json` files at the [prefix] path.
|
||||
|
||||
[^1]: License detection is only supported for `<package>.json` files
|
||||
[^2]: Trivy supports both `yaml` and `yml` extensions.
|
||||
To correctly define licenses, make sure your `environment.yml`[^1] contains `prefix` field and `prefix` directory contains `package.json` files.
|
||||
|
||||
!!! note
|
||||
To get correct `environment.yml`[^1] file and fill `prefix` directory - use `conda env export` command.
|
||||
|
||||
[^1]: Trivy supports both `yaml` and `yml` extensions.
|
||||
|
||||
[environment.yml]: https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#sharing-an-environment
|
||||
[env-version-range]: https://docs.conda.io/projects/conda-build/en/latest/resources/package-spec.html#examples-of-package-specs
|
||||
[prefix]: https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#specifying-a-location-for-an-environment
|
||||
|
||||
@@ -40,8 +40,6 @@ $ trivy plugin install referrer
|
||||
|
||||
This command will download the plugin and install it in the plugin cache.
|
||||
|
||||
|
||||
|
||||
Trivy adheres to the XDG specification, so the location depends on whether XDG_DATA_HOME is set.
|
||||
Trivy will now search XDG_DATA_HOME for the location of the Trivy plugins cache.
|
||||
The preference order is as follows:
|
||||
@@ -55,7 +53,10 @@ Furthermore, it is possible to download plugins that are not registered in the i
|
||||
$ trivy plugin install github.com/aquasecurity/trivy-plugin-kubectl
|
||||
```
|
||||
```bash
|
||||
$ trivy plugin install myplugin.tar.gz
|
||||
$ trivy plugin install https://github.com/aquasecurity/trivy-plugin-kubectl/archive/refs/heads/main.zip
|
||||
```
|
||||
```bash
|
||||
$ trivy plugin install ./myplugin.tar.gz
|
||||
```
|
||||
|
||||
If the plugin's Git repository is [properly tagged](./developer-guide.md#tagging-plugin-repositories), you can specify the version to install like this:
|
||||
|
||||
@@ -43,7 +43,7 @@ trivy [global flags] command [flags] target
|
||||
|
||||
### SEE ALSO
|
||||
|
||||
* [trivy aws](trivy_aws.md) - [EXPERIMENTAL] Scan AWS account
|
||||
* [trivy clean](trivy_clean.md) - Remove cached files
|
||||
* [trivy config](trivy_config.md) - Scan config files for misconfigurations
|
||||
* [trivy convert](trivy_convert.md) - Convert Trivy JSON report into a different format
|
||||
* [trivy filesystem](trivy_filesystem.md) - Scan local filesystem
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
## trivy aws
|
||||
|
||||
[EXPERIMENTAL] Scan AWS account
|
||||
|
||||
### Synopsis
|
||||
|
||||
Scan an AWS account for misconfigurations. Trivy uses the same authentication methods as the AWS CLI. See https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html
|
||||
|
||||
The following services are supported:
|
||||
|
||||
- accessanalyzer
|
||||
- api-gateway
|
||||
- athena
|
||||
- cloudfront
|
||||
- cloudtrail
|
||||
- cloudwatch
|
||||
- codebuild
|
||||
- documentdb
|
||||
- dynamodb
|
||||
- ec2
|
||||
- ecr
|
||||
- ecs
|
||||
- efs
|
||||
- eks
|
||||
- elasticache
|
||||
- elasticsearch
|
||||
- elb
|
||||
- emr
|
||||
- iam
|
||||
- kinesis
|
||||
- kms
|
||||
- lambda
|
||||
- mq
|
||||
- msk
|
||||
- neptune
|
||||
- rds
|
||||
- redshift
|
||||
- s3
|
||||
- sns
|
||||
- sqs
|
||||
- ssm
|
||||
- workspaces
|
||||
|
||||
|
||||
```
|
||||
trivy aws [flags]
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
# basic scanning
|
||||
$ trivy aws --region us-east-1
|
||||
|
||||
# limit scan to a single service:
|
||||
$ trivy aws --region us-east-1 --service s3
|
||||
|
||||
# limit scan to multiple services:
|
||||
$ trivy aws --region us-east-1 --service s3 --service ec2
|
||||
|
||||
# force refresh of cache for fresh results
|
||||
$ trivy aws --region us-east-1 --update-cache
|
||||
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
```
|
||||
--account string The AWS account to scan. It's useful to specify this when reviewing cached results for multiple accounts.
|
||||
--arn string The AWS ARN to show results for. Useful to filter results once a scan is cached.
|
||||
--cf-params strings specify paths to override the CloudFormation parameters files
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--compliance string compliance report to generate (aws-cis-1.2,aws-cis-1.4)
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
--dependency-tree [EXPERIMENTAL] show dependency origin tree of vulnerable packages
|
||||
--endpoint string AWS Endpoint override
|
||||
--exit-code int specify exit code when any security issues are found
|
||||
-f, --format string format (table,json,template,sarif,cyclonedx,spdx,spdx-json,github,cosign-vuln) (default "table")
|
||||
--helm-api-versions strings Available API versions used for Capabilities.APIVersions. This flag is the same as the api-versions flag of the helm template command. (can specify multiple or separate values with commas: policy/v1/PodDisruptionBudget,apps/v1/Deployment)
|
||||
--helm-kube-version string Kubernetes version used for Capabilities.KubeVersion. This flag is the same as the kube-version flag of the helm template command.
|
||||
--helm-set strings specify Helm values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)
|
||||
--helm-set-file strings specify Helm values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)
|
||||
--helm-set-string strings specify Helm string values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)
|
||||
--helm-values strings specify paths to override the Helm values.yaml files
|
||||
-h, --help help for aws
|
||||
--ignore-policy string specify the Rego file path to evaluate each vulnerability
|
||||
--ignorefile string specify .trivyignore file (default ".trivyignore")
|
||||
--include-deprecated-checks include deprecated checks
|
||||
--include-non-failures include successes and exceptions, available with '--scanners misconfig'
|
||||
--list-all-pkgs output all packages in the JSON report regardless of vulnerability
|
||||
--max-cache-age duration The maximum age of the cloud cache. Cached data will be required from the cloud provider if it is older than this. (default 24h0m0s)
|
||||
--misconfig-scanners strings comma-separated list of misconfig scanners to use for misconfiguration scanning (default [azure-arm,cloudformation,dockerfile,helm,kubernetes,terraform,terraformplan-json,terraformplan-snapshot])
|
||||
-o, --output string output file name
|
||||
--output-plugin-arg string [EXPERIMENTAL] output plugin arguments
|
||||
--region string AWS Region to scan
|
||||
--report string specify a report format for the output (all,summary) (default "all")
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--service strings Only scan AWS Service(s) specified with this flag. Can specify multiple services using --service A --service B etc.
|
||||
-s, --severity strings severities of security issues to be displayed (UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL) (default [UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL])
|
||||
--skip-check-update skip fetching rego check updates
|
||||
--skip-service strings Skip selected AWS Service(s) specified with this flag. Can specify multiple services using --skip-service A --skip-service B etc.
|
||||
-t, --template string output template
|
||||
--tf-exclude-downloaded-modules exclude misconfigurations for downloaded terraform modules
|
||||
--tf-vars strings specify paths to override the Terraform tfvars files
|
||||
--trace enable more verbose trace output for custom queries
|
||||
--update-cache Update the cache for the applicable cloud provider instead of using cached results.
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
||||
```
|
||||
--cache-dir string cache directory (default "/path/to/cache")
|
||||
-c, --config string config path (default "trivy.yaml")
|
||||
-d, --debug debug mode
|
||||
--generate-default-config write the default config to trivy-default.yaml
|
||||
--insecure allow insecure server connections
|
||||
-q, --quiet suppress progress bar and log output
|
||||
--timeout duration timeout (default 5m0s)
|
||||
-v, --version show version
|
||||
```
|
||||
|
||||
### SEE ALSO
|
||||
|
||||
* [trivy](trivy.md) - Unified security scanner
|
||||
|
||||
50
docs/docs/references/configuration/cli/trivy_clean.md
Normal file
50
docs/docs/references/configuration/cli/trivy_clean.md
Normal file
@@ -0,0 +1,50 @@
|
||||
## trivy clean
|
||||
|
||||
Remove cached files
|
||||
|
||||
```
|
||||
trivy clean [flags]
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
# Remove all caches
|
||||
$ trivy clean --all
|
||||
|
||||
# Remove scan cache
|
||||
$ trivy clean --scan-cache
|
||||
|
||||
# Remove vulnerability database
|
||||
$ trivy clean --vuln-db
|
||||
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
```
|
||||
-a, --all remove all caches
|
||||
--checks-bundle remove checks bundle
|
||||
-h, --help help for clean
|
||||
--java-db remove Java database
|
||||
--scan-cache remove scan cache (container and VM image analysis results)
|
||||
--vuln-db remove vulnerability database
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
||||
```
|
||||
--cache-dir string cache directory (default "/path/to/cache")
|
||||
-c, --config string config path (default "trivy.yaml")
|
||||
-d, --debug debug mode
|
||||
--generate-default-config write the default config to trivy-default.yaml
|
||||
--insecure allow insecure server connections
|
||||
-q, --quiet suppress progress bar and log output
|
||||
--timeout duration timeout (default 5m0s)
|
||||
-v, --version show version
|
||||
```
|
||||
|
||||
### SEE ALSO
|
||||
|
||||
* [trivy](trivy.md) - Unified security scanner
|
||||
|
||||
@@ -9,12 +9,11 @@ trivy config [flags] DIR
|
||||
### Options
|
||||
|
||||
```
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "memory")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--cf-params strings specify paths to override the CloudFormation parameters files
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--compliance string compliance report to generate
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
@@ -45,7 +44,6 @@ trivy config [flags] DIR
|
||||
--redis-tls enable redis TLS with public certificates, if using redis as cache backend
|
||||
--registry-token string registry token
|
||||
--report string specify a compliance report format for the output (all,summary) (default "all")
|
||||
--reset-checks-bundle remove checks bundle
|
||||
-s, --severity strings severities of security issues to be displayed (UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL) (default [UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL])
|
||||
--skip-check-update skip fetching rego check updates
|
||||
--skip-dirs strings specify the directories or glob patterns to skip
|
||||
|
||||
@@ -19,12 +19,11 @@ trivy filesystem [flags] PATH
|
||||
### Options
|
||||
|
||||
```
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "memory")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--cf-params strings specify paths to override the CloudFormation parameters files
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--compliance string compliance report to generate
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
@@ -71,8 +70,6 @@ trivy filesystem [flags] PATH
|
||||
--registry-token string registry token
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--report string specify a compliance report format for the output (all,summary) (default "all")
|
||||
--reset remove all caches and database
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,misconfig,secret,license) (default [vuln,secret])
|
||||
--secret-config string specify a path to config file for secret scanning (default "trivy-secret.yaml")
|
||||
|
||||
@@ -34,12 +34,11 @@ trivy image [flags] IMAGE_NAME
|
||||
### Options
|
||||
|
||||
```
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--compliance string compliance report to generate (docker-cis)
|
||||
--compliance string compliance report to generate (docker-cis-1.6.0)
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
--custom-headers strings custom headers in client mode
|
||||
@@ -92,8 +91,6 @@ trivy image [flags] IMAGE_NAME
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine)
|
||||
--report string specify a format for the compliance report. (all,summary) (default "summary")
|
||||
--reset remove all caches and database
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,misconfig,secret,license) (default [vuln,secret])
|
||||
--secret-config string specify a path to config file for secret scanning (default "trivy-secret.yaml")
|
||||
|
||||
@@ -30,12 +30,11 @@ trivy kubernetes [flags] [CONTEXT]
|
||||
|
||||
```
|
||||
--burst int specify the maximum burst for throttle (default 10)
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--compliance string compliance report to generate (k8s-nsa,k8s-cis,k8s-pss-baseline,k8s-pss-restricted)
|
||||
--compliance string compliance report to generate (k8s-nsa-1.0,k8s-cis-1.23,eks-cis-1.4,rke2-cis-1.24,k8s-pss-baseline-0.1,k8s-pss-restricted-0.1)
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
--db-repository string OCI repository to retrieve trivy-db from (default "ghcr.io/aquasecurity/trivy-db:2")
|
||||
@@ -72,7 +71,7 @@ trivy kubernetes [flags] [CONTEXT]
|
||||
--list-all-pkgs output all packages in the JSON report regardless of vulnerability
|
||||
--misconfig-scanners strings comma-separated list of misconfig scanners to use for misconfiguration scanning (default [azure-arm,cloudformation,dockerfile,helm,kubernetes,terraform,terraformplan-json,terraformplan-snapshot])
|
||||
--no-progress suppress progress bar
|
||||
--node-collector-imageref string indicate the image reference for the node-collector scan job (default "ghcr.io/aquasecurity/node-collector:0.2.1")
|
||||
--node-collector-imageref string indicate the image reference for the node-collector scan job (default "ghcr.io/aquasecurity/node-collector:0.3.1")
|
||||
--node-collector-namespace string specify the namespace in which the node-collector job should be deployed (default "trivy-temp")
|
||||
--offline-scan do not issue API requests to identify dependencies
|
||||
-o, --output string output file name
|
||||
@@ -87,8 +86,6 @@ trivy kubernetes [flags] [CONTEXT]
|
||||
--registry-token string registry token
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--report string specify a report format for the output (all,summary) (default "all")
|
||||
--reset remove all caches and database
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,misconfig,secret,rbac) (default [vuln,misconfig,secret,rbac])
|
||||
--secret-config string specify a path to config file for secret scanning (default "trivy-secret.yaml")
|
||||
|
||||
@@ -19,12 +19,11 @@ trivy repository [flags] (REPO_PATH | REPO_URL)
|
||||
|
||||
```
|
||||
--branch string pass the branch name to be scanned
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "memory")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--cf-params strings specify paths to override the CloudFormation parameters files
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--commit string pass the commit hash to be scanned
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
@@ -70,8 +69,6 @@ trivy repository [flags] (REPO_PATH | REPO_URL)
|
||||
--redis-tls enable redis TLS with public certificates, if using redis as cache backend
|
||||
--registry-token string registry token
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--reset remove all caches and database
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,misconfig,secret,license) (default [vuln,secret])
|
||||
--secret-config string specify a path to config file for secret scanning (default "trivy-secret.yaml")
|
||||
|
||||
@@ -22,12 +22,11 @@ trivy rootfs [flags] ROOTDIR
|
||||
### Options
|
||||
|
||||
```
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "memory")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--cf-params strings specify paths to override the CloudFormation parameters files
|
||||
--check-namespaces strings Rego namespaces
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--config-check strings specify the paths to the Rego check files or to the directories containing them, applying config files
|
||||
--config-data strings specify paths from which data for the Rego checks will be recursively loaded
|
||||
--custom-headers strings custom headers in client mode
|
||||
@@ -72,8 +71,6 @@ trivy rootfs [flags] ROOTDIR
|
||||
--redis-tls enable redis TLS with public certificates, if using redis as cache backend
|
||||
--registry-token string registry token
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--reset remove all caches and database
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,misconfig,secret,license) (default [vuln,secret])
|
||||
--secret-config string specify a path to config file for secret scanning (default "trivy-secret.yaml")
|
||||
|
||||
@@ -20,9 +20,8 @@ trivy sbom [flags] SBOM_PATH
|
||||
### Options
|
||||
|
||||
```
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "memory")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--clear-cache clear image caches without scanning
|
||||
--compliance string compliance report to generate
|
||||
--custom-headers strings custom headers in client mode
|
||||
--db-repository string OCI repository to retrieve trivy-db from (default "ghcr.io/aquasecurity/trivy-db:2")
|
||||
@@ -49,7 +48,6 @@ trivy sbom [flags] SBOM_PATH
|
||||
--redis-key string redis key file location, if using redis as cache backend
|
||||
--redis-tls enable redis TLS with public certificates, if using redis as cache backend
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--reset remove all caches and database
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,license) (default [vuln])
|
||||
--server string server address in client mode
|
||||
|
||||
@@ -20,9 +20,8 @@ trivy server [flags]
|
||||
### Options
|
||||
|
||||
```
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--clear-cache clear image caches without scanning
|
||||
--db-repository string OCI repository to retrieve trivy-db from (default "ghcr.io/aquasecurity/trivy-db:2")
|
||||
--download-db-only download/update vulnerability database but don't run a scan
|
||||
--enable-modules strings [EXPERIMENTAL] module names to enable
|
||||
@@ -36,7 +35,6 @@ trivy server [flags]
|
||||
--redis-key string redis key file location, if using redis as cache backend
|
||||
--redis-tls enable redis TLS with public certificates, if using redis as cache backend
|
||||
--registry-token string registry token
|
||||
--reset remove all caches and database
|
||||
--skip-db-update skip updating vulnerability database
|
||||
--token string for authentication in client/server mode
|
||||
--token-header string specify a header name for token in client/server mode (default "Trivy-Token")
|
||||
|
||||
@@ -21,10 +21,9 @@ trivy vm [flags] VM_IMAGE
|
||||
|
||||
```
|
||||
--aws-region string AWS region to scan
|
||||
--cache-backend string cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-backend string [EXPERIMENTAL] cache backend (e.g. redis://localhost:6379) (default "fs")
|
||||
--cache-ttl duration cache TTL when using redis as cache backend
|
||||
--checks-bundle-repository string OCI registry URL to retrieve checks bundle from (default "ghcr.io/aquasecurity/trivy-checks:0")
|
||||
--clear-cache clear image caches without scanning
|
||||
--compliance string compliance report to generate
|
||||
--custom-headers strings custom headers in client mode
|
||||
--db-repository string OCI repository to retrieve trivy-db from (default "ghcr.io/aquasecurity/trivy-db:2")
|
||||
@@ -62,8 +61,6 @@ trivy vm [flags] VM_IMAGE
|
||||
--redis-key string redis key file location, if using redis as cache backend
|
||||
--redis-tls enable redis TLS with public certificates, if using redis as cache backend
|
||||
--rekor-url string [EXPERIMENTAL] address of rekor STL server (default "https://rekor.sigstore.dev")
|
||||
--reset remove all caches and database
|
||||
--reset-checks-bundle remove checks bundle
|
||||
--sbom-sources strings [EXPERIMENTAL] try to retrieve SBOM from the specified sources (oci,rekor)
|
||||
--scanners strings comma-separated list of what security issues to detect (vuln,misconfig,secret,license) (default [vuln,secret])
|
||||
--secret-config string specify a path to config file for secret scanning (default "trivy-secret.yaml")
|
||||
|
||||
@@ -264,10 +264,10 @@ $ brew install aquasecurity/trivy/trivy
|
||||
## Others
|
||||
### Unknown error
|
||||
|
||||
Try again with `--reset` option:
|
||||
Try again after running `trivy clean --all`:
|
||||
|
||||
```
|
||||
$ trivy image --reset
|
||||
$ trivy clean --all
|
||||
```
|
||||
|
||||
[air-gapped]: ../advanced/air-gap.md
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
# Vulnerability Scanning
|
||||
Trivy detects known vulnerabilities according to the versions of installed packages.
|
||||
Trivy detects known vulnerabilities in software components that it finds in the scan target.
|
||||
|
||||
The following packages are supported.
|
||||
The following are supported:
|
||||
|
||||
- [OS packages](#os-packages)
|
||||
- [Language-specific packages](#language-specific-packages)
|
||||
- [Kubernetes components (control plane, node and addons)](#kubernetes)
|
||||
|
||||
Trivy also detects known vulnerabilities in Kubernetes components using KBOM (Kubernetes bill of Material) scanning. To learn more, see the [documentation for Kubernetes scanning](../target/kubernetes.md#KBOM).
|
||||
- [Non-packaged software](#non-packaged-software)
|
||||
- [Kubernetes components](#kubernetes)
|
||||
|
||||
## OS Packages
|
||||
Trivy is capable of automatically detecting installed OS packages when scanning container images, VM images and running hosts.
|
||||
@@ -66,7 +65,44 @@ If the data source does not provide a severity, the severity is determined based
|
||||
| 7.0-8.9 | High |
|
||||
| 9.0-10.0 | Critical |
|
||||
|
||||
If the CVSS score is also not provided, it falls back to [NVD][nvd], and if NVD does not have severity, it will be UNKNOWN.
|
||||
If the CVSS score is also not provided, it falls back to [NVD][nvd].
|
||||
|
||||
NVD and some vendors may delay severity analysis, while other vendors, such as Red Hat, are able to quickly evaluate and announce the severity of vulnerabilities.
|
||||
To avoid marking too many vulnerabilities as "UNKNOWN" severity, Trivy uses severity ratings from other vendors when the NVD information is not yet available.
|
||||
The order of preference for vendor severity data can be found [here](https://github.com/aquasecurity/trivy-db/blob/79d0fbd1e246f3c77eef4b9826fe4bf65940b221/pkg/vulnsrc/vulnerability/vulnerability.go#L17-L19).
|
||||
|
||||
You can reference `SeveritySource` in the [JSON reporting format](../configuration/reporting.md#json) to see from where the severity is taken for a given vulnerability.
|
||||
|
||||
```shell
|
||||
"SeveritySource": "debian",
|
||||
```
|
||||
|
||||
|
||||
In addition, you can see all the vendor severity ratings.
|
||||
|
||||
```json
|
||||
"VendorSeverity": {
|
||||
"amazon": 2,
|
||||
"cbl-mariner": 4,
|
||||
"ghsa": 4,
|
||||
"nvd": 4,
|
||||
"photon": 4,
|
||||
"redhat": 2,
|
||||
"ubuntu": 2
|
||||
}
|
||||
```
|
||||
|
||||
Here is the severity mapping in Trivy:
|
||||
|
||||
| Number | Severity |
|
||||
|:------:|----------|
|
||||
| 0 | Unknown |
|
||||
| 1 | Low |
|
||||
| 2 | Medium |
|
||||
| 3 | High |
|
||||
| 4 | Critical |
|
||||
|
||||
If no vendor has a severity, the `UNKNOWN` severity will be used.
|
||||
|
||||
### Unfixed Vulnerabilities
|
||||
The unfixed/unfixable vulnerabilities mean that the patch has not yet been provided on their distribution.
|
||||
@@ -101,9 +137,18 @@ See [here](../coverage/language/index.md#supported-languages) for the supported
|
||||
|
||||
[^1]: Intentional delay between vulnerability disclosure and registration in the DB
|
||||
|
||||
## Non-packaged software
|
||||
|
||||
If you have software that is not managed by a package manager, Trivy can still detect vulnerabilities in it in some cases:
|
||||
|
||||
- [Using SBOM from Sigstore Rekor](../supply-chain/attestation/rekor/#non-packaged-binaries)
|
||||
- [Go Binaries with embedded module information](../coverage/language/golang/#go-binaries)
|
||||
- [Rust Binaries with embedded information](../coverage/language/rust/#binaries)
|
||||
- [SBOM embedded in container images](../supply-chain/container-image/#sbom-embedded-in-container-images)
|
||||
|
||||
## Kubernetes
|
||||
|
||||
Trivy can detect vulnerabilities in Kubernetes clusters and components.
|
||||
Trivy can detect vulnerabilities in Kubernetes clusters and components by scanning a Kubernetes Cluster, or a KBOM (Kubernetes bill of Material). To learn more, see the [documentation for Kubernetes scanning](../target/kubernetes.md).
|
||||
|
||||
### Data Sources
|
||||
|
||||
|
||||
@@ -731,17 +731,20 @@ $ cat result.spdx.json | jq .
|
||||
</details>
|
||||
|
||||
## Scanning
|
||||
Trivy can take SBOM documents as input for scanning.
|
||||
|
||||
### SBOM as Target
|
||||
Trivy can take SBOM documents as input for scanning, e.g `trivy sbom ./sbom.spdx`.
|
||||
See [here](../target/sbom.md) for more details.
|
||||
|
||||
Also, Trivy searches for SBOM files in container images.
|
||||
### SBOM Detection inside Targets
|
||||
Trivy searches for SBOM files in container images with the following extensions:
|
||||
- `.spdx`
|
||||
- `.spdx.json`
|
||||
- `.cdx`
|
||||
- `.cdx.json`
|
||||
|
||||
```bash
|
||||
$ trivy image bitnami/elasticsearch:8.7.1
|
||||
```
|
||||
In addition, Trivy automatically detects SBOM files in [Bitnami images](https://github.com/bitnami/containers), [see here](../coverage/os/bitnami.md) for more details.
|
||||
|
||||
For example, [Bitnami images](https://github.com/bitnami/containers) contain SBOM files in `/opt/bitnami` directory.
|
||||
Trivy automatically detects the SBOM files and uses them for scanning.
|
||||
It is enabled in the following targets.
|
||||
|
||||
| Target | Enabled |
|
||||
@@ -755,6 +758,9 @@ It is enabled in the following targets.
|
||||
| AWS | |
|
||||
| SBOM | |
|
||||
|
||||
### SBOM Discovery for Container Images
|
||||
|
||||
When scanning container images, Trivy can discover SBOM for those images. [See here](../target/container_image.md) for more details.
|
||||
|
||||
[spdx]: https://spdx.dev/wp-content/uploads/sites/41/2020/08/SPDX-specification-2-2.pdf
|
||||
|
||||
|
||||
@@ -263,6 +263,8 @@ $ trivy image ghcr.io/aquasecurity/trivy:0.50.0 --vex trivy.openvex.json
|
||||
VEX documents can indeed be reused across different container images, eliminating the need to issue separate VEX documents for each image.
|
||||
This is particularly useful when there is a common component or library that is used across multiple projects or container images.
|
||||
|
||||
You can see [the appendix](#applying-vex-to-dependency-trees) for more details on how VEX is applied in Trivy.
|
||||
|
||||
### Scan with VEX
|
||||
Provide the VEX when scanning your target.
|
||||
|
||||
@@ -412,6 +414,8 @@ At present, the specified relationship category is not taken into account and al
|
||||
- installed_on
|
||||
- installed_with
|
||||
|
||||
You can see [the appendix](#applying-vex-to-dependency-trees) for more details on how VEX is applied in Trivy.
|
||||
|
||||
### Scan with CSAF VEX
|
||||
Provide the CSAF document when scanning your target.
|
||||
|
||||
@@ -470,6 +474,103 @@ does not match:
|
||||
- `pkg:maven/com.google.guava/guava@24.1.1?classifier=sources`
|
||||
- `classifier` must have the same value.
|
||||
|
||||
### Applying VEX to Dependency Trees
|
||||
|
||||
Trivy internally generates a dependency tree and applies VEX statements to this graph.
|
||||
Let's consider a project with the following dependency tree, where `Module C v2.0.0` is assumed to have a vulnerability CVE-XXXX-YYYY:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
modRootA(Module Root A v1.0.0)
|
||||
modB(Module B v1.0.0)
|
||||
modC(Module C v2.0.0)
|
||||
|
||||
modRootA-->modB
|
||||
modB-->modC
|
||||
```
|
||||
|
||||
Now, suppose a VEX statement is issued for `Module B` as follows:
|
||||
|
||||
```json
|
||||
"statements": [
|
||||
{
|
||||
"vulnerability": {"name": "CVE-XXXX-YYYY"},
|
||||
"products": [
|
||||
{
|
||||
"@id": "pkg:golang/module-b@1.0.0",
|
||||
"subcomponents": [
|
||||
{ "@id": "pkg:golang/module-c@2.0.0" }
|
||||
]
|
||||
}
|
||||
],
|
||||
"status": "not_affected",
|
||||
"justification": "vulnerable_code_not_in_execute_path"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
It declares that `Module B` is not affected by CVE-XXXX-YYYY on `Module C`.
|
||||
|
||||
!!! note
|
||||
The VEX in this example defines the relationship between `Module B` and `Module C`.
|
||||
However, as Trivy traverses all parents from vulnerable packages, it is also possible to define a VEX for the relationship between a vulnerable package and any parent, such as `Module A` and `Module C`, etc.
|
||||
|
||||
Mapping this VEX onto the dependency tree would look like this:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
modRootA(Module Root A v1.0.0)
|
||||
|
||||
subgraph "VEX (Not Affected)"
|
||||
modB(Module B v1.0.0)
|
||||
modC(Module C v2.0.0)
|
||||
end
|
||||
|
||||
modRootA-->modB
|
||||
modB-->modC
|
||||
```
|
||||
|
||||
In this case, it's clear that `Module Root A` is also not affected by CVE-XXXX-YYYY, so this vulnerability is suppressed.
|
||||
|
||||
Now, let's consider another project:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
modRootZ(Module Root Z v1.0.0)
|
||||
modB'(Module B v1.0.0)
|
||||
modC'(Module C v2.0.0)
|
||||
modD'(Module D v3.0.0)
|
||||
|
||||
modRootZ-->modB'
|
||||
modRootZ-->modD'
|
||||
modB'-->modC'
|
||||
modD'-->modC'
|
||||
```
|
||||
|
||||
Assuming the same VEX as before, applying it to this dependency tree would look like:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
modRootZ(Module Root Z v1.0.0)
|
||||
|
||||
subgraph "VEX (Not Affected)"
|
||||
modB'(Module B v1.0.0)
|
||||
modC'(Module C v2.0.0)
|
||||
end
|
||||
|
||||
modD'(Module D v3.0.0)
|
||||
|
||||
modRootZ-->modB'
|
||||
modRootZ-->modD'
|
||||
modB'-->modC'
|
||||
modD'-->modC'
|
||||
```
|
||||
|
||||
`Module Root Z` depends on `Module C` via multiple paths.
|
||||
While the VEX tells us that `Module B` is not affected by the vulnerability, `Module D` might be.
|
||||
In the absence of a VEX, the default assumption is that it is affected.
|
||||
Taking all of this into account, Trivy determines that `Module Root Z` is affected by this vulnerability.
|
||||
|
||||
|
||||
[csaf]: https://oasis-open.github.io/csaf-documentation/specification.html
|
||||
[openvex]: https://github.com/openvex/spec
|
||||
|
||||
@@ -436,14 +436,14 @@ The following reports are available out of the box:
|
||||
|
||||
| Compliance | Version | Name for command | More info |
|
||||
|----------------------------------------|---------|------------------|---------------------------------------------------------------------------------------------|
|
||||
| CIS Docker Community Edition Benchmark | 1.1.0 | `docker-cis` | [Link](https://www.aquasec.com/cloud-native-academy/docker-container/docker-cis-benchmark/) |
|
||||
| CIS Docker Community Edition Benchmark | 1.1.0 | `docker-cis-1.6.0` | [Link](https://www.aquasec.com/cloud-native-academy/docker-container/docker-cis-benchmark/) |
|
||||
|
||||
### Examples
|
||||
|
||||
Scan a container image configuration and generate a compliance summary report:
|
||||
|
||||
```
|
||||
$ trivy image --compliance docker-cis [YOUR_IMAGE_NAME]
|
||||
trivy image --compliance docker-cis-1.6.0 [YOUR_IMAGE_NAME]
|
||||
```
|
||||
|
||||
!!! note
|
||||
|
||||
@@ -355,12 +355,14 @@ For an overview of Trivy's Compliance feature, including working with custom com
|
||||
|
||||
The following reports are available out of the box:
|
||||
|
||||
| Compliance | Name for command | More info |
|
||||
|----------------------------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------|
|
||||
| NSA, CISA Kubernetes Hardening Guidance v1.2 | `k8s-nsa` | [Link](https://media.defense.gov/2022/Aug/29/2003066362/-1/-1/0/CTR_KUBERNETES_HARDENING_GUIDANCE_1.2_20220829.PDF) |
|
||||
| CIS Benchmark for Kubernetes v1.23 | `k8s-cis` | [Link](https://www.cisecurity.org/benchmark/kubernetes) |
|
||||
| Pod Security Standards, Baseline | `k8s-pss-baseline` | [Link](https://kubernetes.io/docs/concepts/security/pod-security-standards/#baseline) |
|
||||
| Pod Security Standards, Restricted | `k8s-pss-restricted` | [Link](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted) |
|
||||
| Compliance | Name for command | More info |
|
||||
|----------------------------------------------|--------------------------|---------------------------------------------------------------------------------------------------------------------|
|
||||
| NSA, CISA Kubernetes Hardening Guidance v1.0 | `k8s-nsa-1.0` | [Link](https://media.defense.gov/2022/Aug/29/2003066362/-1/-1/0/CTR_KUBERNETES_HARDENING_GUIDANCE_1.2_20220829.PDF) |
|
||||
| CIS Benchmark for Kubernetes v1.23 | `k8s-cis-1.23` | [Link](https://www.cisecurity.org/benchmark/kubernetes) |
|
||||
| CIS Benchmark for RKE2 v1.24 | `rke2-cis-1.24` | [Link](https://www.cisecurity.org/benchmark/kubernetes) |
|
||||
| CIS Benchmark for EKS v1.4 | `eks-cis-1.4` | [Link](https://www.cisecurity.org/benchmark/kubernetes) |
|
||||
| Pod Security Standards, Baseline | `k8s-pss-baseline-0.1` | [Link](https://kubernetes.io/docs/concepts/security/pod-security-standards/#baseline) |
|
||||
| Pod Security Standards, Restricted | `k8s-pss-restricted-0.1` | [Link](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted) |
|
||||
|
||||
Examples:
|
||||
|
||||
@@ -376,7 +378,7 @@ Get the detailed report for checks:
|
||||
|
||||
```
|
||||
|
||||
trivy k8s --compliance=k8s-cis --report all
|
||||
trivy k8s --compliance=k8s-cis-1.23 --report all
|
||||
|
||||
```
|
||||
|
||||
@@ -384,7 +386,7 @@ Get summary report in JSON format:
|
||||
|
||||
```
|
||||
|
||||
trivy k8s --compliance=k8s-cis --report summary --format json
|
||||
trivy k8s --compliance=k8s-cis-1.23 --report summary --format json
|
||||
|
||||
```
|
||||
|
||||
@@ -392,7 +394,7 @@ Get detailed report in JSON format:
|
||||
|
||||
```
|
||||
|
||||
trivy k8s --compliance=k8s-cis --report all --format json
|
||||
trivy k8s --compliance=k8s-cis-1.23 --report all --format json
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -29,3 +29,11 @@ You can use Kyverno to ensure and enforce that deployed workloads' images are sc
|
||||
Trivy is integrated into Zora as a vulnerability scanner plugin.
|
||||
|
||||
👉 Get it at: <https://zora-docs.undistro.io/latest/plugins/trivy/>
|
||||
|
||||
## Helmper (Community)
|
||||
|
||||
[Helmper](https://christoffernissen.github.io/helmper/) is a go program that reads Helm Charts from remote OCI registries and pushes the Helm Charts and the Helm Charts container images to your OCI registries with optional OS level vulnerability patching
|
||||
|
||||
Trivy is integrated into Helmper as a vulnerability scanner in combination with Copacetic to fix detected vulnerabilities.
|
||||
|
||||
👉 Get it at: <https://github.com/ChristofferNissen/helmper>
|
||||
|
||||
@@ -61,7 +61,7 @@ brew install trivy
|
||||
Arch Linux Package Repository.
|
||||
|
||||
```bash
|
||||
pacman -S trivy
|
||||
sudo pacman -S trivy
|
||||
```
|
||||
|
||||
References:
|
||||
@@ -163,17 +163,17 @@ The plugin used by both tools is developped [here](https://github.com/zufardhiya
|
||||
|
||||
### Download Binary
|
||||
|
||||
1. Download the file for your operating system/architecture from [GitHub Release assets](https://github.com/aquasecurity/trivy/releases/tag/{{ git.tag }}) (`curl -LO https://url.to/trivy.tar.gz`).
|
||||
1. Download the file for your operating system/architecture from [GitHub Release assets](https://github.com/aquasecurity/trivy/releases/tag/{{ git.tag }}).
|
||||
2. Unpack the downloaded archive (`tar -xzf ./trivy.tar.gz`).
|
||||
3. Put the binary somewhere in your `$PATH` (e.g `mv ./trivy /usr/local/bin/`).
|
||||
4. Make sure the binary has execution bit turned on (`chmod +x ./trivy`).
|
||||
3. Make sure the binary has execution bit turned on (`chmod +x ./trivy`).
|
||||
4. Put the binary somewhere in your `$PATH` (e.g `sudo mv ./trivy /usr/local/bin/`).
|
||||
|
||||
### Install Script
|
||||
|
||||
The process above can be automated by the following script:
|
||||
|
||||
```bash
|
||||
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin {{ git.tag }}
|
||||
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin {{ git.tag }}
|
||||
```
|
||||
|
||||
### Install from source
|
||||
|
||||
@@ -85,8 +85,6 @@ container_scanning:
|
||||
FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
|
||||
script:
|
||||
- trivy --version
|
||||
# cache cleanup is needed when scanning images with the same tags, it does not remove the database
|
||||
- time trivy image --clear-cache
|
||||
# update vulnerabilities db
|
||||
- time trivy image --download-db-only
|
||||
# Builds report and puts it in the default workdir $CI_PROJECT_DIR, so `artifacts:` can take it from there
|
||||
|
||||
140
go.mod
140
go.mod
@@ -2,43 +2,40 @@ module github.com/aquasecurity/trivy
|
||||
|
||||
go 1.22.0
|
||||
|
||||
toolchain go1.22.2
|
||||
toolchain go1.22.4
|
||||
|
||||
require (
|
||||
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0
|
||||
github.com/BurntSushi/toml v1.4.0
|
||||
github.com/CycloneDX/cyclonedx-go v0.8.0
|
||||
github.com/CycloneDX/cyclonedx-go v0.9.0
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr v2.0.5+incompatible
|
||||
github.com/Masterminds/sprig/v3 v3.2.3
|
||||
github.com/NYTimes/gziphandler v1.1.1
|
||||
github.com/alecthomas/chroma v0.10.0
|
||||
github.com/alicebob/miniredis/v2 v2.32.1
|
||||
github.com/alicebob/miniredis/v2 v2.33.0
|
||||
github.com/antchfx/htmlquery v1.3.1
|
||||
github.com/apparentlymart/go-cidr v1.1.0
|
||||
github.com/aquasecurity/bolt-fixtures v0.0.0-20200903104109-d34e7f983986
|
||||
github.com/aquasecurity/go-gem-version v0.0.0-20201115065557-8eed6fe000ce
|
||||
github.com/aquasecurity/go-npm-version v0.0.0-20201110091526-0b796d180798
|
||||
github.com/aquasecurity/go-pep440-version v0.0.0-20210121094942-22b2f8951d46
|
||||
github.com/aquasecurity/go-version v0.0.0-20210121072130-637058cfe492
|
||||
github.com/aquasecurity/loading v0.0.5
|
||||
github.com/aquasecurity/go-version v0.0.0-20240603093900-cf8a8d29271d
|
||||
github.com/aquasecurity/table v1.8.0
|
||||
github.com/aquasecurity/testdocker v0.0.0-20240419073403-90bd43849334
|
||||
github.com/aquasecurity/testdocker v0.0.0-20240613070307-2c3868d658ac
|
||||
github.com/aquasecurity/tml v0.6.1
|
||||
github.com/aquasecurity/trivy-aws v0.9.0
|
||||
github.com/aquasecurity/trivy-checks v0.11.0
|
||||
github.com/aquasecurity/trivy-checks v0.13.0
|
||||
github.com/aquasecurity/trivy-db v0.0.0-20231005141211-4fc651f7ac8d
|
||||
github.com/aquasecurity/trivy-java-db v0.0.0-20240109071736-184bd7481d48
|
||||
github.com/aquasecurity/trivy-kubernetes v0.6.7-0.20240516051533-4c5a4aad13b7
|
||||
github.com/aws/aws-sdk-go-v2 v1.27.0
|
||||
github.com/aws/aws-sdk-go-v2/config v1.27.15
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.15
|
||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.20
|
||||
github.com/aws/aws-sdk-go-v2/service/ec2 v1.161.3
|
||||
github.com/aws/aws-sdk-go-v2/service/ecr v1.28.2
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.54.2
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.28.9
|
||||
github.com/aquasecurity/trivy-kubernetes v0.6.7-0.20240627095026-cf9d48837f6d
|
||||
github.com/aws/aws-sdk-go-v2 v1.27.2
|
||||
github.com/aws/aws-sdk-go-v2/config v1.27.18
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.17.18
|
||||
github.com/aws/aws-sdk-go-v2/service/ec2 v1.163.1
|
||||
github.com/aws/aws-sdk-go-v2/service/ecr v1.28.5
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.55.1
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 // indirect
|
||||
github.com/aws/smithy-go v1.20.2
|
||||
github.com/bitnami/go-version v0.0.0-20231130084017-bb00604d650c
|
||||
github.com/bmatcuk/doublestar/v4 v4.6.1
|
||||
@@ -54,13 +51,13 @@ require (
|
||||
github.com/go-openapi/strfmt v0.23.0
|
||||
github.com/go-redis/redis/v8 v8.11.5
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||
github.com/google/go-containerregistry v0.19.1
|
||||
github.com/google/go-containerregistry v0.19.2
|
||||
github.com/google/licenseclassifier/v2 v2.0.0
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/google/wire v0.6.0
|
||||
github.com/hashicorp/go-getter v1.7.4
|
||||
github.com/hashicorp/go-getter v1.7.5
|
||||
github.com/hashicorp/go-multierror v1.1.1
|
||||
github.com/hashicorp/go-retryablehttp v0.7.6
|
||||
github.com/hashicorp/go-retryablehttp v0.7.7
|
||||
github.com/hashicorp/go-uuid v1.0.3
|
||||
github.com/hashicorp/go-version v1.7.0
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7
|
||||
@@ -90,7 +87,7 @@ require (
|
||||
github.com/mitchellh/hashstructure/v2 v2.0.2
|
||||
github.com/mitchellh/mapstructure v1.5.0
|
||||
github.com/moby/buildkit v0.13.2
|
||||
github.com/open-policy-agent/opa v0.64.1
|
||||
github.com/open-policy-agent/opa v0.65.0
|
||||
github.com/opencontainers/go-digest v1.0.0
|
||||
github.com/opencontainers/image-spec v1.1.0
|
||||
github.com/openvex/go-vex v0.2.5
|
||||
@@ -107,7 +104,7 @@ require (
|
||||
github.com/spf13/cast v1.6.0
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/spf13/viper v1.18.2
|
||||
github.com/spf13/viper v1.19.0
|
||||
github.com/stretchr/testify v1.9.0
|
||||
github.com/testcontainers/testcontainers-go v0.31.0
|
||||
github.com/testcontainers/testcontainers-go/modules/localstack v0.31.0
|
||||
@@ -118,33 +115,32 @@ require (
|
||||
github.com/zclconf/go-cty v1.14.4
|
||||
github.com/zclconf/go-cty-yaml v1.0.3
|
||||
go.etcd.io/bbolt v1.3.10
|
||||
golang.org/x/crypto v0.23.0
|
||||
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
|
||||
golang.org/x/crypto v0.24.0
|
||||
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
|
||||
golang.org/x/mod v0.17.0
|
||||
golang.org/x/net v0.25.0
|
||||
golang.org/x/net v0.26.0
|
||||
golang.org/x/sync v0.7.0
|
||||
golang.org/x/term v0.20.0
|
||||
golang.org/x/text v0.15.0
|
||||
golang.org/x/term v0.21.0
|
||||
golang.org/x/text v0.16.0
|
||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028
|
||||
google.golang.org/protobuf v1.34.1
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
helm.sh/helm/v3 v3.15.1
|
||||
k8s.io/api v0.30.1
|
||||
k8s.io/api v0.30.2
|
||||
k8s.io/utils v0.0.0-20231127182322-b307cd553661
|
||||
modernc.org/sqlite v1.29.10
|
||||
modernc.org/sqlite v1.30.0
|
||||
sigs.k8s.io/yaml v1.4.0
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go v0.112.1 // indirect
|
||||
cloud.google.com/go/compute v1.25.1 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.3.0 // indirect
|
||||
cloud.google.com/go/iam v1.1.6 // indirect
|
||||
cloud.google.com/go/storage v1.39.1 // indirect
|
||||
dario.cat/mergo v1.0.0 // indirect
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
|
||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect
|
||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
||||
github.com/Azure/go-autorest/autorest v0.11.29 // indirect
|
||||
@@ -171,52 +167,16 @@ require (
|
||||
github.com/antchfx/xpath v1.3.0 // indirect
|
||||
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
|
||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
||||
github.com/aws/aws-sdk-go v1.53.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect
|
||||
github.com/aws/aws-sdk-go v1.54.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/accessanalyzer v1.26.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/apigateway v1.21.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.18.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/athena v1.37.3 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudfront v1.36.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.35.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.30.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/codebuild v1.26.5 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/docdb v1.34.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.26.8 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ebs v1.21.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ecs v1.35.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/efs v1.28.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/eks v1.41.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/elasticache v1.34.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/elasticsearchservice v1.25.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/emr v1.36.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/iam v1.28.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.11 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/kafka v1.28.5 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/kinesis v1.24.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/kms v1.32.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.49.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/mq v1.20.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/neptune v1.28.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/rds v1.66.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/redshift v1.39.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.26.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sns v1.26.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sqs v1.29.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.20.8 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/workspaces v1.38.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
|
||||
github.com/briandowns/spinner v1.23.0 // indirect
|
||||
@@ -245,6 +205,7 @@ require (
|
||||
github.com/docker/go-metrics v0.0.1 // indirect
|
||||
github.com/docker/go-units v0.5.0 // indirect
|
||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
|
||||
github.com/dsnet/compress v0.0.1 // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
@@ -257,7 +218,7 @@ require (
|
||||
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
||||
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
|
||||
github.com/go-ini/ini v1.67.0 // indirect
|
||||
github.com/go-logr/logr v1.4.1 // indirect
|
||||
github.com/go-logr/logr v1.4.2 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||
github.com/go-openapi/analysis v0.23.0 // indirect
|
||||
@@ -288,6 +249,7 @@ require (
|
||||
github.com/gorilla/websocket v1.5.0 // indirect
|
||||
github.com/gosuri/uitable v0.0.4 // indirect
|
||||
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||
github.com/hashicorp/go-safetemp v1.0.0 // indirect
|
||||
@@ -339,14 +301,14 @@ require (
|
||||
github.com/opencontainers/runtime-spec v1.1.0 // indirect
|
||||
github.com/opencontainers/selinux v1.11.0 // indirect
|
||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||
github.com/prometheus/client_golang v1.19.0 // indirect
|
||||
github.com/prometheus/client_golang v1.19.1 // indirect
|
||||
github.com/prometheus/client_model v0.6.1 // indirect
|
||||
github.com/prometheus/common v0.48.0 // indirect
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
@@ -384,18 +346,18 @@ require (
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
|
||||
go.opentelemetry.io/otel v1.27.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.27.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.27.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.27.0 // indirect
|
||||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
golang.org/x/oauth2 v0.18.0 // indirect
|
||||
golang.org/x/sys v0.20.0 // indirect
|
||||
golang.org/x/oauth2 v0.20.0 // indirect
|
||||
golang.org/x/sys v0.21.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
golang.org/x/tools v0.19.0 // indirect
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
|
||||
google.golang.org/api v0.172.0 // indirect
|
||||
google.golang.org/appengine v1.6.8 // indirect
|
||||
google.golang.org/genproto v0.0.0-20240311173647-c811ad7063a7 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 // indirect
|
||||
@@ -406,16 +368,16 @@ require (
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
k8s.io/apiextensions-apiserver v0.30.0 // indirect
|
||||
k8s.io/apimachinery v0.30.1 // indirect
|
||||
k8s.io/apimachinery v0.30.2 // indirect
|
||||
k8s.io/apiserver v0.30.0 // indirect
|
||||
k8s.io/cli-runtime v0.30.0 // indirect
|
||||
k8s.io/client-go v0.30.0 // indirect
|
||||
k8s.io/component-base v0.30.0 // indirect
|
||||
k8s.io/cli-runtime v0.30.2 // indirect
|
||||
k8s.io/client-go v0.30.2 // indirect
|
||||
k8s.io/component-base v0.30.1 // indirect
|
||||
k8s.io/klog/v2 v2.120.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
|
||||
k8s.io/kubectl v0.30.0 // indirect
|
||||
k8s.io/kubectl v0.30.1 // indirect
|
||||
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
|
||||
modernc.org/libc v1.49.3 // indirect
|
||||
modernc.org/libc v1.50.9 // indirect
|
||||
modernc.org/mathutil v1.6.0 // indirect
|
||||
modernc.org/memory v1.8.0 // indirect
|
||||
modernc.org/strutil v1.2.0 // indirect
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
version: 2
|
||||
|
||||
project_name: trivy_canary_build
|
||||
builds:
|
||||
-
|
||||
@@ -6,7 +8,7 @@ builds:
|
||||
ldflags:
|
||||
- -s -w
|
||||
- "-extldflags '-static'"
|
||||
- -X github.com/aquasecurity/trivy/pkg/version.ver={{.Version}}
|
||||
- -X github.com/aquasecurity/trivy/pkg/version/app.ver={{.Version}}
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
version: 2
|
||||
|
||||
project_name: trivy
|
||||
builds:
|
||||
- id: build-linux
|
||||
@@ -6,7 +8,7 @@ builds:
|
||||
ldflags:
|
||||
- -s -w
|
||||
- "-extldflags '-static'"
|
||||
- -X github.com/aquasecurity/trivy/pkg/version.ver={{.Version}}
|
||||
- -X github.com/aquasecurity/trivy/pkg/version/app.ver={{.Version}}
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
@@ -26,7 +28,7 @@ builds:
|
||||
ldflags:
|
||||
- -s -w
|
||||
- "-extldflags '-static'"
|
||||
- -X github.com/aquasecurity/trivy/pkg/version.ver={{.Version}}
|
||||
- -X github.com/aquasecurity/trivy/pkg/version/app.ver={{.Version}}
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
@@ -41,7 +43,7 @@ builds:
|
||||
ldflags:
|
||||
- -s -w
|
||||
- "-extldflags '-static'"
|
||||
- -X github.com/aquasecurity/trivy/pkg/version.ver={{.Version}}
|
||||
- -X github.com/aquasecurity/trivy/pkg/version/app.ver={{.Version}}
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
@@ -57,7 +59,7 @@ builds:
|
||||
ldflags:
|
||||
- -s -w
|
||||
- "-extldflags '-static'"
|
||||
- -X github.com/aquasecurity/trivy/pkg/version.ver={{.Version}}
|
||||
- -X github.com/aquasecurity/trivy/pkg/version/app.ver={{.Version}}
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
//go:build integration
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aquasecurity/trivy/internal/testutil"
|
||||
awscommands "github.com/aquasecurity/trivy/pkg/cloud/aws/commands"
|
||||
"github.com/aquasecurity/trivy/pkg/flag"
|
||||
)
|
||||
|
||||
func TestAwsCommandRun(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
options flag.Options
|
||||
envs map[string]string
|
||||
wantErr string
|
||||
}{
|
||||
{
|
||||
name: "fail without region",
|
||||
options: flag.Options{
|
||||
RegoOptions: flag.RegoOptions{SkipCheckUpdate: true},
|
||||
},
|
||||
envs: map[string]string{
|
||||
"AWS_ACCESS_KEY_ID": "test",
|
||||
"AWS_SECRET_ACCESS_KEY": "test",
|
||||
},
|
||||
wantErr: "aws region is required",
|
||||
},
|
||||
{
|
||||
name: "fail without creds",
|
||||
envs: map[string]string{
|
||||
"AWS_PROFILE": "non-existent-profile",
|
||||
},
|
||||
options: flag.Options{
|
||||
RegoOptions: flag.RegoOptions{SkipCheckUpdate: true},
|
||||
AWSOptions: flag.AWSOptions{
|
||||
Region: "us-east-1",
|
||||
},
|
||||
},
|
||||
wantErr: "non-existent-profile",
|
||||
},
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
localstackC, addr, err := testutil.SetupLocalStack(ctx, "2.2.0")
|
||||
require.NoError(t, err)
|
||||
defer localstackC.Terminate(ctx)
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
|
||||
tt.options.AWSOptions.Endpoint = addr
|
||||
tt.options.GlobalOptions.Timeout = time.Minute
|
||||
|
||||
for k, v := range tt.envs {
|
||||
t.Setenv(k, v)
|
||||
}
|
||||
|
||||
err := awscommands.Run(context.Background(), tt.options)
|
||||
|
||||
if tt.wantErr != "" {
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), tt.wantErr, tt.name)
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
69
integration/convert_test.go
Normal file
69
integration/convert_test.go
Normal file
@@ -0,0 +1,69 @@
|
||||
//go:build integration
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
func TestConvert(t *testing.T) {
|
||||
type args struct {
|
||||
input string
|
||||
format string
|
||||
scanners string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
golden string
|
||||
override OverrideFunc
|
||||
}{
|
||||
{
|
||||
name: "npm",
|
||||
args: args{
|
||||
input: "testdata/npm.json.golden",
|
||||
format: "cyclonedx",
|
||||
},
|
||||
golden: "testdata/npm-cyclonedx.json.golden",
|
||||
},
|
||||
{
|
||||
name: "npm without package UID",
|
||||
args: args{
|
||||
input: "testdata/fixtures/convert/npm.json.golden",
|
||||
format: "cyclonedx",
|
||||
},
|
||||
golden: "testdata/npm-cyclonedx.json.golden",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
osArgs := []string{
|
||||
"convert",
|
||||
"--cache-dir",
|
||||
t.TempDir(),
|
||||
"-q",
|
||||
"--format",
|
||||
tt.args.format,
|
||||
}
|
||||
|
||||
// Set up the output file
|
||||
outputFile := filepath.Join(t.TempDir(), "output.json")
|
||||
if *update {
|
||||
outputFile = tt.golden
|
||||
}
|
||||
|
||||
osArgs = append(osArgs, "--output", outputFile)
|
||||
osArgs = append(osArgs, tt.args.input)
|
||||
|
||||
// Run "trivy convert"
|
||||
runTest(t, osArgs, tt.golden, outputFile, types.Format(tt.args.format), runOptions{
|
||||
fakeUUID: "3ff14136-e09f-4df9-80ea-%012d",
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
@@ -304,7 +304,14 @@ func TestDockerEngine(t *testing.T) {
|
||||
osArgs = append(osArgs, tt.input)
|
||||
|
||||
// Run Trivy
|
||||
runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{wantErr: tt.wantErr})
|
||||
runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{
|
||||
wantErr: tt.wantErr,
|
||||
// Container field was removed in Docker Engine v26.0
|
||||
// cf. https://github.com/docker/cli/blob/v26.1.3/docs/deprecated.md#container-and-containerconfig-fields-in-image-inspect
|
||||
override: overrideFuncs(overrideUID, func(t *testing.T, want, _ *types.Report) {
|
||||
want.Metadata.ImageConfig.Container = ""
|
||||
}),
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,9 +28,10 @@ import (
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
"github.com/aquasecurity/trivy-db/pkg/metadata"
|
||||
|
||||
"github.com/aquasecurity/trivy/internal/dbtest"
|
||||
"github.com/aquasecurity/trivy/pkg/clock"
|
||||
"github.com/aquasecurity/trivy/pkg/commands"
|
||||
"github.com/aquasecurity/trivy/pkg/dbtest"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/uuid"
|
||||
|
||||
|
||||
@@ -153,6 +153,14 @@ func TestRepository(t *testing.T) {
|
||||
},
|
||||
golden: "testdata/gradle.json.golden",
|
||||
},
|
||||
{
|
||||
name: "sbt",
|
||||
args: args{
|
||||
scanner: types.VulnerabilityScanner,
|
||||
input: "testdata/fixtures/repo/sbt",
|
||||
},
|
||||
golden: "testdata/sbt.json.golden",
|
||||
},
|
||||
{
|
||||
name: "conan",
|
||||
args: args{
|
||||
@@ -242,6 +250,16 @@ func TestRepository(t *testing.T) {
|
||||
},
|
||||
golden: "testdata/test-repo.json.golden",
|
||||
},
|
||||
{
|
||||
name: "installed.json",
|
||||
args: args{
|
||||
command: "rootfs",
|
||||
scanner: types.VulnerabilityScanner,
|
||||
listAllPkgs: true,
|
||||
input: "testdata/fixtures/repo/composer-vendor",
|
||||
},
|
||||
golden: "testdata/composer.vendor.json.golden",
|
||||
},
|
||||
{
|
||||
name: "dockerfile",
|
||||
args: args{
|
||||
|
||||
1
integration/testdata/alpine-310.sarif.golden
vendored
1
integration/testdata/alpine-310.sarif.golden
vendored
@@ -184,6 +184,7 @@
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"imageID": "sha256:961769676411f082461f9ef46626dd7a2d1e2b2a38e6a44364bcbecf51e66dd4",
|
||||
"imageName": "testdata/fixtures/images/alpine-310.tar.gz",
|
||||
"repoDigests": null,
|
||||
"repoTags": null
|
||||
|
||||
131
integration/testdata/composer.vendor.json.golden
vendored
Normal file
131
integration/testdata/composer.vendor.json.golden
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
{
|
||||
"SchemaVersion": 2,
|
||||
"CreatedAt": "2021-08-25T12:20:30.000000005Z",
|
||||
"ArtifactName": "testdata/fixtures/repo/composer-vendor",
|
||||
"ArtifactType": "filesystem",
|
||||
"Metadata": {
|
||||
"ImageConfig": {
|
||||
"architecture": "",
|
||||
"created": "0001-01-01T00:00:00Z",
|
||||
"os": "",
|
||||
"rootfs": {
|
||||
"type": "",
|
||||
"diff_ids": null
|
||||
},
|
||||
"config": {}
|
||||
}
|
||||
},
|
||||
"Results": [
|
||||
{
|
||||
"Target": "installed.json",
|
||||
"Class": "lang-pkgs",
|
||||
"Type": "composer-vendor",
|
||||
"Packages": [
|
||||
{
|
||||
"ID": "guzzlehttp/psr7@1.8.3",
|
||||
"Name": "guzzlehttp/psr7",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:composer/guzzlehttp/psr7@1.8.3",
|
||||
"UID": "25fca97fe23aa7b1"
|
||||
},
|
||||
"Version": "1.8.3",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"DependsOn": [
|
||||
"psr/http-message@1.1",
|
||||
"ralouphie/getallheaders@3.0.3"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 3,
|
||||
"EndLine": 115
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "psr/http-message@1.1",
|
||||
"Name": "psr/http-message",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:composer/psr/http-message@1.1",
|
||||
"UID": "299d8ff4461e894"
|
||||
},
|
||||
"Version": "1.1",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 116,
|
||||
"EndLine": 171
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "ralouphie/getallheaders@3.0.3",
|
||||
"Name": "ralouphie/getallheaders",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:composer/ralouphie/getallheaders@3.0.3",
|
||||
"UID": "c383e94d979a209c"
|
||||
},
|
||||
"Version": "3.0.3",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 172,
|
||||
"EndLine": 218
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2022-24775",
|
||||
"PkgID": "guzzlehttp/psr7@1.8.3",
|
||||
"PkgName": "guzzlehttp/psr7",
|
||||
"PkgIdentifier": {
|
||||
"PURL": "pkg:composer/guzzlehttp/psr7@1.8.3",
|
||||
"UID": "25fca97fe23aa7b1"
|
||||
},
|
||||
"InstalledVersion": "1.8.3",
|
||||
"FixedVersion": "1.8.4",
|
||||
"Status": "fixed",
|
||||
"Layer": {},
|
||||
"SeveritySource": "ghsa",
|
||||
"PrimaryURL": "https://avd.aquasec.com/nvd/cve-2022-24775",
|
||||
"DataSource": {
|
||||
"ID": "ghsa",
|
||||
"Name": "GitHub Security Advisory Composer",
|
||||
"URL": "https://github.com/advisories?query=type%%3Areviewed+ecosystem%%3Acomposer"
|
||||
},
|
||||
"Title": "Improper Input Validation in guzzlehttp/psr7",
|
||||
"Description": "### Impact\nIn proper header parsing. An attacker could sneak in a new line character and pass untrusted values. \n\n### Patches\nThe issue is patched in 1.8.4 and 2.1.1.\n\n### Workarounds\nThere are no known workarounds.\n",
|
||||
"Severity": "HIGH",
|
||||
"CweIDs": [
|
||||
"CWE-20"
|
||||
],
|
||||
"VendorSeverity": {
|
||||
"ghsa": 3
|
||||
},
|
||||
"CVSS": {
|
||||
"ghsa": {
|
||||
"V3Vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N",
|
||||
"V3Score": 7.5
|
||||
}
|
||||
},
|
||||
"References": [
|
||||
"https://github.com/guzzle/psr7/security/advisories/GHSA-q7rv-6hp3-vh96",
|
||||
"https://nvd.nist.gov/vuln/detail/CVE-2022-24775"
|
||||
],
|
||||
"PublishedDate": "2022-03-25T19:26:33Z",
|
||||
"LastModifiedDate": "2022-06-14T20:02:29Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
|
||||
"bomFormat": "CycloneDX",
|
||||
"specVersion": "1.5",
|
||||
"specVersion": "1.6",
|
||||
"serialNumber": "urn:uuid:3ff14136-e09f-4df9-80ea-000000000004",
|
||||
"version": 1,
|
||||
"metadata": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
|
||||
"bomFormat": "CycloneDX",
|
||||
"specVersion": "1.5",
|
||||
"specVersion": "1.6",
|
||||
"serialNumber": "urn:uuid:3ff14136-e09f-4df9-80ea-000000000004",
|
||||
"version": 1,
|
||||
"metadata": {
|
||||
|
||||
381
integration/testdata/fixtures/convert/npm.json.golden
vendored
Normal file
381
integration/testdata/fixtures/convert/npm.json.golden
vendored
Normal file
@@ -0,0 +1,381 @@
|
||||
{
|
||||
"SchemaVersion": 2,
|
||||
"CreatedAt": "2021-08-25T12:20:30.000000005Z",
|
||||
"ArtifactName": "testdata/fixtures/repo/npm",
|
||||
"ArtifactType": "repository",
|
||||
"Metadata": {
|
||||
"ImageConfig": {
|
||||
"architecture": "",
|
||||
"created": "0001-01-01T00:00:00Z",
|
||||
"os": "",
|
||||
"rootfs": {
|
||||
"type": "",
|
||||
"diff_ids": null
|
||||
},
|
||||
"config": {}
|
||||
}
|
||||
},
|
||||
"Results": [
|
||||
{
|
||||
"Target": "package-lock.json",
|
||||
"Class": "lang-pkgs",
|
||||
"Type": "npm",
|
||||
"Packages": [
|
||||
{
|
||||
"ID": "asap@2.0.6",
|
||||
"Name": "asap",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/asap@2.0.6"
|
||||
},
|
||||
"Version": "2.0.6",
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 6,
|
||||
"EndLine": 10
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "jquery@3.3.9",
|
||||
"Name": "jquery",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/jquery@3.3.9"
|
||||
},
|
||||
"Version": "3.3.9",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 11,
|
||||
"EndLine": 15
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "js-tokens@4.0.0",
|
||||
"Name": "js-tokens",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/js-tokens@4.0.0"
|
||||
},
|
||||
"Version": "4.0.0",
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 16,
|
||||
"EndLine": 20
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "loose-envify@1.4.0",
|
||||
"Name": "loose-envify",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/loose-envify@1.4.0"
|
||||
},
|
||||
"Version": "1.4.0",
|
||||
"DependsOn": [
|
||||
"js-tokens@4.0.0"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 21,
|
||||
"EndLine": 28
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "object-assign@4.1.1",
|
||||
"Name": "object-assign",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/object-assign@4.1.1"
|
||||
},
|
||||
"Version": "4.1.1",
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 29,
|
||||
"EndLine": 33
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "promise@8.0.3",
|
||||
"Name": "promise",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/promise@8.0.3"
|
||||
},
|
||||
"Version": "8.0.3",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"DependsOn": [
|
||||
"asap@2.0.6"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 34,
|
||||
"EndLine": 41
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "prop-types@15.7.2",
|
||||
"Name": "prop-types",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/prop-types@15.7.2"
|
||||
},
|
||||
"Version": "15.7.2",
|
||||
"DependsOn": [
|
||||
"loose-envify@1.4.0",
|
||||
"object-assign@4.1.1",
|
||||
"react-is@16.8.6"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 42,
|
||||
"EndLine": 51
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "react@16.8.6",
|
||||
"Name": "react",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/react@16.8.6"
|
||||
},
|
||||
"Version": "16.8.6",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"DependsOn": [
|
||||
"loose-envify@1.4.0",
|
||||
"object-assign@4.1.1",
|
||||
"prop-types@15.7.2",
|
||||
"scheduler@0.13.6"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 52,
|
||||
"EndLine": 62
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "react-is@16.8.6",
|
||||
"Name": "react-is",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/react-is@16.8.6"
|
||||
},
|
||||
"Version": "16.8.6",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 63,
|
||||
"EndLine": 67
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "redux@4.0.1",
|
||||
"Name": "redux",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/redux@4.0.1"
|
||||
},
|
||||
"Version": "4.0.1",
|
||||
"Licenses": [
|
||||
"MIT"
|
||||
],
|
||||
"DependsOn": [
|
||||
"loose-envify@1.4.0",
|
||||
"symbol-observable@1.2.0"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 68,
|
||||
"EndLine": 76
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "scheduler@0.13.6",
|
||||
"Name": "scheduler",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/scheduler@0.13.6"
|
||||
},
|
||||
"Version": "0.13.6",
|
||||
"DependsOn": [
|
||||
"loose-envify@1.4.0",
|
||||
"object-assign@4.1.1"
|
||||
],
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 77,
|
||||
"EndLine": 85
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "symbol-observable@1.2.0",
|
||||
"Name": "symbol-observable",
|
||||
"Identifier": {
|
||||
"PURL": "pkg:npm/symbol-observable@1.2.0"
|
||||
},
|
||||
"Version": "1.2.0",
|
||||
"Layer": {},
|
||||
"Locations": [
|
||||
{
|
||||
"StartLine": 86,
|
||||
"EndLine": 90
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-11358",
|
||||
"PkgID": "jquery@3.3.9",
|
||||
"PkgName": "jquery",
|
||||
"PkgIdentifier": {
|
||||
"PURL": "pkg:npm/jquery@3.3.9"
|
||||
},
|
||||
"InstalledVersion": "3.3.9",
|
||||
"FixedVersion": "3.4.0",
|
||||
"Status": "fixed",
|
||||
"Layer": {},
|
||||
"SeveritySource": "ghsa",
|
||||
"PrimaryURL": "https://avd.aquasec.com/nvd/cve-2019-11358",
|
||||
"DataSource": {
|
||||
"ID": "ghsa",
|
||||
"Name": "GitHub Security Advisory Npm",
|
||||
"URL": "https://github.com/advisories?query=type%3Areviewed+ecosystem%3Anpm"
|
||||
},
|
||||
"Title": "jquery: Prototype pollution in object's prototype leading to denial of service, remote code execution, or property injection",
|
||||
"Description": "jQuery before 3.4.0, as used in Drupal, Backdrop CMS, and other products, mishandles jQuery.extend(true, {}, ...) because of Object.prototype pollution. If an unsanitized source object contained an enumerable __proto__ property, it could extend the native Object.prototype.",
|
||||
"Severity": "MEDIUM",
|
||||
"CweIDs": [
|
||||
"CWE-79"
|
||||
],
|
||||
"VendorSeverity": {
|
||||
"alma": 2,
|
||||
"amazon": 2,
|
||||
"arch-linux": 2,
|
||||
"ghsa": 2,
|
||||
"nodejs-security-wg": 2,
|
||||
"nvd": 2,
|
||||
"oracle-oval": 2,
|
||||
"redhat": 2,
|
||||
"ruby-advisory-db": 2,
|
||||
"ubuntu": 1
|
||||
},
|
||||
"CVSS": {
|
||||
"nvd": {
|
||||
"V2Vector": "AV:N/AC:M/Au:N/C:N/I:P/A:N",
|
||||
"V3Vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
|
||||
"V2Score": 4.3,
|
||||
"V3Score": 6.1
|
||||
},
|
||||
"redhat": {
|
||||
"V3Vector": "CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L",
|
||||
"V3Score": 5.6
|
||||
}
|
||||
},
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00006.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00025.html",
|
||||
"http://packetstormsecurity.com/files/152787/dotCMS-5.1.1-Vulnerable-Dependencies.html",
|
||||
"http://packetstormsecurity.com/files/153237/RetireJS-CORS-Issue-Script-Execution.html",
|
||||
"http://packetstormsecurity.com/files/156743/OctoberCMS-Insecure-Dependencies.html",
|
||||
"http://seclists.org/fulldisclosure/2019/May/10",
|
||||
"http://seclists.org/fulldisclosure/2019/May/11",
|
||||
"http://seclists.org/fulldisclosure/2019/May/13",
|
||||
"http://www.openwall.com/lists/oss-security/2019/06/03/2",
|
||||
"http://www.securityfocus.com/bid/108023",
|
||||
"https://access.redhat.com/errata/RHBA-2019:1570",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1456",
|
||||
"https://access.redhat.com/errata/RHSA-2019:2587",
|
||||
"https://access.redhat.com/errata/RHSA-2019:3023",
|
||||
"https://access.redhat.com/errata/RHSA-2019:3024",
|
||||
"https://access.redhat.com/security/cve/CVE-2019-11358",
|
||||
"https://backdropcms.org/security/backdrop-sa-core-2019-009",
|
||||
"https://blog.jquery.com/2019/04/10/jquery-3-4-0-released/",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11358",
|
||||
"https://github.com/DanielRuf/snyk-js-jquery-174006?files=1",
|
||||
"https://github.com/advisories/GHSA-6c3j-c64m-qhgq",
|
||||
"https://github.com/jquery/jquery/commit/753d591aea698e57d6db58c9f722cd0808619b1b",
|
||||
"https://github.com/jquery/jquery/pull/4333",
|
||||
"https://github.com/rails/jquery-rails/blob/master/CHANGELOG.md#434",
|
||||
"https://hackerone.com/reports/454365",
|
||||
"https://kb.pulsesecure.net/articles/Pulse_Security_Advisories/SA44601",
|
||||
"https://linux.oracle.com/cve/CVE-2019-11358.html",
|
||||
"https://linux.oracle.com/errata/ELSA-2020-4847.html",
|
||||
"https://lists.apache.org/thread.html/08720ef215ee7ab3386c05a1a90a7d1c852bf0706f176a7816bf65fc@%3Ccommits.airflow.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/519eb0fd45642dcecd9ff74cb3e71c20a4753f7d82e2f07864b5108f@%3Cdev.drill.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/5928aa293e39d248266472210c50f176cac1535220f2486e6a7fa844@%3Ccommits.airflow.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/6097cdbd6f0a337bedd9bb5cc441b2d525ff002a96531de367e4259f@%3Ccommits.airflow.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/88fb0362fd40e5b605ea8149f63241537b8b6fb5bfa315391fc5cbb7@%3Ccommits.airflow.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/b0656d359c7d40ec9f39c8cc61bca66802ef9a2a12ee199f5b0c1442@%3Cdev.drill.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/b736d0784cf02f5a30fbb4c5902762a15ad6d47e17e2c5a17b7d6205@%3Ccommits.airflow.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/ba79cf1658741e9f146e4c59b50aee56656ea95d841d358d006c18b6@%3Ccommits.roller.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/bcce5a9c532b386c68dab2f6b3ce8b0cc9b950ec551766e76391caa3@%3Ccommits.nifi.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/f9bc3e55f4e28d1dcd1a69aae6d53e609a758e34d2869b4d798e13cc@%3Cissues.drill.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r2041a75d3fc09dec55adfd95d598b38d22715303f65c997c054844c9@%3Cissues.flink.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r2baacab6e0acb5a2092eb46ae04fd6c3e8277b4fd79b1ffb7f3254fa@%3Cissues.flink.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r38f0d1aa3c923c22977fe7376508f030f22e22c1379fbb155bf29766@%3Cdev.syncope.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r41b5bfe009c845f67d4f68948cc9419ac2d62e287804aafd72892b08@%3Cissues.flink.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r7aac081cbddb6baa24b75e74abf0929bf309b176755a53e3ed810355@%3Cdev.flink.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r7d64895cc4dff84d0becfc572b20c0e4bf9bfa7b10c6f5f73e783734@%3Cdev.storm.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r7e8ebccb7c022e41295f6fdb7b971209b83702339f872ddd8cf8bf73@%3Cissues.flink.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rac25da84ecdcd36f6de5ad0d255f4e967209bbbebddb285e231da37d@%3Cissues.flink.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rca37935d661f4689cb4119f1b3b224413b22be161b678e6e6ce0c69b@%3Ccommits.nifi.apache.org%3E",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/05/msg00006.html",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/05/msg00029.html",
|
||||
"https://lists.debian.org/debian-lts-announce/2020/02/msg00024.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/4UOAZIFCSZ3ENEFOR5IXX6NFAD3HV7FA/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5IABSKTYZ5JUGL735UKGXL5YPRYOPUYI/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/KYH3OAGR2RTCHRA5NOKX2TES7SNQMWGO/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/QV3PKZC3PQCO3273HAT76PAQZFBEO4KP/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/RLXRX23725JL366CNZGJZ7AQQB7LHQ6F/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/WZW27UCJ5CYFL4KFFFMYMIBNMIU2ALG5/",
|
||||
"https://nvd.nist.gov/vuln/detail/CVE-2019-11358",
|
||||
"https://seclists.org/bugtraq/2019/Apr/32",
|
||||
"https://seclists.org/bugtraq/2019/Jun/12",
|
||||
"https://seclists.org/bugtraq/2019/May/18",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0001/",
|
||||
"https://snyk.io/vuln/SNYK-JS-JQUERY-174006",
|
||||
"https://www.debian.org/security/2019/dsa-4434",
|
||||
"https://www.debian.org/security/2019/dsa-4460",
|
||||
"https://www.drupal.org/sa-core-2019-006",
|
||||
"https://www.oracle.com//security-alerts/cpujul2021.html",
|
||||
"https://www.oracle.com/security-alerts/cpuApr2021.html",
|
||||
"https://www.oracle.com/security-alerts/cpuapr2020.html",
|
||||
"https://www.oracle.com/security-alerts/cpujan2020.html",
|
||||
"https://www.oracle.com/security-alerts/cpujan2021.html",
|
||||
"https://www.oracle.com/security-alerts/cpujul2020.html",
|
||||
"https://www.oracle.com/security-alerts/cpuoct2020.html",
|
||||
"https://www.oracle.com/security-alerts/cpuoct2021.html",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpujul2019-5072835.html",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuoct2019-5072832.html",
|
||||
"https://www.privacy-wise.com/mitigating-cve-2019-11358-in-old-versions-of-jquery/",
|
||||
"https://www.synology.com/security/advisory/Synology_SA_19_19",
|
||||
"https://www.tenable.com/security/tns-2019-08",
|
||||
"https://www.tenable.com/security/tns-2020-02"
|
||||
],
|
||||
"PublishedDate": "2019-04-20T00:29:00Z",
|
||||
"LastModifiedDate": "2021-10-20T11:15:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
222
integration/testdata/fixtures/repo/composer-vendor/installed.json
vendored
Normal file
222
integration/testdata/fixtures/repo/composer-vendor/installed.json
vendored
Normal file
@@ -0,0 +1,222 @@
|
||||
{
|
||||
"packages": [
|
||||
{
|
||||
"name": "guzzlehttp/psr7",
|
||||
"version": "1.8.3",
|
||||
"version_normalized": "1.8.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/psr7.git",
|
||||
"reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
|
||||
"reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0",
|
||||
"psr/http-message": "~1.0",
|
||||
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
|
||||
},
|
||||
"provide": {
|
||||
"psr/http-message-implementation": "1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-zlib": "*",
|
||||
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
|
||||
},
|
||||
"suggest": {
|
||||
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
||||
},
|
||||
"time": "2021-10-05T13:56:00+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.7-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Psr7\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Graham Campbell",
|
||||
"email": "hello@gjcampbell.co.uk",
|
||||
"homepage": "https://github.com/GrahamCampbell"
|
||||
},
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
},
|
||||
{
|
||||
"name": "George Mponos",
|
||||
"email": "gmponos@gmail.com",
|
||||
"homepage": "https://github.com/gmponos"
|
||||
},
|
||||
{
|
||||
"name": "Tobias Nyholm",
|
||||
"email": "tobias.nyholm@gmail.com",
|
||||
"homepage": "https://github.com/Nyholm"
|
||||
},
|
||||
{
|
||||
"name": "Márk Sági-Kazár",
|
||||
"email": "mark.sagikazar@gmail.com",
|
||||
"homepage": "https://github.com/sagikazarmark"
|
||||
},
|
||||
{
|
||||
"name": "Tobias Schultze",
|
||||
"email": "webmaster@tubo-world.de",
|
||||
"homepage": "https://github.com/Tobion"
|
||||
}
|
||||
],
|
||||
"description": "PSR-7 message implementation that also provides common utility methods",
|
||||
"keywords": [
|
||||
"http",
|
||||
"message",
|
||||
"psr-7",
|
||||
"request",
|
||||
"response",
|
||||
"stream",
|
||||
"uri",
|
||||
"url"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/guzzle/psr7/issues",
|
||||
"source": "https://github.com/guzzle/psr7/tree/1.8.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/GrahamCampbell",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/Nyholm",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"install-path": "../guzzlehttp/psr7"
|
||||
},
|
||||
{
|
||||
"name": "psr/http-message",
|
||||
"version": "1.1",
|
||||
"version_normalized": "1.1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/http-message.git",
|
||||
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
|
||||
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2 || ^8.0"
|
||||
},
|
||||
"time": "2023-04-04T09:50:52+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.1.x-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Http\\Message\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "http://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common interface for HTTP messages",
|
||||
"homepage": "https://github.com/php-fig/http-message",
|
||||
"keywords": [
|
||||
"http",
|
||||
"http-message",
|
||||
"psr",
|
||||
"psr-7",
|
||||
"request",
|
||||
"response"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/php-fig/http-message/tree/1.1"
|
||||
},
|
||||
"install-path": "../psr/http-message"
|
||||
},
|
||||
{
|
||||
"name": "ralouphie/getallheaders",
|
||||
"version": "3.0.3",
|
||||
"version_normalized": "3.0.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ralouphie/getallheaders.git",
|
||||
"reference": "120b605dfeb996808c31b6477290a714d356e822"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
|
||||
"reference": "120b605dfeb996808c31b6477290a714d356e822",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.6"
|
||||
},
|
||||
"require-dev": {
|
||||
"php-coveralls/php-coveralls": "^2.1",
|
||||
"phpunit/phpunit": "^5 || ^6.5"
|
||||
},
|
||||
"time": "2019-03-08T08:55:37+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/getallheaders.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Ralph Khattar",
|
||||
"email": "ralph.khattar@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "A polyfill for getallheaders.",
|
||||
"support": {
|
||||
"issues": "https://github.com/ralouphie/getallheaders/issues",
|
||||
"source": "https://github.com/ralouphie/getallheaders/tree/develop"
|
||||
},
|
||||
"install-path": "../ralouphie/getallheaders"
|
||||
}
|
||||
],
|
||||
"dev": true,
|
||||
"dev-package-names": []
|
||||
}
|
||||
29
integration/testdata/fixtures/repo/sbt/build.sbt.lock
vendored
Normal file
29
integration/testdata/fixtures/repo/sbt/build.sbt.lock
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"lockVersion" : 1,
|
||||
"timestamp" : "2024-06-06T11:03:09.964557Z",
|
||||
"configurations" : [
|
||||
"compile",
|
||||
"optional",
|
||||
"provided",
|
||||
"runtime",
|
||||
"test"
|
||||
],
|
||||
"dependencies" : [
|
||||
{
|
||||
"org" : "com.fasterxml.jackson.core",
|
||||
"name" : "jackson-databind",
|
||||
"version" : "2.9.1",
|
||||
"artifacts" : [
|
||||
{
|
||||
"name" : "jackson-databind.jar",
|
||||
"hash" : "sha1:716da1830a2043f18882fc036ec26eb32cbe5aff"
|
||||
}
|
||||
],
|
||||
"configurations" : [
|
||||
"compile",
|
||||
"runtime",
|
||||
"test"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
|
||||
"bomFormat": "CycloneDX",
|
||||
"specVersion": "1.5",
|
||||
"specVersion": "1.6",
|
||||
"serialNumber": "urn:uuid:3ff14136-e09f-4df9-80ea-000000000163",
|
||||
"version": 1,
|
||||
"metadata": {
|
||||
|
||||
2
integration/testdata/helm.json.golden
vendored
2
integration/testdata/helm.json.golden
vendored
@@ -21,7 +21,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 125,
|
||||
"Successes": 80,
|
||||
"Failures": 14,
|
||||
"Exceptions": 0
|
||||
},
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 135,
|
||||
"Successes": 90,
|
||||
"Failures": 4,
|
||||
"Exceptions": 0
|
||||
},
|
||||
@@ -341,7 +341,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 106,
|
||||
"Successes": 61,
|
||||
"Failures": 0,
|
||||
"Exceptions": 0
|
||||
}
|
||||
@@ -351,7 +351,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 105,
|
||||
"Successes": 60,
|
||||
"Failures": 0,
|
||||
"Exceptions": 0
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 133,
|
||||
"Successes": 88,
|
||||
"Failures": 6,
|
||||
"Exceptions": 0
|
||||
},
|
||||
@@ -568,7 +568,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 106,
|
||||
"Successes": 61,
|
||||
"Failures": 0,
|
||||
"Exceptions": 0
|
||||
}
|
||||
@@ -578,7 +578,7 @@
|
||||
"Class": "config",
|
||||
"Type": "helm",
|
||||
"MisconfSummary": {
|
||||
"Successes": 105,
|
||||
"Successes": 60,
|
||||
"Failures": 0,
|
||||
"Exceptions": 0
|
||||
}
|
||||
|
||||
4
integration/testdata/mariner-1.0.json.golden
vendored
4
integration/testdata/mariner-1.0.json.golden
vendored
@@ -42,7 +42,7 @@
|
||||
"VulnerabilityID": "CVE-2022-0261",
|
||||
"PkgName": "vim",
|
||||
"PkgIdentifier": {
|
||||
"PURL": "pkg:cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64",
|
||||
"PURL": "pkg:rpm/cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64\u0026distro=cbl-mariner-1.0.20220122",
|
||||
"UID": "3f08cd76fa5ba73d"
|
||||
},
|
||||
"InstalledVersion": "8.2.4081-1.cm1",
|
||||
@@ -79,7 +79,7 @@
|
||||
"VulnerabilityID": "CVE-2022-0158",
|
||||
"PkgName": "vim",
|
||||
"PkgIdentifier": {
|
||||
"PURL": "pkg:cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64",
|
||||
"PURL": "pkg:rpm/cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64\u0026distro=cbl-mariner-1.0.20220122",
|
||||
"UID": "3f08cd76fa5ba73d"
|
||||
},
|
||||
"InstalledVersion": "8.2.4081-1.cm1",
|
||||
|
||||
725
integration/testdata/npm-cyclonedx.json.golden
vendored
Normal file
725
integration/testdata/npm-cyclonedx.json.golden
vendored
Normal file
@@ -0,0 +1,725 @@
|
||||
{
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
|
||||
"bomFormat": "CycloneDX",
|
||||
"specVersion": "1.6",
|
||||
"serialNumber": "urn:uuid:3ff14136-e09f-4df9-80ea-000000000015",
|
||||
"version": 1,
|
||||
"metadata": {
|
||||
"timestamp": "2021-08-25T12:20:30+00:00",
|
||||
"tools": {
|
||||
"components": [
|
||||
{
|
||||
"type": "application",
|
||||
"group": "aquasecurity",
|
||||
"name": "trivy",
|
||||
"version": "dev"
|
||||
}
|
||||
]
|
||||
},
|
||||
"component": {
|
||||
"bom-ref": "3ff14136-e09f-4df9-80ea-000000000001",
|
||||
"type": "application",
|
||||
"name": "testdata/fixtures/repo/npm",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:SchemaVersion",
|
||||
"value": "2"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"components": [
|
||||
{
|
||||
"bom-ref": "3ff14136-e09f-4df9-80ea-000000000002",
|
||||
"type": "application",
|
||||
"name": "package-lock.json",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:Class",
|
||||
"value": "lang-pkgs"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:Type",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/asap@2.0.6",
|
||||
"type": "library",
|
||||
"name": "asap",
|
||||
"version": "2.0.6",
|
||||
"purl": "pkg:npm/asap@2.0.6",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "asap@2.0.6"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/jquery@3.3.9",
|
||||
"type": "library",
|
||||
"name": "jquery",
|
||||
"version": "3.3.9",
|
||||
"licenses": [
|
||||
{
|
||||
"license": {
|
||||
"name": "MIT"
|
||||
}
|
||||
}
|
||||
],
|
||||
"purl": "pkg:npm/jquery@3.3.9",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "jquery@3.3.9"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/js-tokens@4.0.0",
|
||||
"type": "library",
|
||||
"name": "js-tokens",
|
||||
"version": "4.0.0",
|
||||
"purl": "pkg:npm/js-tokens@4.0.0",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "js-tokens@4.0.0"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/loose-envify@1.4.0",
|
||||
"type": "library",
|
||||
"name": "loose-envify",
|
||||
"version": "1.4.0",
|
||||
"purl": "pkg:npm/loose-envify@1.4.0",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "loose-envify@1.4.0"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/object-assign@4.1.1",
|
||||
"type": "library",
|
||||
"name": "object-assign",
|
||||
"version": "4.1.1",
|
||||
"purl": "pkg:npm/object-assign@4.1.1",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "object-assign@4.1.1"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/promise@8.0.3",
|
||||
"type": "library",
|
||||
"name": "promise",
|
||||
"version": "8.0.3",
|
||||
"licenses": [
|
||||
{
|
||||
"license": {
|
||||
"name": "MIT"
|
||||
}
|
||||
}
|
||||
],
|
||||
"purl": "pkg:npm/promise@8.0.3",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "promise@8.0.3"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/prop-types@15.7.2",
|
||||
"type": "library",
|
||||
"name": "prop-types",
|
||||
"version": "15.7.2",
|
||||
"purl": "pkg:npm/prop-types@15.7.2",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "prop-types@15.7.2"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/react-is@16.8.6",
|
||||
"type": "library",
|
||||
"name": "react-is",
|
||||
"version": "16.8.6",
|
||||
"licenses": [
|
||||
{
|
||||
"license": {
|
||||
"name": "MIT"
|
||||
}
|
||||
}
|
||||
],
|
||||
"purl": "pkg:npm/react-is@16.8.6",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "react-is@16.8.6"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/react@16.8.6",
|
||||
"type": "library",
|
||||
"name": "react",
|
||||
"version": "16.8.6",
|
||||
"licenses": [
|
||||
{
|
||||
"license": {
|
||||
"name": "MIT"
|
||||
}
|
||||
}
|
||||
],
|
||||
"purl": "pkg:npm/react@16.8.6",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "react@16.8.6"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/redux@4.0.1",
|
||||
"type": "library",
|
||||
"name": "redux",
|
||||
"version": "4.0.1",
|
||||
"licenses": [
|
||||
{
|
||||
"license": {
|
||||
"name": "MIT"
|
||||
}
|
||||
}
|
||||
],
|
||||
"purl": "pkg:npm/redux@4.0.1",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "redux@4.0.1"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/scheduler@0.13.6",
|
||||
"type": "library",
|
||||
"name": "scheduler",
|
||||
"version": "0.13.6",
|
||||
"purl": "pkg:npm/scheduler@0.13.6",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "scheduler@0.13.6"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"bom-ref": "pkg:npm/symbol-observable@1.2.0",
|
||||
"type": "library",
|
||||
"name": "symbol-observable",
|
||||
"version": "1.2.0",
|
||||
"purl": "pkg:npm/symbol-observable@1.2.0",
|
||||
"properties": [
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgID",
|
||||
"value": "symbol-observable@1.2.0"
|
||||
},
|
||||
{
|
||||
"name": "aquasecurity:trivy:PkgType",
|
||||
"value": "npm"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"dependencies": [
|
||||
{
|
||||
"ref": "3ff14136-e09f-4df9-80ea-000000000001",
|
||||
"dependsOn": [
|
||||
"3ff14136-e09f-4df9-80ea-000000000002"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "3ff14136-e09f-4df9-80ea-000000000002",
|
||||
"dependsOn": [
|
||||
"pkg:npm/asap@2.0.6",
|
||||
"pkg:npm/jquery@3.3.9",
|
||||
"pkg:npm/js-tokens@4.0.0",
|
||||
"pkg:npm/loose-envify@1.4.0",
|
||||
"pkg:npm/object-assign@4.1.1",
|
||||
"pkg:npm/promise@8.0.3",
|
||||
"pkg:npm/prop-types@15.7.2",
|
||||
"pkg:npm/react-is@16.8.6",
|
||||
"pkg:npm/react@16.8.6",
|
||||
"pkg:npm/redux@4.0.1",
|
||||
"pkg:npm/scheduler@0.13.6",
|
||||
"pkg:npm/symbol-observable@1.2.0"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/asap@2.0.6",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/jquery@3.3.9",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/js-tokens@4.0.0",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/loose-envify@1.4.0",
|
||||
"dependsOn": [
|
||||
"pkg:npm/js-tokens@4.0.0"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/object-assign@4.1.1",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/promise@8.0.3",
|
||||
"dependsOn": [
|
||||
"pkg:npm/asap@2.0.6"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/prop-types@15.7.2",
|
||||
"dependsOn": [
|
||||
"pkg:npm/loose-envify@1.4.0",
|
||||
"pkg:npm/object-assign@4.1.1",
|
||||
"pkg:npm/react-is@16.8.6"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/react-is@16.8.6",
|
||||
"dependsOn": []
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/react@16.8.6",
|
||||
"dependsOn": [
|
||||
"pkg:npm/loose-envify@1.4.0",
|
||||
"pkg:npm/object-assign@4.1.1",
|
||||
"pkg:npm/prop-types@15.7.2",
|
||||
"pkg:npm/scheduler@0.13.6"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/redux@4.0.1",
|
||||
"dependsOn": [
|
||||
"pkg:npm/loose-envify@1.4.0",
|
||||
"pkg:npm/symbol-observable@1.2.0"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/scheduler@0.13.6",
|
||||
"dependsOn": [
|
||||
"pkg:npm/loose-envify@1.4.0",
|
||||
"pkg:npm/object-assign@4.1.1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ref": "pkg:npm/symbol-observable@1.2.0",
|
||||
"dependsOn": []
|
||||
}
|
||||
],
|
||||
"vulnerabilities": [
|
||||
{
|
||||
"id": "CVE-2019-11358",
|
||||
"source": {
|
||||
"name": "ghsa",
|
||||
"url": "https://github.com/advisories?query=type%3Areviewed+ecosystem%3Anpm"
|
||||
},
|
||||
"ratings": [
|
||||
{
|
||||
"source": {
|
||||
"name": "alma"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "amazon"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "arch-linux"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "ghsa"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "nodejs-security-wg"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "nvd"
|
||||
},
|
||||
"score": 4.3,
|
||||
"severity": "medium",
|
||||
"method": "CVSSv2",
|
||||
"vector": "AV:N/AC:M/Au:N/C:N/I:P/A:N"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "nvd"
|
||||
},
|
||||
"score": 6.1,
|
||||
"severity": "medium",
|
||||
"method": "CVSSv31",
|
||||
"vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "oracle-oval"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "redhat"
|
||||
},
|
||||
"score": 5.6,
|
||||
"severity": "medium",
|
||||
"method": "CVSSv3",
|
||||
"vector": "CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "ruby-advisory-db"
|
||||
},
|
||||
"severity": "medium"
|
||||
},
|
||||
{
|
||||
"source": {
|
||||
"name": "ubuntu"
|
||||
},
|
||||
"severity": "low"
|
||||
}
|
||||
],
|
||||
"cwes": [
|
||||
79
|
||||
],
|
||||
"description": "jQuery before 3.4.0, as used in Drupal, Backdrop CMS, and other products, mishandles jQuery.extend(true, {}, ...) because of Object.prototype pollution. If an unsanitized source object contained an enumerable __proto__ property, it could extend the native Object.prototype.",
|
||||
"recommendation": "Upgrade jquery to version 3.4.0",
|
||||
"advisories": [
|
||||
{
|
||||
"url": "https://avd.aquasec.com/nvd/cve-2019-11358"
|
||||
},
|
||||
{
|
||||
"url": "http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00006.html"
|
||||
},
|
||||
{
|
||||
"url": "http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00025.html"
|
||||
},
|
||||
{
|
||||
"url": "http://packetstormsecurity.com/files/152787/dotCMS-5.1.1-Vulnerable-Dependencies.html"
|
||||
},
|
||||
{
|
||||
"url": "http://packetstormsecurity.com/files/153237/RetireJS-CORS-Issue-Script-Execution.html"
|
||||
},
|
||||
{
|
||||
"url": "http://packetstormsecurity.com/files/156743/OctoberCMS-Insecure-Dependencies.html"
|
||||
},
|
||||
{
|
||||
"url": "http://seclists.org/fulldisclosure/2019/May/10"
|
||||
},
|
||||
{
|
||||
"url": "http://seclists.org/fulldisclosure/2019/May/11"
|
||||
},
|
||||
{
|
||||
"url": "http://seclists.org/fulldisclosure/2019/May/13"
|
||||
},
|
||||
{
|
||||
"url": "http://www.openwall.com/lists/oss-security/2019/06/03/2"
|
||||
},
|
||||
{
|
||||
"url": "http://www.securityfocus.com/bid/108023"
|
||||
},
|
||||
{
|
||||
"url": "https://access.redhat.com/errata/RHBA-2019:1570"
|
||||
},
|
||||
{
|
||||
"url": "https://access.redhat.com/errata/RHSA-2019:1456"
|
||||
},
|
||||
{
|
||||
"url": "https://access.redhat.com/errata/RHSA-2019:2587"
|
||||
},
|
||||
{
|
||||
"url": "https://access.redhat.com/errata/RHSA-2019:3023"
|
||||
},
|
||||
{
|
||||
"url": "https://access.redhat.com/errata/RHSA-2019:3024"
|
||||
},
|
||||
{
|
||||
"url": "https://access.redhat.com/security/cve/CVE-2019-11358"
|
||||
},
|
||||
{
|
||||
"url": "https://backdropcms.org/security/backdrop-sa-core-2019-009"
|
||||
},
|
||||
{
|
||||
"url": "https://blog.jquery.com/2019/04/10/jquery-3-4-0-released/"
|
||||
},
|
||||
{
|
||||
"url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11358"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/DanielRuf/snyk-js-jquery-174006?files=1"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/advisories/GHSA-6c3j-c64m-qhgq"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/jquery/jquery/commit/753d591aea698e57d6db58c9f722cd0808619b1b"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/jquery/jquery/pull/4333"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/rails/jquery-rails/blob/master/CHANGELOG.md#434"
|
||||
},
|
||||
{
|
||||
"url": "https://hackerone.com/reports/454365"
|
||||
},
|
||||
{
|
||||
"url": "https://kb.pulsesecure.net/articles/Pulse_Security_Advisories/SA44601"
|
||||
},
|
||||
{
|
||||
"url": "https://linux.oracle.com/cve/CVE-2019-11358.html"
|
||||
},
|
||||
{
|
||||
"url": "https://linux.oracle.com/errata/ELSA-2020-4847.html"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/08720ef215ee7ab3386c05a1a90a7d1c852bf0706f176a7816bf65fc@%3Ccommits.airflow.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/519eb0fd45642dcecd9ff74cb3e71c20a4753f7d82e2f07864b5108f@%3Cdev.drill.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/5928aa293e39d248266472210c50f176cac1535220f2486e6a7fa844@%3Ccommits.airflow.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/6097cdbd6f0a337bedd9bb5cc441b2d525ff002a96531de367e4259f@%3Ccommits.airflow.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/88fb0362fd40e5b605ea8149f63241537b8b6fb5bfa315391fc5cbb7@%3Ccommits.airflow.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/b0656d359c7d40ec9f39c8cc61bca66802ef9a2a12ee199f5b0c1442@%3Cdev.drill.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/b736d0784cf02f5a30fbb4c5902762a15ad6d47e17e2c5a17b7d6205@%3Ccommits.airflow.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/ba79cf1658741e9f146e4c59b50aee56656ea95d841d358d006c18b6@%3Ccommits.roller.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/bcce5a9c532b386c68dab2f6b3ce8b0cc9b950ec551766e76391caa3@%3Ccommits.nifi.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/f9bc3e55f4e28d1dcd1a69aae6d53e609a758e34d2869b4d798e13cc@%3Cissues.drill.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r2041a75d3fc09dec55adfd95d598b38d22715303f65c997c054844c9@%3Cissues.flink.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r2baacab6e0acb5a2092eb46ae04fd6c3e8277b4fd79b1ffb7f3254fa@%3Cissues.flink.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r38f0d1aa3c923c22977fe7376508f030f22e22c1379fbb155bf29766@%3Cdev.syncope.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r41b5bfe009c845f67d4f68948cc9419ac2d62e287804aafd72892b08@%3Cissues.flink.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r7aac081cbddb6baa24b75e74abf0929bf309b176755a53e3ed810355@%3Cdev.flink.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r7d64895cc4dff84d0becfc572b20c0e4bf9bfa7b10c6f5f73e783734@%3Cdev.storm.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/r7e8ebccb7c022e41295f6fdb7b971209b83702339f872ddd8cf8bf73@%3Cissues.flink.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/rac25da84ecdcd36f6de5ad0d255f4e967209bbbebddb285e231da37d@%3Cissues.flink.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.apache.org/thread.html/rca37935d661f4689cb4119f1b3b224413b22be161b678e6e6ce0c69b@%3Ccommits.nifi.apache.org%3E"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.debian.org/debian-lts-announce/2019/05/msg00006.html"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.debian.org/debian-lts-announce/2019/05/msg00029.html"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.debian.org/debian-lts-announce/2020/02/msg00024.html"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/4UOAZIFCSZ3ENEFOR5IXX6NFAD3HV7FA/"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5IABSKTYZ5JUGL735UKGXL5YPRYOPUYI/"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/KYH3OAGR2RTCHRA5NOKX2TES7SNQMWGO/"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/QV3PKZC3PQCO3273HAT76PAQZFBEO4KP/"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/RLXRX23725JL366CNZGJZ7AQQB7LHQ6F/"
|
||||
},
|
||||
{
|
||||
"url": "https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/WZW27UCJ5CYFL4KFFFMYMIBNMIU2ALG5/"
|
||||
},
|
||||
{
|
||||
"url": "https://nvd.nist.gov/vuln/detail/CVE-2019-11358"
|
||||
},
|
||||
{
|
||||
"url": "https://seclists.org/bugtraq/2019/Apr/32"
|
||||
},
|
||||
{
|
||||
"url": "https://seclists.org/bugtraq/2019/Jun/12"
|
||||
},
|
||||
{
|
||||
"url": "https://seclists.org/bugtraq/2019/May/18"
|
||||
},
|
||||
{
|
||||
"url": "https://security.netapp.com/advisory/ntap-20190919-0001/"
|
||||
},
|
||||
{
|
||||
"url": "https://snyk.io/vuln/SNYK-JS-JQUERY-174006"
|
||||
},
|
||||
{
|
||||
"url": "https://www.debian.org/security/2019/dsa-4434"
|
||||
},
|
||||
{
|
||||
"url": "https://www.debian.org/security/2019/dsa-4460"
|
||||
},
|
||||
{
|
||||
"url": "https://www.drupal.org/sa-core-2019-006"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com//security-alerts/cpujul2021.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpuApr2021.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpuapr2020.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpujan2020.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpujan2021.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpujul2020.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpuoct2020.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/security-alerts/cpuoct2021.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/technetwork/security-advisory/cpujul2019-5072835.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.oracle.com/technetwork/security-advisory/cpuoct2019-5072832.html"
|
||||
},
|
||||
{
|
||||
"url": "https://www.privacy-wise.com/mitigating-cve-2019-11358-in-old-versions-of-jquery/"
|
||||
},
|
||||
{
|
||||
"url": "https://www.synology.com/security/advisory/Synology_SA_19_19"
|
||||
},
|
||||
{
|
||||
"url": "https://www.tenable.com/security/tns-2019-08"
|
||||
},
|
||||
{
|
||||
"url": "https://www.tenable.com/security/tns-2020-02"
|
||||
}
|
||||
],
|
||||
"published": "2019-04-20T00:29:00+00:00",
|
||||
"updated": "2021-10-20T11:15:00+00:00",
|
||||
"affects": [
|
||||
{
|
||||
"ref": "pkg:npm/jquery@3.3.9",
|
||||
"versions": [
|
||||
{
|
||||
"version": "3.3.9",
|
||||
"status": "affected"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
|
||||
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
|
||||
"bomFormat": "CycloneDX",
|
||||
"specVersion": "1.5",
|
||||
"specVersion": "1.6",
|
||||
"serialNumber": "urn:uuid:3ff14136-e09f-4df9-80ea-000000000005",
|
||||
"version": 1,
|
||||
"metadata": {
|
||||
|
||||
149
integration/testdata/sbt.json.golden
vendored
Normal file
149
integration/testdata/sbt.json.golden
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"SchemaVersion": 2,
|
||||
"CreatedAt": "2021-08-25T12:20:30.000000005Z",
|
||||
"ArtifactName": "testdata/fixtures/repo/sbt",
|
||||
"ArtifactType": "repository",
|
||||
"Metadata": {
|
||||
"ImageConfig": {
|
||||
"architecture": "",
|
||||
"created": "0001-01-01T00:00:00Z",
|
||||
"os": "",
|
||||
"rootfs": {
|
||||
"type": "",
|
||||
"diff_ids": null
|
||||
},
|
||||
"config": {}
|
||||
}
|
||||
},
|
||||
"Results": [
|
||||
{
|
||||
"Target": "build.sbt.lock",
|
||||
"Class": "lang-pkgs",
|
||||
"Type": "sbt",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2020-9548",
|
||||
"PkgID": "com.fasterxml.jackson.core:jackson-databind:2.9.1",
|
||||
"PkgName": "com.fasterxml.jackson.core:jackson-databind",
|
||||
"PkgIdentifier": {
|
||||
"PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1",
|
||||
"UID": "9ccd2eb3e03373ff"
|
||||
},
|
||||
"InstalledVersion": "2.9.1",
|
||||
"FixedVersion": "2.9.10.4",
|
||||
"Status": "fixed",
|
||||
"Layer": {},
|
||||
"SeveritySource": "ghsa",
|
||||
"PrimaryURL": "https://avd.aquasec.com/nvd/cve-2020-9548",
|
||||
"DataSource": {
|
||||
"ID": "ghsa",
|
||||
"Name": "GitHub Security Advisory Maven",
|
||||
"URL": "https://github.com/advisories?query=type%3Areviewed+ecosystem%3Amaven"
|
||||
},
|
||||
"Title": "jackson-databind: Serialization gadgets in anteros-core",
|
||||
"Description": "FasterXML jackson-databind 2.x before 2.9.10.4 mishandles the interaction between serialization gadgets and typing, related to br.com.anteros.dbcp.AnterosDBCPConfig (aka anteros-core).",
|
||||
"Severity": "CRITICAL",
|
||||
"CweIDs": [
|
||||
"CWE-502"
|
||||
],
|
||||
"VendorSeverity": {
|
||||
"ghsa": 4,
|
||||
"nvd": 4,
|
||||
"redhat": 3
|
||||
},
|
||||
"CVSS": {
|
||||
"nvd": {
|
||||
"V2Vector": "AV:N/AC:M/Au:N/C:P/I:P/A:P",
|
||||
"V3Vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
||||
"V2Score": 6.8,
|
||||
"V3Score": 9.8
|
||||
},
|
||||
"redhat": {
|
||||
"V3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
||||
"V3Score": 8.1
|
||||
}
|
||||
},
|
||||
"References": [
|
||||
"https://access.redhat.com/security/cve/CVE-2020-9548",
|
||||
"https://github.com/FasterXML/jackson-databind/issues/2634",
|
||||
"https://github.com/advisories/GHSA-p43x-xfjf-5jhr",
|
||||
"https://lists.apache.org/thread.html/r35d30db00440ef63b791c4b7f7acb036e14d4a23afa2a249cb66c0fd@%3Cissues.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r9464a40d25c3ba1a55622db72f113eb494a889656962d098c70c5bb1@%3Cdev.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/r98c9b6e4c9e17792e2cd1ec3e4aa20b61a791939046d3f10888176bb@%3Cissues.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rb6fecb5e96a6d61e175ff49f33f2713798dd05cf03067c169d195596@%3Cissues.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rd5a4457be4623038c3989294429bc063eec433a2e55995d81591e2ca@%3Cissues.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rdd49ab9565bec436a896bc00c4b9fc9dce1598e106c318524fbdfec6@%3Cissues.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rdd4df698d5d8e635144d2994922bf0842e933809eae259521f3b5097@%3Cissues.zookeeper.apache.org%3E",
|
||||
"https://lists.apache.org/thread.html/rf1bbc0ea4a9f014cf94df9a12a6477d24a27f52741dbc87f2fd52ff2@%3Cissues.geode.apache.org%3E",
|
||||
"https://lists.debian.org/debian-lts-announce/2020/03/msg00008.html",
|
||||
"https://medium.com/@cowtowncoder/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062",
|
||||
"https://nvd.nist.gov/vuln/detail/CVE-2020-9548",
|
||||
"https://security.netapp.com/advisory/ntap-20200904-0006/",
|
||||
"https://www.oracle.com/security-alerts/cpujan2021.html",
|
||||
"https://www.oracle.com/security-alerts/cpujul2020.html",
|
||||
"https://www.oracle.com/security-alerts/cpuoct2020.html",
|
||||
"https://www.oracle.com/security-alerts/cpuoct2021.html"
|
||||
],
|
||||
"PublishedDate": "2020-03-02T04:15:00Z",
|
||||
"LastModifiedDate": "2021-12-02T21:23:00Z"
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2021-20190",
|
||||
"PkgID": "com.fasterxml.jackson.core:jackson-databind:2.9.1",
|
||||
"PkgName": "com.fasterxml.jackson.core:jackson-databind",
|
||||
"PkgIdentifier": {
|
||||
"PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1",
|
||||
"UID": "9ccd2eb3e03373ff"
|
||||
},
|
||||
"InstalledVersion": "2.9.1",
|
||||
"FixedVersion": "2.9.10.7",
|
||||
"Status": "fixed",
|
||||
"Layer": {},
|
||||
"SeveritySource": "nvd",
|
||||
"PrimaryURL": "https://avd.aquasec.com/nvd/cve-2021-20190",
|
||||
"DataSource": {
|
||||
"ID": "glad",
|
||||
"Name": "GitLab Advisory Database Community",
|
||||
"URL": "https://gitlab.com/gitlab-org/advisories-community"
|
||||
},
|
||||
"Title": "jackson-databind: mishandles the interaction between serialization gadgets and typing, related to javax.swing",
|
||||
"Description": "A flaw was found in jackson-databind before 2.9.10.7. FasterXML mishandles the interaction between serialization gadgets and typing. The highest threat from this vulnerability is to data confidentiality and integrity as well as system availability.",
|
||||
"Severity": "HIGH",
|
||||
"CweIDs": [
|
||||
"CWE-502"
|
||||
],
|
||||
"VendorSeverity": {
|
||||
"ghsa": 3,
|
||||
"nvd": 3,
|
||||
"redhat": 3
|
||||
},
|
||||
"CVSS": {
|
||||
"nvd": {
|
||||
"V2Vector": "AV:N/AC:M/Au:N/C:P/I:P/A:C",
|
||||
"V3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
||||
"V2Score": 8.3,
|
||||
"V3Score": 8.1
|
||||
},
|
||||
"redhat": {
|
||||
"V3Vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
|
||||
"V3Score": 8.1
|
||||
}
|
||||
},
|
||||
"References": [
|
||||
"https://access.redhat.com/security/cve/CVE-2021-20190",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1916633",
|
||||
"https://github.com/FasterXML/jackson-databind/commit/7dbf51bf78d157098074a20bd9da39bd48c18e4a",
|
||||
"https://github.com/FasterXML/jackson-databind/issues/2854",
|
||||
"https://github.com/advisories/GHSA-5949-rw7g-wx7w",
|
||||
"https://lists.apache.org/thread.html/r380e9257bacb8551ee6fcf2c59890ae9477b2c78e553fa9ea08e9d9a@%3Ccommits.nifi.apache.org%3E",
|
||||
"https://lists.debian.org/debian-lts-announce/2021/04/msg00025.html",
|
||||
"https://nvd.nist.gov/vuln/detail/CVE-2021-20190",
|
||||
"https://security.netapp.com/advisory/ntap-20210219-0008/"
|
||||
],
|
||||
"PublishedDate": "2021-01-19T17:15:00Z",
|
||||
"LastModifiedDate": "2021-07-20T23:15:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
84
internal/dbtest/fake.go
Normal file
84
internal/dbtest/fake.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package dbtest
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
v1 "github.com/google/go-containerregistry/pkg/v1"
|
||||
fakei "github.com/google/go-containerregistry/pkg/v1/fake"
|
||||
"github.com/google/go-containerregistry/pkg/v1/tarball"
|
||||
"github.com/google/go-containerregistry/pkg/v1/types"
|
||||
"github.com/samber/lo"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
ftypes "github.com/aquasecurity/trivy/pkg/fanal/types"
|
||||
"github.com/aquasecurity/trivy/pkg/oci"
|
||||
)
|
||||
|
||||
const defaultMediaType = "application/vnd.aquasec.trivy.db.layer.v1.tar+gzip"
|
||||
|
||||
type fakeLayer struct {
|
||||
v1.Layer
|
||||
}
|
||||
|
||||
func (f fakeLayer) MediaType() (types.MediaType, error) {
|
||||
return f.Layer.MediaType()
|
||||
}
|
||||
|
||||
func NewFakeLayer(t *testing.T, input string, mediaType types.MediaType) v1.Layer {
|
||||
layer, err := tarball.LayerFromFile(input, tarball.WithMediaType(mediaType))
|
||||
require.NoError(t, err)
|
||||
|
||||
return fakeLayer{layer}
|
||||
}
|
||||
|
||||
type FakeDBOptions struct {
|
||||
MediaType types.MediaType
|
||||
}
|
||||
|
||||
func NewFakeDB(t *testing.T, dbPath string, opts FakeDBOptions) *oci.Artifact {
|
||||
mediaType := lo.Ternary(opts.MediaType != "", opts.MediaType, defaultMediaType)
|
||||
img := new(fakei.FakeImage)
|
||||
img.LayersReturns([]v1.Layer{NewFakeLayer(t, dbPath, mediaType)}, nil)
|
||||
img.ManifestReturns(&v1.Manifest{
|
||||
Layers: []v1.Descriptor{
|
||||
{
|
||||
MediaType: mediaType,
|
||||
Size: 100,
|
||||
Digest: v1.Hash{
|
||||
Algorithm: "sha256",
|
||||
Hex: "aec482bc254b5dd025d3eaf5bb35997d3dba783e394e8f91d5a415963151bfb8",
|
||||
},
|
||||
Annotations: map[string]string{
|
||||
"org.opencontainers.image.title": "db.tar.gz",
|
||||
},
|
||||
},
|
||||
},
|
||||
}, nil)
|
||||
|
||||
// Mock OCI artifact
|
||||
opt := ftypes.RegistryOptions{
|
||||
Insecure: false,
|
||||
}
|
||||
art, err := oci.NewArtifact("dummy", true, opt, oci.WithImage(img))
|
||||
require.NoError(t, err)
|
||||
|
||||
return art
|
||||
}
|
||||
|
||||
func ArchiveDir(t *testing.T, dir string) string {
|
||||
tmpDBPath := filepath.Join(t.TempDir(), "db.tar")
|
||||
f, err := os.Create(tmpDBPath)
|
||||
require.NoError(t, err)
|
||||
defer f.Close()
|
||||
|
||||
tr := tar.NewWriter(f)
|
||||
defer tr.Close()
|
||||
|
||||
err = tr.AddFS(os.DirFS(dir))
|
||||
require.NoError(t, err)
|
||||
|
||||
return tmpDBPath
|
||||
}
|
||||
132
internal/gittest/server.go
Normal file
132
internal/gittest/server.go
Normal file
@@ -0,0 +1,132 @@
|
||||
//go:build unix
|
||||
|
||||
package gittest
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http/httptest"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/config"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/object"
|
||||
"github.com/sosedoff/gitkit"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aquasecurity/trivy/internal/testutil"
|
||||
)
|
||||
|
||||
var signature = &object.Signature{
|
||||
Name: "Test",
|
||||
Email: "test@example.com",
|
||||
When: time.Now(),
|
||||
}
|
||||
|
||||
func NewServer(t *testing.T, repo, dir string) *httptest.Server {
|
||||
wtDir := t.TempDir()
|
||||
|
||||
// git init
|
||||
r, err := git.PlainInit(wtDir, false)
|
||||
require.NoError(t, err)
|
||||
|
||||
wt, err := r.Worktree()
|
||||
require.NoError(t, err)
|
||||
|
||||
testutil.CopyDir(t, dir, wtDir)
|
||||
|
||||
_, err = wt.Add(".")
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = wt.Commit("initial commit", &git.CommitOptions{
|
||||
Author: signature,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create a bare repository
|
||||
bareDir := t.TempDir()
|
||||
gitDir := filepath.Join(bareDir, repo+".git")
|
||||
_, err = git.PlainClone(gitDir, true, &git.CloneOptions{URL: wtDir})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Set up a git server
|
||||
service := gitkit.New(gitkit.Config{Dir: bareDir})
|
||||
err = service.Setup()
|
||||
require.NoError(t, err)
|
||||
|
||||
return httptest.NewServer(service)
|
||||
}
|
||||
|
||||
func Clone(t *testing.T, ts *httptest.Server, repo, worktree string) *git.Repository {
|
||||
cloneOptions := git.CloneOptions{
|
||||
URL: ts.URL + "/" + repo + ".git",
|
||||
}
|
||||
|
||||
r, err := git.PlainClone(worktree, false, &cloneOptions)
|
||||
require.NoError(t, err)
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
func CommitAll(t *testing.T, r *git.Repository, msg string) {
|
||||
w, err := r.Worktree()
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = w.Add(".")
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = w.Commit(msg, &git.CommitOptions{
|
||||
Author: signature,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func SetTag(t *testing.T, r *git.Repository, tag string) {
|
||||
h, err := r.Head()
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Logf("git tag -a %s %s -m \"%s\"", tag, h.Hash(), tag)
|
||||
_, err = r.CreateTag(tag, h.Hash(), &git.CreateTagOptions{
|
||||
Tagger: signature,
|
||||
Message: tag,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func PushTags(t *testing.T, r *git.Repository) {
|
||||
t.Log("git push --tags")
|
||||
err := r.Push(&git.PushOptions{
|
||||
RemoteName: "origin",
|
||||
RefSpecs: []config.RefSpec{"refs/tags/*:refs/tags/*"},
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, git.NoErrAlreadyUpToDate) {
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
func CreateRemoteBranch(t *testing.T, r *git.Repository, branchName string) {
|
||||
wt, err := r.Worktree()
|
||||
require.NoError(t, err)
|
||||
|
||||
ref := plumbing.NewBranchReferenceName(branchName)
|
||||
err = wt.Checkout(&git.CheckoutOptions{
|
||||
Branch: ref,
|
||||
Create: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
require.NoError(t, wt.Checkout(&git.CheckoutOptions{}))
|
||||
}()
|
||||
|
||||
err = r.Push(&git.PushOptions{
|
||||
RemoteName: "origin",
|
||||
RefSpecs: []config.RefSpec{config.RefSpec(ref + ":" + ref)},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
36
internal/testutil/fs.go
Normal file
36
internal/testutil/fs.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/utils/fsutils"
|
||||
)
|
||||
|
||||
// CopyDir copies the directory content from src to dst.
|
||||
// It supports only simple cases for testing.
|
||||
func CopyDir(t *testing.T, src, dst string) {
|
||||
srcInfo, err := os.Stat(src)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = os.MkdirAll(dst, srcInfo.Mode())
|
||||
require.NoError(t, err)
|
||||
|
||||
entries, err := os.ReadDir(src)
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, entry := range entries {
|
||||
srcPath := filepath.Join(src, entry.Name())
|
||||
dstPath := filepath.Join(dst, entry.Name())
|
||||
|
||||
if entry.IsDir() {
|
||||
CopyDir(t, srcPath, dstPath)
|
||||
} else {
|
||||
_, err = fsutils.CopyFile(srcPath, dstPath)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -48,7 +48,7 @@ func buildLdflags() (string, error) {
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return fmt.Sprintf("-s -w -X=github.com/aquasecurity/trivy/pkg/version.ver=%s", ver), nil
|
||||
return fmt.Sprintf("-s -w -X=github.com/aquasecurity/trivy/pkg/version/app.ver=%s", ver), nil
|
||||
}
|
||||
|
||||
type Tool mg.Namespace
|
||||
|
||||
71
misc/backport/backport.sh
Executable file
71
misc/backport/backport.sh
Executable file
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
BRANCH_NAME=$1
|
||||
PR_NUMBER=$2
|
||||
|
||||
echo "Backporting PR #$PR_NUMBER to branch $BRANCH_NAME"
|
||||
|
||||
# Get the merge commit hash of the pull request
|
||||
echo "Fetching merge commit hash of PR #$PR_NUMBER..."
|
||||
COMMIT_HASH=$(gh api /repos/"$GITHUB_REPOSITORY"/pulls/"$PR_NUMBER" | jq -r '.merge_commit_sha')
|
||||
echo "Merge commit hash: $COMMIT_HASH"
|
||||
|
||||
# Get the title of the original pull request
|
||||
echo "Fetching title of PR #$PR_NUMBER..."
|
||||
ORIGINAL_PR_TITLE=$(gh api /repos/"$GITHUB_REPOSITORY"/pulls/"$PR_NUMBER" | jq -r '.title')
|
||||
echo "Original PR title: $ORIGINAL_PR_TITLE"
|
||||
|
||||
# Checkout the base branch
|
||||
echo "Checking out base branch: $BRANCH_NAME"
|
||||
git checkout "$BRANCH_NAME"
|
||||
|
||||
# Create a new branch with the PR number and branch name
|
||||
NEW_BRANCH="backport-pr-$PR_NUMBER-to-$BRANCH_NAME"
|
||||
|
||||
echo "Creating new branch: $NEW_BRANCH"
|
||||
git switch -c "$NEW_BRANCH"
|
||||
|
||||
# Create the pull request title
|
||||
PR_TITLE="$ORIGINAL_PR_TITLE [backport: $BRANCH_NAME]"
|
||||
|
||||
# Create the pull request description
|
||||
PR_DESCRIPTION="# Backport
|
||||
|
||||
This will backport the following commits from \`main\` to \`$BRANCH_NAME\`:
|
||||
- https://github.com/$GITHUB_REPOSITORY/pull/$PR_NUMBER"
|
||||
|
||||
echo "Cherry-picking commit: $COMMIT_HASH"
|
||||
if git cherry-pick "$COMMIT_HASH"; then
|
||||
echo "Cherry-pick successful"
|
||||
else
|
||||
echo "Cherry-pick failed due to conflicts, force-committing changes"
|
||||
|
||||
# Add only conflicted files
|
||||
git diff --name-only --diff-filter=U | xargs git add
|
||||
|
||||
# Force-commit the changes with conflicts
|
||||
git commit -m "Force-committed changes with conflicts for cherry-pick of $COMMIT_HASH"
|
||||
|
||||
PR_DESCRIPTION="$PR_DESCRIPTION
|
||||
|
||||
## ⚠️ Warning
|
||||
Conflicts occurred during the cherry-pick and were force-committed without proper resolution. Please carefully review the changes, resolve any remaining conflicts, and ensure the code is in a valid state."
|
||||
fi
|
||||
|
||||
echo "Pushing new branch to origin: $NEW_BRANCH"
|
||||
git push origin "$NEW_BRANCH"
|
||||
|
||||
echo "Pull request title: $PR_TITLE"
|
||||
|
||||
echo "Pull request description:"
|
||||
echo "$PR_DESCRIPTION"
|
||||
|
||||
# Create a new pull request with the original PR title, backport suffix, and description
|
||||
echo "Creating pull request..."
|
||||
gh pr create --base "$BRANCH_NAME" --head "$NEW_BRANCH" --title "$PR_TITLE" --body "$PR_DESCRIPTION" --repo "$GITHUB_REPOSITORY" --label "backport"
|
||||
|
||||
# Add a comment to the original PR
|
||||
echo "Adding comment to the original PR #$PR_NUMBER"
|
||||
gh pr comment "$PR_NUMBER" --body "Backport PR created: https://github.com/$GITHUB_REPOSITORY/pull/$(gh pr view "$NEW_BRANCH" --json number --jq .number)"
|
||||
@@ -127,10 +127,15 @@ labels:
|
||||
color: 0ebdb0
|
||||
description: Issues relating to virtual machine scanning
|
||||
|
||||
# others
|
||||
# community
|
||||
- name: good first issue
|
||||
color: 7057ff
|
||||
description: Denotes an issue ready for a new contributor, according to the "help wanted" guidelines.
|
||||
- name: help wanted
|
||||
color: 006b75
|
||||
description: Denotes an issue that needs help from a contributor. Must meet "help wanted" guidelines.
|
||||
|
||||
# release
|
||||
- name: backport
|
||||
color: A8F7BC
|
||||
description: Backport PRs
|
||||
@@ -152,7 +152,7 @@ nav:
|
||||
- Configuration:
|
||||
- CLI:
|
||||
- Overview: docs/references/configuration/cli/trivy.md
|
||||
- AWS: docs/references/configuration/cli/trivy_aws.md
|
||||
- Clean: docs/references/configuration/cli/trivy_clean.md
|
||||
- Config: docs/references/configuration/cli/trivy_config.md
|
||||
- Convert: docs/references/configuration/cli/trivy_convert.md
|
||||
- Filesystem: docs/references/configuration/cli/trivy_filesystem.md
|
||||
@@ -200,6 +200,7 @@ nav:
|
||||
- Add Service Support: community/contribute/checks/service-support.md
|
||||
- Maintainer:
|
||||
- Release Flow: community/maintainer/release-flow.md
|
||||
- Backporting: community/maintainer/backporting.md
|
||||
- Help Wanted: community/maintainer/help-wanted.md
|
||||
- Triage: community/maintainer/triage.md
|
||||
theme:
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
cacheDirName = "fanal"
|
||||
scanCacheDirName = "fanal"
|
||||
|
||||
// artifactBucket stores artifact information with artifact ID such as image ID
|
||||
artifactBucket = "artifact"
|
||||
73
pkg/cache/client.go
vendored
Normal file
73
pkg/cache/client.go
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
const (
|
||||
TypeUnknown Type = "unknown"
|
||||
TypeFS Type = "fs"
|
||||
TypeRedis Type = "redis"
|
||||
TypeMemory Type = "memory"
|
||||
)
|
||||
|
||||
type Type string
|
||||
|
||||
type Options struct {
|
||||
Backend string
|
||||
CacheDir string
|
||||
RedisCACert string
|
||||
RedisCert string
|
||||
RedisKey string
|
||||
RedisTLS bool
|
||||
TTL time.Duration
|
||||
}
|
||||
|
||||
func NewType(backend string) Type {
|
||||
// "redis://" or "fs" are allowed for now
|
||||
// An empty value is also allowed for testability
|
||||
switch {
|
||||
case strings.HasPrefix(backend, "redis://"):
|
||||
return TypeRedis
|
||||
case backend == "fs", backend == "":
|
||||
return TypeFS
|
||||
case backend == "memory":
|
||||
return TypeMemory
|
||||
default:
|
||||
return TypeUnknown
|
||||
}
|
||||
}
|
||||
|
||||
// New returns a new cache client
|
||||
func New(opts Options) (Cache, func(), error) {
|
||||
cleanup := func() {} // To avoid panic
|
||||
|
||||
var cache Cache
|
||||
t := NewType(opts.Backend)
|
||||
log.Debug("Initializing scan cache...", log.String("type", string(t)))
|
||||
switch t {
|
||||
case TypeRedis:
|
||||
redisCache, err := NewRedisCache(opts.Backend, opts.RedisCACert, opts.RedisCert, opts.RedisKey, opts.RedisTLS, opts.TTL)
|
||||
if err != nil {
|
||||
return nil, cleanup, xerrors.Errorf("unable to initialize redis cache: %w", err)
|
||||
}
|
||||
cache = redisCache
|
||||
case TypeFS:
|
||||
// standalone mode
|
||||
fsCache, err := NewFSCache(opts.CacheDir)
|
||||
if err != nil {
|
||||
return nil, cleanup, xerrors.Errorf("unable to initialize fs cache: %w", err)
|
||||
}
|
||||
cache = fsCache
|
||||
case TypeMemory:
|
||||
cache = NewMemoryCache()
|
||||
default:
|
||||
return nil, cleanup, xerrors.Errorf("unknown cache type: %s", t)
|
||||
}
|
||||
return cache, func() { _ = cache.Close() }, nil
|
||||
}
|
||||
121
pkg/cache/client_test.go
vendored
Normal file
121
pkg/cache/client_test.go
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
package cache_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/cache"
|
||||
)
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
opts cache.Options
|
||||
wantType any
|
||||
wantErr string
|
||||
}{
|
||||
{
|
||||
name: "fs backend",
|
||||
opts: cache.Options{
|
||||
Backend: "fs",
|
||||
CacheDir: "/tmp/cache",
|
||||
},
|
||||
wantType: cache.FSCache{},
|
||||
},
|
||||
{
|
||||
name: "redis backend",
|
||||
opts: cache.Options{
|
||||
Backend: "redis://localhost:6379",
|
||||
},
|
||||
wantType: cache.RedisCache{},
|
||||
},
|
||||
{
|
||||
name: "unknown backend",
|
||||
opts: cache.Options{
|
||||
Backend: "unknown",
|
||||
},
|
||||
wantErr: "unknown cache type",
|
||||
},
|
||||
{
|
||||
name: "invalid redis URL",
|
||||
opts: cache.Options{
|
||||
Backend: "redis://invalid-url:foo/bar",
|
||||
},
|
||||
wantErr: "failed to parse Redis URL",
|
||||
},
|
||||
{
|
||||
name: "incomplete TLS options",
|
||||
opts: cache.Options{
|
||||
Backend: "redis://localhost:6379",
|
||||
RedisCACert: "testdata/ca-cert.pem",
|
||||
RedisTLS: true,
|
||||
},
|
||||
wantErr: "you must provide Redis CA, cert and key file path when using TLS",
|
||||
},
|
||||
{
|
||||
name: "invalid TLS file paths",
|
||||
opts: cache.Options{
|
||||
Backend: "redis://localhost:6379",
|
||||
RedisCACert: "testdata/non-existent-ca-cert.pem",
|
||||
RedisCert: "testdata/non-existent-cert.pem",
|
||||
RedisKey: "testdata/non-existent-key.pem",
|
||||
RedisTLS: true,
|
||||
},
|
||||
wantErr: "failed to get TLS config",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c, cleanup, err := cache.New(tt.opts)
|
||||
defer cleanup()
|
||||
|
||||
if tt.wantErr != "" {
|
||||
assert.ErrorContains(t, err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, c)
|
||||
assert.IsType(t, tt.wantType, c)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewType(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
backend string
|
||||
wantType cache.Type
|
||||
}{
|
||||
{
|
||||
name: "redis backend",
|
||||
backend: "redis://localhost:6379",
|
||||
wantType: cache.TypeRedis,
|
||||
},
|
||||
{
|
||||
name: "fs backend",
|
||||
backend: "fs",
|
||||
wantType: cache.TypeFS,
|
||||
},
|
||||
{
|
||||
name: "empty backend",
|
||||
backend: "",
|
||||
wantType: cache.TypeFS,
|
||||
},
|
||||
{
|
||||
name: "unknown backend",
|
||||
backend: "unknown",
|
||||
wantType: cache.TypeUnknown,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := cache.NewType(tt.backend)
|
||||
assert.Equal(t, tt.wantType, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
15
pkg/cache/dir.go
vendored
Normal file
15
pkg/cache/dir.go
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// DefaultDir returns/creates the cache-dir to be used for trivy operations
|
||||
func DefaultDir() string {
|
||||
tmpDir, err := os.UserCacheDir()
|
||||
if err != nil {
|
||||
tmpDir = os.TempDir()
|
||||
}
|
||||
return filepath.Join(tmpDir, "trivy")
|
||||
}
|
||||
7
pkg/fanal/cache/fs.go → pkg/cache/fs.go
vendored
7
pkg/fanal/cache/fs.go → pkg/cache/fs.go
vendored
@@ -20,7 +20,7 @@ type FSCache struct {
|
||||
}
|
||||
|
||||
func NewFSCache(cacheDir string) (FSCache, error) {
|
||||
dir := filepath.Join(cacheDir, cacheDirName)
|
||||
dir := filepath.Join(cacheDir, scanCacheDirName)
|
||||
if err := os.MkdirAll(dir, 0700); err != nil {
|
||||
return FSCache{}, xerrors.Errorf("failed to create cache dir: %w", err)
|
||||
}
|
||||
@@ -31,7 +31,10 @@ func NewFSCache(cacheDir string) (FSCache, error) {
|
||||
}
|
||||
|
||||
err = db.Update(func(tx *bolt.Tx) error {
|
||||
for _, bucket := range []string{artifactBucket, blobBucket} {
|
||||
for _, bucket := range []string{
|
||||
artifactBucket,
|
||||
blobBucket,
|
||||
} {
|
||||
if _, err := tx.CreateBucketIfNotExists([]byte(bucket)); err != nil {
|
||||
return xerrors.Errorf("unable to create %s bucket: %w", bucket, err)
|
||||
}
|
||||
@@ -373,7 +373,7 @@ func TestFSCache_PutArtifact(t *testing.T) {
|
||||
require.NoError(t, err, tt.name)
|
||||
}
|
||||
|
||||
fs.db.View(func(tx *bolt.Tx) error {
|
||||
err = fs.db.View(func(tx *bolt.Tx) error {
|
||||
// check decompressedDigestBucket
|
||||
imageBucket := tx.Bucket([]byte(artifactBucket))
|
||||
b := imageBucket.Get([]byte(tt.args.imageID))
|
||||
@@ -381,6 +381,7 @@ func TestFSCache_PutArtifact(t *testing.T) {
|
||||
|
||||
return nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
98
pkg/cache/memory.go
vendored
Normal file
98
pkg/cache/memory.go
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/fanal/types"
|
||||
)
|
||||
|
||||
var _ Cache = &MemoryCache{}
|
||||
|
||||
type MemoryCache struct {
|
||||
artifacts sync.Map // Map to store artifact information
|
||||
blobs sync.Map // Map to store blob information
|
||||
}
|
||||
|
||||
func NewMemoryCache() *MemoryCache {
|
||||
return &MemoryCache{}
|
||||
}
|
||||
|
||||
// PutArtifact stores the artifact information in the memory cache
|
||||
func (c *MemoryCache) PutArtifact(artifactID string, artifactInfo types.ArtifactInfo) error {
|
||||
c.artifacts.Store(artifactID, artifactInfo)
|
||||
return nil
|
||||
}
|
||||
|
||||
// PutBlob stores the blob information in the memory cache
|
||||
func (c *MemoryCache) PutBlob(blobID string, blobInfo types.BlobInfo) error {
|
||||
c.blobs.Store(blobID, blobInfo)
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteBlobs removes the specified blobs from the memory cache
|
||||
func (c *MemoryCache) DeleteBlobs(blobIDs []string) error {
|
||||
for _, blobID := range blobIDs {
|
||||
c.blobs.Delete(blobID)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetArtifact retrieves the artifact information from the memory cache
|
||||
func (c *MemoryCache) GetArtifact(artifactID string) (types.ArtifactInfo, error) {
|
||||
info, ok := c.artifacts.Load(artifactID)
|
||||
if !ok {
|
||||
return types.ArtifactInfo{}, xerrors.Errorf("artifact (%s) not found in memory cache", artifactID)
|
||||
}
|
||||
artifactInfo, ok := info.(types.ArtifactInfo)
|
||||
if !ok {
|
||||
return types.ArtifactInfo{}, xerrors.Errorf("invalid type for artifact (%s) in memory cache", artifactID)
|
||||
}
|
||||
return artifactInfo, nil
|
||||
}
|
||||
|
||||
// GetBlob retrieves the blob information from the memory cache
|
||||
func (c *MemoryCache) GetBlob(blobID string) (types.BlobInfo, error) {
|
||||
info, ok := c.blobs.Load(blobID)
|
||||
if !ok {
|
||||
return types.BlobInfo{}, xerrors.Errorf("blob (%s) not found in memory cache", blobID)
|
||||
}
|
||||
blobInfo, ok := info.(types.BlobInfo)
|
||||
if !ok {
|
||||
return types.BlobInfo{}, xerrors.Errorf("invalid type for blob (%s) in memory cache", blobID)
|
||||
}
|
||||
return blobInfo, nil
|
||||
}
|
||||
|
||||
// MissingBlobs determines the missing artifact and blob information in the memory cache
|
||||
func (c *MemoryCache) MissingBlobs(artifactID string, blobIDs []string) (bool, []string, error) {
|
||||
var missingArtifact bool
|
||||
var missingBlobIDs []string
|
||||
|
||||
if _, err := c.GetArtifact(artifactID); err != nil {
|
||||
missingArtifact = true
|
||||
}
|
||||
|
||||
for _, blobID := range blobIDs {
|
||||
if _, err := c.GetBlob(blobID); err != nil {
|
||||
missingBlobIDs = append(missingBlobIDs, blobID)
|
||||
}
|
||||
}
|
||||
|
||||
return missingArtifact, missingBlobIDs, nil
|
||||
}
|
||||
|
||||
// Close clears the artifact and blob information from the memory cache
|
||||
func (c *MemoryCache) Close() error {
|
||||
c.artifacts = sync.Map{}
|
||||
c.blobs = sync.Map{}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Clear clears the artifact and blob information from the memory cache
|
||||
func (c *MemoryCache) Clear() error {
|
||||
c.artifacts = sync.Map{}
|
||||
c.blobs = sync.Map{}
|
||||
return nil
|
||||
}
|
||||
396
pkg/cache/memory_test.go
vendored
Normal file
396
pkg/cache/memory_test.go
vendored
Normal file
@@ -0,0 +1,396 @@
|
||||
package cache_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/cache"
|
||||
"github.com/aquasecurity/trivy/pkg/fanal/types"
|
||||
)
|
||||
|
||||
func TestMemoryCache_PutArtifact(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
artifactID string
|
||||
artifactInfo types.ArtifactInfo
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
artifactID: "sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf",
|
||||
artifactInfo: types.ArtifactInfo{
|
||||
SchemaVersion: 2,
|
||||
Architecture: "amd64",
|
||||
Created: time.Date(2020, 11, 14, 0, 20, 4, 0, time.UTC),
|
||||
DockerVersion: "19.03.12",
|
||||
OS: "linux",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
err := c.PutArtifact(tt.artifactID, tt.artifactInfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
got, err := c.GetArtifact(tt.artifactID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.artifactInfo, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_PutBlob(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
blobID string
|
||||
blobInfo types.BlobInfo
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
blobID: "sha256:03901b4a2ea88eeaad62dbe59b072b28b6efa00491962b8741081c5df50c65e0",
|
||||
blobInfo: types.BlobInfo{
|
||||
SchemaVersion: 2,
|
||||
Digest: "sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609",
|
||||
DiffID: "sha256:03901b4a2ea88eeaad62dbe59b072b28b6efa00491962b8741081c5df50c65e0",
|
||||
OS: types.OS{
|
||||
Family: "alpine",
|
||||
Name: "3.10.2",
|
||||
},
|
||||
PackageInfos: []types.PackageInfo{
|
||||
{
|
||||
FilePath: "lib/apk/db/installed",
|
||||
Packages: []types.Package{
|
||||
{
|
||||
Name: "musl",
|
||||
Version: "1.1.22-r3",
|
||||
SrcName: "musl",
|
||||
SrcVersion: "1.1.22-r3",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
err := c.PutBlob(tt.blobID, tt.blobInfo)
|
||||
require.NoError(t, err)
|
||||
|
||||
got, err := c.GetBlob(tt.blobID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.blobInfo, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_GetArtifact(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
artifactID string
|
||||
artifactInfo types.ArtifactInfo
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
artifactID: "sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf",
|
||||
artifactInfo: types.ArtifactInfo{
|
||||
SchemaVersion: 2,
|
||||
Architecture: "amd64",
|
||||
Created: time.Date(2020, 11, 14, 0, 20, 4, 0, time.UTC),
|
||||
DockerVersion: "19.03.12",
|
||||
OS: "linux",
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "not found",
|
||||
artifactID: "sha256:nonexistent",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
if !tt.wantErr {
|
||||
err := c.PutArtifact(tt.artifactID, tt.artifactInfo)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
got, err := c.GetArtifact(tt.artifactID)
|
||||
if tt.wantErr {
|
||||
require.ErrorContains(t, err, "not found in memory cache")
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.artifactInfo, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_GetBlob(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
blobID string
|
||||
blobInfo types.BlobInfo
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
blobID: "sha256:03901b4a2ea88eeaad62dbe59b072b28b6efa00491962b8741081c5df50c65e0",
|
||||
blobInfo: types.BlobInfo{
|
||||
SchemaVersion: 2,
|
||||
Digest: "sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609",
|
||||
DiffID: "sha256:03901b4a2ea88eeaad62dbe59b072b28b6efa00491962b8741081c5df50c65e0",
|
||||
OS: types.OS{
|
||||
Family: "alpine",
|
||||
Name: "3.10.2",
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "not found",
|
||||
blobID: "sha256:nonexistent",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
if !tt.wantErr {
|
||||
err := c.PutBlob(tt.blobID, tt.blobInfo)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
got, err := c.GetBlob(tt.blobID)
|
||||
if tt.wantErr {
|
||||
require.ErrorContains(t, err, "not found in memory cache")
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.blobInfo, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_MissingBlobs(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
artifactID string
|
||||
blobIDs []string
|
||||
putArtifact bool
|
||||
putBlobs []string
|
||||
wantMissingArtifact bool
|
||||
wantMissingBlobIDs []string
|
||||
}{
|
||||
{
|
||||
name: "missing both artifact and blob",
|
||||
artifactID: "sha256:artifact1",
|
||||
blobIDs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
putArtifact: false,
|
||||
putBlobs: []string{},
|
||||
wantMissingArtifact: true,
|
||||
wantMissingBlobIDs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "missing artifact only",
|
||||
artifactID: "sha256:artifact1",
|
||||
blobIDs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
putArtifact: false,
|
||||
putBlobs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
wantMissingArtifact: true,
|
||||
wantMissingBlobIDs: nil,
|
||||
},
|
||||
{
|
||||
name: "missing one blob",
|
||||
artifactID: "sha256:artifact1",
|
||||
blobIDs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
putArtifact: true,
|
||||
putBlobs: []string{"sha256:blob1"},
|
||||
wantMissingArtifact: false,
|
||||
wantMissingBlobIDs: []string{"sha256:blob2"},
|
||||
},
|
||||
{
|
||||
name: "no missing blobs",
|
||||
artifactID: "sha256:artifact1",
|
||||
blobIDs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
putArtifact: true,
|
||||
putBlobs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
wantMissingArtifact: false,
|
||||
wantMissingBlobIDs: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
if tt.putArtifact {
|
||||
err := c.PutArtifact(tt.artifactID, types.ArtifactInfo{})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
for _, blobID := range tt.putBlobs {
|
||||
err := c.PutBlob(blobID, types.BlobInfo{})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
gotMissingArtifact, gotMissingBlobIDs, err := c.MissingBlobs(tt.artifactID, tt.blobIDs)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.wantMissingArtifact, gotMissingArtifact)
|
||||
assert.Equal(t, tt.wantMissingBlobIDs, gotMissingBlobIDs)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_DeleteBlobs(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
blobIDs []string
|
||||
}{
|
||||
{
|
||||
name: "delete existing blobs",
|
||||
blobIDs: []string{
|
||||
"sha256:blob1",
|
||||
"sha256:blob2",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "delete non-existing blobs",
|
||||
blobIDs: []string{
|
||||
"sha256:nonexistent1",
|
||||
"sha256:nonexistent2",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
// Put some blobs in the cache
|
||||
for _, blobID := range tt.blobIDs {
|
||||
err := c.PutBlob(blobID, types.BlobInfo{})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
err := c.DeleteBlobs(tt.blobIDs)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Check that the blobs are no longer in the cache
|
||||
for _, blobID := range tt.blobIDs {
|
||||
_, err := c.GetBlob(blobID)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "not found in memory cache")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_Clear(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
artifactID string
|
||||
blobID string
|
||||
}{
|
||||
{
|
||||
name: "clear cache",
|
||||
artifactID: "sha256:artifact1",
|
||||
blobID: "sha256:blob1",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
err := c.PutArtifact(tt.artifactID, types.ArtifactInfo{})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = c.PutBlob(tt.blobID, types.BlobInfo{})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = c.Clear()
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = c.GetArtifact(tt.artifactID)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "not found in memory cache")
|
||||
|
||||
_, err = c.GetBlob(tt.blobID)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "not found in memory cache")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMemoryCache_Close(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
artifactID string
|
||||
blobID string
|
||||
}{
|
||||
{
|
||||
name: "close cache",
|
||||
artifactID: "sha256:artifact1",
|
||||
blobID: "sha256:blob1",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := cache.NewMemoryCache()
|
||||
|
||||
err := c.PutArtifact(tt.artifactID, types.ArtifactInfo{})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = c.PutBlob(tt.blobID, types.BlobInfo{})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = c.Close()
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = c.GetArtifact(tt.artifactID)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "not found in memory cache")
|
||||
|
||||
_, err = c.GetBlob(tt.blobID)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "not found in memory cache")
|
||||
})
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user