mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-15 17:11:40 -08:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab8b73e8f8 | ||
|
|
a77984a381 | ||
|
|
31a1f5968b | ||
|
|
4ca73f0406 | ||
|
|
0909f94c20 | ||
|
|
d1c01c1ecc | ||
|
|
f8cdd608e2 | ||
|
|
2e4b83b710 | ||
|
|
6fbcbb3286 | ||
|
|
a843682f7c | ||
|
|
0611bf915b | ||
|
|
9a9cb016fa | ||
|
|
74a66fb68a | ||
|
|
aedfd3bfb8 | ||
|
|
a2e13bdeed | ||
|
|
a7d991f3cc | ||
|
|
11bc00d629 | ||
|
|
5005d7966d | ||
|
|
c2a05c71c7 | ||
|
|
51bbc1dc95 | ||
|
|
7b5e3407d1 | ||
|
|
52ab4e9376 |
@@ -21,7 +21,7 @@ jobs:
|
||||
command: goreleaser --rm-dist
|
||||
- run:
|
||||
name: Clone trivy repository
|
||||
command: git clone git@github.com:knqyf263/trivy-repo.git
|
||||
command: git clone git@github.com:aquasecurity/trivy-repo.git
|
||||
- run:
|
||||
name: Setup git settings
|
||||
command: |
|
||||
|
||||
45
.github/ISSUE_TEMPLATE.md
vendored
45
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,45 +0,0 @@
|
||||
<!--
|
||||
|
||||
---------------------------------------------------
|
||||
FEATURE REQUEST
|
||||
---------------------------------------------------
|
||||
|
||||
If this is a FEATURE REQUEST, request format does not matter
|
||||
|
||||
|
||||
---------------------------------------------------
|
||||
BUG REPORT INFORMATION
|
||||
---------------------------------------------------
|
||||
|
||||
You do NOT have to include this information if this is a FEATURE REQUEST
|
||||
|
||||
If this is a BUG REPORT, provide key information from your environment:
|
||||
|
||||
-->
|
||||
|
||||
**Description**
|
||||
|
||||
<!--
|
||||
Briefly describe the problem you are having in a few paragraphs.
|
||||
-->
|
||||
|
||||
**What did you expect to happen?**
|
||||
|
||||
|
||||
**What happened instead?**
|
||||
|
||||
|
||||
**Output of run with `-debug`:**
|
||||
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
|
||||
**Output of `trivy -v`:**
|
||||
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
|
||||
**Additional details (base image name, container registry info...):**
|
||||
|
||||
31
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
Normal file
31
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
name: Bug Report
|
||||
labels: bug
|
||||
about: If something isn't working as expected.
|
||||
---
|
||||
|
||||
**Description**
|
||||
|
||||
<!--
|
||||
Briefly describe the problem you are having in a few paragraphs.
|
||||
-->
|
||||
|
||||
**What did you expect to happen?**
|
||||
|
||||
|
||||
**What happened instead?**
|
||||
|
||||
|
||||
**Output of run with `-debug`:**
|
||||
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
|
||||
**Output of `trivy -v`:**
|
||||
|
||||
```
|
||||
(paste your output here)
|
||||
```
|
||||
|
||||
**Additional details (base image name, container registry info...):**
|
||||
9
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
Normal file
9
.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
name: Feature Request
|
||||
labels: enhancement
|
||||
about: I have a suggestion (and might want to implement myself)!
|
||||
---
|
||||
|
||||
<!--
|
||||
If this is a FEATURE REQUEST, request format does not matter!
|
||||
-->
|
||||
10
.github/ISSUE_TEMPLATE/SUPPORT_QUESTION.md
vendored
Normal file
10
.github/ISSUE_TEMPLATE/SUPPORT_QUESTION.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
name: Support Question
|
||||
labels: question
|
||||
about: If you have a question about Trivy.
|
||||
---
|
||||
|
||||
<!--
|
||||
If you have a trouble, feel free to ask.
|
||||
Make sure you're not asking duplicate question by searching on the issues lists.
|
||||
-->
|
||||
@@ -1,10 +1,11 @@
|
||||
FROM golang:1.12-alpine AS builder
|
||||
ADD go.mod go.sum /app/
|
||||
WORKDIR /app/
|
||||
RUN apk --no-cache add git
|
||||
RUN apk --no-cache add git upx
|
||||
RUN go mod download
|
||||
ADD . /app/
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-X main.version=$(git describe --tags --abbrev=0)" -a -o /trivy cmd/trivy/main.go
|
||||
RUN upx --lzma --best /trivy
|
||||
|
||||
FROM alpine:3.9
|
||||
RUN apk --no-cache add ca-certificates git
|
||||
|
||||
221
README.md
221
README.md
@@ -1,8 +1,12 @@
|
||||
**This repository was transferred from knqyf263/trivy to aquasecurity/trivy.**
|
||||
**If you have previously installed Trivy, please check the [Migration](#Migration) section in case you have any scripts or package managers that need to be updated. We apologise for any inconvenience.**
|
||||
|
||||
<img src="imgs/logo.png" width="300">
|
||||
|
||||
[](https://github.com/knqyf263/trivy/releases/latest)
|
||||
[](https://circleci.com/gh/knqyf263/trivy)
|
||||
[](https://goreportcard.com/report/github.com/knqyf263/trivy)
|
||||
|
||||
[](https://github.com/aquasecurity/trivy/releases/latest)
|
||||
[](https://circleci.com/gh/aquasecurity/trivy)
|
||||
[](https://goreportcard.com/report/github.com/aquasecurity/trivy)
|
||||
[](https://www.gnu.org/licenses/agpl-3.0)
|
||||
|
||||
|
||||
@@ -13,14 +17,6 @@ A Simple and Comprehensive Vulnerability Scanner for Containers, Suitable for CI
|
||||
<img src="imgs/usage1.png" width="600">
|
||||
<img src="imgs/usage2.png" width="600">
|
||||
|
||||
# Accuracy Comparison
|
||||
|
||||
The number of vulnerabilities detected on Alpine Linux (as of 2019/05/12)
|
||||
|
||||
<img src="imgs/alpine.png" width="500">
|
||||
|
||||
See [Comparison with other scanners](#comparison-with-other-scanners) for details.
|
||||
|
||||
# TOC
|
||||
|
||||
- [Abstract](#abstract)
|
||||
@@ -28,7 +24,8 @@ See [Comparison with other scanners](#comparison-with-other-scanners) for detail
|
||||
- [Installation](#installation)
|
||||
- [RHEL/CentOS](#rhelcentos)
|
||||
- [Debian/Ubuntu](#debianubuntu)
|
||||
- [Mac OS X / Homebrew](#mac-os-x--homebrew)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [Mac OS X / Homebrew](#homebrew)
|
||||
- [Binary (Including Windows)](#binary-including-windows)
|
||||
- [From source](#from-source)
|
||||
- [Quick Start](#quick-start)
|
||||
@@ -48,7 +45,7 @@ See [Comparison with other scanners](#comparison-with-other-scanners) for detail
|
||||
- [Reset](#reset)
|
||||
- [Continuous Integration (CI)](#continuous-integration-ci)
|
||||
- [Travis CI](#travis-ci)
|
||||
- [Circle CI](#circle-ci)
|
||||
- [CircleCI](#circleci)
|
||||
- [Authorization for Private Docker Registry](#authorization-for-private-docker-registry)
|
||||
- [Vulnerability Detection](#vulnerability-detection)
|
||||
- [OS Packages](#os-packages)
|
||||
@@ -56,10 +53,10 @@ See [Comparison with other scanners](#comparison-with-other-scanners) for detail
|
||||
- [Usage](#usage)
|
||||
- [Comparison with other scanners](#comparison-with-other-scanners)
|
||||
- [Overview](#overview)
|
||||
- [Accuracy](#accuracy)
|
||||
- [vs Clair](#vs-clair)
|
||||
- [vs Anchore Engine](#vs-anchore-engine)
|
||||
- [vs Quay, Docker Hub, GCR](#vs-quay-docker-hub-gcr)
|
||||
- [Migration](#migration)
|
||||
- [Q&A](#qa)
|
||||
- [Homebrew](#homebrew)
|
||||
- [Others](#others)
|
||||
@@ -85,7 +82,7 @@ See [here](#continuous-integration-ci) for details.
|
||||
- **No need for prerequirements** such as installation of DB, libraries, etc.
|
||||
- `apt-get install`, `yum install` and `brew install` is possible (See [Installation](#installation))
|
||||
- High accuracy
|
||||
- **Especially Alpine Linux and RHEL/CentOS** (See [Comparison with other scanners](#comparison-with-other-scanners))
|
||||
- **Especially Alpine Linux and RHEL/CentOS**
|
||||
- Other OSes are also high
|
||||
- DevSecOps
|
||||
- **Suitable for CI** such as Travis CI, CircleCI, Jenkins, etc.
|
||||
@@ -101,7 +98,7 @@ Add repository setting to `/etc/yum.repos.d`.
|
||||
$ sudo vim /etc/yum.repos.d/trivy.repo
|
||||
[trivy]
|
||||
name=Trivy repository
|
||||
baseurl=https://knqyf263.github.io/trivy-repo/rpm/releases/$releasever/$basearch/
|
||||
baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$releasever/$basearch/
|
||||
gpgcheck=0
|
||||
enabled=1
|
||||
$ sudo yum -y update
|
||||
@@ -111,7 +108,7 @@ $ sudo yum -y install trivy
|
||||
or
|
||||
|
||||
```
|
||||
$ rpm -ivh https://github.com/knqyf263/trivy/releases/download/v0.0.15/trivy_0.0.15_Linux-64bit.rpm
|
||||
$ rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.0.15/trivy_0.0.15_Linux-64bit.rpm
|
||||
```
|
||||
|
||||
## Debian/Ubuntu
|
||||
@@ -120,10 +117,12 @@ Replace `[CODE_NAME]` with your code name
|
||||
|
||||
CODE_NAME: wheezy, jessie, stretch, buster, trusty, xenial, bionic
|
||||
|
||||
`$ lsb_release -c`
|
||||
|
||||
```
|
||||
$ sudo apt-get install apt-transport-https gnupg
|
||||
$ wget -qO - https://knqyf263.github.io/trivy-repo/deb/public.key | sudo apt-key add -
|
||||
$ echo deb https://knqyf263.github.io/trivy-repo/deb [CODE_NAME] main | sudo tee -a /etc/apt/sources.list.d/trivy.list
|
||||
$ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
|
||||
$ echo deb https://aquasecurity.github.io/trivy-repo/deb [CODE_NAME] main | sudo tee -a /etc/apt/sources.list.d/trivy.list
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install trivy
|
||||
```
|
||||
@@ -132,30 +131,39 @@ or
|
||||
|
||||
```
|
||||
$ sudo apt-get install rpm
|
||||
$ wget https://github.com/knqyf263/trivy/releases/download/v0.0.15/trivy_0.0.15_Linux-64bit.deb
|
||||
$ wget https://github.com/aquasecurity/trivy/releases/download/v0.0.15/trivy_0.0.15_Linux-64bit.deb
|
||||
$ sudo dpkg -i trivy_0.0.15_Linux-64bit.deb
|
||||
```
|
||||
## Arch Linux
|
||||
trivy-bin can be installed from the Arch User Repository. Examples:
|
||||
```
|
||||
pikaur -Sy trivy-bin
|
||||
```
|
||||
or
|
||||
```
|
||||
yay -Sy trivy-bin
|
||||
```
|
||||
|
||||
## Mac OS X / Homebrew
|
||||
## Homebrew
|
||||
|
||||
You can use homebrew on Mac OS.
|
||||
You can use homebrew on macOS.
|
||||
|
||||
```
|
||||
$ brew install knqyf263/trivy/trivy
|
||||
$ brew install aquasecurity/trivy/trivy
|
||||
```
|
||||
|
||||
## Binary (Including Windows)
|
||||
|
||||
Get the latest version from [this page](https://github.com/knqyf263/trivy/releases/latest), and download the archive file for your operating system/architecture. Unpack the archive, and put the binary somewhere in your `$PATH` (on UNIX-y systems, /usr/local/bin or the like). Make sure it has execution bits turned on.
|
||||
Get the latest version from [this page](https://github.com/aquasecurity/trivy/releases/latest), and download the archive file for your operating system/architecture. Unpack the archive, and put the binary somewhere in your `$PATH` (on UNIX-y systems, /usr/local/bin or the like). Make sure it has execution bits turned on.
|
||||
|
||||
You need to install `rpm` command for scanning RHEL/CentOS.
|
||||
|
||||
## From source
|
||||
|
||||
```sh
|
||||
$ mkdir -p $GOPATH/src/github.com/knqyf263
|
||||
$ cd $GOPATH/src/github.com/knqyf263
|
||||
$ git clone https://github.com/knqyf263/trivy
|
||||
$ mkdir -p $GOPATH/src/github.com/aquasecurity
|
||||
$ cd $GOPATH/src/github.com/aquasecurity
|
||||
$ git clone https://github.com/aquasecurity/trivy
|
||||
$ cd trivy/cmd/trivy/
|
||||
$ export GO111MODULE=on
|
||||
$ go install
|
||||
@@ -203,23 +211,23 @@ Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
|
||||
Replace [YOUR_CACHE_DIR] with the cache directory on your machine.
|
||||
|
||||
```
|
||||
$ docker run --rm -v [YOUR_CACHE_DIR]:/root/.cache/ knqyf263/trivy [YOUR_IMAGE_NAME]
|
||||
$ docker run --rm -v [YOUR_CACHE_DIR]:/root/.cache/ aquasec/trivy [YOUR_IMAGE_NAME]
|
||||
```
|
||||
|
||||
Example for macOS:
|
||||
|
||||
```
|
||||
$ docker run --rm -v $HOME/Library/Caches:/root/.cache/ knqyf263/trivy python:3.4-alpine
|
||||
$ docker run --rm -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy python:3.4-alpine
|
||||
```
|
||||
|
||||
If you would like to scan the image on your host machine, you need to mount `docker.sock`.
|
||||
|
||||
```
|
||||
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v $HOME/Library/Caches:/root/.cache/ knqyf263/trivy python:3.4-alpine
|
||||
-v $HOME/Library/Caches:/root/.cache/ aquasec/trivy python:3.4-alpine
|
||||
```
|
||||
|
||||
Please re-pull latest `knqyf263/trivy` if an error occured.
|
||||
Please re-pull latest `aquasecurity/trivy` if an error occured.
|
||||
|
||||
<details>
|
||||
<summary>Result</summary>
|
||||
@@ -249,7 +257,7 @@ Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
|
||||
Simply specify an image name (and a tag).
|
||||
|
||||
```
|
||||
$ trivy knqyf263/test-image:1.2.3
|
||||
$ trivy aquasecurity/test-image:1.2.3
|
||||
```
|
||||
|
||||
<details>
|
||||
@@ -269,7 +277,7 @@ $ trivy knqyf263/test-image:1.2.3
|
||||
2019-05-16T12:59:10.285+0900 INFO Updating pipenv Security DB...
|
||||
2019-05-16T12:59:11.487+0900 INFO Detecting pipenv vulnerabilities...
|
||||
|
||||
knqyf263/test-image:1.2.3 (alpine 3.7.1)
|
||||
aquasecurity/test-image:1.2.3 (alpine 3.7.1)
|
||||
========================================
|
||||
Total: 26 (UNKNOWN: 0, LOW: 3, MEDIUM: 16, HIGH: 5, CRITICAL: 2)
|
||||
|
||||
@@ -1008,6 +1016,12 @@ Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
|
||||
|
||||
</details>
|
||||
|
||||
### Specify cache directory
|
||||
|
||||
```
|
||||
$ trivy --cache-dir /tmp/trivy/ python:3.4-alpine3.9
|
||||
```
|
||||
|
||||
### Clear image caches
|
||||
|
||||
The `--clear-cache` option removes image caches. This option is useful if the image which has the same tag is updated (such as when using `latest` tag).
|
||||
@@ -1076,8 +1090,8 @@ env:
|
||||
|
||||
before_install:
|
||||
- docker build -t trivy-ci-test:${COMMIT} .
|
||||
- export VERSION=$(curl --silent "https://api.github.com/repos/knqyf263/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||
- wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
- export VERSION=$(curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||
- wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
- tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
script:
|
||||
- ./trivy --exit-code 0 --severity HIGH --quiet --auto-refresh trivy-ci-test:${COMMIT}
|
||||
@@ -1087,8 +1101,8 @@ cache:
|
||||
- $HOME/.cache/trivy
|
||||
```
|
||||
|
||||
Example: https://travis-ci.org/knqyf263/trivy-ci-test
|
||||
Repository: https://github.com/knqyf263/trivy-ci-test
|
||||
Example: https://travis-ci.org/aquasecurity/trivy-ci-test
|
||||
Repository: https://github.com/aquasecurity/trivy-ci-test
|
||||
|
||||
## CircleCI
|
||||
|
||||
@@ -1111,12 +1125,12 @@ jobs:
|
||||
command: |
|
||||
apk add --update curl
|
||||
VERSION=$(
|
||||
curl --silent "https://api.github.com/repos/knqyf263/trivy/releases/latest" | \
|
||||
curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | \
|
||||
grep '"tag_name":' | \
|
||||
sed -E 's/.*"v([^"]+)".*/\1/'
|
||||
)
|
||||
|
||||
wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
mv trivy /usr/local/bin
|
||||
- run:
|
||||
@@ -1133,8 +1147,8 @@ workflows:
|
||||
- build
|
||||
```
|
||||
|
||||
Example: https://circleci.com/gh/knqyf263/trivy-ci-test
|
||||
Repository: https://github.com/knqyf263/trivy-ci-test
|
||||
Example: https://circleci.com/gh/aquasecurity/trivy-ci-test
|
||||
Repository: https://github.com/aquasecurity/trivy-ci-test
|
||||
|
||||
## Authorization for Private Docker Registry
|
||||
|
||||
@@ -1211,7 +1225,19 @@ The unfixed/unfixable vulnerabilities mean that the patch has not yet been provi
|
||||
|
||||
The path of these files does not matter.
|
||||
|
||||
Example: https://npm.pkg.github.com/knqyf263/trivy-ci-test/blob/master/Dockerfile
|
||||
Example: https://npm.pkg.github.com/aquasecurity/trivy-ci-test/blob/master/Dockerfile
|
||||
|
||||
### Data source
|
||||
- PHP
|
||||
- https://github.com/FriendsOfPHP/security-advisories
|
||||
- Python
|
||||
- https://github.com/pyupio/safety-db
|
||||
- Ruby
|
||||
- https://github.com/rubysec/ruby-advisory-db
|
||||
- Node.js
|
||||
- https://github.com/nodejs/security-wg
|
||||
- Rust
|
||||
- https://github.com/RustSec/advisory-db
|
||||
|
||||
# Usage
|
||||
|
||||
@@ -1237,6 +1263,7 @@ OPTIONS:
|
||||
--auto-refresh refresh DB automatically when updating version of trivy
|
||||
--debug, -d debug mode
|
||||
--vuln-type value comma-separated list of vulnerability types (os,library)
|
||||
--cache-dir value cache directory (default: "/path/to/cache")
|
||||
--help, -h show help
|
||||
--version, -v print the version
|
||||
```
|
||||
@@ -1251,59 +1278,18 @@ OPTIONS:
|
||||
| Clair | ◯ | × | △ | ◯ | △ |
|
||||
| Anchore Engine | ◯ | △ | △ | ◯ | △ |
|
||||
| Quay | ◯ | × | ◯ | ◯ | × |
|
||||
| MicroScanner | ◯ | × | ◯ | △ | ◯ |
|
||||
| MicroScanner | ◯ | × | ◯ | ◯ | ◯ |
|
||||
| Docker Hub | ◯ | × | ◯ | × | × |
|
||||
| GCR | ◯ | × | ◯ | ◯ | × |
|
||||
|
||||
## Accuracy
|
||||
|
||||
The following bar charts show the results of scanning [composer:1.7.2](https://hub.docker.com/_/composer?tab=tags) and [crate:3.2.2](https://hub.docker.com/_/crate?tab=tags) by container scanners. These images were selected randomly.
|
||||
|
||||
Scanners: [Clair](https://github.com/coreos/clair), [Quay](https://quay.io/), [MicroScanner(Free)](https://github.com/aquasecurity/microscanner), [Docker Hub](https://hub.docker.com/), [Anchore Engine](https://anchore.com/engine/)
|
||||
|
||||
See [spreadsheet](https://docs.google.com/spreadsheets/d/16uj9vGh2PHMcVwb_D4h0nYUSvzCAxcnUz9UgQaDCYs4/edit#gid=0) for details.
|
||||
|
||||
In this case, the union of vulnerabilities detected by all vulnerability scanners is used as a data set.
|
||||
|
||||
**NOTE**
|
||||
|
||||
- There may be vulnerabilities that all scanners could not detect.
|
||||
- There may be a mistake because I have confirmed the correctness manually.
|
||||
|
||||
### Alpine Linux
|
||||
|
||||
The results of [composer:1.7.2](https://hub.docker.com/_/composer?tab=tags) using Alpine Linux 3.7.1 (as of 2019/05/12).
|
||||
|
||||
<img src="imgs/alpine.png" width="500">
|
||||
|
||||
`Trivy` has high accuracy and high precision, while GCR did not detect any vulnerability. Although Docker Hub has many True Positive, it also has many False Positive.
|
||||
|
||||
### RHEL/CentOS
|
||||
|
||||
The results of [crate:3.2.2](https://hub.docker.com/_/crate?tab=tags) using CentOS 7.6.1810. (as of 2019/05/14).
|
||||
|
||||
The following chart includes only fixable vulnerabilities.
|
||||
|
||||
<img src="imgs/centos_only_fixable.png" width="500">
|
||||
|
||||
Most scanners only detect patched/fixable vulnerabilities on RHEL/CentOS, but `Trivy` also detects unpatched/unfixable vulnerabilities.
|
||||
|
||||
This graph includes unfixable vulnerabilities as well.
|
||||
|
||||
<img src="imgs/centos_include_unfixable.png" width="500">
|
||||
|
||||
### Other OS
|
||||
|
||||
In the case of other OS, the result is similar to other container scanners.
|
||||
|
||||
## vs Clair
|
||||
|
||||
[Clair](https://github.com/coreos/clair) uses [alpine-secdb](https://github.com/alpinelinux/alpine-secdb/).
|
||||
However, the purpose of this database is to make it possible to know what packages has backported fixes.
|
||||
As README says, it is not a complete database of all security issues in Alpine.
|
||||
|
||||
`Trivy` collects vulnerability information in Alpine Linux from [Alpine Linux Redmine](https://bugs.alpinelinux.org/projects/alpine/issues).
|
||||
Then, those vulnerabilities will be saved on [vuln-list](https://github.com/knqyf263/vuln-list/tree/master/alpine).
|
||||
`Trivy` collects vulnerability information in Alpine Linux from [Alpine Linux aports repository](https://gitlab.alpinelinux.org/alpine/aports).
|
||||
Then, those vulnerabilities will be saved on [vuln-list](https://github.com/aquasecurity/vuln-list/tree/master/alpine).
|
||||
|
||||
`alpine-secdb` has 6959 vulnerabilities (as of 2019/05/12).
|
||||
`vuln-list` has 11101 vulnerabilities related with Alpine Linux (as of 2019/05/12).
|
||||
@@ -1339,6 +1325,55 @@ As `Quay` seems to use `Clair` internally, it has the same accuracy than `Clair`
|
||||
|
||||
`Trivy` can be used regardless of the registry. In addition, it is easy to be integrated with CI/CD services.
|
||||
|
||||
# Migration
|
||||
|
||||
On 19 August 2019, Trivy's repositories moved from `knqyf263/trivy` to `aquasecurity/trivy`. If you previously installed Trivy you should update any scripts or package manager records as described in this section.
|
||||
|
||||
## Overview
|
||||
If you have a script that installs Trivy (for example into your CI pipelines) you should update it to obtain it from the new location by replacing knqyf263/trivy with aquasecurity/trivy.
|
||||
|
||||
For example:
|
||||
```bash
|
||||
# Before
|
||||
$ wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
|
||||
# After
|
||||
$ wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||
```
|
||||
|
||||
## CentOS/RedHat
|
||||
Use https://aquasecurity.github.io instead of https://knqyf263.github.io.
|
||||
|
||||
```bash
|
||||
$ yum remove trivy
|
||||
$ sed -i s/knqyf263/aquasecurity/g /etc/yum.repos.d/trivy.repo
|
||||
$ yum update
|
||||
$ yum install trivy
|
||||
```
|
||||
|
||||
## Debian/Ubuntu
|
||||
Use https://aquasecurity.github.io instead of https://knqyf263.github.io.
|
||||
|
||||
```bash
|
||||
$ apt-get remove --purge trivy
|
||||
$ sed -i s/knqyf263/aquasecurity/g /etc/apt/sources.list.d/trivy.list
|
||||
$ apt-get update
|
||||
$ apt-get install trivy
|
||||
```
|
||||
|
||||
## Homebrew
|
||||
Tap aquasecurity/trivy
|
||||
|
||||
```bash
|
||||
$ brew uninstall --force trivy
|
||||
$ brew untap knqyf263/trivy
|
||||
$ brew install aquasecurity/trivy
|
||||
```
|
||||
|
||||
## Binary (Including Windows)
|
||||
No need to fix.
|
||||
|
||||
|
||||
# Q&A
|
||||
|
||||
## Homebrew
|
||||
@@ -1346,7 +1381,7 @@ As `Quay` seems to use `Clair` internally, it has the same accuracy than `Clair`
|
||||
### Error: Your macOS keychain GitHub credentials do not have sufficient scope!
|
||||
|
||||
```
|
||||
$ brew tap knqyf263/trivy
|
||||
$ brew tap aquasecurity/trivy
|
||||
Error: Your macOS keychain GitHub credentials do not have sufficient scope!
|
||||
Scopes they need: none
|
||||
Scopes they have:
|
||||
@@ -1361,12 +1396,12 @@ Try:
|
||||
$ printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
|
||||
```
|
||||
|
||||
### Error: knqyf263/trivy/trivy 64 already installed
|
||||
### Error: aquasecurity/trivy/trivy 64 already installed
|
||||
|
||||
```
|
||||
$ brew upgrade
|
||||
...
|
||||
Error: knqyf263/trivy/trivy 64 already installed
|
||||
Error: aquasecurity/trivy/trivy 64 already installed
|
||||
```
|
||||
|
||||
Try:
|
||||
@@ -1374,7 +1409,7 @@ Try:
|
||||
```
|
||||
$ brew unlink trivy && brew uninstall trivy
|
||||
($ rm -rf /usr/local/Cellar/trivy/64)
|
||||
$ brew install knqyf263/trivy/trivy
|
||||
$ brew install aquasecurity/trivy/trivy
|
||||
```
|
||||
|
||||
## Others
|
||||
@@ -1397,13 +1432,13 @@ $ trivy --reset
|
||||
|
||||
# Related Projects
|
||||
|
||||
- [Remic](https://github.com/knqyf263/remic)
|
||||
- [Remic](https://github.com/aquasecurity/remic)
|
||||
- Vulnerability Scanner for Detecting Publicly Disclosed Vulnerabilities in Application Dependencies
|
||||
|
||||
# Contribute
|
||||
|
||||
1. fork a repository: github.com/knqyf263/trivy to github.com/you/repo
|
||||
2. get original code: `go get github.com/knqyf263/trivy`
|
||||
1. fork a repository: github.com/aquasecurity/trivy to github.com/you/repo
|
||||
2. get original code: `go get github.com/aquasecurity/trivy`
|
||||
3. work on original code
|
||||
4. add remote to your repo: git remote add myfork https://github.com/you/repo.git
|
||||
5. push your changes: git push myfork
|
||||
|
||||
@@ -5,12 +5,14 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -83,6 +85,10 @@ OPTIONS:
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "quiet, q",
|
||||
Usage: "suppress progress bar and log output",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "no-progress",
|
||||
Usage: "suppress progress bar",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
@@ -101,15 +107,16 @@ OPTIONS:
|
||||
Name: "debug, d",
|
||||
Usage: "debug mode",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "cache-dir",
|
||||
Usage: "cache directory",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "vuln-type",
|
||||
Value: "os,library",
|
||||
Usage: "comma-separated list of vulnerability types (os,library)",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "cache-dir",
|
||||
Value: utils.DefaultCacheDir(),
|
||||
Usage: "cache directory",
|
||||
},
|
||||
}
|
||||
|
||||
app.Action = pkg.Run
|
||||
|
||||
7
go.mod
7
go.mod
@@ -1,9 +1,11 @@
|
||||
module github.com/knqyf263/trivy
|
||||
module github.com/aquasecurity/trivy
|
||||
|
||||
go 1.12
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v0.3.1
|
||||
github.com/aquasecurity/fanal v0.0.0-20190819081512-f04452b627c6
|
||||
github.com/aquasecurity/go-dep-parser v0.0.0-20190819075924-ea223f0ef24b
|
||||
github.com/briandowns/spinner v0.0.0-20190319032542-ac46072a5a91
|
||||
github.com/caarlos0/env/v6 v6.0.0
|
||||
github.com/emirpasic/gods v1.12.0 // indirect
|
||||
@@ -11,11 +13,10 @@ require (
|
||||
github.com/fatih/color v1.7.0
|
||||
github.com/genuinetools/reg v0.16.0
|
||||
github.com/gliderlabs/ssh v0.1.3 // indirect
|
||||
github.com/knqyf263/fanal v0.0.0-20190706175150-0e953d070757
|
||||
github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d
|
||||
github.com/knqyf263/go-dep-parser v0.0.0-20190521150559-1ef8521d17a0
|
||||
github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936
|
||||
github.com/knqyf263/go-version v1.1.1
|
||||
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348
|
||||
github.com/mattn/go-colorable v0.1.1 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/olekukonko/tablewriter v0.0.2-0.20190607075207-195002e6e56a
|
||||
|
||||
8
go.sum
8
go.sum
@@ -22,6 +22,10 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/aquasecurity/fanal v0.0.0-20190819081512-f04452b627c6 h1:pkl+kEW4KeLDPLfDtzjXa+zHOcS4YWSQuSTZ2kWO2GE=
|
||||
github.com/aquasecurity/fanal v0.0.0-20190819081512-f04452b627c6/go.mod h1:enEz4FFetw4XAbkffaYgyCVq1556R9Ry+noqT4rq9BE=
|
||||
github.com/aquasecurity/go-dep-parser v0.0.0-20190819075924-ea223f0ef24b h1:55Ulc/gvfWm4ylhVaR7MxOwujRjA6et7KhmUbSgUFf4=
|
||||
github.com/aquasecurity/go-dep-parser v0.0.0-20190819075924-ea223f0ef24b/go.mod h1:BpNTD9vHfrejKsED9rx04ldM1WIbeyXGYxUrqTVwxVQ=
|
||||
github.com/aws/aws-sdk-go v1.19.11 h1:tqaTGER6Byw3QvsjGW0p018U2UOqaJPeJuzoaF7jjoQ=
|
||||
github.com/aws/aws-sdk-go v1.19.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
|
||||
@@ -124,12 +128,8 @@ github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/knqyf263/berkeleydb v0.0.0-20190501065933-fafe01fb9662/go.mod h1:bu1CcN4tUtoRcI/B/RFHhxMNKFHVq/c3SV+UTyduoXg=
|
||||
github.com/knqyf263/fanal v0.0.0-20190706175150-0e953d070757 h1:+GxAt32Vfj1v2KPUvA44zcTRwZrJbUu5BVvtiU7Y1vo=
|
||||
github.com/knqyf263/fanal v0.0.0-20190706175150-0e953d070757/go.mod h1:kdmitQCmUcpPs1JZA3/kBuxu0AeN9OnVLl7SRkPUoGU=
|
||||
github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d h1:X4cedH4Kn3JPupAwwWuo4AzYp16P0OyLO9d7OnMZc/c=
|
||||
github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d/go.mod h1:o8sgWoz3JADecfc/cTYD92/Et1yMqMy0utV1z+VaZao=
|
||||
github.com/knqyf263/go-dep-parser v0.0.0-20190521150559-1ef8521d17a0 h1:DOQ2UbTciy48dV9vpZ25BOiShrWIWZwBdMOy7SD1Wow=
|
||||
github.com/knqyf263/go-dep-parser v0.0.0-20190521150559-1ef8521d17a0/go.mod h1:gSiqSkOFPstUZu/qZ4wnNJS69PtQQnPl397vxKHJ5mQ=
|
||||
github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936 h1:HDjRqotkViMNcGMGicb7cgxklx8OwnjtCBmyWEqrRvM=
|
||||
github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936/go.mod h1:i4sF0l1fFnY1aiw08QQSwVAFxHEm311Me3WsU/X7nL0=
|
||||
github.com/knqyf263/go-rpmdb v0.0.0-20190501070121-10a1c42a10dc/go.mod h1:MrSSvdMpTSymaQWk1yFr9sxFSyQmKMj6jkbvGrchBV8=
|
||||
|
||||
@@ -28,8 +28,8 @@ nfpm:
|
||||
- rpm
|
||||
dependencies:
|
||||
- rpm
|
||||
vendor: "knqyf263"
|
||||
homepage: "https://github.com/knqyf263"
|
||||
vendor: "aquasecurity"
|
||||
homepage: "https://github.com/aquasecurity"
|
||||
maintainer: "Teppei Fukuda <knqyf263@gmail.com>"
|
||||
description: "A Fast Vulnerability Scanner for Containers"
|
||||
license: "MIT"
|
||||
@@ -71,11 +71,11 @@ archive:
|
||||
|
||||
brew:
|
||||
github:
|
||||
owner: knqyf263
|
||||
owner: aquasecurity
|
||||
name: homebrew-trivy
|
||||
dependencies:
|
||||
- rpm
|
||||
homepage: "https://github.com/knqyf263/trivy"
|
||||
homepage: "https://github.com/aquasecurity/trivy"
|
||||
description: ""
|
||||
test: |
|
||||
system "#{bin}/program --version"
|
||||
|
||||
BIN
imgs/alpine.png
BIN
imgs/alpine.png
Binary file not shown.
|
Before Width: | Height: | Size: 37 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 41 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB |
19
misc/eol/data/debian.csv
Normal file
19
misc/eol/data/debian.csv
Normal file
@@ -0,0 +1,19 @@
|
||||
1.1,Buzz,buzz,1993-08-16,1996-06-17,1997-06-05
|
||||
1.2,Rex,rex,1996-06-17,1996-12-12,1998-06-05
|
||||
1.3,Bo,bo,1996-12-12,1997-06-05,1999-03-09
|
||||
2.0,Hamm,hamm,1997-06-05,1998-07-24,2000-03-09
|
||||
2.1,Slink,slink,1998-07-24,1999-03-09,2000-10-30
|
||||
2.2,Potato,potato,1999-03-09,2000-08-15,2003-07-30
|
||||
3.0,Woody,woody,2000-08-15,2002-07-19,2006-06-30
|
||||
3.1,Sarge,sarge,2002-07-19,2005-06-06,2008-03-30
|
||||
4.0,Etch,etch,2005-06-06,2007-04-08,2010-02-15
|
||||
5.0,Lenny,lenny,2007-04-08,2009-02-14,2012-02-06
|
||||
6.0,Squeeze,squeeze,2009-02-14,2011-02-06,2014-05-31
|
||||
7,Wheezy,wheezy,2011-02-06,2013-05-04,2016-04-26
|
||||
8,Jessie,jessie,2013-05-04,2015-04-25,2018-06-06
|
||||
9,Stretch,stretch,2015-04-25,2017-06-17
|
||||
10,Buster,buster,2017-06-17
|
||||
11,Bullseye,bullseye,2019-08-01
|
||||
12,Bookworm,bookworm,2021-08-01
|
||||
,Sid,sid,1993-08-16
|
||||
,Experimental,experimental,1993-08-16
|
||||
|
31
misc/eol/data/ubuntu.csv
Normal file
31
misc/eol/data/ubuntu.csv
Normal file
@@ -0,0 +1,31 @@
|
||||
4.10,Warty Warthog,warty,2004-03-05,2004-10-20,2006-04-30
|
||||
5.04,Hoary Hedgehog,hoary,2004-10-20,2005-04-08,2006-10-31
|
||||
5.10,Breezy Badger,breezy,2005-04-08,2005-10-12,2007-04-13
|
||||
6.06 LTS,Dapper Drake,dapper,2005-10-12,2006-06-01,2009-07-14,2011-06-01
|
||||
6.10,Edgy Eft,edgy,2006-06-01,2006-10-26,2008-04-25
|
||||
7.04,Feisty Fawn,feisty,2006-10-26,2007-04-19,2008-10-19
|
||||
7.10,Gutsy Gibbon,gutsy,2007-04-19,2007-10-18,2009-04-18
|
||||
8.04 LTS,Hardy Heron,hardy,2007-10-18,2008-04-24,2011-05-12,2013-05-09
|
||||
8.10,Intrepid Ibex,intrepid,2008-04-24,2008-10-30,2010-04-30
|
||||
9.04,Jaunty Jackalope,jaunty,2008-10-30,2009-04-23,2010-10-23
|
||||
9.10,Karmic Koala,karmic,2009-04-23,2009-10-29,2011-04-29
|
||||
10.04 LTS,Lucid Lynx,lucid,2009-10-29,2010-04-29,2013-05-09,2015-04-29
|
||||
10.10,Maverick Meerkat,maverick,2010-04-29,2010-10-10,2012-04-10
|
||||
11.04,Natty Narwhal,natty,2010-10-10,2011-04-28,2012-10-28
|
||||
11.10,Oneiric Ocelot,oneiric,2011-04-28,2011-10-13,2013-05-09
|
||||
12.04 LTS,Precise Pangolin,precise,2011-10-13,2012-04-26,2017-04-26,2017-04-26,2019-04-26
|
||||
12.10,Quantal Quetzal,quantal,2012-04-26,2012-10-18,2014-05-16
|
||||
13.04,Raring Ringtail,raring,2012-10-18,2013-04-25,2014-01-27
|
||||
13.10,Saucy Salamander,saucy,2013-04-25,2013-10-17,2014-07-17
|
||||
14.04 LTS,Trusty Tahr,trusty,2013-10-17,2014-04-17,2019-04-25,2019-04-25,2022-04-25
|
||||
14.10,Utopic Unicorn,utopic,2014-04-17,2014-10-23,2015-07-23
|
||||
15.04,Vivid Vervet,vivid,2014-10-23,2015-04-23,2016-01-23
|
||||
15.10,Wily Werewolf,wily,2015-04-23,2015-10-22,2016-07-22
|
||||
16.04 LTS,Xenial Xerus,xenial,2015-10-22,2016-04-21,2021-04-21,2021-04-21,2024-04-21
|
||||
16.10,Yakkety Yak,yakkety,2016-04-21,2016-10-13,2017-07-20
|
||||
17.04,Zesty Zapus,zesty,2016-10-13,2017-04-13,2018-01-13
|
||||
17.10,Artful Aardvark,artful,2017-04-13,2017-10-19,2018-07-19
|
||||
18.04 LTS,Bionic Beaver,bionic,2017-10-19,2018-04-26,2023-04-26,2023-04-26,2028-04-26
|
||||
18.10,Cosmic Cuttlefish,cosmic,2018-04-26,2018-10-18,2019-07-18
|
||||
19.04,Disco Dingo,disco,2018-10-18,2019-04-18,2020-01-18
|
||||
19.10,Eoan Ermine,eoan,2019-04-18,2019-10-17,2020-07-17
|
||||
|
56
misc/eol/main.go
Normal file
56
misc/eol/main.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// This script displays EOL dates
|
||||
func main() {
|
||||
fmt.Println("Debian")
|
||||
debianEOL()
|
||||
|
||||
fmt.Println("\nUbuntu")
|
||||
ubuntuEOL()
|
||||
}
|
||||
|
||||
func debianEOL() {
|
||||
f, err := os.Open("data/debian.csv")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
fields := strings.Split(line, ",")
|
||||
|
||||
if len(fields) < 6 && fields[0] != "" {
|
||||
fmt.Printf("\"%s\": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),\n", fields[0])
|
||||
} else if len(fields) == 6 {
|
||||
eol, _ := time.Parse("2006-1-2", fields[5])
|
||||
fmt.Printf("\"%s\": time.Date(%d, %d, %d, 23, 59, 59, 0, time.UTC),\n", fields[0], eol.Year(), eol.Month(), eol.Day())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ubuntuEOL() {
|
||||
f, err := os.Open("data/ubuntu.csv")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
fields := strings.Split(line, ",")
|
||||
|
||||
eol, _ := time.Parse("2006-1-2", fields[len(fields)-1])
|
||||
fmt.Printf("\"%s\": time.Date(%d, %d, %d, 23, 59, 59, 0, time.UTC),\n", strings.Fields(fields[0])[0], eol.Year(), eol.Month(), eol.Day())
|
||||
}
|
||||
}
|
||||
10
pkg/db/db.go
10
pkg/db/db.go
@@ -5,21 +5,22 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
)
|
||||
|
||||
var (
|
||||
db *bolt.DB
|
||||
db *bolt.DB
|
||||
dbDir string
|
||||
)
|
||||
|
||||
func Init() (err error) {
|
||||
dbDir := filepath.Join(utils.CacheDir(), "db")
|
||||
dbDir = filepath.Join(utils.CacheDir(), "db")
|
||||
if err = os.MkdirAll(dbDir, 0700); err != nil {
|
||||
return xerrors.Errorf("failed to mkdir: %w", err)
|
||||
}
|
||||
@@ -45,7 +46,6 @@ func Reset() error {
|
||||
return xerrors.Errorf("failed to reset DB: %w", err)
|
||||
}
|
||||
|
||||
dbDir := filepath.Join(utils.CacheDir(), "db")
|
||||
if err := os.RemoveAll(dbDir); err != nil {
|
||||
return xerrors.Errorf("failed to reset DB: %w", err)
|
||||
}
|
||||
|
||||
@@ -5,10 +5,10 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"golang.org/x/xerrors"
|
||||
git "gopkg.in/src-d/go-git.v4"
|
||||
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package log
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
"golang.org/x/xerrors"
|
||||
@@ -11,9 +13,9 @@ var (
|
||||
debugOption bool
|
||||
)
|
||||
|
||||
func InitLogger(debug bool) (err error) {
|
||||
func InitLogger(debug, disable bool) (err error) {
|
||||
debugOption = debug
|
||||
Logger, err = newLogger(debug)
|
||||
Logger, err = newLogger(debug, disable)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in new logger: %w", err)
|
||||
}
|
||||
@@ -21,7 +23,7 @@ func InitLogger(debug bool) (err error) {
|
||||
|
||||
}
|
||||
|
||||
func newLogger(debug bool) (*zap.SugaredLogger, error) {
|
||||
func newLogger(debug, disable bool) (*zap.SugaredLogger, error) {
|
||||
level := zap.NewAtomicLevel()
|
||||
if debug {
|
||||
level.SetLevel(zapcore.DebugLevel)
|
||||
@@ -50,6 +52,10 @@ func newLogger(debug bool) (*zap.SugaredLogger, error) {
|
||||
OutputPaths: []string{"stdout"},
|
||||
ErrorOutputPaths: []string{"stderr"},
|
||||
}
|
||||
if disable {
|
||||
myConfig.OutputPaths = []string{os.DevNull}
|
||||
myConfig.ErrorOutputPaths = []string{os.DevNull}
|
||||
}
|
||||
logger, err := myConfig.Build()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to build zap config: %w", err)
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/olekukonko/tablewriter"
|
||||
)
|
||||
|
||||
30
pkg/run.go
30
pkg/run.go
@@ -5,16 +5,16 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/aquasecurity/fanal/cache"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/report"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/genuinetools/reg/registry"
|
||||
"github.com/knqyf263/fanal/cache"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/report"
|
||||
"github.com/knqyf263/trivy/pkg/scanner"
|
||||
"github.com/knqyf263/trivy/pkg/types"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/urfave/cli"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
@@ -22,17 +22,15 @@ import (
|
||||
func Run(c *cli.Context) (err error) {
|
||||
cliVersion := c.App.Version
|
||||
|
||||
utils.Quiet = c.Bool("quiet")
|
||||
if c.Bool("quiet") || c.Bool("no-progress") {
|
||||
utils.Quiet = true
|
||||
}
|
||||
debug := c.Bool("debug")
|
||||
if err = log.InitLogger(debug); err != nil {
|
||||
if err = log.InitLogger(debug, c.Bool("quiet")); err != nil {
|
||||
l.Fatal(err)
|
||||
}
|
||||
|
||||
cacheDir := c.String("cache-dir")
|
||||
if cacheDir != "" {
|
||||
utils.SetCacheDir(cacheDir)
|
||||
}
|
||||
|
||||
utils.SetCacheDir(c.String("cache-dir"))
|
||||
log.Logger.Debugf("cache dir: %s", utils.CacheDir())
|
||||
|
||||
reset := c.Bool("reset")
|
||||
|
||||
@@ -8,13 +8,13 @@ import (
|
||||
|
||||
"github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
@@ -23,7 +23,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "ruby-advisory-db")
|
||||
repoPath string
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
@@ -49,6 +49,7 @@ type Related struct {
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
repoPath = filepath.Join(utils.CacheDir(), "ruby-advisory-db")
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return xerrors.Errorf("error in %s security DB update: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
@@ -5,12 +5,12 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/bundler"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/bundler"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
|
||||
@@ -9,13 +9,13 @@ import (
|
||||
|
||||
"github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -23,7 +23,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "rust-advisory-db")
|
||||
repoPath string
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Lockfile
|
||||
@@ -45,6 +45,7 @@ type Advisory struct {
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
repoPath = filepath.Join(utils.CacheDir(), "rust-advisory-db")
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return xerrors.Errorf("error in %s security DB update: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/cargo"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/cargo"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,14 +6,14 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
@@ -22,7 +22,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "php-security-advisories")
|
||||
repoPath string
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
@@ -40,6 +40,7 @@ type Branch struct {
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
repoPath = filepath.Join(utils.CacheDir(), "php-security-advisories")
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -5,14 +5,14 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/composer"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/composer"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -10,13 +10,13 @@ import (
|
||||
|
||||
"github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -24,7 +24,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "nodejs-security-wg")
|
||||
repoPath string
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
@@ -44,6 +44,7 @@ type Advisory struct {
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
repoPath = filepath.Join(utils.CacheDir(), "nodejs-security-wg")
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -6,14 +6,14 @@ import (
|
||||
"strings"
|
||||
|
||||
version "github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/npm"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-dep-parser/pkg/yarn"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/npm"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/yarn"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -7,14 +7,14 @@ import (
|
||||
|
||||
"github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -22,7 +22,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "python-safety-db")
|
||||
repoPath string
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
@@ -36,6 +36,7 @@ type Advisory struct {
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
repoPath = filepath.Join(utils.CacheDir(), "python-safety-db")
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -4,15 +4,15 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/pipenv"
|
||||
"github.com/knqyf263/go-dep-parser/pkg/poetry"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/pipenv"
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/poetry"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -4,26 +4,26 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/bundler"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/cargo"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/composer"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/npm"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/pipenv"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/poetry"
|
||||
_ "github.com/knqyf263/fanal/analyzer/library/yarn"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/bundler"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/cargo"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/composer"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/npm"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/pipenv"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/poetry"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/library/yarn"
|
||||
"github.com/aquasecurity/fanal/extractor"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/library/bundler"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/library/cargo"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/library/composer"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/library/node"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/library/python"
|
||||
"github.com/knqyf263/trivy/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/library/bundler"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/library/cargo"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/library/composer"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/library/node"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/library/python"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
|
||||
@@ -2,16 +2,41 @@ package alpine
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
version "github.com/knqyf263/go-rpm-version"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/alpine"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/alpine"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
var (
|
||||
eolDates = map[string]time.Time{
|
||||
"2.0": time.Date(2012, 4, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.1": time.Date(2012, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.2": time.Date(2013, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.3": time.Date(2013, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.4": time.Date(2014, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.5": time.Date(2014, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.6": time.Date(2015, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"2.7": time.Date(2015, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.0": time.Date(2016, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.1": time.Date(2016, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.2": time.Date(2017, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.3": time.Date(2017, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.4": time.Date(2018, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.5": time.Date(2018, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.6": time.Date(2019, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.7": time.Date(2019, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.8": time.Date(2020, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.9": time.Date(2020, 11, 1, 23, 59, 59, 0, time.UTC),
|
||||
"3.10": time.Date(2021, 5, 1, 23, 59, 59, 0, time.UTC),
|
||||
}
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
@@ -51,3 +76,21 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) IsSupportedVersion(osFamily, osVer string) bool {
|
||||
now := time.Now()
|
||||
return s.isSupportedVersion(now, osFamily, osVer)
|
||||
}
|
||||
|
||||
func (s *Scanner) isSupportedVersion(now time.Time, osFamily, osVer string) bool {
|
||||
if strings.Count(osVer, ".") > 1 {
|
||||
osVer = osVer[:strings.LastIndex(osVer, ".")]
|
||||
}
|
||||
|
||||
eol, ok := eolDates[osVer]
|
||||
if !ok {
|
||||
log.Logger.Warnf("This OS version is not on the EOL list: %s %s", osFamily, osVer)
|
||||
return false
|
||||
}
|
||||
return now.Before(eol)
|
||||
}
|
||||
|
||||
64
pkg/scanner/ospkg/alpine/alpine_test.go
Normal file
64
pkg/scanner/ospkg/alpine/alpine_test.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
log.InitLogger(false, false)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
func TestScanner_IsSupportedVersion(t *testing.T) {
|
||||
vectors := map[string]struct {
|
||||
now time.Time
|
||||
osFamily string
|
||||
osVersion string
|
||||
expected bool
|
||||
}{
|
||||
"alpine3.6": {
|
||||
now: time.Date(2019, 3, 2, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "alpine",
|
||||
osVersion: "3.6",
|
||||
expected: true,
|
||||
},
|
||||
"alpine3.6 with EOL": {
|
||||
now: time.Date(2019, 5, 2, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "alpine",
|
||||
osVersion: "3.6.5",
|
||||
expected: false,
|
||||
},
|
||||
"alpine3.9": {
|
||||
now: time.Date(2019, 5, 2, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "alpine",
|
||||
osVersion: "3.9.0",
|
||||
expected: true,
|
||||
},
|
||||
"alpine3.10": {
|
||||
now: time.Date(2019, 5, 2, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "alpine",
|
||||
osVersion: "3.10",
|
||||
expected: true,
|
||||
},
|
||||
"unknown": {
|
||||
now: time.Date(2019, 5, 2, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "alpine",
|
||||
osVersion: "unknown",
|
||||
expected: false,
|
||||
},
|
||||
}
|
||||
|
||||
for testName, v := range vectors {
|
||||
s := NewScanner()
|
||||
t.Run(testName, func(t *testing.T) {
|
||||
actual := s.isSupportedVersion(v.now, v.osFamily, v.osVersion)
|
||||
if actual != v.expected {
|
||||
t.Errorf("[%s] got %v, want %v", testName, actual, v.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -2,19 +2,40 @@ package debian
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
version "github.com/knqyf263/go-deb-version"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/debian"
|
||||
debianoval "github.com/aquasecurity/trivy/pkg/vulnsrc/debian-oval"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
)
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/debian"
|
||||
debianoval "github.com/knqyf263/trivy/pkg/vulnsrc/debian-oval"
|
||||
var (
|
||||
eolDates = map[string]time.Time{
|
||||
"1.1": time.Date(1997, 6, 5, 23, 59, 59, 0, time.UTC),
|
||||
"1.2": time.Date(1998, 6, 5, 23, 59, 59, 0, time.UTC),
|
||||
"1.3": time.Date(1999, 3, 9, 23, 59, 59, 0, time.UTC),
|
||||
"2.0": time.Date(2000, 3, 9, 23, 59, 59, 0, time.UTC),
|
||||
"2.1": time.Date(2000, 10, 30, 23, 59, 59, 0, time.UTC),
|
||||
"2.2": time.Date(2003, 7, 30, 23, 59, 59, 0, time.UTC),
|
||||
"3.0": time.Date(2006, 6, 30, 23, 59, 59, 0, time.UTC),
|
||||
"3.1": time.Date(2008, 3, 30, 23, 59, 59, 0, time.UTC),
|
||||
"4.0": time.Date(2010, 2, 15, 23, 59, 59, 0, time.UTC),
|
||||
"5.0": time.Date(2012, 2, 6, 23, 59, 59, 0, time.UTC),
|
||||
// LTS
|
||||
"6.0": time.Date(2016, 2, 29, 23, 59, 59, 0, time.UTC),
|
||||
"7": time.Date(2018, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
"8": time.Date(2020, 6, 30, 23, 59, 59, 0, time.UTC),
|
||||
"9": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),
|
||||
"10": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),
|
||||
"11": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),
|
||||
"12": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),
|
||||
}
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
@@ -78,3 +99,21 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) IsSupportedVersion(osFamily, osVer string) bool {
|
||||
now := time.Now()
|
||||
return s.isSupportedVersion(now, osFamily, osVer)
|
||||
}
|
||||
|
||||
func (s *Scanner) isSupportedVersion(now time.Time, osFamily, osVer string) bool {
|
||||
if strings.Count(osVer, ".") > 0 {
|
||||
osVer = osVer[:strings.Index(osVer, ".")]
|
||||
}
|
||||
|
||||
eol, ok := eolDates[osVer]
|
||||
if !ok {
|
||||
log.Logger.Warnf("This OS version is not on the EOL list: %s %s", osFamily, osVer)
|
||||
return false
|
||||
}
|
||||
return now.Before(eol)
|
||||
}
|
||||
|
||||
64
pkg/scanner/ospkg/debian/debian_test.go
Normal file
64
pkg/scanner/ospkg/debian/debian_test.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package debian
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
log.InitLogger(false, false)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
func TestScanner_IsSupportedVersion(t *testing.T) {
|
||||
vectors := map[string]struct {
|
||||
now time.Time
|
||||
osFamily string
|
||||
osVersion string
|
||||
expected bool
|
||||
}{
|
||||
"debian7": {
|
||||
now: time.Date(2019, 3, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "debian",
|
||||
osVersion: "7",
|
||||
expected: false,
|
||||
},
|
||||
"debian8": {
|
||||
now: time.Date(2019, 3, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "debian",
|
||||
osVersion: "8.11",
|
||||
expected: true,
|
||||
},
|
||||
"debian8 eol ends": {
|
||||
now: time.Date(2020, 7, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "debian",
|
||||
osVersion: "8.0",
|
||||
expected: false,
|
||||
},
|
||||
"debian9": {
|
||||
now: time.Date(2020, 7, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "debian",
|
||||
osVersion: "9",
|
||||
expected: true,
|
||||
},
|
||||
"unknown": {
|
||||
now: time.Date(2020, 7, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "debian",
|
||||
osVersion: "unknown",
|
||||
expected: false,
|
||||
},
|
||||
}
|
||||
|
||||
for testName, v := range vectors {
|
||||
s := NewScanner()
|
||||
t.Run(testName, func(t *testing.T) {
|
||||
actual := s.isSupportedVersion(v.now, v.osFamily, v.osVersion)
|
||||
if actual != v.expected {
|
||||
t.Errorf("[%s] got %v, want %v", testName, actual, v.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -2,16 +2,38 @@ package redhat
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/analyzer/os"
|
||||
version "github.com/knqyf263/go-rpm-version"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/redhat"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/redhat"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
var (
|
||||
redhatEOLDates = map[string]time.Time{
|
||||
"4": time.Date(2017, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
"5": time.Date(2020, 11, 30, 23, 59, 59, 0, time.UTC),
|
||||
"6": time.Date(2024, 6, 30, 23, 59, 59, 0, time.UTC),
|
||||
// N/A
|
||||
"7": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),
|
||||
"8": time.Date(3000, 1, 1, 23, 59, 59, 0, time.UTC),
|
||||
}
|
||||
centosEOLDates = map[string]time.Time{
|
||||
"3": time.Date(2010, 10, 31, 23, 59, 59, 0, time.UTC),
|
||||
"4": time.Date(2012, 2, 29, 23, 59, 59, 0, time.UTC),
|
||||
"5": time.Date(2017, 3, 31, 23, 59, 59, 0, time.UTC),
|
||||
"6": time.Date(2020, 11, 30, 23, 59, 59, 0, time.UTC),
|
||||
"7": time.Date(2024, 6, 30, 23, 59, 59, 0, time.UTC),
|
||||
// N/A
|
||||
"8": time.Date(3000, 6, 30, 23, 59, 59, 0, time.UTC),
|
||||
}
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
@@ -53,3 +75,27 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) IsSupportedVersion(osFamily, osVer string) bool {
|
||||
now := time.Now()
|
||||
return s.isSupportedVersion(now, osFamily, osVer)
|
||||
}
|
||||
|
||||
func (s *Scanner) isSupportedVersion(now time.Time, osFamily, osVer string) bool {
|
||||
if strings.Count(osVer, ".") > 0 {
|
||||
osVer = osVer[:strings.Index(osVer, ".")]
|
||||
}
|
||||
|
||||
var eolDate time.Time
|
||||
var ok bool
|
||||
if osFamily == os.RedHat {
|
||||
eolDate, ok = redhatEOLDates[osVer]
|
||||
} else if osFamily == os.CentOS {
|
||||
eolDate, ok = centosEOLDates[osVer]
|
||||
}
|
||||
if !ok {
|
||||
log.Logger.Warnf("This OS version is not on the EOL list: %s %s", osFamily, osVer)
|
||||
return false
|
||||
}
|
||||
return now.Before(eolDate)
|
||||
}
|
||||
|
||||
113
pkg/scanner/ospkg/redhat/redhat_test.go
Normal file
113
pkg/scanner/ospkg/redhat/redhat_test.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package redhat
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
log.InitLogger(false, false)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
func TestScanner_IsSupportedVersion(t *testing.T) {
|
||||
vectors := map[string]struct {
|
||||
now time.Time
|
||||
osFamily string
|
||||
osVersion string
|
||||
expected bool
|
||||
}{
|
||||
"centos5": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "centos",
|
||||
osVersion: "5.0",
|
||||
expected: false,
|
||||
},
|
||||
"centos6": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "centos",
|
||||
osVersion: "6.7",
|
||||
expected: true,
|
||||
},
|
||||
"centos6 (eol ends)": {
|
||||
now: time.Date(2020, 12, 1, 0, 0, 0, 0, time.UTC),
|
||||
osFamily: "centos",
|
||||
osVersion: "6.7",
|
||||
expected: false,
|
||||
},
|
||||
"centos7": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "centos",
|
||||
osVersion: "7.5",
|
||||
expected: true,
|
||||
},
|
||||
"centos8": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "centos",
|
||||
osVersion: "8.0",
|
||||
expected: true,
|
||||
},
|
||||
"two dots": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "centos",
|
||||
osVersion: "8.0.1",
|
||||
expected: true,
|
||||
},
|
||||
"redhat5": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "redhat",
|
||||
osVersion: "5.0",
|
||||
expected: true,
|
||||
},
|
||||
"redhat6": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "redhat",
|
||||
osVersion: "6.7",
|
||||
expected: true,
|
||||
},
|
||||
"redhat6 (eol ends)": {
|
||||
now: time.Date(2024, 7, 1, 0, 0, 0, 0, time.UTC),
|
||||
osFamily: "redhat",
|
||||
osVersion: "6.7",
|
||||
expected: false,
|
||||
},
|
||||
"redhat7": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "redhat",
|
||||
osVersion: "7.5",
|
||||
expected: true,
|
||||
},
|
||||
"redhat8": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "redhat",
|
||||
osVersion: "8.0",
|
||||
expected: true,
|
||||
},
|
||||
"no dot": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "redhat",
|
||||
osVersion: "8",
|
||||
expected: true,
|
||||
},
|
||||
"debian": {
|
||||
now: time.Date(2019, 5, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "debian",
|
||||
osVersion: "8",
|
||||
expected: false,
|
||||
},
|
||||
}
|
||||
|
||||
for testName, v := range vectors {
|
||||
s := NewScanner()
|
||||
t.Run(testName, func(t *testing.T) {
|
||||
actual := s.isSupportedVersion(v.now, v.osFamily, v.osVersion)
|
||||
if actual != v.expected {
|
||||
t.Errorf("[%s] got %v, want %v", testName, actual, v.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,28 +1,29 @@
|
||||
package ospkg
|
||||
|
||||
import (
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
_ "github.com/knqyf263/fanal/analyzer/command/apk"
|
||||
fos "github.com/knqyf263/fanal/analyzer/os"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/alpine"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/amazonlinux"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/debianbase"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/opensuse"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/redhatbase"
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/apk"
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/dpkg"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/ospkg/alpine"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/ospkg/debian"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/ospkg/redhat"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/ospkg/ubuntu"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/command/apk"
|
||||
fos "github.com/aquasecurity/fanal/analyzer/os"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/os/alpine"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/os/amazonlinux"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/os/debianbase"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/os/opensuse"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/os/redhatbase"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/pkg/apk"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/pkg/dpkg"
|
||||
"github.com/aquasecurity/fanal/extractor"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg/alpine"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg/debian"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg/redhat"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg/ubuntu"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
type Scanner interface {
|
||||
Detect(string, []analyzer.Package) ([]vulnerability.DetectedVulnerability, error)
|
||||
IsSupportedVersion(string, string) bool
|
||||
}
|
||||
|
||||
func Scan(files extractor.FileMap) (string, string, []vulnerability.DetectedVulnerability, error) {
|
||||
@@ -61,6 +62,11 @@ func Scan(files extractor.FileMap) (string, string, []vulnerability.DetectedVuln
|
||||
pkgs = mergePkgs(pkgs, pkgsFromCommands)
|
||||
log.Logger.Debugf("the number of packages: %d", len(pkgs))
|
||||
|
||||
if !s.IsSupportedVersion(os.Family, os.Name) {
|
||||
log.Logger.Warnf("This OS version is no longer supported by the distribution: %s %s", os.Family, os.Name)
|
||||
log.Logger.Warnf("The vulnerability detection may be insufficient because security updates are not provided")
|
||||
}
|
||||
|
||||
vulns, err := s.Detect(os.Name, pkgs)
|
||||
if err != nil {
|
||||
return "", "", nil, xerrors.Errorf("failed to detect vulnerabilities: %w", err)
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
package ospkg
|
||||
|
||||
import (
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/rpmcmd"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/pkg/rpmcmd"
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
package ospkg
|
||||
|
||||
import (
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/rpmcmd"
|
||||
_ "github.com/aquasecurity/fanal/analyzer/pkg/rpmcmd"
|
||||
// TODO: Eliminate the dependency on "rpm" command
|
||||
// _ "github.com/knqyf263/fanal/analyzer/pkg/rpm"
|
||||
// _ "github.com/aquasecurity/fanal/analyzer/pkg/rpm"
|
||||
)
|
||||
|
||||
70
pkg/scanner/ospkg/ubuntu/ubnutu_test.go
Normal file
70
pkg/scanner/ospkg/ubuntu/ubnutu_test.go
Normal file
@@ -0,0 +1,70 @@
|
||||
package ubuntu
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
log.InitLogger(false, false)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
func TestScanner_IsSupportedVersion(t *testing.T) {
|
||||
vectors := map[string]struct {
|
||||
now time.Time
|
||||
osFamily string
|
||||
osVersion string
|
||||
expected bool
|
||||
}{
|
||||
"ubuntu12.04 eol ends": {
|
||||
now: time.Date(2019, 3, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "ubuntu",
|
||||
osVersion: "12.04",
|
||||
expected: true,
|
||||
},
|
||||
"ubuntu12.04": {
|
||||
now: time.Date(2019, 4, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "ubuntu",
|
||||
osVersion: "12.04",
|
||||
expected: false,
|
||||
},
|
||||
"ubuntu12.10": {
|
||||
now: time.Date(2019, 4, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "ubuntu",
|
||||
osVersion: "12.10",
|
||||
expected: false,
|
||||
},
|
||||
"ubuntu18.04": {
|
||||
now: time.Date(2019, 4, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "ubuntu",
|
||||
osVersion: "18.04",
|
||||
expected: true,
|
||||
},
|
||||
"ubuntu19.04": {
|
||||
now: time.Date(2019, 4, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "ubuntu",
|
||||
osVersion: "19.04",
|
||||
expected: true,
|
||||
},
|
||||
"unknown": {
|
||||
now: time.Date(2019, 4, 31, 23, 59, 59, 0, time.UTC),
|
||||
osFamily: "ubuntu",
|
||||
osVersion: "unknown",
|
||||
expected: false,
|
||||
},
|
||||
}
|
||||
|
||||
for testName, v := range vectors {
|
||||
s := NewScanner()
|
||||
t.Run(testName, func(t *testing.T) {
|
||||
actual := s.isSupportedVersion(v.now, v.osFamily, v.osVersion)
|
||||
if actual != v.expected {
|
||||
t.Errorf("[%s] got %v, want %v", testName, actual, v.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,52 @@
|
||||
package ubuntu
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
version "github.com/knqyf263/go-deb-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/ubuntu"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/ubuntu"
|
||||
)
|
||||
|
||||
var (
|
||||
eolDates = map[string]time.Time{
|
||||
"4.10": time.Date(2006, 4, 30, 23, 59, 59, 0, time.UTC),
|
||||
"5.04": time.Date(2006, 10, 31, 23, 59, 59, 0, time.UTC),
|
||||
"5.10": time.Date(2007, 4, 13, 23, 59, 59, 0, time.UTC),
|
||||
"6.06": time.Date(2011, 6, 1, 23, 59, 59, 0, time.UTC),
|
||||
"6.10": time.Date(2008, 4, 25, 23, 59, 59, 0, time.UTC),
|
||||
"7.04": time.Date(2008, 10, 19, 23, 59, 59, 0, time.UTC),
|
||||
"7.10": time.Date(2009, 4, 18, 23, 59, 59, 0, time.UTC),
|
||||
"8.04": time.Date(2013, 5, 9, 23, 59, 59, 0, time.UTC),
|
||||
"8.10": time.Date(2010, 4, 30, 23, 59, 59, 0, time.UTC),
|
||||
"9.04": time.Date(2010, 10, 23, 23, 59, 59, 0, time.UTC),
|
||||
"9.10": time.Date(2011, 4, 29, 23, 59, 59, 0, time.UTC),
|
||||
"10.04": time.Date(2015, 4, 29, 23, 59, 59, 0, time.UTC),
|
||||
"10.10": time.Date(2012, 4, 10, 23, 59, 59, 0, time.UTC),
|
||||
"11.04": time.Date(2012, 10, 28, 23, 59, 59, 0, time.UTC),
|
||||
"11.10": time.Date(2013, 5, 9, 23, 59, 59, 0, time.UTC),
|
||||
"12.04": time.Date(2019, 4, 26, 23, 59, 59, 0, time.UTC),
|
||||
"12.10": time.Date(2014, 5, 16, 23, 59, 59, 0, time.UTC),
|
||||
"13.04": time.Date(2014, 1, 27, 23, 59, 59, 0, time.UTC),
|
||||
"13.10": time.Date(2014, 7, 17, 23, 59, 59, 0, time.UTC),
|
||||
"14.04": time.Date(2022, 4, 25, 23, 59, 59, 0, time.UTC),
|
||||
"14.10": time.Date(2015, 7, 23, 23, 59, 59, 0, time.UTC),
|
||||
"15.04": time.Date(2016, 1, 23, 23, 59, 59, 0, time.UTC),
|
||||
"15.10": time.Date(2016, 7, 22, 23, 59, 59, 0, time.UTC),
|
||||
"16.04": time.Date(2024, 4, 21, 23, 59, 59, 0, time.UTC),
|
||||
"16.10": time.Date(2017, 7, 20, 23, 59, 59, 0, time.UTC),
|
||||
"17.04": time.Date(2018, 1, 13, 23, 59, 59, 0, time.UTC),
|
||||
"17.10": time.Date(2018, 7, 19, 23, 59, 59, 0, time.UTC),
|
||||
"18.04": time.Date(2028, 4, 26, 23, 59, 59, 0, time.UTC),
|
||||
"18.10": time.Date(2019, 7, 18, 23, 59, 59, 0, time.UTC),
|
||||
"19.04": time.Date(2020, 1, 18, 23, 59, 59, 0, time.UTC),
|
||||
"19.10": time.Date(2020, 7, 17, 23, 59, 59, 0, time.UTC),
|
||||
}
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
@@ -62,3 +100,17 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) IsSupportedVersion(osFamily, osVer string) bool {
|
||||
now := time.Now()
|
||||
return s.isSupportedVersion(now, osFamily, osVer)
|
||||
}
|
||||
|
||||
func (s *Scanner) isSupportedVersion(now time.Time, osFamily, osVer string) bool {
|
||||
eol, ok := eolDates[osVer]
|
||||
if !ok {
|
||||
log.Logger.Warnf("This OS version is not on the EOL list: %s %s", osFamily, osVer)
|
||||
return false
|
||||
}
|
||||
return now.Before(eol)
|
||||
}
|
||||
|
||||
@@ -6,13 +6,13 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/library"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/ospkg"
|
||||
"github.com/knqyf263/trivy/pkg/types"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/extractor"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/library"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
@@ -4,10 +4,10 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/caarlos0/env/v6"
|
||||
"github.com/knqyf263/fanal/types"
|
||||
"github.com/aquasecurity/fanal/types"
|
||||
)
|
||||
|
||||
type DockerConfig struct {
|
||||
|
||||
@@ -8,26 +8,26 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
var cacheDir string
|
||||
|
||||
func CacheDir() string {
|
||||
if cacheDir == "" {
|
||||
var err error
|
||||
cacheDir, err = os.UserCacheDir()
|
||||
if err != nil {
|
||||
cacheDir = os.TempDir()
|
||||
}
|
||||
func DefaultCacheDir() string {
|
||||
tmpDir, err := os.UserCacheDir()
|
||||
if err != nil {
|
||||
tmpDir = os.TempDir()
|
||||
}
|
||||
dir := filepath.Join(cacheDir, "trivy")
|
||||
return dir
|
||||
return filepath.Join(tmpDir, "trivy")
|
||||
}
|
||||
|
||||
func SetCacheDir(cd string) {
|
||||
cacheDir = cd
|
||||
func CacheDir() string {
|
||||
return cacheDir
|
||||
}
|
||||
|
||||
func SetCacheDir(dir string) {
|
||||
cacheDir = dir
|
||||
}
|
||||
|
||||
func FileWalk(root string, targetFiles map[string]struct{}, walkFn func(r io.Reader, path string) error) error {
|
||||
@@ -115,6 +115,9 @@ func FilterTargets(prefixPath string, targets map[string]struct{}) (map[string]s
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in filepath rel: %w", err)
|
||||
}
|
||||
if strings.HasPrefix(rel, "../") {
|
||||
continue
|
||||
}
|
||||
filtered[rel] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
144
pkg/utils/utils_test.go
Normal file
144
pkg/utils/utils_test.go
Normal file
@@ -0,0 +1,144 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/kylelemons/godebug/pretty"
|
||||
)
|
||||
|
||||
func touch(t *testing.T, name string) {
|
||||
f, err := os.Create(name)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := f.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func write(t *testing.T, name string, content string) {
|
||||
err := ioutil.WriteFile(name, []byte(content), 0666)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFileWalk(t *testing.T) {
|
||||
if err := log.InitLogger(false, false); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
td, err := ioutil.TempDir("", "walktest")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(td)
|
||||
|
||||
if err := os.MkdirAll(filepath.Join(td, "dir"), 0755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
touch(t, filepath.Join(td, "dir/foo1"))
|
||||
touch(t, filepath.Join(td, "dir/foo2"))
|
||||
write(t, filepath.Join(td, "dir/foo3"), "foo3")
|
||||
write(t, filepath.Join(td, "dir/foo4"), "foo4")
|
||||
|
||||
sawDir := false
|
||||
sawFoo1 := false
|
||||
sawFoo2 := false
|
||||
sawFoo4 := false
|
||||
var contentFoo3 []byte
|
||||
walker := func(r io.Reader, path string) error {
|
||||
if strings.HasSuffix(path, "dir") {
|
||||
sawDir = true
|
||||
}
|
||||
if strings.HasSuffix(path, "foo1") {
|
||||
sawFoo1 = true
|
||||
}
|
||||
if strings.HasSuffix(path, "foo2") {
|
||||
sawFoo2 = true
|
||||
}
|
||||
if strings.HasSuffix(path, "foo3") {
|
||||
contentFoo3, err = ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
if strings.HasSuffix(path, "foo4") {
|
||||
sawFoo4 = true
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
targetFiles := map[string]struct{}{
|
||||
"dir/foo2": {},
|
||||
"dir/foo3": {},
|
||||
}
|
||||
err = FileWalk(td, targetFiles, walker)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if sawDir {
|
||||
t.Error("directories must not be passed to walkFn")
|
||||
}
|
||||
if sawFoo1 || sawFoo4 {
|
||||
t.Error("a file not included in targetFiles must not be passed to walkFn")
|
||||
}
|
||||
if sawFoo2 {
|
||||
t.Error("an empty file must not be passed to walkFn")
|
||||
}
|
||||
if string(contentFoo3) != "foo3" {
|
||||
t.Error("The file content is wrong")
|
||||
}
|
||||
}
|
||||
func TestFilterTargets(t *testing.T) {
|
||||
vectors := map[string]struct {
|
||||
prefix string
|
||||
targets map[string]struct{} // Target files
|
||||
expected map[string]struct{}
|
||||
err error // Expected error to occur
|
||||
}{
|
||||
"normal": {
|
||||
prefix: "dir",
|
||||
targets: map[string]struct{}{
|
||||
"dir/file1": {},
|
||||
"dir/file2": {},
|
||||
"foo/bar": {},
|
||||
},
|
||||
expected: map[string]struct{}{
|
||||
"file1": {},
|
||||
"file2": {},
|
||||
},
|
||||
err: nil,
|
||||
},
|
||||
"other directory with the same prefix": {
|
||||
prefix: "dir",
|
||||
targets: map[string]struct{}{
|
||||
"dir/file1": {},
|
||||
"dir2/file2": {},
|
||||
},
|
||||
expected: map[string]struct{}{
|
||||
"file1": {},
|
||||
},
|
||||
err: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for testName, v := range vectors {
|
||||
t.Run(testName, func(t *testing.T) {
|
||||
actual, err := FilterTargets(v.prefix, v.targets)
|
||||
if err != nil {
|
||||
t.Errorf("err: got %v, want %v", v.err, err)
|
||||
}
|
||||
if !reflect.DeepEqual(actual, v.expected) {
|
||||
t.Errorf("[%s]\n%s", testName, pretty.Compare(v.expected, actual))
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,15 @@ import (
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -8,17 +8,17 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/debian"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/debian"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -8,10 +8,10 @@ import (
|
||||
"strings"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,17 +6,17 @@ import (
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -9,13 +9,13 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,16 +6,16 @@ import (
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,11 +6,11 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
|
||||
"sort"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -3,21 +3,21 @@ package vulnsrc
|
||||
import (
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/alpine"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/debian"
|
||||
debianoval "github.com/knqyf263/trivy/pkg/vulnsrc/debian-oval"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/nvd"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/redhat"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/ubuntu"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/alpine"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/debian"
|
||||
debianoval "github.com/aquasecurity/trivy/pkg/vulnsrc/debian-oval"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/nvd"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/redhat"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/ubuntu"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
const (
|
||||
repoURL = "https://github.com/knqyf263/vuln-list.git"
|
||||
repoURL = "https://github.com/aquasecurity/vuln-list.git"
|
||||
)
|
||||
|
||||
type updateFunc func(dir string, updatedFiles map[string]struct{}) error
|
||||
|
||||
@@ -6,11 +6,11 @@ import (
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/git"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/vulnsrc/vulnerability"
|
||||
)
|
||||
|
||||
func BenchmarkUpdate(b *testing.B) {
|
||||
|
||||
Reference in New Issue
Block a user