mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-06 21:01:09 -08:00
Compare commits
177 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3cb713c5d7 | ||
|
|
0106939d30 | ||
|
|
e371747bae | ||
|
|
514137ecd5 | ||
|
|
4f4019b920 | ||
|
|
30fe97339b | ||
|
|
c91eb92d7f | ||
|
|
fdeaaee53d | ||
|
|
0cf1b70947 | ||
|
|
6a9f4fdce0 | ||
|
|
852c47f677 | ||
|
|
8be4af33ee | ||
|
|
daf0d59461 | ||
|
|
348f2bdde3 | ||
|
|
12b18ea7f4 | ||
|
|
381b80125a | ||
|
|
739b1f33e4 | ||
|
|
d312c0d6b3 | ||
|
|
61ec338ea8 | ||
|
|
b6cfbad35b | ||
|
|
41589d5110 | ||
|
|
4fcd61c6b1 | ||
|
|
c96ecaae4a | ||
|
|
d1f35ffb59 | ||
|
|
b348dc2b55 | ||
|
|
119e3098db | ||
|
|
4bf0615579 | ||
|
|
93c7b5e248 | ||
|
|
51eb0dd362 | ||
|
|
6a283102f9 | ||
|
|
8a5887a4d5 | ||
|
|
b605bb4c53 | ||
|
|
23b26e0b48 | ||
|
|
9efc4214b2 | ||
|
|
84b759d767 | ||
|
|
abac635737 | ||
|
|
f0ea4be2e0 | ||
|
|
010a6867f3 | ||
|
|
ee0d6b1841 | ||
|
|
0604e363f4 | ||
|
|
77d7177627 | ||
|
|
c44af99c6b | ||
|
|
4f92d2942a | ||
|
|
6013ed9fd7 | ||
|
|
8ea2e8c632 | ||
|
|
d1615bcdb6 | ||
|
|
76d920eda7 | ||
|
|
35a7d9bb15 | ||
|
|
8257e0d455 | ||
|
|
d47958b7c5 | ||
|
|
380de9fd10 | ||
|
|
ff4405589d | ||
|
|
1f072205a9 | ||
|
|
c970018fc7 | ||
|
|
5a3ebc1ba9 | ||
|
|
a97bbb0f8d | ||
|
|
46c7ff7a83 | ||
|
|
f326beb1f2 | ||
|
|
55d5c29f38 | ||
|
|
47273ef6da | ||
|
|
e5fc57af0e | ||
|
|
2921c25c62 | ||
|
|
e04e90fcbc | ||
|
|
d27eeb2b84 | ||
|
|
62ea073bad | ||
|
|
187864a4e4 | ||
|
|
a666c4a787 | ||
|
|
bda4ee0ad5 | ||
|
|
4925873a67 | ||
|
|
63ed4eb77f | ||
|
|
d03a64ced0 | ||
|
|
615a56353d | ||
|
|
45db6df1eb | ||
|
|
ac628f39ec | ||
|
|
20babc46a1 | ||
|
|
a6141ed2f0 | ||
|
|
a12bb8d0e2 | ||
|
|
5ae10e0463 | ||
|
|
ff873a274b | ||
|
|
7ad94c34e7 | ||
|
|
f8509846cf | ||
|
|
9334e607a0 | ||
|
|
f198b6eb63 | ||
|
|
cb1870e7bf | ||
|
|
384205a8c5 | ||
|
|
d9e64d2cfe | ||
|
|
5ccb0af867 | ||
|
|
da621c3524 | ||
|
|
3a28576e02 | ||
|
|
dbb7a555ce | ||
|
|
7a6991c8d9 | ||
|
|
6efac16c80 | ||
|
|
a7360a4b34 | ||
|
|
4fb9f0cb74 | ||
|
|
89f2d48f0f | ||
|
|
11dcbff707 | ||
|
|
7a6074721f | ||
|
|
959e43d8f9 | ||
|
|
f933ab4602 | ||
|
|
af78d2fd69 | ||
|
|
6f9c4aa2e0 | ||
|
|
5efa4a4751 | ||
|
|
cde336ec99 | ||
|
|
b8c51c56c2 | ||
|
|
22c28adc78 | ||
|
|
7b04f31566 | ||
|
|
0fff415c2a | ||
|
|
987538fc49 | ||
|
|
2642020398 | ||
|
|
c4a2b762e7 | ||
|
|
339d0db240 | ||
|
|
43568ccd69 | ||
|
|
fbd73f2f17 | ||
|
|
4a21ad9540 | ||
|
|
18de7e45e9 | ||
|
|
48f66aa3fe | ||
|
|
18274462ff | ||
|
|
90e4c159b1 | ||
|
|
4f57216935 | ||
|
|
e6b68305ec | ||
|
|
4ce651c0e4 | ||
|
|
db2d4e45eb | ||
|
|
ab8b73e8f8 | ||
|
|
876b8bd795 | ||
|
|
64ef6b63b7 | ||
|
|
a77984a381 | ||
|
|
31a1f5968b | ||
|
|
4ca73f0406 | ||
|
|
0909f94c20 | ||
|
|
d1c01c1ecc | ||
|
|
f8cdd608e2 | ||
|
|
2e4b83b710 | ||
|
|
6fbcbb3286 | ||
|
|
a843682f7c | ||
|
|
0611bf915b | ||
|
|
9a9cb016fa | ||
|
|
74a66fb68a | ||
|
|
aedfd3bfb8 | ||
|
|
a2e13bdeed | ||
|
|
a7d991f3cc | ||
|
|
11bc00d629 | ||
|
|
5005d7966d | ||
|
|
c2a05c71c7 | ||
|
|
51bbc1dc95 | ||
|
|
7b5e3407d1 | ||
|
|
52ab4e9376 | ||
|
|
9bfbff953b | ||
|
|
6af2d32e10 | ||
|
|
75b944ff50 | ||
|
|
bbb67198bb | ||
|
|
6be2ebde9d | ||
|
|
a4f1f25cc4 | ||
|
|
c29f6f51da | ||
|
|
edb899b9ce | ||
|
|
a8f7ecefae | ||
|
|
ec1afc2665 | ||
|
|
f12284ab2e | ||
|
|
a9ff0b5243 | ||
|
|
0a271a04cc | ||
|
|
6fa78df282 | ||
|
|
b62536fcdc | ||
|
|
9741d4ae94 | ||
|
|
68f326d9e1 | ||
|
|
76ee7291d6 | ||
|
|
d31f09035e | ||
|
|
8d7c2e6d2a | ||
|
|
9269a305fb | ||
|
|
073b315737 | ||
|
|
47c46fbe17 | ||
|
|
39572968bb | ||
|
|
4383764cae | ||
|
|
e0ef0563ce | ||
|
|
d9cf2c487d | ||
|
|
58bf4b21e7 | ||
|
|
e95c619eaa | ||
|
|
cd04c0bdb2 | ||
|
|
fd74926e76 |
@@ -1,6 +1,6 @@
|
||||
defaults: &defaults
|
||||
docker :
|
||||
- image: knqyf263/ci-trivy:latest
|
||||
- image: aquasec/trivy-ci:latest
|
||||
environment:
|
||||
CGO_ENABLED: "0"
|
||||
|
||||
@@ -9,19 +9,37 @@ jobs:
|
||||
<<: *defaults
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Check if there's anything to fix with gofmt
|
||||
command: |
|
||||
if test -z "$(gofmt -l .)"; then
|
||||
echo "Congrats! There is nothing to fix."
|
||||
else
|
||||
echo "The following lines should be fixed."
|
||||
gofmt -s -d .
|
||||
exit 1
|
||||
fi
|
||||
- run:
|
||||
name: Test
|
||||
command: go test ./...
|
||||
command: make test
|
||||
- run:
|
||||
name: Integration Test
|
||||
command: make test-integration
|
||||
release:
|
||||
<<: *defaults
|
||||
steps:
|
||||
- checkout
|
||||
- setup_remote_docker:
|
||||
version: 18.06.0-ce
|
||||
- run:
|
||||
name: setup docker
|
||||
command: docker login -u $DOCKER_USER -p $DOCKER_PASS
|
||||
- run:
|
||||
name: Release
|
||||
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: |
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
.circleci
|
||||
imgs
|
||||
|
||||
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.
|
||||
-->
|
||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -12,3 +12,10 @@
|
||||
*.out
|
||||
|
||||
.idea
|
||||
|
||||
# Directory Cache Files
|
||||
.DS_Store
|
||||
thumbs.db
|
||||
|
||||
# test fixtures
|
||||
integration/testdata/fixtures/
|
||||
|
||||
28
CONTRIBUTING.md
Normal file
28
CONTRIBUTING.md
Normal file
@@ -0,0 +1,28 @@
|
||||
Thank you for taking interest in contributing to Trivy !
|
||||
|
||||
## Issues
|
||||
- Feel free to open issues for any reason. When you open a new issue, you'll have to select an issue kind: bug/feature/support and fill the required information based on the selected template.
|
||||
- Please spend a small amount of time giving due diligence to the issue tracker. Your issue might be a duplicate. If it is, please add your comment to the existing issue.
|
||||
- Remember users might be searching for your issue in the future, so please give it a meaningful title to help others.
|
||||
- The issue should clearly explain the reason for opening, the proposal if you have any, and any relevant technical information.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
1. Every Pull Request should have an associated bug or feature issue unless you are fixing a trivial documentation issue.
|
||||
1. Your PR is more likely to be accepted if it focuses on just one change.
|
||||
1. Describe what the PR does. There's no convention enforced, but please try to be concise and descriptive. Treat the PR description as a commit message. Titles that starts with "fix"/"add"/"improve"/"remove" are good examples.
|
||||
1. Please add the associated Issue in the PR description.
|
||||
1. There's no need to add or tag reviewers.
|
||||
1. If a reviewer commented on your code or asked for changes, please remember to mark the discussion as resolved after you address it. PRs with unresolved issues should not be merged (even if the comment is unclear or requires no action from your side).
|
||||
1. Please include a comment with the results before and after your change.
|
||||
1. Your PR is more likely to be accepted if it includes tests (We have not historically been very strict about tests, but we would like to improve this!).
|
||||
1. If your PR affects the user experience in some way, please update the Readme and the CLI help accordingly.
|
||||
|
||||
## Understand where your pull request belongs
|
||||
|
||||
Trivy is composed of several different repositories that work together:
|
||||
|
||||
- [Trivy](https://github.com/aquasecurity/trivy) is the client-side, user-facing, command line tool.
|
||||
- [vuln-list](https://github.com/aquasecurity/vuln-list) is a vulnerabilities database, aggregated from different sources, and normalized for easy consumption. This of this as the "server" side of the trivy command line tool. **There should be no pull requests to this repo**
|
||||
- [vuln-list-update](https://github.com/aquasecurity/vuln-list-update) is the code that maintains the vuln-list database.
|
||||
- [fanal](https://github.com/aquasecurity/fanal) is a library for extracting system information containers. It is being used by Trivy to find testable subjects in the container image.
|
||||
15
Dockerfile
15
Dockerfile
@@ -1,14 +1,5 @@
|
||||
FROM golang:1.12-alpine AS builder
|
||||
ADD go.mod go.sum /app/
|
||||
WORKDIR /app/
|
||||
RUN apk --no-cache add git
|
||||
RUN go mod download
|
||||
ADD . /app/
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o /trivy cmd/trivy/main.go
|
||||
|
||||
FROM alpine:3.9
|
||||
RUN apk --no-cache add ca-certificates git
|
||||
COPY --from=builder /trivy /usr/local/bin/trivy
|
||||
RUN chmod +x /usr/local/bin/trivy
|
||||
FROM alpine:3.10
|
||||
RUN apk --no-cache add ca-certificates git rpm
|
||||
COPY trivy /usr/local/bin/trivy
|
||||
|
||||
ENTRYPOINT ["trivy"]
|
||||
|
||||
42
Makefile
Normal file
42
Makefile
Normal file
@@ -0,0 +1,42 @@
|
||||
VERSION := $(shell git describe --tags)
|
||||
LDFLAGS=-ldflags "-s -w -X=main.version=$(VERSION)"
|
||||
|
||||
GOPATH=$(shell go env GOPATH)
|
||||
GOBIN=$(GOPATH)/bin
|
||||
|
||||
u := $(if $(update),-u)
|
||||
|
||||
.PHONY: deps
|
||||
deps:
|
||||
go get ${u} -d
|
||||
go mod tidy
|
||||
|
||||
$(GOBIN)/golangci-lint:
|
||||
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(GOBIN) v1.21.0
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
go test -v -short ./...
|
||||
|
||||
integration/testdata/fixtures/*.tar.gz:
|
||||
git clone https://github.com/aquasecurity/trivy-test-images.git integration/testdata/fixtures
|
||||
|
||||
.PHONY: test-integration
|
||||
test-integration: integration/testdata/fixtures/*.tar.gz
|
||||
go test -v -tags=integration ./integration/...
|
||||
|
||||
.PHONY: lint
|
||||
lint: $(GOBIN)/golangci-lint
|
||||
$(GOBIN)/golangci-lint run
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
go build $(LDFLAGS) ./cmd/trivy
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
go install $(LDFLAGS) ./cmd/trivy
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf integration/testdata/fixtures/
|
||||
@@ -1,20 +1,10 @@
|
||||
FROM bepsays/ci-goreleaser:1.12-2
|
||||
FROM circleci/golang:1.13-buster
|
||||
|
||||
RUN apt-get -y update \
|
||||
&& apt-get -y install vim rpm reprepro createrepo \
|
||||
&& wget https://dl.bintray.com/homebrew/mirror/berkeley-db-18.1.32.tar.gz \
|
||||
RUN sudo apt-get -y update \
|
||||
&& sudo apt-get -y install rpm reprepro createrepo
|
||||
|
||||
# Berkeley DB
|
||||
&& tar zxvf berkeley-db-18.1.32.tar.gz \
|
||||
&& cd db-18.1.32/build_unix \
|
||||
|
||||
# Linux
|
||||
&& ../dist/configure --prefix=/usr/local --host=x86_64-linux \
|
||||
&& make \
|
||||
&& make install \
|
||||
|
||||
# Darwin
|
||||
&& make clean \
|
||||
&& ../dist/configure --prefix=/usr/local --host=x86_64-apple-darwin15 \
|
||||
&& make \
|
||||
&& make install
|
||||
ARG GORELEASER_VERSION=0.110.0
|
||||
ARG GORELEASER_ARTIFACT=goreleaser_Linux_x86_64.tar.gz
|
||||
RUN wget https://github.com/goreleaser/goreleaser/releases/download/v${GORELEASER_VERSION}/${GORELEASER_ARTIFACT} \
|
||||
&& sudo tar -xzf ${GORELEASER_ARTIFACT} -C /usr/bin/ goreleaser \
|
||||
&& rm ${GORELEASER_ARTIFACT}
|
||||
|
||||
@@ -1,18 +1,25 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
RPM_EL6=$(find dist/ -type f -name "*64bit.rpm" -printf "%f\n" | head -n1 | sed -e 's/_/-/g' -e 's/-Linux/.el6/' -e 's/-64bit/.x86_64/')
|
||||
RPM_EL7=$(find dist/ -type f -name "*64bit.rpm" -printf "%f\n" | head -n1 | sed -e 's/_/-/g' -e 's/-Linux/.el7/' -e 's/-64bit/.x86_64/')
|
||||
function create_rpm_repo () {
|
||||
version=$1
|
||||
rpm_path=rpm/releases/${version}/x86_64
|
||||
|
||||
RPM_EL=$(find ../dist/ -type f -name "*64bit.rpm" -printf "%f\n" | head -n1 | sed -e "s/_/-/g" -e "s/-Linux/.el$version/" -e "s/-64bit/.x86_64/")
|
||||
echo $RPM_EL
|
||||
|
||||
mkdir -p $rpm_path
|
||||
cp ../dist/*64bit.rpm ${rpm_path}/${RPM_EL}
|
||||
|
||||
createrepo --update $rpm_path
|
||||
}
|
||||
|
||||
cd trivy-repo
|
||||
mkdir -p rpm/releases/6/x86_64
|
||||
mkdir -p rpm/releases/7/x86_64
|
||||
|
||||
cd rpm
|
||||
cp ../../dist/*64bit.rpm releases/6/x86_64/${RPM_EL6}
|
||||
cp ../../dist/*64bit.rpm releases/7/x86_64/${RPM_EL7}
|
||||
|
||||
createrepo --update releases/6/x86_64/
|
||||
createrepo --update releases/7/x86_64/
|
||||
VERSIONS=(5 6 7 8)
|
||||
for version in ${VERSIONS[@]}; do
|
||||
echo "Processing RHEL/CentOS $version..."
|
||||
create_rpm_repo $version
|
||||
done
|
||||
|
||||
git add .
|
||||
git commit -m "Update rpm packages"
|
||||
|
||||
@@ -3,14 +3,9 @@ package main
|
||||
import (
|
||||
l "log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/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 (
|
||||
@@ -18,95 +13,7 @@ var (
|
||||
)
|
||||
|
||||
func main() {
|
||||
cli.AppHelpTemplate = `NAME:
|
||||
{{.Name}}{{if .Usage}} - {{.Usage}}{{end}}
|
||||
USAGE:
|
||||
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
|
||||
VERSION:
|
||||
{{.Version}}{{end}}{{end}}{{if .Description}}
|
||||
DESCRIPTION:
|
||||
{{.Description}}{{end}}{{if len .Authors}}
|
||||
AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
|
||||
{{range $index, $author := .Authors}}{{if $index}}
|
||||
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
|
||||
OPTIONS:
|
||||
{{range $index, $option := .VisibleFlags}}{{if $index}}
|
||||
{{end}}{{$option}}{{end}}{{end}}
|
||||
`
|
||||
app := cli.NewApp()
|
||||
app.Name = "trivy"
|
||||
app.Version = version
|
||||
app.ArgsUsage = "image_name"
|
||||
|
||||
app.Usage = "A simple and comprehensive vulnerability scanner for containers"
|
||||
|
||||
app.Flags = []cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "format, f",
|
||||
Value: "table",
|
||||
Usage: "format (table, json)",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "input, i",
|
||||
Value: "",
|
||||
Usage: "input file path instead of image name",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "severity, s",
|
||||
Value: strings.Join(vulnerability.SeverityNames, ","),
|
||||
Usage: "severities of vulnerabilities to be displayed (comma separated)",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "output, o",
|
||||
Usage: "output file name",
|
||||
},
|
||||
cli.IntFlag{
|
||||
Name: "exit-code",
|
||||
Usage: "Exit code when vulnerabilities were found",
|
||||
Value: 0,
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "skip-update",
|
||||
Usage: "skip db update",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "reset",
|
||||
Usage: "remove all caches and database",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "clear-cache, c",
|
||||
Usage: "clear image caches",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "quiet, q",
|
||||
Usage: "suppress progress bar",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "ignore-unfixed",
|
||||
Usage: "display only fixed vulnerabilities",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "refresh",
|
||||
Usage: "refresh DB (usually used after version update of trivy)",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "auto-refresh",
|
||||
Usage: "refresh DB automatically when updating version of trivy",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "debug, d",
|
||||
Usage: "debug mode",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "cache-dir",
|
||||
Usage: "cache directory",
|
||||
},
|
||||
}
|
||||
|
||||
app.Action = func(c *cli.Context) error {
|
||||
return pkg.Run(c)
|
||||
}
|
||||
|
||||
app := pkg.NewApp(version)
|
||||
err := app.Run(os.Args)
|
||||
if err != nil {
|
||||
if log.Logger != nil {
|
||||
|
||||
46
go.mod
46
go.mod
@@ -1,43 +1,31 @@
|
||||
module github.com/knqyf263/trivy
|
||||
module github.com/aquasecurity/trivy
|
||||
|
||||
go 1.12
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v0.3.1
|
||||
github.com/aquasecurity/fanal v0.0.0-20191015084852-e80236018d26
|
||||
github.com/aquasecurity/go-dep-parser v0.0.0-20190819075924-ea223f0ef24b
|
||||
github.com/aquasecurity/trivy-db v0.0.0-20191101193735-bb56553762c0
|
||||
github.com/briandowns/spinner v0.0.0-20190319032542-ac46072a5a91
|
||||
github.com/emirpasic/gods v1.12.0 // indirect
|
||||
github.com/etcd-io/bbolt v1.3.2
|
||||
github.com/fatih/color v1.7.0
|
||||
github.com/caarlos0/env/v6 v6.0.0
|
||||
github.com/genuinetools/reg v0.16.0
|
||||
github.com/gliderlabs/ssh v0.1.3 // indirect
|
||||
github.com/golang/protobuf v1.3.1 // indirect
|
||||
github.com/knqyf263/fanal v0.0.0-20190517090627-af48380166ef
|
||||
github.com/google/go-github/v28 v28.1.1
|
||||
github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d
|
||||
github.com/knqyf263/go-dep-parser v0.0.0-20190515172517-b8305876c9c2
|
||||
github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936
|
||||
github.com/knqyf263/go-version v1.1.1
|
||||
github.com/mattn/go-colorable v0.1.1 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.4 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/olekukonko/tablewriter v0.0.1
|
||||
github.com/stretchr/testify v1.3.0 // indirect
|
||||
github.com/kylelemons/godebug v1.1.0
|
||||
github.com/olekukonko/tablewriter v0.0.2-0.20190607075207-195002e6e56a
|
||||
github.com/stretchr/testify v1.4.0
|
||||
github.com/urfave/cli v1.20.0
|
||||
github.com/xanzy/ssh-agent v0.2.1 // indirect
|
||||
go.etcd.io/bbolt v1.3.2 // indirect
|
||||
go.uber.org/atomic v1.3.2 // indirect
|
||||
go.uber.org/multierr v1.1.0 // indirect
|
||||
go.uber.org/zap v1.9.1
|
||||
golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 // indirect
|
||||
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373
|
||||
golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
|
||||
golang.org/x/sys v0.0.0-20191020152052-9984515f0562 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.28
|
||||
gopkg.in/src-d/go-billy.v4 v4.3.0 // indirect
|
||||
gopkg.in/src-d/go-git-fixtures.v3 v3.4.0 // indirect
|
||||
gopkg.in/src-d/go-git.v4 v4.10.0
|
||||
gopkg.in/yaml.v2 v2.2.2
|
||||
gopkg.in/yaml.v2 v2.2.4 // indirect
|
||||
k8s.io/utils v0.0.0-20191010214722-8d271d903fe4
|
||||
)
|
||||
|
||||
replace github.com/genuinetools/reg => github.com/tomoyamachi/reg v0.16.2-0.20190418055600-c6010b917a55
|
||||
|
||||
replace github.com/olekukonko/tablewriter => github.com/knqyf263/tablewriter v0.0.2
|
||||
replace github.com/genuinetools/reg => github.com/tomoyamachi/reg v0.16.1-0.20190706172545-2a2250fd7c00
|
||||
|
||||
180
go.sum
180
go.sum
@@ -8,10 +8,11 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr v1.5.0 h1:wykTgKwhVr2t2qs+xI020s6W5dt614QqCHV+7W9dg64=
|
||||
github.com/GoogleCloudPlatform/docker-credential-gcr v1.5.0/go.mod h1:BB1eHdMLYEFuFdBlRMb0N7YGVdM5s6Pt0njxgvfbGGs=
|
||||
github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q=
|
||||
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||
github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc=
|
||||
github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
|
||||
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
|
||||
@@ -21,68 +22,91 @@ 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/go.mod h1:enEz4FFetw4XAbkffaYgyCVq1556R9Ry+noqT4rq9BE=
|
||||
github.com/aquasecurity/fanal v0.0.0-20191015084852-e80236018d26 h1:HvyiDHbYDm094Oo59MWIWtZ3Lt2Uu6nQ06IsG2jvIrg=
|
||||
github.com/aquasecurity/fanal v0.0.0-20191015084852-e80236018d26/go.mod h1:dD1Ny21eY5FSDyERfUIMwdgYhg6Lnw611VOwDHmTSoQ=
|
||||
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/aquasecurity/trivy v0.1.6/go.mod h1:5hobyhxLzDtxruHzPxpND2PUKOssvGUdE9BocpJUwo4=
|
||||
github.com/aquasecurity/trivy-db v0.0.0-20191101193735-bb56553762c0 h1:G6DzbsaARDzEuT3SdUdXw6GBH3RHhhkoaX1YQtwqYyI=
|
||||
github.com/aquasecurity/trivy-db v0.0.0-20191101193735-bb56553762c0/go.mod h1:PCxSRIDg26j0v3NgjjFbA3BqrGVLSEu1Fb/n/0RzXzg=
|
||||
github.com/aquasecurity/vuln-list-update v0.0.0-20191016075347-3d158c2bf9a2 h1:xbdUfr2KE4THsFx9CFWtWpU91lF+YhgP46moV94nYTA=
|
||||
github.com/aquasecurity/vuln-list-update v0.0.0-20191016075347-3d158c2bf9a2/go.mod h1:6NhOP0CjZJL27bZZcaHECtzWdwDDm2g6yCY0QgXEGQQ=
|
||||
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83 h1:ukTLOeMC0aVxbJWVg6hOsVJ0VPIo8w++PbNsze/pqF8=
|
||||
github.com/araddon/dateparse v0.0.0-20190426192744-0d74ffceef83/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI=
|
||||
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=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/briandowns/spinner v0.0.0-20190319032542-ac46072a5a91 h1:GMmnK0dvr0Sf0gx3DvTbln0c8DE07B7sPVD9dgHOqo4=
|
||||
github.com/briandowns/spinner v0.0.0-20190319032542-ac46072a5a91/go.mod h1:hw/JEQBIE+c/BLI4aKM8UU8v+ZqrD3h7HC27kKt8JQU=
|
||||
github.com/caarlos0/env/v6 v6.0.0 h1:NZt6FAoB8ieKO5lEwRdwCzYxWFx7ZYF2R7UcoyaWtyc=
|
||||
github.com/caarlos0/env/v6 v6.0.0/go.mod h1:+wdyOmtjoZIW2GJOc2OYa5NoOFuWD/bIpWqm30NgtRk=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/containerd/continuity v0.0.0-20180921161001-7f53d412b9eb h1:qSMRxG547z/BgQmyVyADxaMADQXVAD9uleP2sQeClbo=
|
||||
github.com/containerd/continuity v0.0.0-20180921161001-7f53d412b9eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||
github.com/coreos/clair v0.0.0-20180919182544-44ae4bc9590a h1:glxUtT0RlaVJU86kg78ygzfhwW6D+uj5H+aOK01QDgI=
|
||||
github.com/coreos/clair v0.0.0-20180919182544-44ae4bc9590a/go.mod h1:uXhHPWAoRqw0jJc2f8RrPCwRhIo9otQ8OEWUFtpCiwA=
|
||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
|
||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
|
||||
github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/docker/cli v0.0.0-20180920165730-54c19e67f69c h1:QlAVcyoF7QQVN7zV+xYBjgwtRVlRU3WCTCpb2mcqQrM=
|
||||
github.com/docker/cli v0.0.0-20180920165730-54c19e67f69c/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/distribution v0.0.0-20180920194744-16128bbac47f h1:hYf+mPizfvpH6VgIxdntnOmQHd1F1mQUc1oG+j3Ol2g=
|
||||
github.com/docker/distribution v0.0.0-20180920194744-16128bbac47f/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
|
||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v0.0.0-20180924202107-a9c061deec0f h1:W4fbqg0JUwy6lLesoJaV/rE0fwAmtdtinMa64X1CEh0=
|
||||
github.com/docker/docker v0.0.0-20180924202107-a9c061deec0f/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker-ce v0.0.0-20180924210327-f53bd8bb8e43 h1:gZ4lWixV821UVbYtr+oz1ZPCHkbtE+ivfmHyZRgyl2Y=
|
||||
github.com/docker/docker-ce v0.0.0-20180924210327-f53bd8bb8e43/go.mod h1:l1FUGRYBvbjnZ8MS6A2xOji4aZFlY/Qmgz7p4oXH7ac=
|
||||
github.com/docker/docker-credential-helpers v0.6.1 h1:Dq4iIfcM7cNtddhLVWe9h4QDjsi4OER3Z8voPu/I52g=
|
||||
github.com/docker/docker-credential-helpers v0.6.1/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
|
||||
github.com/docker/docker-credential-helpers v0.6.2 h1:CrW9H1VMf3a4GrtyAi7IUJjkJVpwBBpX0+mvkvYJaus=
|
||||
github.com/docker/docker-credential-helpers v0.6.2/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
|
||||
github.com/docker/go-connections v0.0.0-20180821093606-97c2040d34df/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 h1:yWHOI+vFjEsAakUTSrtqc/SAHrhSkmn48pqjidZX3QA=
|
||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||
github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
|
||||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 h1:X0fj836zx99zFu83v/M79DuBn84IL/Syx1SY6Y5ZEMA=
|
||||
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
|
||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
||||
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f h1:8GDPb0tCY8LQ+OJ3dbHb5sA6YZWXFORQYZx5sdsTlMs=
|
||||
github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f h1:AUj1VoZUfhPhOPHULCQQDnGhRelpFWHMLhQVWDsS0v4=
|
||||
github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
||||
github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
|
||||
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||
github.com/etcd-io/bbolt v1.3.2 h1:RLRQ0TKLX7DlBRXAJHvbmXL17Q3KNnTBtZ9B6Qo+/Y0=
|
||||
github.com/etcd-io/bbolt v1.3.2/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
|
||||
github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
|
||||
github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
|
||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fernet/fernet-go v0.0.0-20180830025343-9eac43b88a5e/go.mod h1:2H9hjfbpSMHwY503FclkV/lZTBh2YlOmLLSda12uL8c=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/genuinetools/pkg v0.0.0-20180910213200-1c141f661797/go.mod h1:XTcrCYlXPxnxL2UpnwuRn7tcaTn9HAhxFoFJucootk8=
|
||||
github.com/genuinetools/pkg v0.0.0-20181022210355-2fcf164d37cb/go.mod h1:XTcrCYlXPxnxL2UpnwuRn7tcaTn9HAhxFoFJucootk8=
|
||||
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||
github.com/gliderlabs/ssh v0.1.3 h1:cBU46h1lYQk5f2Z+jZbewFKy+1zzE2aUX/ilcPDAm9M=
|
||||
github.com/gliderlabs/ssh v0.1.3/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
|
||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
@@ -93,14 +117,25 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-github/v28 v28.1.1 h1:kORf5ekX5qwXO2mGzXXOjMe/g6ap8ahVe0sBEulhSxo=
|
||||
github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM=
|
||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||
github.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU=
|
||||
github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E=
|
||||
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||
@@ -109,17 +144,16 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8=
|
||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||
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-20190517090627-af48380166ef h1:mxKy5exy/vKIhV86Ar7E1AzNS/NCjfyrcRKcoblgZd8=
|
||||
github.com/knqyf263/fanal v0.0.0-20190517090627-af48380166ef/go.mod h1:bycEQTZsPG1IOBXWwTNxruhtNN0KYDgux0CMgu9UGoQ=
|
||||
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-20190515172517-b8305876c9c2 h1:bQGj8WH6X4czC2FlkgUKKFq2xPnJovzf61T4Yl9sVZs=
|
||||
github.com/knqyf263/go-dep-parser v0.0.0-20190515172517-b8305876c9c2/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=
|
||||
@@ -127,10 +161,10 @@ github.com/knqyf263/go-version v1.1.1 h1:+MpcBC9b7rk5ihag8Y/FLG8get1H2GjniwKQ+9D
|
||||
github.com/knqyf263/go-version v1.1.1/go.mod h1:0tBvHvOBSf5TqGNcY+/ih9o8qo3R16iZCpB9rP0D3VM=
|
||||
github.com/knqyf263/nested v0.0.1 h1:Sv26CegUMhjt19zqbBKntjwESdxe5hxVPSk0+AKjdUc=
|
||||
github.com/knqyf263/nested v0.0.1/go.mod h1:zwhsIhMkBg90DTOJQvxPkKIypEHPYkgWHs4gybdlUmk=
|
||||
github.com/knqyf263/tablewriter v0.0.2 h1:lGaBruL/oJt8FAlMVy9KU0oQ/6NXAJjvK7wBgZyc+Og=
|
||||
github.com/knqyf263/tablewriter v0.0.2/go.mod h1:NDOJQAZxabBL3e13jQVktkvbr6bxXXPon8Lyh7fRPPc=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
@@ -139,10 +173,14 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
|
||||
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-jsonpointer v0.0.0-20180225143300-37667080efed h1:fCWISZq4YN4ulCJx7x0KB15rqxLEe3mtNJL8cSOGKZU=
|
||||
github.com/mattn/go-jsonpointer v0.0.0-20180225143300-37667080efed/go.mod h1:SDJ4hurDYyQ9/7nc+eCYtXqdufgK4Cq9TJlwPklqEYA=
|
||||
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
@@ -152,9 +190,12 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/olekukonko/tablewriter v0.0.2-0.20190607075207-195002e6e56a h1:0LD5FJGQpEyD78OdhX97W75RjYmMjfLPp1ePrk5URxs=
|
||||
github.com/olekukonko/tablewriter v0.0.2-0.20190607075207-195002e6e56a/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 h1:QhPf3A2AZW3tTGvHPg0TA+CR3oHbVLlXUhlghqISp1I=
|
||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
@@ -163,6 +204,8 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM
|
||||
github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y=
|
||||
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/parnurzeal/gorequest v0.2.16 h1:T/5x+/4BT+nj+3eSknXmCTnEVGSzFzPGdpqmUVVZXHQ=
|
||||
github.com/parnurzeal/gorequest v0.2.16/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE=
|
||||
github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
|
||||
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
|
||||
github.com/peterhellberg/link v1.0.0 h1:mUWkiegowUXEcmlb+ybF75Q/8D2Y0BjZtR8cxoKhaQo=
|
||||
@@ -173,36 +216,55 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.0.0-20180924113449-f69c853d21c1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f h1:BVwpUVJDADN2ufcGik7W992pyps0wZ888b/y9GXcLTU=
|
||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU=
|
||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/procfs v0.0.0-20180920065004-418d78d0b9a7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
|
||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 h1:/K3IL0Z1quvmJ7X0A1AwNEK7CRkVK3YwfOU/QAL4WGg=
|
||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
||||
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
||||
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||
github.com/shurcooL/httpfs v0.0.0-20181222201310-74dc9339e414/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
||||
github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8=
|
||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
|
||||
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/tomoyamachi/reg v0.16.2-0.20190418055600-c6010b917a55 h1:O7Xl4zpk6zjYnwxUd7lubrx7xdzQ+PqfTgaxLE9nF+o=
|
||||
github.com/tomoyamachi/reg v0.16.2-0.20190418055600-c6010b917a55/go.mod h1:12Fe9EIvK3dG/qWhNk5e9O96I8SGmCKLsJ8GsXUbk+Y=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/tomoyamachi/reg v0.16.1-0.20190706172545-2a2250fd7c00 h1:0e4vRd9YqnQBIAIAE39jLKDWffRfJWxloyWwcaMAQho=
|
||||
github.com/tomoyamachi/reg v0.16.1-0.20190706172545-2a2250fd7c00/go.mod h1:RQE7h2jyIxekQZ24/wad0c9RGP+KSq4XzHh7h83ALi8=
|
||||
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
|
||||
@@ -218,27 +280,27 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
|
||||
go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
|
||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5 h1:bselrhR0Or1vomJZC8ZIjWtbDmn9OYFLX5Ik9alpJpE=
|
||||
golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180925072008-f04abc6bdfa7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582 h1:p9xBe/w/OzkeYVKm234g55gMdD1nSIooTir5kV11kfA=
|
||||
golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -246,45 +308,62 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180925112736-b09afc3d579e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67 h1:1Fzlr8kkDLQwqMP8GxrhptBLqZG/EDpiATneiZHY998=
|
||||
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190506115046-ca7f33d4116e h1:bq5BY1tGuaK8HxuwN6pT6kWgTVLeJ5KwuyBpsl1CZL4=
|
||||
golang.org/x/sys v0.0.0-20190506115046-ca7f33d4116e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191020152052-9984515f0562 h1:wOweSabW7qssfcg63CEDHHA4zyoqRlGU6eYV7IUMCq0=
|
||||
golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190503185657-3b6f9c0030f7/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373 h1:PPwnA7z1Pjf7XYaBP9GL1VAMZmcIWyFz7QCMSIIa3Bg=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180924164928-221a8d4f7494/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 h1:xtNn7qFlagY2mQNFHMSRPjT2RkOV4OXM7P5TVy9xATo=
|
||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
@@ -292,7 +371,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/src-d/go-billy.v4 v4.2.1/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk=
|
||||
gopkg.in/src-d/go-billy.v4 v4.3.0 h1:KtlZ4c1OWbIs4jCv5ZXrTqG8EQocr0g/d4DjNg70aek=
|
||||
gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk=
|
||||
@@ -307,8 +386,15 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gotest.tools v2.1.0+incompatible h1:5USw7CrJBYKqjg9R7QlA6jzqZKEAtvW82aNmsxxGPxw=
|
||||
gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
|
||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||
k8s.io/utils v0.0.0-20191010214722-8d271d903fe4 h1:Gi+/O1saihwDqnlmC8Vhv1M5Sp4+rbOmK9TbsLn8ZEA=
|
||||
k8s.io/utils v0.0.0-20191010214722-8d271d903fe4/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
||||
moul.io/http2curl v1.0.0 h1:6XwpyZOYsgZJrU8exnG87ncVkU1FVCcTRpwzOkTDUi8=
|
||||
moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE=
|
||||
|
||||
132
goreleaser.yml
132
goreleaser.yml
@@ -1,6 +1,7 @@
|
||||
project_name: trivy
|
||||
builds:
|
||||
- main: cmd/trivy/main.go
|
||||
-
|
||||
main: cmd/trivy/main.go
|
||||
binary: trivy
|
||||
ldflags:
|
||||
- -s -w
|
||||
@@ -22,60 +23,79 @@ builds:
|
||||
goarm:
|
||||
- 7
|
||||
|
||||
nfpm:
|
||||
formats:
|
||||
- deb
|
||||
- rpm
|
||||
dependencies:
|
||||
- rpm
|
||||
vendor: "knqyf263"
|
||||
homepage: "https://github.com/knqyf263"
|
||||
maintainer: "Teppei Fukuda <knqyf263@gmail.com>"
|
||||
description: "A Fast Vulnerability Scanner for Containers"
|
||||
license: "MIT"
|
||||
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
|
||||
replacements:
|
||||
amd64: 64bit
|
||||
386: 32bit
|
||||
arm: ARM
|
||||
arm64: ARM64
|
||||
darwin: macOS
|
||||
linux: Linux
|
||||
windows: Windows
|
||||
openbsd: OpenBSD
|
||||
netbsd: NetBSD
|
||||
freebsd: FreeBSD
|
||||
dragonfly: DragonFlyBSD
|
||||
nfpms:
|
||||
-
|
||||
formats:
|
||||
- deb
|
||||
- rpm
|
||||
dependencies:
|
||||
- rpm
|
||||
vendor: "aquasecurity"
|
||||
homepage: "https://github.com/aquasecurity"
|
||||
maintainer: "Teppei Fukuda <knqyf263@gmail.com>"
|
||||
description: "A Fast Vulnerability Scanner for Containers"
|
||||
license: "MIT"
|
||||
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
|
||||
replacements:
|
||||
amd64: 64bit
|
||||
386: 32bit
|
||||
arm: ARM
|
||||
arm64: ARM64
|
||||
darwin: macOS
|
||||
linux: Linux
|
||||
windows: Windows
|
||||
openbsd: OpenBSD
|
||||
netbsd: NetBSD
|
||||
freebsd: FreeBSD
|
||||
dragonfly: DragonFlyBSD
|
||||
|
||||
archive:
|
||||
format: tar.gz
|
||||
format_overrides:
|
||||
- goos: windows
|
||||
format: zip
|
||||
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
|
||||
replacements:
|
||||
amd64: 64bit
|
||||
386: 32bit
|
||||
arm: ARM
|
||||
arm64: ARM64
|
||||
darwin: macOS
|
||||
linux: Linux
|
||||
windows: Windows
|
||||
openbsd: OpenBSD
|
||||
netbsd: NetBSD
|
||||
freebsd: FreeBSD
|
||||
dragonfly: DragonFlyBSD
|
||||
files:
|
||||
- README.md
|
||||
- LICENSE
|
||||
archives:
|
||||
-
|
||||
format: tar.gz
|
||||
format_overrides:
|
||||
- goos: windows
|
||||
format: zip
|
||||
name_template: "{{.ProjectName}}_{{.Version}}_{{.Os}}-{{.Arch}}"
|
||||
replacements:
|
||||
amd64: 64bit
|
||||
386: 32bit
|
||||
arm: ARM
|
||||
arm64: ARM64
|
||||
darwin: macOS
|
||||
linux: Linux
|
||||
windows: Windows
|
||||
openbsd: OpenBSD
|
||||
netbsd: NetBSD
|
||||
freebsd: FreeBSD
|
||||
dragonfly: DragonFlyBSD
|
||||
files:
|
||||
- README.md
|
||||
- LICENSE
|
||||
|
||||
brew:
|
||||
github:
|
||||
owner: knqyf263
|
||||
name: homebrew-trivy
|
||||
dependencies:
|
||||
- rpm
|
||||
homepage: "https://github.com/knqyf263/trivy"
|
||||
description: ""
|
||||
test: |
|
||||
system "#{bin}/program --version"
|
||||
brews:
|
||||
-
|
||||
github:
|
||||
owner: aquasecurity
|
||||
name: homebrew-trivy
|
||||
dependencies:
|
||||
- rpm
|
||||
homepage: "https://github.com/aquasecurity/trivy"
|
||||
description: ""
|
||||
test: |
|
||||
system "#{bin}/program --version"
|
||||
|
||||
dockers:
|
||||
- image_templates:
|
||||
- "docker.io/aquasec/trivy:{{ .Version }}"
|
||||
- "docker.io/aquasec/trivy:latest"
|
||||
binaries:
|
||||
- trivy
|
||||
build_flag_templates:
|
||||
- "--label=org.label-schema.schema-version=1.0"
|
||||
- "--label=org.label-schema.name={{ .ProjectName }}"
|
||||
- "--label=org.label-schema.description=A Fast Vulnerability Scanner for Containers"
|
||||
- "--label=org.label-schema.vendor=Aqua Security"
|
||||
- "--label=org.label-schema.version={{ .Version }}"
|
||||
- "--label=org.label-schema.build-date={{ .Date }}"
|
||||
- "--label=org.label-schema.vcs=https://github.com/aquasecurity/trivy"
|
||||
- "--label=org.label-schema.vcs-ref={{ .FullCommit }}"
|
||||
|
||||
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 |
363
integration/tar_input_test.go
Normal file
363
integration/tar_input_test.go
Normal file
@@ -0,0 +1,363 @@
|
||||
// +build integration
|
||||
|
||||
package integration_test
|
||||
|
||||
import (
|
||||
"compress/gzip"
|
||||
"flag"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg"
|
||||
)
|
||||
|
||||
var update = flag.Bool("update", false, "update golden files")
|
||||
|
||||
func gunzipDB() string {
|
||||
gz, err := os.Open("testdata/trivy.db.gz")
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
zr, err := gzip.NewReader(gz)
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
||||
tmpDir, err := ioutil.TempDir("", "integration")
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
dbDir := filepath.Join(tmpDir, "db")
|
||||
err = os.MkdirAll(dbDir, 0700)
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
||||
file, err := os.Create(filepath.Join(dbDir, "trivy.db"))
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
_, err = io.Copy(file, zr)
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
return tmpDir
|
||||
}
|
||||
|
||||
func TestRun_WithTar(t *testing.T) {
|
||||
type args struct {
|
||||
Version string
|
||||
SkipUpdate bool
|
||||
IgnoreUnfixed bool
|
||||
Severity []string
|
||||
IgnoreIDs []string
|
||||
Format string
|
||||
Input string
|
||||
}
|
||||
cases := []struct {
|
||||
name string
|
||||
testArgs args
|
||||
golden string
|
||||
}{
|
||||
{
|
||||
name: "alpine 3.10 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/alpine-310.tar.gz",
|
||||
},
|
||||
golden: "testdata/alpine-310.json.golden",
|
||||
},
|
||||
{
|
||||
name: "alpine 3.10 integration with --ignore-unfixed option",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/alpine-310.tar.gz",
|
||||
},
|
||||
golden: "testdata/alpine-310-ignore-unfixed.json.golden",
|
||||
},
|
||||
{
|
||||
name: "alpine 3.10 integration with medium and high severity",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Severity: []string{"MEDIUM", "HIGH"},
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/alpine-310.tar.gz",
|
||||
},
|
||||
golden: "testdata/alpine-310-medium-high.json.golden",
|
||||
},
|
||||
{
|
||||
name: "alpine 3.10 integration with .trivyignore",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: false,
|
||||
IgnoreIDs: []string{"CVE-2019-1549", "CVE-2019-1563"},
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/alpine-310.tar.gz",
|
||||
},
|
||||
golden: "testdata/alpine-310-ignore-cveids.json.golden",
|
||||
},
|
||||
{
|
||||
name: "alpine 3.9 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/alpine-39.tar.gz",
|
||||
},
|
||||
golden: "testdata/alpine-39.json.golden",
|
||||
},
|
||||
{
|
||||
name: "debian buster integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/debian-buster.tar.gz",
|
||||
},
|
||||
golden: "testdata/debian-buster.json.golden",
|
||||
},
|
||||
{
|
||||
name: "debian buster integration with --ignore-unfixed option",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/debian-buster.tar.gz",
|
||||
},
|
||||
golden: "testdata/debian-buster-ignore-unfixed.json.golden",
|
||||
},
|
||||
{
|
||||
name: "debian stretch integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/debian-stretch.tar.gz",
|
||||
},
|
||||
golden: "testdata/debian-stretch.json.golden",
|
||||
},
|
||||
{
|
||||
name: "ubuntu 18.04 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/ubuntu-1804.tar.gz",
|
||||
},
|
||||
golden: "testdata/ubuntu-1804.json.golden",
|
||||
},
|
||||
{
|
||||
name: "ubuntu 18.04 integration with --ignore-unfixed option",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/ubuntu-1804.tar.gz",
|
||||
},
|
||||
golden: "testdata/ubuntu-1804-ignore-unfixed.json.golden",
|
||||
},
|
||||
{
|
||||
name: "ubuntu 16.04 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/ubuntu-1604.tar.gz",
|
||||
},
|
||||
golden: "testdata/ubuntu-1604.json.golden",
|
||||
},
|
||||
{
|
||||
name: "centos 7 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/centos-7.tar.gz",
|
||||
},
|
||||
golden: "testdata/centos-7.json.golden",
|
||||
},
|
||||
{
|
||||
name: "centos 7 integration with --ignore-unfixed option",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/centos-7.tar.gz",
|
||||
},
|
||||
golden: "testdata/centos-7-ignore-unfixed.json.golden",
|
||||
},
|
||||
{
|
||||
name: "centos 7 integration with critical severity",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Severity: []string{"CRITICAL"},
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/centos-7.tar.gz",
|
||||
},
|
||||
golden: "testdata/centos-7-critical.json.golden",
|
||||
},
|
||||
{
|
||||
name: "centos 7 integration with low and high severity",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Severity: []string{"LOW", "HIGH"},
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/centos-7.tar.gz",
|
||||
},
|
||||
golden: "testdata/centos-7-low-high.json.golden",
|
||||
},
|
||||
{
|
||||
name: "centos 6 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/centos-6.tar.gz",
|
||||
},
|
||||
golden: "testdata/centos-6.json.golden",
|
||||
},
|
||||
{
|
||||
name: "ubi 7 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/ubi-7.tar.gz",
|
||||
},
|
||||
golden: "testdata/ubi-7.json.golden",
|
||||
},
|
||||
{
|
||||
name: "distroless base integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/distroless-base.tar.gz",
|
||||
},
|
||||
golden: "testdata/distroless-base.json.golden",
|
||||
},
|
||||
{
|
||||
name: "distroless base integration with --ignore-unfixed option",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
IgnoreUnfixed: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/distroless-base.tar.gz",
|
||||
},
|
||||
golden: "testdata/distroless-base-ignore-unfixed.json.golden",
|
||||
},
|
||||
{
|
||||
name: "distroless python27 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/distroless-python27.tar.gz",
|
||||
},
|
||||
golden: "testdata/distroless-python27.json.golden",
|
||||
},
|
||||
{
|
||||
name: "amazon 1 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/amazon-1.tar.gz",
|
||||
},
|
||||
golden: "testdata/amazon-1.json.golden",
|
||||
},
|
||||
{
|
||||
name: "amazon 2 integration",
|
||||
testArgs: args{
|
||||
Version: "dev",
|
||||
SkipUpdate: true,
|
||||
Format: "json",
|
||||
Input: "testdata/fixtures/amazon-2.tar.gz",
|
||||
},
|
||||
golden: "testdata/amazon-2.json.golden",
|
||||
},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
// Copy DB file
|
||||
cacheDir := gunzipDB()
|
||||
defer os.RemoveAll(cacheDir)
|
||||
|
||||
// Setup CLI App
|
||||
app := pkg.NewApp(c.testArgs.Version)
|
||||
app.Writer = ioutil.Discard
|
||||
|
||||
osArgs := []string{"trivy", "--cache-dir", cacheDir, "--format", c.testArgs.Format}
|
||||
if c.testArgs.SkipUpdate {
|
||||
osArgs = append(osArgs, "--skip-update")
|
||||
}
|
||||
if c.testArgs.IgnoreUnfixed {
|
||||
osArgs = append(osArgs, "--ignore-unfixed")
|
||||
}
|
||||
if len(c.testArgs.Severity) != 0 {
|
||||
osArgs = append(osArgs,
|
||||
[]string{"--severity", strings.Join(c.testArgs.Severity, ",")}...,
|
||||
)
|
||||
}
|
||||
if len(c.testArgs.IgnoreIDs) != 0 {
|
||||
trivyIgnore := ".trivyignore"
|
||||
err := ioutil.WriteFile(trivyIgnore, []byte(strings.Join(c.testArgs.IgnoreIDs, "\n")), 0444)
|
||||
assert.NoError(t, err, "failed to write .trivyignore")
|
||||
defer os.Remove(trivyIgnore)
|
||||
}
|
||||
if c.testArgs.Input != "" {
|
||||
osArgs = append(osArgs, []string{"--input", c.testArgs.Input}...)
|
||||
}
|
||||
|
||||
// Setup the output file
|
||||
var outputFile string
|
||||
if *update {
|
||||
outputFile = c.golden
|
||||
} else {
|
||||
output, _ := ioutil.TempFile("", "integration")
|
||||
assert.Nil(t, output.Close())
|
||||
defer os.Remove(output.Name())
|
||||
outputFile = output.Name()
|
||||
}
|
||||
|
||||
osArgs = append(osArgs, []string{"--output", outputFile}...)
|
||||
|
||||
// Run Trivy
|
||||
assert.Nil(t, app.Run(osArgs))
|
||||
|
||||
// Compare want and got
|
||||
want, err := ioutil.ReadFile(c.golden)
|
||||
assert.NoError(t, err)
|
||||
got, err := ioutil.ReadFile(outputFile)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.JSONEq(t, string(want), string(got))
|
||||
})
|
||||
}
|
||||
}
|
||||
27
integration/testdata/alpine-310-ignore-cveids.json.golden
vendored
Normal file
27
integration/testdata/alpine-310-ignore-cveids.json.golden
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/alpine-310.tar.gz (alpine 3.10.2)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1547",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: side-channel weak encryption vulnerability",
|
||||
"Description": "Normally in OpenSSL EC groups always have a co-factor present and this is used in side channel resistant code paths. However, in some cases, it is possible to construct a group using explicit parameters (instead of using a named curve). In those cases it is possible that such a group does not have the cofactor present. This can occur even where all the parameters match a known named curve. If such a curve is used then OpenSSL falls back to non-side channel resistant code paths which may result in full key recovery during an ECDSA signature operation. In order to be vulnerable an attacker would have to have the ability to time the creation of a large number of signatures where explicit parameters with no co-factor present are in use by an application using libcrypto. For the avoidance of doubt libssl is not vulnerable because explicit parameters are never used. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://arxiv.org/abs/1909.01785",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1547",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=21c856b75d81eff61aa63b4f036bb64a85bf6d46",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=30c22fa8b1d840036b8e203585738df62a03cec8",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=7c1709c2da5414f5b6133d00a03fc8c5bf996c7a",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
63
integration/testdata/alpine-310-ignore-unfixed.json.golden
vendored
Normal file
63
integration/testdata/alpine-310-ignore-unfixed.json.golden
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/alpine-310.tar.gz (alpine 3.10.2)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1549",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in fork()",
|
||||
"Description": "OpenSSL 1.1.1 introduced a rewritten random number generator (RNG). This was intended to include protection in the event of a fork() system call in order to ensure that the parent and child processes did not share the same RNG state. However this protection was not being used in the default case. A partial mitigation for this issue is that the output from a high precision timer is mixed into the RNG state so the likelihood of a parent and child process sharing state is significantly reduced. If an application already calls OPENSSL_init_crypto() explicitly using OPENSSL_INIT_ATFORK then this problem does not occur at all. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1549",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=1b0fe00e2704b5e20334a16d3c9099d1ba2ef1be",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/GY6SNRJP2S7Y42GIIDO3HXPNMDYN2U3A/",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://support.f5.com/csp/article/K44070243",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1547",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: side-channel weak encryption vulnerability",
|
||||
"Description": "Normally in OpenSSL EC groups always have a co-factor present and this is used in side channel resistant code paths. However, in some cases, it is possible to construct a group using explicit parameters (instead of using a named curve). In those cases it is possible that such a group does not have the cofactor present. This can occur even where all the parameters match a known named curve. If such a curve is used then OpenSSL falls back to non-side channel resistant code paths which may result in full key recovery during an ECDSA signature operation. In order to be vulnerable an attacker would have to have the ability to time the creation of a large number of signatures where explicit parameters with no co-factor present are in use by an application using libcrypto. For the avoidance of doubt libssl is not vulnerable because explicit parameters are never used. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://arxiv.org/abs/1909.01785",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1547",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=21c856b75d81eff61aa63b4f036bb64a85bf6d46",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=30c22fa8b1d840036b8e203585738df62a03cec8",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=7c1709c2da5414f5b6133d00a03fc8c5bf996c7a",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
43
integration/testdata/alpine-310-medium-high.json.golden
vendored
Normal file
43
integration/testdata/alpine-310-medium-high.json.golden
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/alpine-310.tar.gz (alpine 3.10.2)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1549",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in fork()",
|
||||
"Description": "OpenSSL 1.1.1 introduced a rewritten random number generator (RNG). This was intended to include protection in the event of a fork() system call in order to ensure that the parent and child processes did not share the same RNG state. However this protection was not being used in the default case. A partial mitigation for this issue is that the output from a high precision timer is mixed into the RNG state so the likelihood of a parent and child process sharing state is significantly reduced. If an application already calls OPENSSL_init_crypto() explicitly using OPENSSL_INIT_ATFORK then this problem does not occur at all. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1549",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=1b0fe00e2704b5e20334a16d3c9099d1ba2ef1be",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/GY6SNRJP2S7Y42GIIDO3HXPNMDYN2U3A/",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://support.f5.com/csp/article/K44070243",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
63
integration/testdata/alpine-310.json.golden
vendored
Normal file
63
integration/testdata/alpine-310.json.golden
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/alpine-310.tar.gz (alpine 3.10.2)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1549",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in fork()",
|
||||
"Description": "OpenSSL 1.1.1 introduced a rewritten random number generator (RNG). This was intended to include protection in the event of a fork() system call in order to ensure that the parent and child processes did not share the same RNG state. However this protection was not being used in the default case. A partial mitigation for this issue is that the output from a high precision timer is mixed into the RNG state so the likelihood of a parent and child process sharing state is significantly reduced. If an application already calls OPENSSL_init_crypto() explicitly using OPENSSL_INIT_ATFORK then this problem does not occur at all. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1549",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=1b0fe00e2704b5e20334a16d3c9099d1ba2ef1be",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/GY6SNRJP2S7Y42GIIDO3HXPNMDYN2U3A/",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://support.f5.com/csp/article/K44070243",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1547",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1c-r0",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: side-channel weak encryption vulnerability",
|
||||
"Description": "Normally in OpenSSL EC groups always have a co-factor present and this is used in side channel resistant code paths. However, in some cases, it is possible to construct a group using explicit parameters (instead of using a named curve). In those cases it is possible that such a group does not have the cofactor present. This can occur even where all the parameters match a known named curve. If such a curve is used then OpenSSL falls back to non-side channel resistant code paths which may result in full key recovery during an ECDSA signature operation. In order to be vulnerable an attacker would have to have the ability to time the creation of a large number of signatures where explicit parameters with no co-factor present are in use by an application using libcrypto. For the avoidance of doubt libssl is not vulnerable because explicit parameters are never used. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://arxiv.org/abs/1909.01785",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1547",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=21c856b75d81eff61aa63b4f036bb64a85bf6d46",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=30c22fa8b1d840036b8e203585738df62a03cec8",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=7c1709c2da5414f5b6133d00a03fc8c5bf996c7a",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
75
integration/testdata/alpine-39.json.golden
vendored
Normal file
75
integration/testdata/alpine-39.json.golden
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/alpine-39.tar.gz (alpine 3.9.4)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-14697",
|
||||
"PkgName": "musl",
|
||||
"InstalledVersion": "1.1.20-r4",
|
||||
"FixedVersion": "1.1.20-r5",
|
||||
"Description": "musl libc through 1.1.23 has an x87 floating-point stack adjustment imbalance, related to the math/i386/ directory. In some cases, use of this library could introduce out-of-bounds writes that are not present in an application's source code.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2019/08/06/4",
|
||||
"https://www.openwall.com/lists/musl/2019/08/06/1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1549",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1b-r1",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in fork()",
|
||||
"Description": "OpenSSL 1.1.1 introduced a rewritten random number generator (RNG). This was intended to include protection in the event of a fork() system call in order to ensure that the parent and child processes did not share the same RNG state. However this protection was not being used in the default case. A partial mitigation for this issue is that the output from a high precision timer is mixed into the RNG state so the likelihood of a parent and child process sharing state is significantly reduced. If an application already calls OPENSSL_init_crypto() explicitly using OPENSSL_INIT_ATFORK then this problem does not occur at all. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1549",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=1b0fe00e2704b5e20334a16d3c9099d1ba2ef1be",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/GY6SNRJP2S7Y42GIIDO3HXPNMDYN2U3A/",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://support.f5.com/csp/article/K44070243",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1b-r1",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1547",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.1b-r1",
|
||||
"FixedVersion": "1.1.1d-r0",
|
||||
"Title": "openssl: side-channel weak encryption vulnerability",
|
||||
"Description": "Normally in OpenSSL EC groups always have a co-factor present and this is used in side channel resistant code paths. However, in some cases, it is possible to construct a group using explicit parameters (instead of using a named curve). In those cases it is possible that such a group does not have the cofactor present. This can occur even where all the parameters match a known named curve. If such a curve is used then OpenSSL falls back to non-side channel resistant code paths which may result in full key recovery during an ECDSA signature operation. In order to be vulnerable an attacker would have to have the ability to time the creation of a large number of signatures where explicit parameters with no co-factor present are in use by an application using libcrypto. For the avoidance of doubt libssl is not vulnerable because explicit parameters are never used. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://arxiv.org/abs/1909.01785",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1547",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=21c856b75d81eff61aa63b4f036bb64a85bf6d46",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=30c22fa8b1d840036b8e203585738df62a03cec8",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=7c1709c2da5414f5b6133d00a03fc8c5bf996c7a",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
130
integration/testdata/amazon-1.json.golden
vendored
Normal file
130
integration/testdata/amazon-1.json.golden
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/amazon-1.tar.gz (amazon AMI release 2018.03)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5481",
|
||||
"PkgName": "curl",
|
||||
"InstalledVersion": "7.61.1-11.91.amzn1",
|
||||
"FixedVersion": "7.61.1-12.93.amzn1",
|
||||
"Title": "curl: double free due to subsequent call of realloc()",
|
||||
"Description": "Double-free vulnerability in the FTP-kerberos code in cURL 7.52.0 to 7.65.3.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00048.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00055.html",
|
||||
"https://curl.haxx.se/docs/CVE-2019-5481.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/RGDVKSLY5JUNJRLYRUA6CXGQ2LM63XC3/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/UA7KDM2WPM5CJDDGOEGFV6SSGD2J7RNT/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5482",
|
||||
"PkgName": "curl",
|
||||
"InstalledVersion": "7.61.1-11.91.amzn1",
|
||||
"FixedVersion": "7.61.1-12.93.amzn1",
|
||||
"Title": "curl: heap buffer overflow in function tftp_receive_packet()",
|
||||
"Description": "Heap buffer overflow in the TFTP protocol handler in cURL 7.19.4 to 7.65.3.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00048.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00055.html",
|
||||
"https://curl.haxx.se/docs/CVE-2019-5482.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5482",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/RGDVKSLY5JUNJRLYRUA6CXGQ2LM63XC3/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/UA7KDM2WPM5CJDDGOEGFV6SSGD2J7RNT/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5481",
|
||||
"PkgName": "libcurl",
|
||||
"InstalledVersion": "7.61.1-11.91.amzn1",
|
||||
"FixedVersion": "7.61.1-12.93.amzn1",
|
||||
"Title": "curl: double free due to subsequent call of realloc()",
|
||||
"Description": "Double-free vulnerability in the FTP-kerberos code in cURL 7.52.0 to 7.65.3.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00048.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00055.html",
|
||||
"https://curl.haxx.se/docs/CVE-2019-5481.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/RGDVKSLY5JUNJRLYRUA6CXGQ2LM63XC3/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/UA7KDM2WPM5CJDDGOEGFV6SSGD2J7RNT/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5482",
|
||||
"PkgName": "libcurl",
|
||||
"InstalledVersion": "7.61.1-11.91.amzn1",
|
||||
"FixedVersion": "7.61.1-12.93.amzn1",
|
||||
"Title": "curl: heap buffer overflow in function tftp_receive_packet()",
|
||||
"Description": "Heap buffer overflow in the TFTP protocol handler in cURL 7.19.4 to 7.65.3.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00048.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00055.html",
|
||||
"https://curl.haxx.se/docs/CVE-2019-5482.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5482",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/RGDVKSLY5JUNJRLYRUA6CXGQ2LM63XC3/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/UA7KDM2WPM5CJDDGOEGFV6SSGD2J7RNT/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9511",
|
||||
"PkgName": "libnghttp2",
|
||||
"InstalledVersion": "1.21.1-1.4.amzn1",
|
||||
"FixedVersion": "1.31.1-2.5.amzn1",
|
||||
"Title": "HTTP/2: large amount of data requests leads to denial of service",
|
||||
"Description": "Some HTTP/2 implementations are vulnerable to window size manipulation and stream prioritization manipulation, potentially leading to a denial of service. The attacker requests a large amount of data from a specified resource over multiple streams. They manipulate window size and stream priority to force the server to queue the data in 1-byte chunks. Depending on how efficiently this data is queued, this can consume excess CPU, memory, or both.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9511",
|
||||
"https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md",
|
||||
"https://kb.cert.org/vuls/id/605641/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BP556LEG3WENHZI5TAQ6ZEBFTJB4E2IS/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JUBYAF6ED3O4XCHQ5C2HYENJLXYXZC4M/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/LZLUYPYY3RX4ZJDWZRJIKSULYRJ4PXW7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TAZZEVTCN2B4WT6AIBJ7XGYJMBTORJU5/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XHTKU7YQ5EEP2XNSAV4M4VJ7QCBOJMOD/",
|
||||
"https://nodejs.org/en/blog/vulnerability/aug-2019-security-releases/",
|
||||
"https://seclists.org/bugtraq/2019/Aug/40",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0002/",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0005/",
|
||||
"https://support.f5.com/csp/article/K02591030",
|
||||
"https://usn.ubuntu.com/4099-1/",
|
||||
"https://www.debian.org/security/2019/dsa-4505",
|
||||
"https://www.nginx.com/blog/nginx-updates-mitigate-august-2019-http-2-vulnerabilities/",
|
||||
"https://www.synology.com/security/advisory/Synology_SA_19_33"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9513",
|
||||
"PkgName": "libnghttp2",
|
||||
"InstalledVersion": "1.21.1-1.4.amzn1",
|
||||
"FixedVersion": "1.31.1-2.5.amzn1",
|
||||
"Title": "HTTP/2: flood using PRIORITY frames results in excessive resource consumption",
|
||||
"Description": "Some HTTP/2 implementations are vulnerable to resource loops, potentially leading to a denial of service. The attacker creates multiple request streams and continually shuffles the priority of the streams in a way that causes substantial churn to the priority tree. This can consume excess CPU.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9513",
|
||||
"https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md",
|
||||
"https://kb.cert.org/vuls/id/605641/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/4ZQGHE3WTYLYAYJEIDJVF2FIGQTAYPMC/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/CMNFX5MNYRWWIMO4BTKYQCGUDMHO3AXP/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JUBYAF6ED3O4XCHQ5C2HYENJLXYXZC4M/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/LZLUYPYY3RX4ZJDWZRJIKSULYRJ4PXW7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TAZZEVTCN2B4WT6AIBJ7XGYJMBTORJU5/",
|
||||
"https://nghttp2.org/blog/2019/08/19/nghttp2-v1-39-2/",
|
||||
"https://nodejs.org/en/blog/vulnerability/aug-2019-security-releases/",
|
||||
"https://seclists.org/bugtraq/2019/Aug/40",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0002/",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0005/",
|
||||
"https://support.f5.com/csp/article/K02591030",
|
||||
"https://usn.ubuntu.com/4099-1/",
|
||||
"https://www.debian.org/security/2019/dsa-4505",
|
||||
"https://www.nginx.com/blog/nginx-updates-mitigate-august-2019-http-2-vulnerabilities/",
|
||||
"https://www.synology.com/security/advisory/Synology_SA_19_33"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
953
integration/testdata/amazon-2.json.golden
vendored
Normal file
953
integration/testdata/amazon-2.json.golden
vendored
Normal file
@@ -0,0 +1,953 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/amazon-2.tar.gz (amazon 2 (Karoo))",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5435",
|
||||
"PkgName": "curl",
|
||||
"InstalledVersion": "7.61.1-9.amzn2.0.1",
|
||||
"FixedVersion": "7.61.1-11.amzn2.0.2",
|
||||
"Title": "curl: Integer overflows in curl_url_set() function",
|
||||
"Description": "An integer overflow in curl's URL API results in a buffer overflow in libcurl 7.62.0 to and including 7.64.1.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://curl.haxx.se/docs/CVE-2019-5435.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5435",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/SMG3V4VTX2SE3EW3HQTN3DDLQBTORQC2/",
|
||||
"https://security.netapp.com/advisory/ntap-20190606-0004/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5436",
|
||||
"PkgName": "curl",
|
||||
"InstalledVersion": "7.61.1-9.amzn2.0.1",
|
||||
"FixedVersion": "7.61.1-11.amzn2.0.2",
|
||||
"Title": "curl: TFTP receive heap buffer overflow in tftp_receive_packet() function",
|
||||
"Description": "A heap buffer overflow in the TFTP receiving code allows for DoS or arbitrary code execution in libcurl versions 7.19.4 through 7.64.1.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00008.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00017.html",
|
||||
"https://curl.haxx.se/docs/CVE-2019-5436.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5436",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/SMG3V4VTX2SE3EW3HQTN3DDLQBTORQC2/",
|
||||
"https://security.netapp.com/advisory/ntap-20190606-0004/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-12450",
|
||||
"PkgName": "glib2",
|
||||
"InstalledVersion": "2.54.2-2.amzn2",
|
||||
"FixedVersion": "2.56.1-4.amzn2",
|
||||
"Title": "glib2: file_copy_fallback in gio/gfile.c in GNOME GLib does not properly restrict file permissions while a copy operation is in progress",
|
||||
"Description": "file_copy_fallback in gio/gfile.c in GNOME GLib 2.15.0 through 2.61.1 does not properly restrict file permissions while a copy operation is in progress. Instead, default permissions are used.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12450",
|
||||
"https://gitlab.gnome.org/GNOME/glib/commit/d8f8f4d637ce43f8699ba94c9b7648beda0ca174",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/06/msg00013.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/2W4WIOAGO3M743M5KZLVQZM3NGHQDYLI/",
|
||||
"https://security.netapp.com/advisory/ntap-20190606-0003/",
|
||||
"https://usn.ubuntu.com/4014-1/",
|
||||
"https://usn.ubuntu.com/4014-2/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5435",
|
||||
"PkgName": "libcurl",
|
||||
"InstalledVersion": "7.61.1-9.amzn2.0.1",
|
||||
"FixedVersion": "7.61.1-11.amzn2.0.2",
|
||||
"Title": "curl: Integer overflows in curl_url_set() function",
|
||||
"Description": "An integer overflow in curl's URL API results in a buffer overflow in libcurl 7.62.0 to and including 7.64.1.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://curl.haxx.se/docs/CVE-2019-5435.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5435",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/SMG3V4VTX2SE3EW3HQTN3DDLQBTORQC2/",
|
||||
"https://security.netapp.com/advisory/ntap-20190606-0004/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5436",
|
||||
"PkgName": "libcurl",
|
||||
"InstalledVersion": "7.61.1-9.amzn2.0.1",
|
||||
"FixedVersion": "7.61.1-11.amzn2.0.2",
|
||||
"Title": "curl: TFTP receive heap buffer overflow in tftp_receive_packet() function",
|
||||
"Description": "A heap buffer overflow in the TFTP receiving code allows for DoS or arbitrary code execution in libcurl versions 7.19.4 through 7.64.1.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00008.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00017.html",
|
||||
"https://curl.haxx.se/docs/CVE-2019-5436.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5436",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/SMG3V4VTX2SE3EW3HQTN3DDLQBTORQC2/",
|
||||
"https://security.netapp.com/advisory/ntap-20190606-0004/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9511",
|
||||
"PkgName": "libnghttp2",
|
||||
"InstalledVersion": "1.31.1-1.amzn2.0.2",
|
||||
"FixedVersion": "1.39.2-1.amzn2",
|
||||
"Title": "HTTP/2: large amount of data requests leads to denial of service",
|
||||
"Description": "Some HTTP/2 implementations are vulnerable to window size manipulation and stream prioritization manipulation, potentially leading to a denial of service. The attacker requests a large amount of data from a specified resource over multiple streams. They manipulate window size and stream priority to force the server to queue the data in 1-byte chunks. Depending on how efficiently this data is queued, this can consume excess CPU, memory, or both.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9511",
|
||||
"https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md",
|
||||
"https://kb.cert.org/vuls/id/605641/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BP556LEG3WENHZI5TAQ6ZEBFTJB4E2IS/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JUBYAF6ED3O4XCHQ5C2HYENJLXYXZC4M/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/LZLUYPYY3RX4ZJDWZRJIKSULYRJ4PXW7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TAZZEVTCN2B4WT6AIBJ7XGYJMBTORJU5/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XHTKU7YQ5EEP2XNSAV4M4VJ7QCBOJMOD/",
|
||||
"https://nodejs.org/en/blog/vulnerability/aug-2019-security-releases/",
|
||||
"https://seclists.org/bugtraq/2019/Aug/40",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0002/",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0005/",
|
||||
"https://support.f5.com/csp/article/K02591030",
|
||||
"https://usn.ubuntu.com/4099-1/",
|
||||
"https://www.debian.org/security/2019/dsa-4505",
|
||||
"https://www.nginx.com/blog/nginx-updates-mitigate-august-2019-http-2-vulnerabilities/",
|
||||
"https://www.synology.com/security/advisory/Synology_SA_19_33"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9513",
|
||||
"PkgName": "libnghttp2",
|
||||
"InstalledVersion": "1.31.1-1.amzn2.0.2",
|
||||
"FixedVersion": "1.39.2-1.amzn2",
|
||||
"Title": "HTTP/2: flood using PRIORITY frames results in excessive resource consumption",
|
||||
"Description": "Some HTTP/2 implementations are vulnerable to resource loops, potentially leading to a denial of service. The attacker creates multiple request streams and continually shuffles the priority of the streams in a way that causes substantial churn to the priority tree. This can consume excess CPU.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9513",
|
||||
"https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md",
|
||||
"https://kb.cert.org/vuls/id/605641/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/4ZQGHE3WTYLYAYJEIDJVF2FIGQTAYPMC/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/CMNFX5MNYRWWIMO4BTKYQCGUDMHO3AXP/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JUBYAF6ED3O4XCHQ5C2HYENJLXYXZC4M/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/LZLUYPYY3RX4ZJDWZRJIKSULYRJ4PXW7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TAZZEVTCN2B4WT6AIBJ7XGYJMBTORJU5/",
|
||||
"https://nghttp2.org/blog/2019/08/19/nghttp2-v1-39-2/",
|
||||
"https://nodejs.org/en/blog/vulnerability/aug-2019-security-releases/",
|
||||
"https://seclists.org/bugtraq/2019/Aug/40",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0002/",
|
||||
"https://security.netapp.com/advisory/ntap-20190823-0005/",
|
||||
"https://support.f5.com/csp/article/K02591030",
|
||||
"https://usn.ubuntu.com/4099-1/",
|
||||
"https://www.debian.org/security/2019/dsa-4505",
|
||||
"https://www.nginx.com/blog/nginx-updates-mitigate-august-2019-http-2-vulnerabilities/",
|
||||
"https://www.synology.com/security/advisory/Synology_SA_19_33"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3858",
|
||||
"PkgName": "libssh2",
|
||||
"InstalledVersion": "1.4.3-12.amzn2.2",
|
||||
"FixedVersion": "1.4.3-12.amzn2.2.1",
|
||||
"Title": "libssh2: Zero-byte allocation with a specially crafted SFTP packed leading to an out-of-bounds read",
|
||||
"Description": "An out of bounds read flaw was discovered in libssh2 before 1.8.1 when a specially crafted SFTP packet is received from the server. A remote attacker who compromises a SSH server may be able to cause a Denial of Service or read data in the client memory.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-03/msg00040.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00003.html",
|
||||
"http://packetstormsecurity.com/files/152136/Slackware-Security-Advisory-libssh2-Updates.html",
|
||||
"http://www.openwall.com/lists/oss-security/2019/03/18/3",
|
||||
"http://www.securityfocus.com/bid/107485",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3858",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-3858",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/03/msg00032.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5DK6VO2CEUTAJFYIKWNZKEKYMYR3NO2O/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XCWEA5ZCLKRDUK62QVVYMFWLWKOPX3LO/",
|
||||
"https://seclists.org/bugtraq/2019/Apr/25",
|
||||
"https://seclists.org/bugtraq/2019/Mar/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190327-0005/",
|
||||
"https://www.broadcom.com/support/fibre-channel-networking/security-advisories/brocade-security-advisory-2019-767",
|
||||
"https://www.debian.org/security/2019/dsa-4431",
|
||||
"https://www.libssh2.org/CVE-2019-3858.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3861",
|
||||
"PkgName": "libssh2",
|
||||
"InstalledVersion": "1.4.3-12.amzn2.2",
|
||||
"FixedVersion": "1.4.3-12.amzn2.2.1",
|
||||
"Title": "libssh2: Out-of-bounds reads with specially crafted SSH packets",
|
||||
"Description": "An out of bounds read flaw was discovered in libssh2 before 1.8.1 in the way SSH packets with a padding length value greater than the packet length are parsed. A remote attacker who compromises a SSH server may be able to cause a Denial of Service or read data in the client memory.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-03/msg00040.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00003.html",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3861",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-3861",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/03/msg00032.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5DK6VO2CEUTAJFYIKWNZKEKYMYR3NO2O/",
|
||||
"https://seclists.org/bugtraq/2019/Apr/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190327-0005/",
|
||||
"https://www.debian.org/security/2019/dsa-4431",
|
||||
"https://www.libssh2.org/CVE-2019-3861.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3862",
|
||||
"PkgName": "libssh2",
|
||||
"InstalledVersion": "1.4.3-12.amzn2.2",
|
||||
"FixedVersion": "1.4.3-12.amzn2.2.2",
|
||||
"Title": "libssh2: Out-of-bounds memory comparison with specially crafted message channel request",
|
||||
"Description": "An out of bounds read flaw was discovered in libssh2 before 1.8.1 in the way SSH_MSG_CHANNEL_REQUEST packets with an exit status message and no payload are parsed. A remote attacker who compromises a SSH server may be able to cause a Denial of Service or read data in the client memory.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-03/msg00040.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00003.html",
|
||||
"http://packetstormsecurity.com/files/152136/Slackware-Security-Advisory-libssh2-Updates.html",
|
||||
"http://www.openwall.com/lists/oss-security/2019/03/18/3",
|
||||
"http://www.securityfocus.com/bid/107485",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3862",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-3862",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/03/msg00032.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5DK6VO2CEUTAJFYIKWNZKEKYMYR3NO2O/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XCWEA5ZCLKRDUK62QVVYMFWLWKOPX3LO/",
|
||||
"https://seclists.org/bugtraq/2019/Apr/25",
|
||||
"https://seclists.org/bugtraq/2019/Mar/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190327-0005/",
|
||||
"https://www.broadcom.com/support/fibre-channel-networking/security-advisories/brocade-security-advisory-2019-767",
|
||||
"https://www.debian.org/security/2019/dsa-4431",
|
||||
"https://www.libssh2.org/CVE-2019-3862.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-4658",
|
||||
"PkgName": "libxml2",
|
||||
"InstalledVersion": "2.9.1-6.amzn2.3.2",
|
||||
"FixedVersion": "2.9.1-6.amzn2.3.3",
|
||||
"Title": "libxml2: Use after free via namespace node in XPointer ranges",
|
||||
"Description": "xpointer.c in libxml2 before 2.9.5 (as used in Apple iOS before 10, OS X before 10.12, tvOS before 10, and watchOS before 3, and other products) does not forbid namespace nodes in XPointer ranges, which allows remote attackers to execute arbitrary code or cause a denial of service (use-after-free and memory corruption) via a crafted XML document.",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://lists.apple.com/archives/security-announce/2016/Sep/msg00006.html",
|
||||
"http://lists.apple.com/archives/security-announce/2016/Sep/msg00008.html",
|
||||
"http://lists.apple.com/archives/security-announce/2016/Sep/msg00010.html",
|
||||
"http://lists.apple.com/archives/security-announce/2016/Sep/msg00011.html",
|
||||
"http://www.securityfocus.com/bid/93054",
|
||||
"http://www.securitytracker.com/id/1036858",
|
||||
"http://www.securitytracker.com/id/1038623",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-4658",
|
||||
"https://git.gnome.org/browse/libxml2/commit/?id=c1d1f7121194036608bf555f08d3062a36fd344b",
|
||||
"https://github.com/sparklemotion/nokogiri/issues/1615",
|
||||
"https://security.gentoo.org/glsa/201701-37",
|
||||
"https://support.apple.com/HT207141",
|
||||
"https://support.apple.com/HT207142",
|
||||
"https://support.apple.com/HT207143",
|
||||
"https://support.apple.com/HT207170"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-16931",
|
||||
"PkgName": "libxml2",
|
||||
"InstalledVersion": "2.9.1-6.amzn2.3.2",
|
||||
"FixedVersion": "2.9.1-6.amzn2.3.3",
|
||||
"Title": "libxml2: Mishandling parameter-entity references",
|
||||
"Description": "parser.c in libxml2 before 2.9.5 mishandles parameter-entity references because the NEXTL macro calls the xmlParserHandlePEReference function in the case of a '%' character in a DTD name.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://xmlsoft.org/news.html",
|
||||
"https://bugzilla.gnome.org/show_bug.cgi?id=766956",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-16931",
|
||||
"https://github.com/GNOME/libxml2/commit/e26630548e7d138d2c560844c43820b6767251e3",
|
||||
"https://lists.debian.org/debian-lts-announce/2017/11/msg00041.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-10684",
|
||||
"PkgName": "ncurses",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Stack-based buffer overflow in fmt_entry function in dump_entry.c",
|
||||
"Description": "In ncurses 6.0, there is a stack-based buffer overflow in the fmt_entry function. A crafted input will lead to a remote arbitrary code execution attack.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464687",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10684",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-10685",
|
||||
"PkgName": "ncurses",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Stack-based buffer overflow caused by format string vulnerability in fmt_entry function",
|
||||
"Description": "In ncurses 6.0, there is a format string vulnerability in the fmt_entry function. A crafted input will lead to a remote arbitrary code execution attack.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464692",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10685",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11112",
|
||||
"PkgName": "ncurses",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Illegal address access in append_acs function",
|
||||
"Description": "In ncurses 6.0, there is an attempted 0xffffffffffffffff access in the append_acs function of tinfo/parse_entry.c. It could lead to a remote denial of service attack if the terminfo library code is used to process untrusted terminfo data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464686",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11112",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11113",
|
||||
"PkgName": "ncurses",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Null pointer dereference vulnerability in _nc_parse_entry function",
|
||||
"Description": "In ncurses 6.0, there is a NULL Pointer Dereference in the _nc_parse_entry function of tinfo/parse_entry.c. It could lead to a remote denial of service attack if the terminfo library code is used to process untrusted terminfo data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464691",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11113",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-10684",
|
||||
"PkgName": "ncurses-base",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Stack-based buffer overflow in fmt_entry function in dump_entry.c",
|
||||
"Description": "In ncurses 6.0, there is a stack-based buffer overflow in the fmt_entry function. A crafted input will lead to a remote arbitrary code execution attack.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464687",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10684",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-10685",
|
||||
"PkgName": "ncurses-base",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Stack-based buffer overflow caused by format string vulnerability in fmt_entry function",
|
||||
"Description": "In ncurses 6.0, there is a format string vulnerability in the fmt_entry function. A crafted input will lead to a remote arbitrary code execution attack.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464692",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10685",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11112",
|
||||
"PkgName": "ncurses-base",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Illegal address access in append_acs function",
|
||||
"Description": "In ncurses 6.0, there is an attempted 0xffffffffffffffff access in the append_acs function of tinfo/parse_entry.c. It could lead to a remote denial of service attack if the terminfo library code is used to process untrusted terminfo data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464686",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11112",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11113",
|
||||
"PkgName": "ncurses-base",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Null pointer dereference vulnerability in _nc_parse_entry function",
|
||||
"Description": "In ncurses 6.0, there is a NULL Pointer Dereference in the _nc_parse_entry function of tinfo/parse_entry.c. It could lead to a remote denial of service attack if the terminfo library code is used to process untrusted terminfo data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464691",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11113",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-10684",
|
||||
"PkgName": "ncurses-libs",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Stack-based buffer overflow in fmt_entry function in dump_entry.c",
|
||||
"Description": "In ncurses 6.0, there is a stack-based buffer overflow in the fmt_entry function. A crafted input will lead to a remote arbitrary code execution attack.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464687",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10684",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-10685",
|
||||
"PkgName": "ncurses-libs",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Stack-based buffer overflow caused by format string vulnerability in fmt_entry function",
|
||||
"Description": "In ncurses 6.0, there is a format string vulnerability in the fmt_entry function. A crafted input will lead to a remote arbitrary code execution attack.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464692",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-10685",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11112",
|
||||
"PkgName": "ncurses-libs",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Illegal address access in append_acs function",
|
||||
"Description": "In ncurses 6.0, there is an attempted 0xffffffffffffffff access in the append_acs function of tinfo/parse_entry.c. It could lead to a remote denial of service attack if the terminfo library code is used to process untrusted terminfo data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464686",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11112",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11113",
|
||||
"PkgName": "ncurses-libs",
|
||||
"InstalledVersion": "6.0-8.20170212.amzn2.1.2",
|
||||
"FixedVersion": "6.0-8.20170212.amzn2.1.3",
|
||||
"Title": "ncurses: Null pointer dereference vulnerability in _nc_parse_entry function",
|
||||
"Description": "In ncurses 6.0, there is a NULL Pointer Dereference in the _nc_parse_entry function of tinfo/parse_entry.c. It could lead to a remote denial of service attack if the terminfo library code is used to process untrusted terminfo data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1464691",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11113",
|
||||
"https://security.gentoo.org/glsa/201804-13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-12404",
|
||||
"PkgName": "nss",
|
||||
"InstalledVersion": "3.36.0-7.amzn2",
|
||||
"FixedVersion": "3.44.0-4.amzn2.0.2",
|
||||
"Title": "nss: Cache side-channel variant of the Bleichenbacher attack",
|
||||
"Description": "A cached side channel attack during handshakes using RSA encryption could allow for the decryption of encrypted content. This is a variant of the Adaptive Chosen Ciphertext attack (AKA Bleichenbacher attack) and affects all NSS versions prior to NSS 3.41.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-07/msg00021.html",
|
||||
"http://www.securityfocus.com/bid/107260",
|
||||
"https://bugzilla.mozilla.org/show_bug.cgi?id=CVE-2018-12404",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12404"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss",
|
||||
"InstalledVersion": "3.36.0-7.amzn2",
|
||||
"FixedVersion": "3.44.0-4.amzn2.0.2",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-12404",
|
||||
"PkgName": "nss-sysinit",
|
||||
"InstalledVersion": "3.36.0-7.amzn2",
|
||||
"FixedVersion": "3.44.0-4.amzn2.0.2",
|
||||
"Title": "nss: Cache side-channel variant of the Bleichenbacher attack",
|
||||
"Description": "A cached side channel attack during handshakes using RSA encryption could allow for the decryption of encrypted content. This is a variant of the Adaptive Chosen Ciphertext attack (AKA Bleichenbacher attack) and affects all NSS versions prior to NSS 3.41.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-07/msg00021.html",
|
||||
"http://www.securityfocus.com/bid/107260",
|
||||
"https://bugzilla.mozilla.org/show_bug.cgi?id=CVE-2018-12404",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12404"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-sysinit",
|
||||
"InstalledVersion": "3.36.0-7.amzn2",
|
||||
"FixedVersion": "3.44.0-4.amzn2.0.2",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-12404",
|
||||
"PkgName": "nss-tools",
|
||||
"InstalledVersion": "3.36.0-7.amzn2",
|
||||
"FixedVersion": "3.44.0-4.amzn2.0.2",
|
||||
"Title": "nss: Cache side-channel variant of the Bleichenbacher attack",
|
||||
"Description": "A cached side channel attack during handshakes using RSA encryption could allow for the decryption of encrypted content. This is a variant of the Adaptive Chosen Ciphertext attack (AKA Bleichenbacher attack) and affects all NSS versions prior to NSS 3.41.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-07/msg00021.html",
|
||||
"http://www.securityfocus.com/bid/107260",
|
||||
"https://bugzilla.mozilla.org/show_bug.cgi?id=CVE-2018-12404",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-12404"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-tools",
|
||||
"InstalledVersion": "3.36.0-7.amzn2",
|
||||
"FixedVersion": "3.44.0-4.amzn2.0.2",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5010",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: NULL pointer dereference using a specially crafted X509 certificate",
|
||||
"Description": "A null pointer dereference vulnerability was found in the certificate parsing code in Python. This causes a denial of service to applications when parsing specially crafted certificates. This vulnerability is unlikely to be triggered if application enables SSL/TLS certificate validation and accepts certificates only from trusted root certificate authorities.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5010",
|
||||
"https://python-security.readthedocs.io/vuln/ssl-crl-dps-dos.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-1060",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: DOS via regular expression catastrophic backtracking in apop() method in pop3lib",
|
||||
"Description": "python before versions 2.7.15, 3.4.9, 3.5.6rc1, 3.6.5rc1 and 3.7.0 is vulnerable to catastrophic backtracking in pop3lib's apop() method. An attacker could use this flaw to cause denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1042001",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3041",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1260",
|
||||
"https://bugs.python.org/issue32981",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-1060",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1060",
|
||||
"https://docs.python.org/3.5/whatsnew/changelog.html#python-3-5-6-release-candidate-1",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-final",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-release-candidate-1",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00030.html",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00031.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://support.hpe.com/hpsc/doc/public/display?docLocale=en_US\u0026docId=emr_na-hpesbst03951en_us",
|
||||
"https://usn.ubuntu.com/3817-1/",
|
||||
"https://usn.ubuntu.com/3817-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4306",
|
||||
"https://www.debian.org/security/2018/dsa-4307"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-1061",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: DOS via regular expression backtracking in difflib.IS_LINE_JUNK method in difflib",
|
||||
"Description": "python before versions 2.7.15, 3.4.9, 3.5.6rc1, 3.6.5rc1 and 3.7.0 is vulnerable to catastrophic backtracking in the difflib.IS_LINE_JUNK method. An attacker could use this flaw to cause denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1042001",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3041",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1260",
|
||||
"https://bugs.python.org/issue32981",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-1061",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1061",
|
||||
"https://docs.python.org/3.5/whatsnew/changelog.html#python-3-5-6-release-candidate-1",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-final",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-release-candidate-1",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00030.html",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00031.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://support.hpe.com/hpsc/doc/public/display?docLocale=en_US\u0026docId=emr_na-hpesbst03951en_us",
|
||||
"https://usn.ubuntu.com/3817-1/",
|
||||
"https://usn.ubuntu.com/3817-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4306",
|
||||
"https://www.debian.org/security/2018/dsa-4307"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20406",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: Integer overflow in Modules/_pickle.c allows for memory exhaustion if serializing gigabytes of data",
|
||||
"Description": "Modules/_pickle.c in Python before 3.7.1 has an integer overflow via a large LONG_BINPUT value that is mishandled during a \"resize to twice the size\" attempt. This issue might cause memory exhaustion, but is only relevant if the pickle format is used for serializing tens or hundreds of gigabytes of data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugs.python.org/issue34656",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20406",
|
||||
"https://github.com/python/cpython/commit/a4ae828ee416a66d8c7bf5ee71d653c2cc6a26dd",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/02/msg00011.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/D3LXPABKVLFYUHRYJPM3CSS5MS6FXKS7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/ICBEGRHIPHWPG2VGYS6R4EVKVUUF4AQW/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TR6GCO3WTV4D5L23WTCBF275VE6BVNI3/",
|
||||
"https://python-security.readthedocs.io/vuln/pickle-load-dos.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190416-0010/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-10160",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-2.amzn2.0.1",
|
||||
"Title": "python: regression of CVE-2019-9636 due to functional fix to allow port numbers in netloc",
|
||||
"Description": "A security regression of CVE-2019-9636 was discovered in python since commit d537ab0ff9767ef024f26246899728f0116b1ec3 affecting versions 2.7, 3.5, 3.6, 3.7 and from v3.8.0a4 through v3.8.0b1, which still allows an attacker to exploit CVE-2019-9636 by abusing the user and password parts of a URL. When an application parses user-supplied URLs to store cookies, authentication credentials, or other kind of information, it is possible for an attacker to provide specially crafted URLs to make the application locate host-related information (e.g. cookies, authentication data) and send them to a different host than where it should, unlike if the URLs had been correctly parsed. The result of an attack may vary based on the application.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://access.redhat.com/errata/RHSA-2019:1587",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-10160",
|
||||
"https://github.com/python/cpython/commit/250b62acc59921d399f0db47db3b462cd6037e09",
|
||||
"https://github.com/python/cpython/commit/8d0ef0b5edeae52960c7ed05ae8a12388324f87e",
|
||||
"https://github.com/python/cpython/commit/f61599b050c621386a3fc6bc480359e2d3bb93de",
|
||||
"https://github.com/python/cpython/commit/fd1771dbdd28709716bd531580c40ae5ed814468",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/06/msg00022.html",
|
||||
"https://python-security.readthedocs.io/vuln/urlsplit-nfkc-normalization2.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190617-0003/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9636",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: Information Disclosure due to urlsplit improper NFKC normalization",
|
||||
"Description": "Python 2.7.x through 2.7.16 and 3.x through 3.7.2 is affected by: Improper Handling of Unicode Encoding (with an incorrect netloc) during NFKC normalization. The impact is: Information disclosure (credentials, cookies, etc. that are cached against a given hostname). The components are: urllib.parse.urlsplit, urllib.parse.urlparse. The attack vector is: A specially crafted URL could be incorrectly parsed to locate cookies or authentication data and send that information to a different host than when parsed correctly.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00092.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00097.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-05/msg00024.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00050.html",
|
||||
"http://www.securityfocus.com/bid/107400",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0959",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0710",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0765",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0806",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0902",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0981",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0997",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1467",
|
||||
"https://bugs.python.org/issue36216",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9636",
|
||||
"https://github.com/python/cpython/pull/12201",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/CFBAAGM27H73OLYBUA2IAZFSUN6KGLME/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/D3LXPABKVLFYUHRYJPM3CSS5MS6FXKS7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/ICBEGRHIPHWPG2VGYS6R4EVKVUUF4AQW/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/IFAXBEY2TGOBDRKTR556JBXBVFSAKD6I/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JMWSKTNOHSUOT3L25QFJAVCFYZX46FYK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JXASHCDD4PQFKTMKQN4YOP5ZH366ABN4/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/L25RTMKCF62DLC2XVSNXGX7C7HXISLVM/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TR6GCO3WTV4D5L23WTCBF275VE6BVNI3/",
|
||||
"https://python-security.readthedocs.io/vuln/urlsplit-nfkc-normalization.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190517-0001/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9948",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-3.amzn2.0.1",
|
||||
"Title": "python: Undocumented local_file protocol allows remote attackers to bypass protection mechanisms",
|
||||
"Description": "urllib in Python 2.x through 2.7.16 supports the local_file: scheme, which makes it easier for remote attackers to bypass protection mechanisms that blacklist file: URIs, as demonstrated by triggering a urllib.urlopen('local_file:///etc/passwd') call.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00092.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00050.html",
|
||||
"http://www.securityfocus.com/bid/107549",
|
||||
"https://bugs.python.org/issue35907",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9948",
|
||||
"https://github.com/python/cpython/pull/11842",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/06/msg00022.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190404-0004/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5010",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: NULL pointer dereference using a specially crafted X509 certificate",
|
||||
"Description": "A null pointer dereference vulnerability was found in the certificate parsing code in Python. This causes a denial of service to applications when parsing specially crafted certificates. This vulnerability is unlikely to be triggered if application enables SSL/TLS certificate validation and accepts certificates only from trusted root certificate authorities.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5010",
|
||||
"https://python-security.readthedocs.io/vuln/ssl-crl-dps-dos.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-1060",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: DOS via regular expression catastrophic backtracking in apop() method in pop3lib",
|
||||
"Description": "python before versions 2.7.15, 3.4.9, 3.5.6rc1, 3.6.5rc1 and 3.7.0 is vulnerable to catastrophic backtracking in pop3lib's apop() method. An attacker could use this flaw to cause denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1042001",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3041",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1260",
|
||||
"https://bugs.python.org/issue32981",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-1060",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1060",
|
||||
"https://docs.python.org/3.5/whatsnew/changelog.html#python-3-5-6-release-candidate-1",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-final",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-release-candidate-1",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00030.html",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00031.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://support.hpe.com/hpsc/doc/public/display?docLocale=en_US\u0026docId=emr_na-hpesbst03951en_us",
|
||||
"https://usn.ubuntu.com/3817-1/",
|
||||
"https://usn.ubuntu.com/3817-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4306",
|
||||
"https://www.debian.org/security/2018/dsa-4307"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-1061",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: DOS via regular expression backtracking in difflib.IS_LINE_JUNK method in difflib",
|
||||
"Description": "python before versions 2.7.15, 3.4.9, 3.5.6rc1, 3.6.5rc1 and 3.7.0 is vulnerable to catastrophic backtracking in the difflib.IS_LINE_JUNK method. An attacker could use this flaw to cause denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1042001",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3041",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1260",
|
||||
"https://bugs.python.org/issue32981",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-1061",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1061",
|
||||
"https://docs.python.org/3.5/whatsnew/changelog.html#python-3-5-6-release-candidate-1",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-final",
|
||||
"https://docs.python.org/3.6/whatsnew/changelog.html#python-3-6-5-release-candidate-1",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00030.html",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/09/msg00031.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://support.hpe.com/hpsc/doc/public/display?docLocale=en_US\u0026docId=emr_na-hpesbst03951en_us",
|
||||
"https://usn.ubuntu.com/3817-1/",
|
||||
"https://usn.ubuntu.com/3817-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4306",
|
||||
"https://www.debian.org/security/2018/dsa-4307"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20406",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: Integer overflow in Modules/_pickle.c allows for memory exhaustion if serializing gigabytes of data",
|
||||
"Description": "Modules/_pickle.c in Python before 3.7.1 has an integer overflow via a large LONG_BINPUT value that is mishandled during a \"resize to twice the size\" attempt. This issue might cause memory exhaustion, but is only relevant if the pickle format is used for serializing tens or hundreds of gigabytes of data.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugs.python.org/issue34656",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20406",
|
||||
"https://github.com/python/cpython/commit/a4ae828ee416a66d8c7bf5ee71d653c2cc6a26dd",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/02/msg00011.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/D3LXPABKVLFYUHRYJPM3CSS5MS6FXKS7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/ICBEGRHIPHWPG2VGYS6R4EVKVUUF4AQW/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TR6GCO3WTV4D5L23WTCBF275VE6BVNI3/",
|
||||
"https://python-security.readthedocs.io/vuln/pickle-load-dos.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190416-0010/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-10160",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-2.amzn2.0.1",
|
||||
"Title": "python: regression of CVE-2019-9636 due to functional fix to allow port numbers in netloc",
|
||||
"Description": "A security regression of CVE-2019-9636 was discovered in python since commit d537ab0ff9767ef024f26246899728f0116b1ec3 affecting versions 2.7, 3.5, 3.6, 3.7 and from v3.8.0a4 through v3.8.0b1, which still allows an attacker to exploit CVE-2019-9636 by abusing the user and password parts of a URL. When an application parses user-supplied URLs to store cookies, authentication credentials, or other kind of information, it is possible for an attacker to provide specially crafted URLs to make the application locate host-related information (e.g. cookies, authentication data) and send them to a different host than where it should, unlike if the URLs had been correctly parsed. The result of an attack may vary based on the application.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://access.redhat.com/errata/RHSA-2019:1587",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-10160",
|
||||
"https://github.com/python/cpython/commit/250b62acc59921d399f0db47db3b462cd6037e09",
|
||||
"https://github.com/python/cpython/commit/8d0ef0b5edeae52960c7ed05ae8a12388324f87e",
|
||||
"https://github.com/python/cpython/commit/f61599b050c621386a3fc6bc480359e2d3bb93de",
|
||||
"https://github.com/python/cpython/commit/fd1771dbdd28709716bd531580c40ae5ed814468",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/06/msg00022.html",
|
||||
"https://python-security.readthedocs.io/vuln/urlsplit-nfkc-normalization2.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190617-0003/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9636",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-1.amzn2.0.1",
|
||||
"Title": "python: Information Disclosure due to urlsplit improper NFKC normalization",
|
||||
"Description": "Python 2.7.x through 2.7.16 and 3.x through 3.7.2 is affected by: Improper Handling of Unicode Encoding (with an incorrect netloc) during NFKC normalization. The impact is: Information disclosure (credentials, cookies, etc. that are cached against a given hostname). The components are: urllib.parse.urlsplit, urllib.parse.urlparse. The attack vector is: A specially crafted URL could be incorrectly parsed to locate cookies or authentication data and send that information to a different host than when parsed correctly.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00092.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00097.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-05/msg00024.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00050.html",
|
||||
"http://www.securityfocus.com/bid/107400",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0959",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0710",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0765",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0806",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0902",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0981",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0997",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1467",
|
||||
"https://bugs.python.org/issue36216",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9636",
|
||||
"https://github.com/python/cpython/pull/12201",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/46PVWY5LFP4BRPG3BVQ5QEEFYBVEXHCK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/AEZ5IQT7OF7Q2NCGIVABOWYGKO7YU3NJ/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/CFBAAGM27H73OLYBUA2IAZFSUN6KGLME/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/D3LXPABKVLFYUHRYJPM3CSS5MS6FXKS7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/ICBEGRHIPHWPG2VGYS6R4EVKVUUF4AQW/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/IFAXBEY2TGOBDRKTR556JBXBVFSAKD6I/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JMWSKTNOHSUOT3L25QFJAVCFYZX46FYK/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JSKPGPZQNTAULHW4UH63KGOOUIDE4RRB/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JXASHCDD4PQFKTMKQN4YOP5ZH366ABN4/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/L25RTMKCF62DLC2XVSNXGX7C7HXISLVM/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TR6GCO3WTV4D5L23WTCBF275VE6BVNI3/",
|
||||
"https://python-security.readthedocs.io/vuln/urlsplit-nfkc-normalization.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190517-0001/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9948",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.14-58.amzn2.0.4",
|
||||
"FixedVersion": "2.7.16-3.amzn2.0.1",
|
||||
"Title": "python: Undocumented local_file protocol allows remote attackers to bypass protection mechanisms",
|
||||
"Description": "urllib in Python 2.x through 2.7.16 supports the local_file: scheme, which makes it easier for remote attackers to bypass protection mechanisms that blacklist file: URIs, as demonstrated by triggering a urllib.urlopen('local_file:///etc/passwd') call.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00092.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00050.html",
|
||||
"http://www.securityfocus.com/bid/107549",
|
||||
"https://bugs.python.org/issue35907",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9948",
|
||||
"https://github.com/python/cpython/pull/11842",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/06/msg00022.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190404-0004/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-12735",
|
||||
"PkgName": "vim-minimal",
|
||||
"InstalledVersion": "2:7.4.160-4.amzn2.0.16",
|
||||
"FixedVersion": "2:8.1.1602-1.amzn2",
|
||||
"Title": "vim/neovim: ':source!' command allows arbitrary command execution via modelines",
|
||||
"Description": "getchar.c in Vim before 8.1.1365 and Neovim before 0.3.6 allows remote attackers to execute arbitrary OS commands via the :source! command in a modeline, as demonstrated by execute in Vim, and assert_fails or nvim_input in Neovim.",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00031.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00036.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00037.html",
|
||||
"http://www.securityfocus.com/bid/108724",
|
||||
"https://bugs.debian.org/930020",
|
||||
"https://bugs.debian.org/930024",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12735",
|
||||
"https://github.com/neovim/neovim/pull/10082",
|
||||
"https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md",
|
||||
"https://github.com/vim/vim/commit/53575521406739cf20bbe4e384d88e7dca11f040",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/2BMDSHTF754TITC6AQJPCS5IRIDMMIM7/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/TRIRBC2YRGKPAWVRMZS4SZTGGCVRVZPR/",
|
||||
"https://usn.ubuntu.com/4016-1/",
|
||||
"https://usn.ubuntu.com/4016-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4467"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
12723
integration/testdata/centos-6.json.golden
vendored
Normal file
12723
integration/testdata/centos-6.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
118
integration/testdata/centos-7-critical.json.golden
vendored
Normal file
118
integration/testdata/centos-7-critical.json.golden
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/centos-7.tar.gz (centos 7.6.1810)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-14618",
|
||||
"PkgName": "curl",
|
||||
"InstalledVersion": "7.29.0-51.el7",
|
||||
"FixedVersion": "7.29.0-51.el7_6.3",
|
||||
"Title": "curl: NTLM password overflow via integer overflow",
|
||||
"Description": "curl before version 7.61.1 is vulnerable to a buffer overrun in the NTLM authentication code. The internal function Curl_ntlm_core_mk_nt_hash multiplies the length of the password by two (SUM) to figure out how large temporary storage area to allocate from the heap. The length value is then subsequently used to iterate over the password and generate output into the allocated storage buffer. On systems with a 32 bit size_t, the math to calculate SUM triggers an integer overflow when the password length exceeds 2GB (2^31 bytes). This integer overflow usually causes a very small buffer to actually get allocated instead of the intended very huge one, making the use of that buffer end up in a heap buffer overflow. (This bug is almost identical to CVE-2017-8816.)",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041605",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3558",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-14618",
|
||||
"https://cert-portal.siemens.com/productcert/pdf/ssa-436177.pdf",
|
||||
"https://curl.haxx.se/docs/CVE-2018-14618.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14618",
|
||||
"https://psirt.global.sonicwall.com/vuln-detail/SNWLID-2018-0014",
|
||||
"https://security.gentoo.org/glsa/201903-03",
|
||||
"https://usn.ubuntu.com/3765-1/",
|
||||
"https://usn.ubuntu.com/3765-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4286"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-14618",
|
||||
"PkgName": "libcurl",
|
||||
"InstalledVersion": "7.29.0-51.el7",
|
||||
"FixedVersion": "7.29.0-51.el7_6.3",
|
||||
"Title": "curl: NTLM password overflow via integer overflow",
|
||||
"Description": "curl before version 7.61.1 is vulnerable to a buffer overrun in the NTLM authentication code. The internal function Curl_ntlm_core_mk_nt_hash multiplies the length of the password by two (SUM) to figure out how large temporary storage area to allocate from the heap. The length value is then subsequently used to iterate over the password and generate output into the allocated storage buffer. On systems with a 32 bit size_t, the math to calculate SUM triggers an integer overflow when the password length exceeds 2GB (2^31 bytes). This integer overflow usually causes a very small buffer to actually get allocated instead of the intended very huge one, making the use of that buffer end up in a heap buffer overflow. (This bug is almost identical to CVE-2017-8816.)",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041605",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3558",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-14618",
|
||||
"https://cert-portal.siemens.com/productcert/pdf/ssa-436177.pdf",
|
||||
"https://curl.haxx.se/docs/CVE-2018-14618.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14618",
|
||||
"https://psirt.global.sonicwall.com/vuln-detail/SNWLID-2018-0014",
|
||||
"https://security.gentoo.org/glsa/201903-03",
|
||||
"https://usn.ubuntu.com/3765-1/",
|
||||
"https://usn.ubuntu.com/3765-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4286"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3855",
|
||||
"PkgName": "libssh2",
|
||||
"InstalledVersion": "1.4.3-12.el7",
|
||||
"FixedVersion": "1.4.3-12.el7_6.2",
|
||||
"Title": "libssh2: Integer overflow in transport read resulting in out of bounds write",
|
||||
"Description": "An integer overflow flaw which could lead to an out of bounds write was discovered in libssh2 before 1.8.1 in the way packets are read from the server. A remote attacker who compromises a SSH server may be able to execute code on the client system when a user connects to the server.",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-03/msg00040.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00003.html",
|
||||
"http://packetstormsecurity.com/files/152136/Slackware-Security-Advisory-libssh2-Updates.html",
|
||||
"http://www.openwall.com/lists/oss-security/2019/03/18/3",
|
||||
"http://www.securityfocus.com/bid/107485",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0679",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1175",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3855",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-3855",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/03/msg00032.html",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5DK6VO2CEUTAJFYIKWNZKEKYMYR3NO2O/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XCWEA5ZCLKRDUK62QVVYMFWLWKOPX3LO/",
|
||||
"https://seclists.org/bugtraq/2019/Apr/25",
|
||||
"https://seclists.org/bugtraq/2019/Mar/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190327-0005/",
|
||||
"https://www.broadcom.com/support/fibre-channel-networking/security-advisories/brocade-security-advisory-2019-767",
|
||||
"https://www.debian.org/security/2019/dsa-4431",
|
||||
"https://www.libssh2.org/CVE-2019-3855.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-15686",
|
||||
"PkgName": "systemd",
|
||||
"InstalledVersion": "219-62.el7_6.5",
|
||||
"FixedVersion": "219-67.el7",
|
||||
"Title": "systemd: line splitting via fgets() allows for state injection during daemon-reexec",
|
||||
"Description": "A vulnerability in unit_deserialize of systemd allows an attacker to supply arbitrary state across systemd re-execution via NotifyAccess. This can be used to improperly influence systemd execution and possibly lead to root privilege escalation. Affected releases are systemd versions up to and including 239.",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/105747",
|
||||
"https://access.redhat.com/errata/RHSA-2019:2091",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-15686",
|
||||
"https://github.com/systemd/systemd/pull/10519",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/11/msg00017.html",
|
||||
"https://security.gentoo.org/glsa/201810-10",
|
||||
"https://usn.ubuntu.com/3816-1/",
|
||||
"https://www.exploit-db.com/exploits/45714/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-15686",
|
||||
"PkgName": "systemd-libs",
|
||||
"InstalledVersion": "219-62.el7_6.5",
|
||||
"FixedVersion": "219-67.el7",
|
||||
"Title": "systemd: line splitting via fgets() allows for state injection during daemon-reexec",
|
||||
"Description": "A vulnerability in unit_deserialize of systemd allows an attacker to supply arbitrary state across systemd re-execution via NotifyAccess. This can be used to improperly influence systemd execution and possibly lead to root privilege escalation. Affected releases are systemd versions up to and including 239.",
|
||||
"Severity": "CRITICAL",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/105747",
|
||||
"https://access.redhat.com/errata/RHSA-2019:2091",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-15686",
|
||||
"https://github.com/systemd/systemd/pull/10519",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/11/msg00017.html",
|
||||
"https://security.gentoo.org/glsa/201810-10",
|
||||
"https://usn.ubuntu.com/3816-1/",
|
||||
"https://www.exploit-db.com/exploits/45714/"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
1714
integration/testdata/centos-7-ignore-unfixed.json.golden
vendored
Normal file
1714
integration/testdata/centos-7-ignore-unfixed.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
415
integration/testdata/centos-7-low-high.json.golden
vendored
Normal file
415
integration/testdata/centos-7-low-high.json.golden
vendored
Normal file
@@ -0,0 +1,415 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/centos-7.tar.gz (centos 7.6.1810)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-5743",
|
||||
"PkgName": "bind-license",
|
||||
"InstalledVersion": "32:9.9.4-73.el7_6",
|
||||
"FixedVersion": "32:9.9.4-74.el7_6.1",
|
||||
"Title": "bind: Limiting simultaneous TCP clients is ineffective",
|
||||
"Description": "By design, BIND is intended to limit the number of TCP clients that can be connected at any given time. The number of allowed connections is a tunable parameter which, if unset, defaults to a conservative value for most servers. Unfortunately, the code which was intended to limit the number of simultaneous connections contained an error which could be exploited to grow the number of simultaneous connections beyond this limit. Versions affected: BIND 9.9.0 -\u003e 9.10.8-P1, 9.11.0 -\u003e 9.11.6, 9.12.0 -\u003e 9.12.4, 9.14.0. BIND 9 Supported Preview Edition versions 9.9.3-S1 -\u003e 9.11.5-S3, and 9.11.5-S5. Versions 9.13.0 -\u003e 9.13.7 of the 9.13 development branch are also affected. Versions prior to BIND 9.9.0 have not been evaluated for vulnerability to CVE-2018-5743.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5743",
|
||||
"https://kb.isc.org/docs/cve-2018-5743"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16402",
|
||||
"PkgName": "elfutils-default-yama-scope",
|
||||
"InstalledVersion": "0.172-2.el7",
|
||||
"FixedVersion": "0.176-2.el7",
|
||||
"Title": "elfutils: Double-free due to double decompression of sections in crafted ELF causes crash",
|
||||
"Description": "libelf/elf_end.c in elfutils 0.173 allows remote attackers to cause a denial of service (double free and application crash) or possibly have unspecified other impact because it tries to decompress twice.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16402",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23528",
|
||||
"https://usn.ubuntu.com/4012-1/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16402",
|
||||
"PkgName": "elfutils-libelf",
|
||||
"InstalledVersion": "0.172-2.el7",
|
||||
"FixedVersion": "0.176-2.el7",
|
||||
"Title": "elfutils: Double-free due to double decompression of sections in crafted ELF causes crash",
|
||||
"Description": "libelf/elf_end.c in elfutils 0.173 allows remote attackers to cause a denial of service (double free and application crash) or possibly have unspecified other impact because it tries to decompress twice.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16402",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23528",
|
||||
"https://usn.ubuntu.com/4012-1/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16402",
|
||||
"PkgName": "elfutils-libs",
|
||||
"InstalledVersion": "0.172-2.el7",
|
||||
"FixedVersion": "0.176-2.el7",
|
||||
"Title": "elfutils: Double-free due to double decompression of sections in crafted ELF causes crash",
|
||||
"Description": "libelf/elf_end.c in elfutils 0.173 allows remote attackers to cause a denial of service (double free and application crash) or possibly have unspecified other impact because it tries to decompress twice.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16402",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23528",
|
||||
"https://usn.ubuntu.com/4012-1/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nspr",
|
||||
"InstalledVersion": "4.19.0-1.el7_5",
|
||||
"FixedVersion": "4.21.0-1.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss",
|
||||
"InstalledVersion": "3.36.0-7.1.el7_6",
|
||||
"FixedVersion": "3.44.0-4.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-softokn",
|
||||
"InstalledVersion": "3.36.0-5.el7_5",
|
||||
"FixedVersion": "3.44.0-5.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-softokn-freebl",
|
||||
"InstalledVersion": "3.36.0-5.el7_5",
|
||||
"FixedVersion": "3.44.0-5.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-sysinit",
|
||||
"InstalledVersion": "3.36.0-7.1.el7_6",
|
||||
"FixedVersion": "3.44.0-4.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-tools",
|
||||
"InstalledVersion": "3.36.0-7.1.el7_6",
|
||||
"FixedVersion": "3.44.0-4.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-0495",
|
||||
"PkgName": "nss-util",
|
||||
"InstalledVersion": "3.36.0-1.1.el7_6",
|
||||
"FixedVersion": "3.44.0-3.el7",
|
||||
"Title": "ROHNP: Key Extraction Side Channel in Multiple Crypto Libraries",
|
||||
"Description": "Libgcrypt before 1.7.10 and 1.8.x before 1.8.3 allows a memory-cache side-channel attack on ECDSA signatures that can be mitigated through the use of blinding during the signing process in the _gcry_ecc_ecdsa_sign function in cipher/ecc-ecdsa.c, aka the Return Of the Hidden Number Problem or ROHNP. To discover an ECDSA key, the attacker needs access to either the local machine or a different virtual machine on the same physical host.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securitytracker.com/id/1041144",
|
||||
"http://www.securitytracker.com/id/1041147",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3221",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3505",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1296",
|
||||
"https://access.redhat.com/errata/RHSA-2019:1297",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-0495",
|
||||
"https://dev.gnupg.org/T4011",
|
||||
"https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=9010d1576e278a4274ad3f4aa15776c28f6ba965",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/06/msg00013.html",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2018q2/000426.html",
|
||||
"https://usn.ubuntu.com/3689-1/",
|
||||
"https://usn.ubuntu.com/3689-2/",
|
||||
"https://usn.ubuntu.com/3692-1/",
|
||||
"https://usn.ubuntu.com/3692-2/",
|
||||
"https://usn.ubuntu.com/3850-1/",
|
||||
"https://usn.ubuntu.com/3850-2/",
|
||||
"https://www.debian.org/security/2018/dsa-4231",
|
||||
"https://www.nccgroup.trust/us/our-research/technical-advisory-return-of-the-hidden-number-problem/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-5407",
|
||||
"PkgName": "openssl-libs",
|
||||
"InstalledVersion": "1:1.0.2k-16.el7",
|
||||
"FixedVersion": "1:1.0.2k-16.el7_6.1",
|
||||
"Title": "openssl: Side-channel vulnerability on SMT/Hyper-Threading architectures (PortSmash)",
|
||||
"Description": "Simultaneous Multi-threading (SMT) in processors can enable local users to exploit software vulnerable to timing attacks via a side-channel timing attack on 'port contention'.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/105897",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0483",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0651",
|
||||
"https://access.redhat.com/errata/RHSA-2019:0652",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5407",
|
||||
"https://eprint.iacr.org/2018/1060.pdf",
|
||||
"https://github.com/bbbrumley/portsmash",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/11/msg00024.html",
|
||||
"https://nodejs.org/en/blog/vulnerability/november-2018-security-releases/",
|
||||
"https://security.gentoo.org/glsa/201903-10",
|
||||
"https://security.netapp.com/advisory/ntap-20181126-0001/",
|
||||
"https://usn.ubuntu.com/3840-1/",
|
||||
"https://www.debian.org/security/2018/dsa-4348",
|
||||
"https://www.debian.org/security/2018/dsa-4355",
|
||||
"https://www.exploit-db.com/exploits/45785/",
|
||||
"https://www.openssl.org/news/secadv/20181112.txt",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpujan2019-5072801.html",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpujul2019-5072835.html",
|
||||
"https://www.tenable.com/security/tns-2018-16",
|
||||
"https://www.tenable.com/security/tns-2018-17"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5010",
|
||||
"PkgName": "python",
|
||||
"InstalledVersion": "2.7.5-76.el7",
|
||||
"FixedVersion": "2.7.5-86.el7",
|
||||
"Title": "python: NULL pointer dereference using a specially crafted X509 certificate",
|
||||
"Description": "A null pointer dereference vulnerability was found in the certificate parsing code in Python. This causes a denial of service to applications when parsing specially crafted certificates. This vulnerability is unlikely to be triggered if application enables SSL/TLS certificate validation and accepts certificates only from trusted root certificate authorities.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5010",
|
||||
"https://python-security.readthedocs.io/vuln/ssl-crl-dps-dos.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5010",
|
||||
"PkgName": "python-libs",
|
||||
"InstalledVersion": "2.7.5-76.el7",
|
||||
"FixedVersion": "2.7.5-86.el7",
|
||||
"Title": "python: NULL pointer dereference using a specially crafted X509 certificate",
|
||||
"Description": "A null pointer dereference vulnerability was found in the certificate parsing code in Python. This causes a denial of service to applications when parsing specially crafted certificates. This vulnerability is unlikely to be triggered if application enables SSL/TLS certificate validation and accepts certificates only from trusted root certificate authorities.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5010",
|
||||
"https://python-security.readthedocs.io/vuln/ssl-crl-dps-dos.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16866",
|
||||
"PkgName": "systemd",
|
||||
"InstalledVersion": "219-62.el7_6.5",
|
||||
"FixedVersion": "219-67.el7",
|
||||
"Title": "systemd: out-of-bounds read when parsing a crafted syslog message",
|
||||
"Description": "An out of bounds read was discovered in systemd-journald in the way it parses log messages that terminate with a colon ':'. A local attacker can use this flaw to disclose process memory data. Versions from v221 to v239 are vulnerable.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/152841/System-Down-A-systemd-journald-Exploit.html",
|
||||
"http://seclists.org/fulldisclosure/2019/May/21",
|
||||
"http://www.openwall.com/lists/oss-security/2019/05/10/4",
|
||||
"http://www.securityfocus.com/bid/106527",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16866",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16866",
|
||||
"https://seclists.org/bugtraq/2019/May/25",
|
||||
"https://security.gentoo.org/glsa/201903-07",
|
||||
"https://security.netapp.com/advisory/ntap-20190117-0001/",
|
||||
"https://usn.ubuntu.com/3855-1/",
|
||||
"https://www.debian.org/security/2019/dsa-4367",
|
||||
"https://www.qualys.com/2019/01/09/system-down/system-down.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16888",
|
||||
"PkgName": "systemd",
|
||||
"InstalledVersion": "219-62.el7_6.5",
|
||||
"FixedVersion": "219-67.el7",
|
||||
"Title": "systemd: kills privileged process if unprivileged PIDFile was tampered",
|
||||
"Description": "It was discovered systemd does not correctly check the content of PIDFile files before using it to kill processes. When a service is run from an unprivileged user (e.g. User field set in the service file), a local attacker who is able to write to the PIDFile of the mentioned service may use this flaw to trick systemd into killing other services and/or privileged processes. Versions before v237 are vulnerable.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"https://access.redhat.com/errata/RHSA-2019:2091",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16888",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16888",
|
||||
"https://lists.apache.org/thread.html/5960a34a524848cd722fd7ab7e2227eac10107b0f90d9d1e9c3caa74@%3Cuser.cassandra.apache.org%3E",
|
||||
"https://security.netapp.com/advisory/ntap-20190307-0007/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16866",
|
||||
"PkgName": "systemd-libs",
|
||||
"InstalledVersion": "219-62.el7_6.5",
|
||||
"FixedVersion": "219-67.el7",
|
||||
"Title": "systemd: out-of-bounds read when parsing a crafted syslog message",
|
||||
"Description": "An out of bounds read was discovered in systemd-journald in the way it parses log messages that terminate with a colon ':'. A local attacker can use this flaw to disclose process memory data. Versions from v221 to v239 are vulnerable.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/152841/System-Down-A-systemd-journald-Exploit.html",
|
||||
"http://seclists.org/fulldisclosure/2019/May/21",
|
||||
"http://www.openwall.com/lists/oss-security/2019/05/10/4",
|
||||
"http://www.securityfocus.com/bid/106527",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16866",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16866",
|
||||
"https://seclists.org/bugtraq/2019/May/25",
|
||||
"https://security.gentoo.org/glsa/201903-07",
|
||||
"https://security.netapp.com/advisory/ntap-20190117-0001/",
|
||||
"https://usn.ubuntu.com/3855-1/",
|
||||
"https://www.debian.org/security/2019/dsa-4367",
|
||||
"https://www.qualys.com/2019/01/09/system-down/system-down.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16888",
|
||||
"PkgName": "systemd-libs",
|
||||
"InstalledVersion": "219-62.el7_6.5",
|
||||
"FixedVersion": "219-67.el7",
|
||||
"Title": "systemd: kills privileged process if unprivileged PIDFile was tampered",
|
||||
"Description": "It was discovered systemd does not correctly check the content of PIDFile files before using it to kill processes. When a service is run from an unprivileged user (e.g. User field set in the service file), a local attacker who is able to write to the PIDFile of the mentioned service may use this flaw to trick systemd into killing other services and/or privileged processes. Versions before v237 are vulnerable.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"https://access.redhat.com/errata/RHSA-2019:2091",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16888",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16888",
|
||||
"https://lists.apache.org/thread.html/5960a34a524848cd722fd7ab7e2227eac10107b0f90d9d1e9c3caa74@%3Cuser.cassandra.apache.org%3E",
|
||||
"https://security.netapp.com/advisory/ntap-20190307-0007/"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
11930
integration/testdata/centos-7.json.golden
vendored
Normal file
11930
integration/testdata/centos-7.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
71
integration/testdata/debian-buster-ignore-unfixed.json.golden
vendored
Normal file
71
integration/testdata/debian-buster-ignore-unfixed.json.golden
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/debian-buster.tar.gz (debian 10.1)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "e2fsprogs",
|
||||
"InstalledVersion": "1.44.5-1+deb10u1",
|
||||
"FixedVersion": "1.44.5-1+deb10u2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libcom-err2",
|
||||
"InstalledVersion": "1.44.5-1+deb10u1",
|
||||
"FixedVersion": "1.44.5-1+deb10u2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libext2fs2",
|
||||
"InstalledVersion": "1.44.5-1+deb10u1",
|
||||
"FixedVersion": "1.44.5-1+deb10u2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libss2",
|
||||
"InstalledVersion": "1.44.5-1+deb10u1",
|
||||
"FixedVersion": "1.44.5-1+deb10u2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
1079
integration/testdata/debian-buster.json.golden
vendored
Normal file
1079
integration/testdata/debian-buster.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2068
integration/testdata/debian-stretch.json.golden
vendored
Normal file
2068
integration/testdata/debian-stretch.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
45
integration/testdata/distroless-base-ignore-unfixed.json.golden
vendored
Normal file
45
integration/testdata/distroless-base-ignore-unfixed.json.golden
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/distroless-base.tar.gz (debian 9.9)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "libssl1.1",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"FixedVersion": "1.1.0l-1~deb9u1",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"FixedVersion": "1.1.0l-1~deb9u1",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
417
integration/testdata/distroless-base.json.golden
vendored
Normal file
417
integration/testdata/distroless-base.json.golden
vendored
Normal file
@@ -0,0 +1,417 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/distroless-base.tar.gz (debian 9.9)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-1000001",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: realpath() buffer underflow when getcwd() returns relative path allows privilege escalation",
|
||||
"Description": "In glibc 2.26 and earlier there is confusion in the usage of getcwd() by realpath() which can be used to write before the destination buffer leading to a buffer underflow and potential code execution.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://seclists.org/oss-sec/2018/q1/38",
|
||||
"http://www.securityfocus.com/bid/102525",
|
||||
"http://www.securitytracker.com/id/1040162",
|
||||
"https://access.redhat.com/errata/RHSA-2018:0805",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1000001",
|
||||
"https://security.netapp.com/advisory/ntap-20190404-0003/",
|
||||
"https://usn.ubuntu.com/3534-1/",
|
||||
"https://usn.ubuntu.com/3536-1/",
|
||||
"https://www.exploit-db.com/exploits/43775/",
|
||||
"https://www.exploit-db.com/exploits/44889/",
|
||||
"https://www.halfdog.net/Security/2017/LibcRealpathBufferUnderflow/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-6485",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: Integer overflow in posix_memalign in memalign functions",
|
||||
"Description": "An integer overflow in the implementation of the posix_memalign in memalign functions in the GNU C Library (aka glibc or libc6) 2.26 and earlier could cause these functions to return a pointer to a heap area that is too small, potentially leading to heap corruption.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://bugs.debian.org/878159",
|
||||
"http://www.securityfocus.com/bid/102912",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3092",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6485",
|
||||
"https://security.netapp.com/advisory/ntap-20190404-0003/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22343",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-6551",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: integer overflow in malloc functions",
|
||||
"Description": "The malloc implementation in the GNU C Library (aka glibc or libc6), from version 2.24 to 2.26 on powerpc, and only in version 2.26 on i386, did not properly handle malloc calls with arguments close to SIZE_MAX and could return a pointer to a heap region that is smaller than requested, eventually leading to heap corruption.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6551",
|
||||
"https://security.netapp.com/advisory/ntap-20190404-0003/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22774",
|
||||
"https://sourceware.org/git/?p=glibc.git;a=commit;h=8e448310d74b283c5cd02b9ed7fb997b47bf9b22"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1010022",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: stack guard protection bypass",
|
||||
"Description": "GNU Libc current is affected by: Mitigation bypass. The impact is: Attacker may bypass stack guard protection. The component is: nptl. The attack vector is: Exploit stack buffer overflow vulnerability and use this bypass vulnerability to bypass stack guard.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22850"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9169",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: regular-expression match via proceed_next_node in posix/regexec.c leads to heap-based buffer over-read",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, proceed_next_node in posix/regexec.c has a heap-based buffer over-read via an attempted case-insensitive regular-expression match.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/107160",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9169",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34140",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34142",
|
||||
"https://kc.mcafee.com/corporate/index?page=content\u0026id=SB10278",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24114",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=583dd860d5b833037175247230a328f0050dbfe9",
|
||||
"https://support.f5.com/csp/article/K54823184"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2009-5155",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: parse_reg_exp in posix/regcomp.c misparses alternatives leading to denial of service or trigger incorrect result",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) before 2.28, parse_reg_exp in posix/regcomp.c misparses alternatives, which allows attackers to cause a denial of service (assertion failure and application exit) or trigger an incorrect result by attempting a regular-expression match.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=5513b40999149090987a0341c018d05d3eea1272",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-5155",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22793",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32806",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34238",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=11053",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=18986",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=eb04c21373e2a2885f3d52ff192b0499afe3c672",
|
||||
"https://support.f5.com/csp/article/K64119434"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2010-4051",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "CVE-2010-4052 glibc: De-recursivise regular expression engine",
|
||||
"Description": "The regcomp implementation in the GNU C Library (aka glibc or libc6) through 2.11.3, and 2.12.x through 2.12.2, allows context-dependent attackers to cause a denial of service (application crash) via a regular expression containing adjacent bounded repetitions that bypass the intended RE_DUP_MAX limitation, as demonstrated by a {10,}{10,}{10,}{10,}{10,} sequence in the proftpd.gnu.c exploit for ProFTPD, related to a \"RE_DUP_MAX overflow.\"",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://cxib.net/stuff/proftpd.gnu.c",
|
||||
"http://seclists.org/fulldisclosure/2011/Jan/78",
|
||||
"http://secunia.com/advisories/42547",
|
||||
"http://securityreason.com/achievement_securityalert/93",
|
||||
"http://securityreason.com/securityalert/8003",
|
||||
"http://securitytracker.com/id?1024832",
|
||||
"http://www.exploit-db.com/exploits/15935",
|
||||
"http://www.kb.cert.org/vuls/id/912279",
|
||||
"http://www.securityfocus.com/archive/1/515589/100/0/threaded",
|
||||
"http://www.securityfocus.com/bid/45233",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=645859"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2010-4052",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "CVE-2010-4051 CVE-2010-4052 glibc: De-recursivise regular expression engine",
|
||||
"Description": "Stack consumption vulnerability in the regcomp implementation in the GNU C Library (aka glibc or libc6) through 2.11.3, and 2.12.x through 2.12.2, allows context-dependent attackers to cause a denial of service (resource exhaustion) via a regular expression containing adjacent repetition operators, as demonstrated by a {10,}{10,}{10,}{10,} sequence in the proftpd.gnu.c exploit for ProFTPD.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://cxib.net/stuff/proftpd.gnu.c",
|
||||
"http://seclists.org/fulldisclosure/2011/Jan/78",
|
||||
"http://secunia.com/advisories/42547",
|
||||
"http://securityreason.com/achievement_securityalert/93",
|
||||
"http://securityreason.com/securityalert/8003",
|
||||
"http://securitytracker.com/id?1024832",
|
||||
"http://www.exploit-db.com/exploits/15935",
|
||||
"http://www.kb.cert.org/vuls/id/912279",
|
||||
"http://www.securityfocus.com/archive/1/515589/100/0/threaded",
|
||||
"http://www.securityfocus.com/bid/45233",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=645859"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2010-4756",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: glob implementation can cause excessive CPU and memory consumption due to crafted glob expressions",
|
||||
"Description": "The glob implementation in the GNU C Library (aka glibc or libc6) allows remote authenticated users to cause a denial of service (CPU and memory consumption) via crafted glob expressions that do not match any pathnames, as demonstrated by glob expressions in STAT commands to an FTP daemon, a different vulnerability than CVE-2010-2632.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://cxib.net/stuff/glob-0day.c",
|
||||
"http://securityreason.com/achievement_securityalert/89",
|
||||
"http://securityreason.com/exploitalert/9223"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2015-8985",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: potential denial of service in pop_fail_stack()",
|
||||
"Description": "The pop_fail_stack function in the GNU C Library (aka glibc or libc6) allows context-dependent attackers to cause a denial of service (assertion failure and application crash) via vectors related to extended regular expression processing.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2017/02/14/9",
|
||||
"http://www.securityfocus.com/bid/76916",
|
||||
"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779392",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8985",
|
||||
"https://security.gentoo.org/glsa/201908-06"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-10228",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: iconv program can hang when invoked with the -c option",
|
||||
"Description": "The iconv program in the GNU C Library (aka glibc or libc6) 2.25 and earlier, when invoked with the -c option, enters an infinite loop when processing invalid multi-byte input sequences, leading to a denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://openwall.com/lists/oss-security/2017/03/01/10",
|
||||
"http://www.securityfocus.com/bid/96525",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=19519"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-10739",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: getaddrinfo should reject IP addresses with trailing characters",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.28, the getaddrinfo function would successfully parse a string that contained an IPv4 address followed by whitespace and arbitrary characters, which could lead applications to incorrectly assume that it had parsed a valid string, without the possibility of embedded HTTP headers or other potentially dangerous substrings.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00082.html",
|
||||
"http://www.securityfocus.com/bid/106672",
|
||||
"https://access.redhat.com/errata/RHSA-2019:2118",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1347549",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10739",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=20018"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-12132",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: Fragmentation attacks possible when EDNS0 is enabled",
|
||||
"Description": "The DNS stub resolver in the GNU C Library (aka glibc or libc6) before version 2.26, when EDNS support is enabled, will solicit large UDP responses from name servers, potentially simplifying off-path DNS spoofing attacks due to IP fragmentation.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/100598",
|
||||
"https://access.redhat.com/errata/RHSA-2018:0805",
|
||||
"https://arxiv.org/pdf/1205.4011.pdf",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-12132",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=21361"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20796",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: uncontrolled recursion in function check_dst_limits_calc_pos_1 in posix/regexec.c",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, check_dst_limits_calc_pos_1 in posix/regexec.c has Uncontrolled Recursion, as demonstrated by '(\\227|)(\\\\1\\\\1|t1|\\\\\\2537)+' in grep.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/107160",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34141",
|
||||
"https://lists.gnu.org/archive/html/bug-gnulib/2019-01/msg00108.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1010023",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Description": "GNU Libc current is affected by: Re-mapping current loaded libray with malicious ELF file. The impact is: In worst case attacker may evaluate privileges. The component is: libld. The attack vector is: Attacker sends 2 ELF files to victim and asks to run ldd on it. ldd execute code.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/109167",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22851",
|
||||
"https://support.f5.com/csp/article/K11932200?utm_source=f5support\u0026amp;utm_medium=RSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1010024",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Description": "GNU Libc current is affected by: Mitigation bypass. The impact is: Attacker may bypass ASLR using cache of thread stack and heap. The component is: glibc.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/109162",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22852",
|
||||
"https://support.f5.com/csp/article/K06046097"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1010025",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: information disclosure of heap addresses of pthread_created thread",
|
||||
"Description": "** DISPUTED ** GNU Libc current is affected by: Mitigation bypass. The impact is: Attacker may guess the heap addresses of pthread_created thread. The component is: glibc. NOTE: the vendor's position is \"ASLR bypass itself is not a vulnerability.\"",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22853"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-6488",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: Incorrect attempt to use a 64-bit register for size_t in assembly codes results in segmentation fault",
|
||||
"Description": "The string component in the GNU C Library (aka glibc or libc6) through 2.28, when running on the x32 architecture, incorrectly attempts to use a 64-bit register for size_t in assembly codes, which can lead to a segmentation fault or possibly unspecified other impact, as demonstrated by a crash in __memmove_avx_unaligned_erms in sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S during a memcpy.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/106671",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6488",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24097"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9192",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: uncontrolled recursion in function check_dst_limits_calc_pos_1 in posix/regexec.c",
|
||||
"Description": "** DISPUTED ** In the GNU C Library (aka glibc or libc6) through 2.29, check_dst_limits_calc_pos_1 in posix/regexec.c has Uncontrolled Recursion, as demonstrated by '(|)(\\\\1\\\\1)*' in grep, a different issue than CVE-2018-20796. NOTE: the software maintainer disputes that this is a vulnerability because the behavior occurs only with a crafted pattern.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24269"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-7309",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.24-11+deb9u4",
|
||||
"Title": "glibc: memcmp function incorrectly returns zero",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, the memcmp function for the x32 architecture can incorrectly return zero (indicating that the inputs are equal) because the RDX most significant bit is mishandled.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/106835",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7309",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24155",
|
||||
"https://sourceware.org/ml/libc-alpha/2019-02/msg00041.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2007-6755",
|
||||
"PkgName": "libssl1.1",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"Title": "Dual_EC_DRBG: weak pseudo random number generator",
|
||||
"Description": "The NIST SP 800-90A default statement of the Dual Elliptic Curve Deterministic Random Bit Generation (Dual_EC_DRBG) algorithm contains point Q constants with a possible relationship to certain \"skeleton key\" values, which might allow context-dependent attackers to defeat cryptographic protection mechanisms by leveraging knowledge of those values. NOTE: this is a preliminary CVE for Dual_EC_DRBG; future research may provide additional details about point Q and associated attacks, and could potentially lead to a RECAST or REJECT of this CVE.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://arstechnica.com/security/2013/09/stop-using-nsa-influence-code-in-our-product-rsa-tells-customers/",
|
||||
"http://blog.cryptographyengineering.com/2013/09/rsa-warns-developers-against-its-own.html",
|
||||
"http://blog.cryptographyengineering.com/2013/09/the-many-flaws-of-dualecdrbg.html",
|
||||
"http://rump2007.cr.yp.to/15-shumow.pdf",
|
||||
"http://stream.wsj.com/story/latest-headlines/SS-2-63399/SS-2-332655/",
|
||||
"http://threatpost.com/in-wake-of-latest-crypto-revelations-everything-is-suspect",
|
||||
"http://www.securityfocus.com/bid/63657",
|
||||
"https://www.schneier.com/blog/archives/2007/11/the_strange_sto.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2010-0928",
|
||||
"PkgName": "libssl1.1",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"Title": "openssl: RSA authentication weakness",
|
||||
"Description": "OpenSSL 0.9.8i on the Gaisler Research LEON3 SoC on the Xilinx Virtex-II Pro FPGA uses a Fixed Width Exponentiation (FWE) algorithm for certain signature calculations, and does not verify the signature before providing it to a caller, which makes it easier for physically proximate attackers to determine the private key via a modified supply voltage for the microprocessor, related to a \"fault-based attack.\"",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://rdist.root.org/2010/03/08/attacking-rsa-exponentiation-with-fault-injection/",
|
||||
"http://www.eecs.umich.edu/%7Evaleria/research/publications/DATE10RSA.pdf",
|
||||
"http://www.networkworld.com/news/2010/030410-rsa-security-attack.html",
|
||||
"http://www.osvdb.org/62808",
|
||||
"http://www.theregister.co.uk/2010/03/04/severe_openssl_vulnerability/",
|
||||
"https://exchange.xforce.ibmcloud.com/vulnerabilities/56750"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "libssl1.1",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"FixedVersion": "1.1.0l-1~deb9u1",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2007-6755",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"Title": "Dual_EC_DRBG: weak pseudo random number generator",
|
||||
"Description": "The NIST SP 800-90A default statement of the Dual Elliptic Curve Deterministic Random Bit Generation (Dual_EC_DRBG) algorithm contains point Q constants with a possible relationship to certain \"skeleton key\" values, which might allow context-dependent attackers to defeat cryptographic protection mechanisms by leveraging knowledge of those values. NOTE: this is a preliminary CVE for Dual_EC_DRBG; future research may provide additional details about point Q and associated attacks, and could potentially lead to a RECAST or REJECT of this CVE.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://arstechnica.com/security/2013/09/stop-using-nsa-influence-code-in-our-product-rsa-tells-customers/",
|
||||
"http://blog.cryptographyengineering.com/2013/09/rsa-warns-developers-against-its-own.html",
|
||||
"http://blog.cryptographyengineering.com/2013/09/the-many-flaws-of-dualecdrbg.html",
|
||||
"http://rump2007.cr.yp.to/15-shumow.pdf",
|
||||
"http://stream.wsj.com/story/latest-headlines/SS-2-63399/SS-2-332655/",
|
||||
"http://threatpost.com/in-wake-of-latest-crypto-revelations-everything-is-suspect",
|
||||
"http://www.securityfocus.com/bid/63657",
|
||||
"https://www.schneier.com/blog/archives/2007/11/the_strange_sto.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2010-0928",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"Title": "openssl: RSA authentication weakness",
|
||||
"Description": "OpenSSL 0.9.8i on the Gaisler Research LEON3 SoC on the Xilinx Virtex-II Pro FPGA uses a Fixed Width Exponentiation (FWE) algorithm for certain signature calculations, and does not verify the signature before providing it to a caller, which makes it easier for physically proximate attackers to determine the private key via a modified supply voltage for the microprocessor, related to a \"fault-based attack.\"",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://rdist.root.org/2010/03/08/attacking-rsa-exponentiation-with-fault-injection/",
|
||||
"http://www.eecs.umich.edu/%7Evaleria/research/publications/DATE10RSA.pdf",
|
||||
"http://www.networkworld.com/news/2010/030410-rsa-security-attack.html",
|
||||
"http://www.osvdb.org/62808",
|
||||
"http://www.theregister.co.uk/2010/03/04/severe_openssl_vulnerability/",
|
||||
"https://exchange.xforce.ibmcloud.com/vulnerabilities/56750"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-1563",
|
||||
"PkgName": "openssl",
|
||||
"InstalledVersion": "1.1.0k-1~deb9u1",
|
||||
"FixedVersion": "1.1.0l-1~deb9u1",
|
||||
"Title": "openssl: information disclosure in PKCS7_dataDecode and CMS_decrypt_set1_pkey",
|
||||
"Description": "In situations where an attacker receives automated notification of the success or failure of a decryption attempt an attacker, after sending a very large number of messages to be decrypted, can recover a CMS/PKCS7 transported encryption key or decrypt any RSA encrypted message that was encrypted with the public RSA key, using a Bleichenbacher padding oracle attack. Applications are not affected if they use a certificate together with the private RSA key to the CMS_decrypt or PKCS7_decrypt functions to select the correct recipient info to decrypt. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c). Fixed in OpenSSL 1.1.0l (Affected 1.1.0-1.1.0k). Fixed in OpenSSL 1.0.2t (Affected 1.0.2-1.0.2s).",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://packetstormsecurity.com/files/154467/Slackware-Security-Advisory-openssl-Updates.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1563",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=08229ad838c50f644d7e928e2eef147b4308ad64",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=631f94db0065c78181ca9ba5546ebc8bb3884b97",
|
||||
"https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=e21f8cf78a125cd3c8c0d1a1a6c8bb0b901f893f",
|
||||
"https://seclists.org/bugtraq/2019/Sep/25",
|
||||
"https://security.netapp.com/advisory/ntap-20190919-0002/",
|
||||
"https://www.openssl.org/news/secadv/20190910.txt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
1496
integration/testdata/distroless-python27.json.golden
vendored
Normal file
1496
integration/testdata/distroless-python27.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
integration/testdata/trivy.db.gz
vendored
Normal file
BIN
integration/testdata/trivy.db.gz
vendored
Normal file
Binary file not shown.
10367
integration/testdata/ubi-7.json.golden
vendored
Normal file
10367
integration/testdata/ubi-7.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2406
integration/testdata/ubuntu-1604.json.golden
vendored
Normal file
2406
integration/testdata/ubuntu-1604.json.golden
vendored
Normal file
File diff suppressed because it is too large
Load Diff
118
integration/testdata/ubuntu-1804-ignore-unfixed.json.golden
vendored
Normal file
118
integration/testdata/ubuntu-1804-ignore-unfixed.json.golden
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/ubuntu-1804.tar.gz (ubuntu 18.04)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "e2fsprogs",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libcom-err2",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libext2fs2",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libss2",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-15718",
|
||||
"PkgName": "libsystemd0",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"FixedVersion": "237-3ubuntu10.28",
|
||||
"Title": "systemd: systemd-resolved allows unprivileged users to configure DNS",
|
||||
"Description": "In systemd 240, bus_open_system_watch_bind_with_description in shared/bus-util.c (as used by systemd-resolved to connect to the system D-Bus instance), calls sd_bus_set_trusted, which disables access controls for incoming D-Bus messages. An unprivileged user can exploit this by executing D-Bus methods that should be restricted to privileged users, in order to change the system's DNS resolver settings.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2019/09/03/1",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1746057",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BRE5IS24XTF5WNZGH2L7GSQJKARBOEGL/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/HIKGKXZ5OEGOEYURHLJHEMFYNLEGAW5B/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/U2WNHRJW4XI6H5YMDG4BUFGPAXWUMUVG/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-15718",
|
||||
"PkgName": "libudev1",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"FixedVersion": "237-3ubuntu10.28",
|
||||
"Title": "systemd: systemd-resolved allows unprivileged users to configure DNS",
|
||||
"Description": "In systemd 240, bus_open_system_watch_bind_with_description in shared/bus-util.c (as used by systemd-resolved to connect to the system D-Bus instance), calls sd_bus_set_trusted, which disables access controls for incoming D-Bus messages. An unprivileged user can exploit this by executing D-Bus methods that should be restricted to privileged users, in order to change the system's DNS resolver settings.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2019/09/03/1",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1746057",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BRE5IS24XTF5WNZGH2L7GSQJKARBOEGL/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/HIKGKXZ5OEGOEYURHLJHEMFYNLEGAW5B/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/U2WNHRJW4XI6H5YMDG4BUFGPAXWUMUVG/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-11922",
|
||||
"PkgName": "libzstd1",
|
||||
"InstalledVersion": "1.3.3+dfsg-2ubuntu1",
|
||||
"FixedVersion": "1.3.3+dfsg-2ubuntu1.1",
|
||||
"Description": "A race condition in the one-pass compression functions of Zstandard prior to version 1.3.8 could allow an attacker to write bytes out of bounds if an output buffer smaller than the recommended size was used.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00008.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00062.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11922",
|
||||
"https://github.com/facebook/zstd/pull/1404/commits/3e5cdf1b6a85843e991d7d10f6a2567c15580da0",
|
||||
"https://www.facebook.com/security/advisories/cve-2019-11922"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
933
integration/testdata/ubuntu-1804.json.golden
vendored
Normal file
933
integration/testdata/ubuntu-1804.json.golden
vendored
Normal file
@@ -0,0 +1,933 @@
|
||||
[
|
||||
{
|
||||
"Target": "testdata/fixtures/ubuntu-1804.tar.gz (ubuntu 18.04)",
|
||||
"Vulnerabilities": [
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "bsdutils",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-2781",
|
||||
"PkgName": "coreutils",
|
||||
"InstalledVersion": "8.28-1ubuntu1",
|
||||
"Title": "coreutils: Non-privileged session can escape to the parent session in chroot",
|
||||
"Description": "chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2016/02/28/2",
|
||||
"http://www.openwall.com/lists/oss-security/2016/02/28/3"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-8283",
|
||||
"PkgName": "dpkg",
|
||||
"InstalledVersion": "1.19.0.5ubuntu2.1",
|
||||
"Description": "dpkg-source in dpkg 1.3.0 through 1.18.23 is able to use a non-GNU patch program and does not offer a protection mechanism for blank-indented diff hunks, which allows remote attackers to conduct directory traversal attacks via a crafted Debian source package, as demonstrated by use of dpkg-source on NetBSD.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2017/04/20/2",
|
||||
"http://www.securityfocus.com/bid/98064",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8283"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "e2fsprogs",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "fdisk",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-13050",
|
||||
"PkgName": "gpgv",
|
||||
"InstalledVersion": "2.2.4-1ubuntu1.2",
|
||||
"Title": "GnuPG: interaction between the sks-keyserver code and GnuPG allows for a Certificate Spamming Attack which leads to persistent DoS",
|
||||
"Description": "Interaction between the sks-keyserver code through 1.2.0 of the SKS keyserver network, and GnuPG through 2.2.16, makes it risky to have a GnuPG keyserver configuration line referring to a host on the SKS keyserver network. Retrieving data from this network may cause a persistent denial of service, because of a Certificate Spamming Attack.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://access.redhat.com/articles/4264021",
|
||||
"https://gist.github.com/rjhansen/67ab921ffb4084c865b3618d6955275f",
|
||||
"https://lists.gnupg.org/pipermail/gnupg-announce/2019q3/000439.html",
|
||||
"https://twitter.com/lambdafu/status/1147162583969009664"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "libblkid1",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-11236",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: Integer overflow in stdlib/canonicalize.c on 32-bit architectures leading to stack-based buffer overflow",
|
||||
"Description": "stdlib/canonicalize.c in the GNU C Library (aka glibc or libc6) 2.27 and earlier, when processing very long pathname arguments to the realpath function, could encounter an integer overflow on 32-bit architectures, leading to a stack-based buffer overflow and, potentially, arbitrary code execution.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/104255",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3092",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-11236",
|
||||
"https://security.netapp.com/advisory/ntap-20190329-0001/",
|
||||
"https://security.netapp.com/advisory/ntap-20190401-0001/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22786",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=5460617d1567657621107d895ee2dd83bc1f88f2",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9169",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: regular-expression match via proceed_next_node in posix/regexec.c leads to heap-based buffer over-read",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, proceed_next_node in posix/regexec.c has a heap-based buffer over-read via an attempted case-insensitive regular-expression match.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/107160",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9169",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34140",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34142",
|
||||
"https://kc.mcafee.com/corporate/index?page=content\u0026id=SB10278",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24114",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=583dd860d5b833037175247230a328f0050dbfe9",
|
||||
"https://support.f5.com/csp/article/K54823184"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2009-5155",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: parse_reg_exp in posix/regcomp.c misparses alternatives leading to denial of service or trigger incorrect result",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) before 2.28, parse_reg_exp in posix/regcomp.c misparses alternatives, which allows attackers to cause a denial of service (assertion failure and application exit) or trigger an incorrect result by attempting a regular-expression match.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=5513b40999149090987a0341c018d05d3eea1272",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-5155",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22793",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32806",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34238",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=11053",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=18986",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=eb04c21373e2a2885f3d52ff192b0499afe3c672",
|
||||
"https://support.f5.com/csp/article/K64119434"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2015-8985",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: potential denial of service in pop_fail_stack()",
|
||||
"Description": "The pop_fail_stack function in the GNU C Library (aka glibc or libc6) allows context-dependent attackers to cause a denial of service (assertion failure and application crash) via vectors related to extended regular expression processing.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2017/02/14/9",
|
||||
"http://www.securityfocus.com/bid/76916",
|
||||
"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779392",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8985",
|
||||
"https://security.gentoo.org/glsa/201908-06"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-10228",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: iconv program can hang when invoked with the -c option",
|
||||
"Description": "The iconv program in the GNU C Library (aka glibc or libc6) 2.25 and earlier, when invoked with the -c option, enters an infinite loop when processing invalid multi-byte input sequences, leading to a denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://openwall.com/lists/oss-security/2017/03/01/10",
|
||||
"http://www.securityfocus.com/bid/96525",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=19519"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-10739",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: getaddrinfo should reject IP addresses with trailing characters",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.28, the getaddrinfo function would successfully parse a string that contained an IPv4 address followed by whitespace and arbitrary characters, which could lead applications to incorrectly assume that it had parsed a valid string, without the possibility of embedded HTTP headers or other potentially dangerous substrings.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00082.html",
|
||||
"http://www.securityfocus.com/bid/106672",
|
||||
"https://access.redhat.com/errata/RHSA-2019:2118",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1347549",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10739",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=20018"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-11237",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: Buffer overflow in __mempcpy_avx512_no_vzeroupper",
|
||||
"Description": "An AVX-512-optimized implementation of the mempcpy function in the GNU C Library (aka glibc or libc6) 2.27 and earlier may write data beyond the target buffer, leading to a buffer overflow in __mempcpy_avx512_no_vzeroupper.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/104256",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3092",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-11237",
|
||||
"https://security.netapp.com/advisory/ntap-20190329-0001/",
|
||||
"https://security.netapp.com/advisory/ntap-20190401-0001/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23196",
|
||||
"https://www.exploit-db.com/exploits/44750/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-19591",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: file descriptor leak in if_nametoindex() in sysdeps/unix/sysv/linux/if_index.c",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.28, attempting to resolve a crafted hostname via getaddrinfo() leads to the allocation of a socket descriptor that is not closed. This is related to the if_nametoindex() function.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/106037",
|
||||
"http://www.securitytracker.com/id/1042174",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-19591",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BO7WHN52GFMC5F2I2232GFIPSSXWFV7G/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/M52KE4YR3GNMHQUOS3DKAGZD5TQ5D5UH/",
|
||||
"https://security.gentoo.org/glsa/201903-09",
|
||||
"https://security.netapp.com/advisory/ntap-20190321-0003/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23927",
|
||||
"https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS;hb=HEAD",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d527c860f5a3f0ed687bd03f0cb464612dc23408"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20796",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: uncontrolled recursion in function check_dst_limits_calc_pos_1 in posix/regexec.c",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, check_dst_limits_calc_pos_1 in posix/regexec.c has Uncontrolled Recursion, as demonstrated by '(\\227|)(\\\\1\\\\1|t1|\\\\\\2537)+' in grep.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/107160",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34141",
|
||||
"https://lists.gnu.org/archive/html/bug-gnulib/2019-01/msg00108.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9192",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: uncontrolled recursion in function check_dst_limits_calc_pos_1 in posix/regexec.c",
|
||||
"Description": "** DISPUTED ** In the GNU C Library (aka glibc or libc6) through 2.29, check_dst_limits_calc_pos_1 in posix/regexec.c has Uncontrolled Recursion, as demonstrated by '(|)(\\\\1\\\\1)*' in grep, a different issue than CVE-2018-20796. NOTE: the software maintainer disputes that this is a vulnerability because the behavior occurs only with a crafted pattern.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24269"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-7309",
|
||||
"PkgName": "libc-bin",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: memcmp function incorrectly returns zero",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, the memcmp function for the x32 architecture can incorrectly return zero (indicating that the inputs are equal) because the RDX most significant bit is mishandled.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/106835",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7309",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24155",
|
||||
"https://sourceware.org/ml/libc-alpha/2019-02/msg00041.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-11236",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: Integer overflow in stdlib/canonicalize.c on 32-bit architectures leading to stack-based buffer overflow",
|
||||
"Description": "stdlib/canonicalize.c in the GNU C Library (aka glibc or libc6) 2.27 and earlier, when processing very long pathname arguments to the realpath function, could encounter an integer overflow on 32-bit architectures, leading to a stack-based buffer overflow and, potentially, arbitrary code execution.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/104255",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3092",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-11236",
|
||||
"https://security.netapp.com/advisory/ntap-20190329-0001/",
|
||||
"https://security.netapp.com/advisory/ntap-20190401-0001/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=22786",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=5460617d1567657621107d895ee2dd83bc1f88f2",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9169",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: regular-expression match via proceed_next_node in posix/regexec.c leads to heap-based buffer over-read",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, proceed_next_node in posix/regexec.c has a heap-based buffer over-read via an attempted case-insensitive regular-expression match.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/107160",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9169",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34140",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34142",
|
||||
"https://kc.mcafee.com/corporate/index?page=content\u0026id=SB10278",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24114",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=583dd860d5b833037175247230a328f0050dbfe9",
|
||||
"https://support.f5.com/csp/article/K54823184"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2009-5155",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: parse_reg_exp in posix/regcomp.c misparses alternatives leading to denial of service or trigger incorrect result",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) before 2.28, parse_reg_exp in posix/regcomp.c misparses alternatives, which allows attackers to cause a denial of service (assertion failure and application exit) or trigger an incorrect result by attempting a regular-expression match.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=5513b40999149090987a0341c018d05d3eea1272",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-5155",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22793",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32806",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34238",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=11053",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=18986",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=eb04c21373e2a2885f3d52ff192b0499afe3c672",
|
||||
"https://support.f5.com/csp/article/K64119434"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2015-8985",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: potential denial of service in pop_fail_stack()",
|
||||
"Description": "The pop_fail_stack function in the GNU C Library (aka glibc or libc6) allows context-dependent attackers to cause a denial of service (assertion failure and application crash) via vectors related to extended regular expression processing.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2017/02/14/9",
|
||||
"http://www.securityfocus.com/bid/76916",
|
||||
"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779392",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8985",
|
||||
"https://security.gentoo.org/glsa/201908-06"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-10228",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: iconv program can hang when invoked with the -c option",
|
||||
"Description": "The iconv program in the GNU C Library (aka glibc or libc6) 2.25 and earlier, when invoked with the -c option, enters an infinite loop when processing invalid multi-byte input sequences, leading to a denial of service.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://openwall.com/lists/oss-security/2017/03/01/10",
|
||||
"http://www.securityfocus.com/bid/96525",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=19519"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2016-10739",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: getaddrinfo should reject IP addresses with trailing characters",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.28, the getaddrinfo function would successfully parse a string that contained an IPv4 address followed by whitespace and arbitrary characters, which could lead applications to incorrectly assume that it had parsed a valid string, without the possibility of embedded HTTP headers or other potentially dangerous substrings.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00082.html",
|
||||
"http://www.securityfocus.com/bid/106672",
|
||||
"https://access.redhat.com/errata/RHSA-2019:2118",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1347549",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10739",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=20018"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-11237",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: Buffer overflow in __mempcpy_avx512_no_vzeroupper",
|
||||
"Description": "An AVX-512-optimized implementation of the mempcpy function in the GNU C Library (aka glibc or libc6) 2.27 and earlier may write data beyond the target buffer, leading to a buffer overflow in __mempcpy_avx512_no_vzeroupper.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/104256",
|
||||
"https://access.redhat.com/errata/RHBA-2019:0327",
|
||||
"https://access.redhat.com/errata/RHSA-2018:3092",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-11237",
|
||||
"https://security.netapp.com/advisory/ntap-20190329-0001/",
|
||||
"https://security.netapp.com/advisory/ntap-20190401-0001/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23196",
|
||||
"https://www.exploit-db.com/exploits/44750/",
|
||||
"https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-19591",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: file descriptor leak in if_nametoindex() in sysdeps/unix/sysv/linux/if_index.c",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.28, attempting to resolve a crafted hostname via getaddrinfo() leads to the allocation of a socket descriptor that is not closed. This is related to the if_nametoindex() function.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/106037",
|
||||
"http://www.securitytracker.com/id/1042174",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-19591",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BO7WHN52GFMC5F2I2232GFIPSSXWFV7G/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/M52KE4YR3GNMHQUOS3DKAGZD5TQ5D5UH/",
|
||||
"https://security.gentoo.org/glsa/201903-09",
|
||||
"https://security.netapp.com/advisory/ntap-20190321-0003/",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=23927",
|
||||
"https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS;hb=HEAD",
|
||||
"https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d527c860f5a3f0ed687bd03f0cb464612dc23408"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20796",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: uncontrolled recursion in function check_dst_limits_calc_pos_1 in posix/regexec.c",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, check_dst_limits_calc_pos_1 in posix/regexec.c has Uncontrolled Recursion, as demonstrated by '(\\227|)(\\\\1\\\\1|t1|\\\\\\2537)+' in grep.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/107160",
|
||||
"https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34141",
|
||||
"https://lists.gnu.org/archive/html/bug-gnulib/2019-01/msg00108.html",
|
||||
"https://security.netapp.com/advisory/ntap-20190315-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-9192",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: uncontrolled recursion in function check_dst_limits_calc_pos_1 in posix/regexec.c",
|
||||
"Description": "** DISPUTED ** In the GNU C Library (aka glibc or libc6) through 2.29, check_dst_limits_calc_pos_1 in posix/regexec.c has Uncontrolled Recursion, as demonstrated by '(|)(\\\\1\\\\1)*' in grep, a different issue than CVE-2018-20796. NOTE: the software maintainer disputes that this is a vulnerability because the behavior occurs only with a crafted pattern.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24269"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-7309",
|
||||
"PkgName": "libc6",
|
||||
"InstalledVersion": "2.27-3ubuntu1",
|
||||
"Title": "glibc: memcmp function incorrectly returns zero",
|
||||
"Description": "In the GNU C Library (aka glibc or libc6) through 2.29, the memcmp function for the x32 architecture can incorrectly return zero (indicating that the inputs are equal) because the RDX most significant bit is mishandled.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/106835",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7309",
|
||||
"https://sourceware.org/bugzilla/show_bug.cgi?id=24155",
|
||||
"https://sourceware.org/ml/libc-alpha/2019-02/msg00041.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libcom-err2",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libext2fs2",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "libfdisk1",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-12904",
|
||||
"PkgName": "libgcrypt20",
|
||||
"InstalledVersion": "1.8.1-4ubuntu1.1",
|
||||
"Title": "Libgcrypt: physical addresses being available to other processes leads to a flush-and-reload side-channel attack",
|
||||
"Description": "In Libgcrypt 1.8.4, the C implementation of AES is vulnerable to a flush-and-reload side-channel attack because physical addresses are available to other processes. (The C implementation is used on platforms where an assembly-language implementation is unavailable.)",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-07/msg00049.html",
|
||||
"https://dev.gnupg.org/T4541",
|
||||
"https://github.com/gpg/libgcrypt/commit/a4c561aab1014c3630bc88faf6f5246fee16b020",
|
||||
"https://github.com/gpg/libgcrypt/commit/daedbbb5541cd8ecda1459d3b843ea4d92788762",
|
||||
"https://people.canonical.com/~ubuntu-security/cve/2019/CVE-2019-12904.html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-13627",
|
||||
"PkgName": "libgcrypt20",
|
||||
"InstalledVersion": "1.8.1-4ubuntu1.1",
|
||||
"Description": "It was discovered that there was a ECDSA timing attack in the libgcrypt20 cryptographic library. Version affected: 1.8.4-5, 1.7.6-2+deb9u3, and 1.6.3-2+deb8u4. Versions fixed: 1.8.5-2 and 1.6.3-2+deb8u7.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-09/msg00060.html",
|
||||
"http://www.openwall.com/lists/oss-security/2019/10/02/2",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13627",
|
||||
"https://github.com/gpg/libgcrypt/releases/tag/libgcrypt-1.8.5",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00024.html",
|
||||
"https://minerva.crocs.fi.muni.cz/",
|
||||
"https://security-tracker.debian.org/tracker/CVE-2019-13627"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16868",
|
||||
"PkgName": "libgnutls30",
|
||||
"InstalledVersion": "3.5.18-1ubuntu1.1",
|
||||
"Title": "gnutls: Bleichenbacher-like side channel leakage in PKCS#1 v1.5 verification and padding oracle verification",
|
||||
"Description": "A Bleichenbacher type side-channel based padding oracle attack was found in the way gnutls handles verification of RSA decrypted PKCS#1 v1.5 data. An attacker who is able to run process on the same physical core as the victim process, could use this to extract plaintext or in some cases downgrade any TLS connections to a vulnerable server.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://cat.eyalro.net/",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-05/msg00017.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-05/msg00068.html",
|
||||
"http://www.securityfocus.com/bid/106080",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16868",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16868"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16869",
|
||||
"PkgName": "libhogweed4",
|
||||
"InstalledVersion": "3.4-1",
|
||||
"Title": "nettle: Leaky data conversion exposing a manager oracle",
|
||||
"Description": "A Bleichenbacher type side-channel based padding oracle attack was found in the way nettle handles endian conversion of RSA decrypted PKCS#1 v1.5 data. An attacker who is able to run a process on the same physical core as the victim process, could use this flaw extract plaintext or in some cases downgrade any TLS connections to a vulnerable server.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://cat.eyalro.net/",
|
||||
"http://www.securityfocus.com/bid/106092",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16869",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16869"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "libmount1",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-16869",
|
||||
"PkgName": "libnettle6",
|
||||
"InstalledVersion": "3.4-1",
|
||||
"Title": "nettle: Leaky data conversion exposing a manager oracle",
|
||||
"Description": "A Bleichenbacher type side-channel based padding oracle attack was found in the way nettle handles endian conversion of RSA decrypted PKCS#1 v1.5 data. An attacker who is able to run a process on the same physical core as the victim process, could use this flaw extract plaintext or in some cases downgrade any TLS connections to a vulnerable server.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://cat.eyalro.net/",
|
||||
"http://www.securityfocus.com/bid/106092",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-16869",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16869"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-11164",
|
||||
"PkgName": "libpcre3",
|
||||
"InstalledVersion": "2:8.39-9",
|
||||
"Title": "pcre: OP_KETRMAX feature in the match function in pcre_exec.c",
|
||||
"Description": "In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://openwall.com/lists/oss-security/2017/07/11/3",
|
||||
"http://www.securityfocus.com/bid/99575"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-7245",
|
||||
"PkgName": "libpcre3",
|
||||
"InstalledVersion": "2:8.39-9",
|
||||
"Title": "pcre: stack-based buffer overflow write in pcre32_copy_substring",
|
||||
"Description": "Stack-based buffer overflow in the pcre32_copy_substring function in pcre_get.c in libpcre1 in PCRE 8.40 allows remote attackers to cause a denial of service (WRITE of size 4) or possibly have unspecified other impact via a crafted file.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/97067",
|
||||
"https://access.redhat.com/errata/RHSA-2018:2486",
|
||||
"https://blogs.gentoo.org/ago/2017/03/20/libpcre-two-stack-based-buffer-overflow-write-in-pcre32_copy_substring-pcre_get-c/",
|
||||
"https://security.gentoo.org/glsa/201710-25"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2017-7246",
|
||||
"PkgName": "libpcre3",
|
||||
"InstalledVersion": "2:8.39-9",
|
||||
"Title": "pcre: stack-based buffer overflow write in pcre32_copy_substring",
|
||||
"Description": "Stack-based buffer overflow in the pcre32_copy_substring function in pcre_get.c in libpcre1 in PCRE 8.40 allows remote attackers to cause a denial of service (WRITE of size 268) or possibly have unspecified other impact via a crafted file.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/97067",
|
||||
"https://access.redhat.com/errata/RHSA-2018:2486",
|
||||
"https://blogs.gentoo.org/ago/2017/03/20/libpcre-two-stack-based-buffer-overflow-write-in-pcre32_copy_substring-pcre_get-c/",
|
||||
"https://security.gentoo.org/glsa/201710-25"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "libsmartcols1",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-5094",
|
||||
"PkgName": "libss2",
|
||||
"InstalledVersion": "1.44.1-1ubuntu1.1",
|
||||
"FixedVersion": "1.44.1-1ubuntu1.2",
|
||||
"Description": "An exploitable code execution vulnerability exists in the quota file functionality of E2fsprogs 1.45.3. A specially crafted ext4 partition can cause an out-of-bounds write on the heap, resulting in code execution. An attacker can corrupt a partition to trigger this vulnerability.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5094",
|
||||
"https://lists.debian.org/debian-lts-announce/2019/09/msg00029.html",
|
||||
"https://seclists.org/bugtraq/2019/Sep/58",
|
||||
"https://talosintelligence.com/vulnerability_reports/TALOS-2019-0887",
|
||||
"https://usn.ubuntu.com/4142-2/",
|
||||
"https://www.debian.org/security/2019/dsa-4535"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20839",
|
||||
"PkgName": "libsystemd0",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"Title": "systemd: mishandling of the current keyboard mode check leading to passwords being disclosed in cleartext to attacker",
|
||||
"Description": "systemd 242 changes the VT1 mode upon a logout, which allows attackers to read cleartext passwords in certain circumstances, such as watching a shutdown, or using Ctrl-Alt-F1 and Ctrl-Alt-F2. This occurs because the KDGKBMODE (aka current keyboard mode) check is mishandled.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/108389",
|
||||
"https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1803993",
|
||||
"https://github.com/systemd/systemd/commit/9725f1a10f80f5e0ae7d9b60547458622aeb322f",
|
||||
"https://github.com/systemd/systemd/pull/12378",
|
||||
"https://security.netapp.com/advisory/ntap-20190530-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3843",
|
||||
"PkgName": "libsystemd0",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"Title": "systemd: services with DynamicUser can create SUID/SGID binaries",
|
||||
"Description": "It was discovered that a systemd service that uses DynamicUser property can create a SUID/SGID binary that would be allowed to run as the transient service UID/GID even after the service is terminated. A local attacker may use this flaw to access resources that will be owned by a potentially different service in the future, when the UID/GID will be recycled.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/108116",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3843",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5JXQAKSTMABZ46EVCRMW62DHWYHTTFES/",
|
||||
"https://security.netapp.com/advisory/ntap-20190619-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3844",
|
||||
"PkgName": "libsystemd0",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"Title": "systemd: services with DynamicUser can get new privileges and create SGID binaries",
|
||||
"Description": "It was discovered that a systemd service that uses DynamicUser property can get new privileges through the execution of SUID binaries, which would allow to create binaries owned by the service transient group with the setgid bit set. A local attacker may use this flaw to access resources that will be owned by a potentially different service in the future, when the GID will be recycled.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/108096",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3844",
|
||||
"https://security.netapp.com/advisory/ntap-20190619-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-15718",
|
||||
"PkgName": "libsystemd0",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"FixedVersion": "237-3ubuntu10.28",
|
||||
"Title": "systemd: systemd-resolved allows unprivileged users to configure DNS",
|
||||
"Description": "In systemd 240, bus_open_system_watch_bind_with_description in shared/bus-util.c (as used by systemd-resolved to connect to the system D-Bus instance), calls sd_bus_set_trusted, which disables access controls for incoming D-Bus messages. An unprivileged user can exploit this by executing D-Bus methods that should be restricted to privileged users, in order to change the system's DNS resolver settings.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2019/09/03/1",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1746057",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BRE5IS24XTF5WNZGH2L7GSQJKARBOEGL/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/HIKGKXZ5OEGOEYURHLJHEMFYNLEGAW5B/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/U2WNHRJW4XI6H5YMDG4BUFGPAXWUMUVG/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-1000654",
|
||||
"PkgName": "libtasn1-6",
|
||||
"InstalledVersion": "4.13-2",
|
||||
"Title": "libtasn1: Infinite loop in _asn1_expand_object_id(ptree) leads to memory exhaustion",
|
||||
"Description": "GNU Libtasn1-4.13 libtasn1-4.13 version libtasn1-4.13, libtasn1-4.12 contains a DoS, specifically CPU usage will reach 100% when running asn1Paser against the POC due to an issue in _asn1_expand_object_id(p_tree), after a long time, the program will be killed. This attack appears to be exploitable via parsing a crafted file.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00009.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-06/msg00018.html",
|
||||
"http://www.securityfocus.com/bid/105151",
|
||||
"https://gitlab.com/gnutls/libtasn1/issues/4"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20839",
|
||||
"PkgName": "libudev1",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"Title": "systemd: mishandling of the current keyboard mode check leading to passwords being disclosed in cleartext to attacker",
|
||||
"Description": "systemd 242 changes the VT1 mode upon a logout, which allows attackers to read cleartext passwords in certain circumstances, such as watching a shutdown, or using Ctrl-Alt-F1 and Ctrl-Alt-F2. This occurs because the KDGKBMODE (aka current keyboard mode) check is mishandled.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/108389",
|
||||
"https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1803993",
|
||||
"https://github.com/systemd/systemd/commit/9725f1a10f80f5e0ae7d9b60547458622aeb322f",
|
||||
"https://github.com/systemd/systemd/pull/12378",
|
||||
"https://security.netapp.com/advisory/ntap-20190530-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3843",
|
||||
"PkgName": "libudev1",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"Title": "systemd: services with DynamicUser can create SUID/SGID binaries",
|
||||
"Description": "It was discovered that a systemd service that uses DynamicUser property can create a SUID/SGID binary that would be allowed to run as the transient service UID/GID even after the service is terminated. A local attacker may use this flaw to access resources that will be owned by a potentially different service in the future, when the UID/GID will be recycled.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/108116",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3843",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/5JXQAKSTMABZ46EVCRMW62DHWYHTTFES/",
|
||||
"https://security.netapp.com/advisory/ntap-20190619-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-3844",
|
||||
"PkgName": "libudev1",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"Title": "systemd: services with DynamicUser can get new privileges and create SGID binaries",
|
||||
"Description": "It was discovered that a systemd service that uses DynamicUser property can get new privileges through the execution of SUID binaries, which would allow to create binaries owned by the service transient group with the setgid bit set. A local attacker may use this flaw to access resources that will be owned by a potentially different service in the future, when the GID will be recycled.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/108096",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-3844",
|
||||
"https://security.netapp.com/advisory/ntap-20190619-0002/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-15718",
|
||||
"PkgName": "libudev1",
|
||||
"InstalledVersion": "237-3ubuntu10.25",
|
||||
"FixedVersion": "237-3ubuntu10.28",
|
||||
"Title": "systemd: systemd-resolved allows unprivileged users to configure DNS",
|
||||
"Description": "In systemd 240, bus_open_system_watch_bind_with_description in shared/bus-util.c (as used by systemd-resolved to connect to the system D-Bus instance), calls sd_bus_set_trusted, which disables access controls for incoming D-Bus messages. An unprivileged user can exploit this by executing D-Bus methods that should be restricted to privileged users, in order to change the system's DNS resolver settings.",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://www.openwall.com/lists/oss-security/2019/09/03/1",
|
||||
"https://bugzilla.redhat.com/show_bug.cgi?id=1746057",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/BRE5IS24XTF5WNZGH2L7GSQJKARBOEGL/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/HIKGKXZ5OEGOEYURHLJHEMFYNLEGAW5B/",
|
||||
"https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/U2WNHRJW4XI6H5YMDG4BUFGPAXWUMUVG/"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "libuuid1",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2019-11922",
|
||||
"PkgName": "libzstd1",
|
||||
"InstalledVersion": "1.3.3+dfsg-2ubuntu1",
|
||||
"FixedVersion": "1.3.3+dfsg-2ubuntu1.1",
|
||||
"Description": "A race condition in the one-pass compression functions of Zstandard prior to version 1.3.8 could allow an attacker to write bytes out of bounds if an output buffer smaller than the recommended size was used.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00008.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-08/msg00062.html",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-11922",
|
||||
"https://github.com/facebook/zstd/pull/1404/commits/3e5cdf1b6a85843e991d7d10f6a2567c15580da0",
|
||||
"https://www.facebook.com/security/advisories/cve-2019-11922"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7169",
|
||||
"PkgName": "login",
|
||||
"InstalledVersion": "1:4.5-1ubuntu2",
|
||||
"Title": "shadow-utils: newgidmap allows unprivileged user to drop supplementary groups potentially allowing privilege escalation",
|
||||
"Description": "An issue was discovered in shadow 4.5. newgidmap (in shadow-utils) is setuid and allows an unprivileged user to be placed in a user namespace where setgroups(2) is permitted. This allows an attacker to remove themselves from a supplementary group, which may allow access to certain filesystem paths if the administrator has used \"group blacklisting\" (e.g., chmod g-rwx) to restrict access to paths. This flaw effectively reverts a security feature in the kernel (in particular, the /proc/self/setgroups knob) to prevent this sort of privilege escalation.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugs.launchpad.net/ubuntu/+source/shadow/+bug/1729357",
|
||||
"https://security.gentoo.org/glsa/201805-09"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2013-4235",
|
||||
"PkgName": "login",
|
||||
"InstalledVersion": "1:4.5-1ubuntu2",
|
||||
"Title": "shadow-utils: TOCTOU race conditions by copying and removing directory trees",
|
||||
"Description": "A TOCTOU race condition was discovered in shadow-utils. A local attacker with write privileges in a directory removed or copied by usermod/userdel could potentially exploit this flaw, when the administrator invokes usermod/userdel, to delete or modify other files on the system.",
|
||||
"Severity": "LOW"
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "mount",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7169",
|
||||
"PkgName": "passwd",
|
||||
"InstalledVersion": "1:4.5-1ubuntu2",
|
||||
"Title": "shadow-utils: newgidmap allows unprivileged user to drop supplementary groups potentially allowing privilege escalation",
|
||||
"Description": "An issue was discovered in shadow 4.5. newgidmap (in shadow-utils) is setuid and allows an unprivileged user to be placed in a user namespace where setgroups(2) is permitted. This allows an attacker to remove themselves from a supplementary group, which may allow access to certain filesystem paths if the administrator has used \"group blacklisting\" (e.g., chmod g-rwx) to restrict access to paths. This flaw effectively reverts a security feature in the kernel (in particular, the /proc/self/setgroups knob) to prevent this sort of privilege escalation.",
|
||||
"Severity": "MEDIUM",
|
||||
"References": [
|
||||
"https://bugs.launchpad.net/ubuntu/+source/shadow/+bug/1729357",
|
||||
"https://security.gentoo.org/glsa/201805-09"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2013-4235",
|
||||
"PkgName": "passwd",
|
||||
"InstalledVersion": "1:4.5-1ubuntu2",
|
||||
"Title": "shadow-utils: TOCTOU race conditions by copying and removing directory trees",
|
||||
"Description": "A TOCTOU race condition was discovered in shadow-utils. A local attacker with write privileges in a directory removed or copied by usermod/userdel could potentially exploit this flaw, when the administrator invokes usermod/userdel, to delete or modify other files on the system.",
|
||||
"Severity": "LOW"
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-20482",
|
||||
"PkgName": "tar",
|
||||
"InstalledVersion": "1.29b-2ubuntu0.1",
|
||||
"Title": "tar: Infinite read loop in sparse_dump_region function in sparse.c",
|
||||
"Description": "GNU Tar through 1.30, when --sparse is used, mishandles file shrinkage during read access, which allows local users to cause a denial of service (infinite read loop in sparse_dump_region in sparse.c) by modifying a file that is supposed to be archived by a different user's process (e.g., a system backup running as root).",
|
||||
"Severity": "LOW",
|
||||
"References": [
|
||||
"http://git.savannah.gnu.org/cgit/tar.git/commit/?id=c15c42ccd1e2377945fd0414eca1a49294bff454",
|
||||
"http://lists.gnu.org/archive/html/bug-tar/2018-12/msg00023.html",
|
||||
"http://lists.opensuse.org/opensuse-security-announce/2019-04/msg00077.html",
|
||||
"http://www.securityfocus.com/bid/106354",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20482",
|
||||
"https://lists.debian.org/debian-lts-announce/2018/12/msg00023.html",
|
||||
"https://news.ycombinator.com/item?id=18745431",
|
||||
"https://security.gentoo.org/glsa/201903-05",
|
||||
"https://twitter.com/thatcks/status/1076166645708668928",
|
||||
"https://utcc.utoronto.ca/~cks/space/blog/sysadmin/TarFindingTruncateBug"
|
||||
]
|
||||
},
|
||||
{
|
||||
"VulnerabilityID": "CVE-2018-7738",
|
||||
"PkgName": "util-linux",
|
||||
"InstalledVersion": "2.31.1-0.4ubuntu3.3",
|
||||
"Title": "util-linux: Shell command injection in unescaped bash-completed mount point names",
|
||||
"Description": "In util-linux before 2.32-rc1, bash-completion/umount allows local users to gain privileges by embedding shell commands in a mountpoint name, which is mishandled during a umount command (within Bash) by a different user, as demonstrated by logging in as root and entering umount followed by a tab character for autocompletion.",
|
||||
"Severity": "HIGH",
|
||||
"References": [
|
||||
"http://www.securityfocus.com/bid/103367",
|
||||
"https://bugs.debian.org/892179",
|
||||
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7738",
|
||||
"https://github.com/karelzak/util-linux/commit/75f03badd7ed9f1dd951863d75e756883d3acc55",
|
||||
"https://github.com/karelzak/util-linux/issues/539",
|
||||
"https://www.debian.org/security/2018/dsa-4134"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
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())
|
||||
}
|
||||
}
|
||||
164
pkg/app.go
Normal file
164
pkg/app.go
Normal file
@@ -0,0 +1,164 @@
|
||||
package pkg
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/vulnerability"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
func NewApp(version string) *cli.App {
|
||||
cli.AppHelpTemplate = `NAME:
|
||||
{{.Name}}{{if .Usage}} - {{.Usage}}{{end}}
|
||||
USAGE:
|
||||
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
|
||||
VERSION:
|
||||
{{.Version}}{{end}}{{end}}{{if .Description}}
|
||||
DESCRIPTION:
|
||||
{{.Description}}{{end}}{{if len .Authors}}
|
||||
AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
|
||||
{{range $index, $author := .Authors}}{{if $index}}
|
||||
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
|
||||
OPTIONS:
|
||||
{{range $index, $option := .VisibleFlags}}{{if $index}}
|
||||
{{end}}{{$option}}{{end}}{{end}}
|
||||
`
|
||||
app := cli.NewApp()
|
||||
app.Name = "trivy"
|
||||
app.Version = version
|
||||
app.ArgsUsage = "image_name"
|
||||
|
||||
app.Usage = "A simple and comprehensive vulnerability scanner for containers"
|
||||
|
||||
app.EnableBashCompletion = true
|
||||
|
||||
app.Flags = []cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "template, t",
|
||||
Value: "",
|
||||
Usage: "output template",
|
||||
EnvVar: "TRIVY_TEMPLATE",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "format, f",
|
||||
Value: "table",
|
||||
Usage: "format (table, json, template)",
|
||||
EnvVar: "TRIVY_FORMAT",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "input, i",
|
||||
Value: "",
|
||||
Usage: "input file path instead of image name",
|
||||
EnvVar: "TRIVY_INPUT",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "severity, s",
|
||||
Value: strings.Join(types.SeverityNames, ","),
|
||||
Usage: "severities of vulnerabilities to be displayed (comma separated)",
|
||||
EnvVar: "TRIVY_SEVERITY",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "output, o",
|
||||
Usage: "output file name",
|
||||
EnvVar: "TRIVY_OUTPUT",
|
||||
},
|
||||
cli.IntFlag{
|
||||
Name: "exit-code",
|
||||
Usage: "Exit code when vulnerabilities were found",
|
||||
Value: 0,
|
||||
EnvVar: "TRIVY_EXIT_CODE",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "skip-update",
|
||||
Usage: "skip db update",
|
||||
EnvVar: "TRIVY_SKIP_UPDATE",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "download-db-only",
|
||||
Usage: "download/update vulnerability database but don't run a scan",
|
||||
EnvVar: "TRIVY_DOWNLOAD_DB_ONLY",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "reset",
|
||||
Usage: "remove all caches and database",
|
||||
EnvVar: "TRIVY_RESET",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "clear-cache, c",
|
||||
Usage: "clear image caches",
|
||||
EnvVar: "TRIVY_CLEAR_CACHE",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "quiet, q",
|
||||
Usage: "suppress progress bar and log output",
|
||||
EnvVar: "TRIVY_QUIET",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "no-progress",
|
||||
Usage: "suppress progress bar",
|
||||
EnvVar: "TRIVY_NO_PROGRESS",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "ignore-unfixed",
|
||||
Usage: "display only fixed vulnerabilities",
|
||||
EnvVar: "TRIVY_IGNORE_UNFIXED",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "debug, d",
|
||||
Usage: "debug mode",
|
||||
EnvVar: "TRIVY_DEBUG",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "vuln-type",
|
||||
Value: "os,library",
|
||||
Usage: "comma-separated list of vulnerability types (os,library)",
|
||||
EnvVar: "TRIVY_VULN_TYPE",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "cache-dir",
|
||||
Value: utils.DefaultCacheDir(),
|
||||
Usage: "use as cache directory, but image cache is stored in /path/to/cache/fanal",
|
||||
EnvVar: "TRIVY_CACHE_DIR",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "ignorefile",
|
||||
Value: vulnerability.DefaultIgnoreFile,
|
||||
Usage: "specify .trivyignore file",
|
||||
EnvVar: "TRIVY_IGNOREFILE",
|
||||
},
|
||||
cli.DurationFlag{
|
||||
Name: "timeout",
|
||||
Value: time.Second * 60,
|
||||
Usage: "docker timeout",
|
||||
EnvVar: "TRIVY_TIMEOUT",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "light",
|
||||
Usage: "light mode: it's faster, but vulnerability descriptions and references are not displayed",
|
||||
},
|
||||
|
||||
// deprecated options
|
||||
cli.StringFlag{
|
||||
Name: "only-update",
|
||||
Usage: "deprecated",
|
||||
EnvVar: "TRIVY_ONLY_UPDATE",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "refresh",
|
||||
Usage: "deprecated",
|
||||
EnvVar: "TRIVY_REFRESH",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "auto-refresh",
|
||||
Usage: "deprecated",
|
||||
EnvVar: "TRIVY_AUTO_REFRESH",
|
||||
},
|
||||
}
|
||||
|
||||
app.Action = Run
|
||||
return app
|
||||
}
|
||||
252
pkg/db/db.go
252
pkg/db/db.go
@@ -1,160 +1,136 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"compress/gzip"
|
||||
"context"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"k8s.io/utils/clock"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/github"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
db *bolt.DB
|
||||
const (
|
||||
fullDB = "trivy.db.gz"
|
||||
lightDB = "trivy-light.db.gz"
|
||||
)
|
||||
|
||||
func Init() (err error) {
|
||||
dbDir := filepath.Join(utils.CacheDir(), "db")
|
||||
if err = os.MkdirAll(dbDir, 0700); err != nil {
|
||||
return xerrors.Errorf("failed to mkdir: %w", err)
|
||||
type Operation interface {
|
||||
GetMetadata() (db.Metadata, error)
|
||||
}
|
||||
|
||||
type GitHubOperation interface {
|
||||
DownloadDB(ctx context.Context, fileName string) (io.ReadCloser, error)
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
dbc Operation
|
||||
clock clock.Clock
|
||||
githubClient GitHubOperation
|
||||
}
|
||||
|
||||
func NewClient() Client {
|
||||
return Client{
|
||||
dbc: db.Config{},
|
||||
clock: clock.RealClock{},
|
||||
githubClient: github.NewClient(),
|
||||
}
|
||||
}
|
||||
|
||||
func (c Client) Download(ctx context.Context, cliVersion, cacheDir string, light, skip bool) error {
|
||||
dbType := db.TypeFull
|
||||
dbFile := fullDB
|
||||
message := " Downloading Full DB file..."
|
||||
if light {
|
||||
dbFile = lightDB
|
||||
message = " Downloading Lightweight DB file..."
|
||||
dbType = db.TypeLight
|
||||
}
|
||||
|
||||
dbPath := filepath.Join(dbDir, "trivy.db")
|
||||
log.Logger.Debugf("db path: %s", dbPath)
|
||||
db, err = bolt.Open(dbPath, 0600, nil)
|
||||
metadata, err := c.dbc.GetMetadata()
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to open db: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Close() error {
|
||||
if err := db.Close(); err != nil {
|
||||
return xerrors.Errorf("failed to close DB: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Reset() error {
|
||||
if err := Close(); err != nil {
|
||||
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)
|
||||
}
|
||||
|
||||
if err := Init(); err != nil {
|
||||
return xerrors.Errorf("failed to reset DB: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetVersion() string {
|
||||
var version string
|
||||
value, err := Get("trivy", "metadata", "version")
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
if err = json.Unmarshal(value, &version); err != nil {
|
||||
return ""
|
||||
}
|
||||
return version
|
||||
}
|
||||
|
||||
func SetVersion(version string) error {
|
||||
err := Update("trivy", "metadata", "version", version)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to save DB version: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Update(rootBucket, nestedBucket, key string, value interface{}) error {
|
||||
err := db.Update(func(tx *bolt.Tx) error {
|
||||
return PutNestedBucket(tx, rootBucket, nestedBucket, key, value)
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in db update: %w", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func PutNestedBucket(tx *bolt.Tx, rootBucket, nestedBucket, key string, value interface{}) error {
|
||||
root, err := tx.CreateBucketIfNotExists([]byte(rootBucket))
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to create a bucket: %w", err)
|
||||
}
|
||||
return Put(root, nestedBucket, key, value)
|
||||
}
|
||||
func Put(root *bolt.Bucket, nestedBucket, key string, value interface{}) error {
|
||||
nested, err := root.CreateBucketIfNotExists([]byte(nestedBucket))
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to create a bucket: %w", err)
|
||||
}
|
||||
v, err := json.Marshal(value)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to unmarshal JSON: %w", err)
|
||||
}
|
||||
return nested.Put([]byte(key), v)
|
||||
}
|
||||
func BatchUpdate(fn func(tx *bolt.Tx) error) error {
|
||||
err := db.Batch(func(tx *bolt.Tx) error {
|
||||
return fn(tx)
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in batch update: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Get(rootBucket, nestedBucket, key string) (value []byte, err error) {
|
||||
err = db.View(func(tx *bolt.Tx) error {
|
||||
root := tx.Bucket([]byte(rootBucket))
|
||||
if root == nil {
|
||||
return nil
|
||||
log.Logger.Debug("This is the first run")
|
||||
if skip {
|
||||
log.Logger.Error("The first run cannot skip downloading DB")
|
||||
return xerrors.New("--skip-update cannot be specified on the first run")
|
||||
}
|
||||
nested := root.Bucket([]byte(nestedBucket))
|
||||
if nested == nil {
|
||||
return nil
|
||||
}
|
||||
value = nested.Get([]byte(key))
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get data from db: %w", err)
|
||||
metadata = db.Metadata{} // suppress a warning
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func ForEach(rootBucket, nestedBucket string) (value map[string][]byte, err error) {
|
||||
value = map[string][]byte{}
|
||||
err = db.View(func(tx *bolt.Tx) error {
|
||||
root := tx.Bucket([]byte(rootBucket))
|
||||
if root == nil {
|
||||
return nil
|
||||
}
|
||||
nested := root.Bucket([]byte(nestedBucket))
|
||||
if nested == nil {
|
||||
return nil
|
||||
}
|
||||
err := nested.ForEach(func(k, v []byte) error {
|
||||
value[string(k)] = v
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in db foreach: %w", err)
|
||||
if db.SchemaVersion < metadata.Version {
|
||||
log.Logger.Errorf("Trivy version (%s) is old. Update to the latest version.", cliVersion)
|
||||
return xerrors.Errorf("the version of DB schema doesn't match. Local DB: %d, Expected: %d",
|
||||
metadata.Version, db.SchemaVersion)
|
||||
}
|
||||
|
||||
if skip {
|
||||
if db.SchemaVersion != metadata.Version {
|
||||
log.Logger.Error("The local DB is old and needs to be updated")
|
||||
return xerrors.New("--skip-update cannot be specified with the old DB")
|
||||
} else if metadata.Type != dbType {
|
||||
if dbType == db.TypeFull {
|
||||
log.Logger.Error("The local DB is a lightweight DB. You have to download a full DB")
|
||||
} else {
|
||||
log.Logger.Error("The local DB is a full DB. You have to download a lightweight DB")
|
||||
}
|
||||
return xerrors.New("--skip-update cannot be specified with the different schema DB")
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get all key/value in the specified bucket: %w", err)
|
||||
}
|
||||
return value, nil
|
||||
|
||||
if db.SchemaVersion == metadata.Version && metadata.Type == dbType &&
|
||||
c.clock.Now().Before(metadata.NextUpdate) {
|
||||
log.Logger.Debug("DB update was skipped because DB is the latest")
|
||||
return nil
|
||||
}
|
||||
|
||||
if err = c.download(ctx, cacheDir, message, dbFile); err != nil {
|
||||
return xerrors.Errorf("failed to download the DB file: %w", err)
|
||||
}
|
||||
|
||||
log.Logger.Info("Reopening vulnerability DB")
|
||||
if err = db.Close(); err != nil {
|
||||
return xerrors.Errorf("unable to close old DB: %w", err)
|
||||
}
|
||||
if err = db.Init(cacheDir); err != nil {
|
||||
return xerrors.Errorf("unable to open new DB: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c Client) download(ctx context.Context, cacheDir, message, dbFile string) error {
|
||||
spinner := utils.NewSpinner(message)
|
||||
spinner.Start()
|
||||
defer spinner.Stop()
|
||||
|
||||
rc, err := c.githubClient.DownloadDB(ctx, dbFile)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to download vulnerability DB: %w", err)
|
||||
}
|
||||
defer rc.Close()
|
||||
|
||||
gr, err := gzip.NewReader(rc)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("invalid gzip file: %w", err)
|
||||
}
|
||||
|
||||
dbPath := db.Path(cacheDir)
|
||||
file, err := os.Create(dbPath)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("unable to open DB file: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
_, err = io.Copy(file, gr)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to save DB file: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
318
pkg/db/db_test.go
Normal file
318
pkg/db/db_test.go
Normal file
@@ -0,0 +1,318 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"k8s.io/utils/clock"
|
||||
clocktesting "k8s.io/utils/clock/testing"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
type MockConfig struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
func (_m *MockConfig) GetMetadata() (db.Metadata, error) {
|
||||
ret := _m.Called()
|
||||
ret0 := ret.Get(0)
|
||||
if ret0 == nil {
|
||||
return db.Metadata{}, ret.Error(1)
|
||||
}
|
||||
metadata, ok := ret0.(db.Metadata)
|
||||
if !ok {
|
||||
return db.Metadata{}, ret.Error(1)
|
||||
}
|
||||
return metadata, ret.Error(1)
|
||||
}
|
||||
|
||||
type MockGitHubClient struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
func (_m *MockGitHubClient) DownloadDB(ctx context.Context, fileName string) (io.ReadCloser, error) {
|
||||
ret := _m.Called(ctx, fileName)
|
||||
ret0 := ret.Get(0)
|
||||
if ret0 == nil {
|
||||
return nil, ret.Error(1)
|
||||
}
|
||||
rc, ok := ret0.(io.ReadCloser)
|
||||
if !ok {
|
||||
return nil, ret.Error(1)
|
||||
}
|
||||
return rc, ret.Error(1)
|
||||
}
|
||||
|
||||
func TestClient_Download(t *testing.T) {
|
||||
type getMetadataOutput struct {
|
||||
metadata db.Metadata
|
||||
err error
|
||||
}
|
||||
|
||||
type downloadDBOutput struct {
|
||||
fileName string
|
||||
err error
|
||||
}
|
||||
type downloadDB struct {
|
||||
input string
|
||||
output downloadDBOutput
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
light bool
|
||||
skip bool
|
||||
clock clock.Clock
|
||||
getMetadata getMetadataOutput
|
||||
downloadDB []downloadDB
|
||||
expectedContent []byte
|
||||
expectedError error
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 1,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
downloadDB: []downloadDB{
|
||||
{
|
||||
input: fullDB,
|
||||
output: downloadDBOutput{
|
||||
fileName: "testdata/test.db.gz",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path for first run",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{},
|
||||
err: errors.New("get metadata failed"),
|
||||
},
|
||||
downloadDB: []downloadDB{
|
||||
{
|
||||
input: fullDB,
|
||||
output: downloadDBOutput{
|
||||
fileName: "testdata/test.db.gz",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path with different type",
|
||||
light: true,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 1,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
downloadDB: []downloadDB{
|
||||
{
|
||||
input: lightDB,
|
||||
output: downloadDBOutput{
|
||||
fileName: "testdata/test.db.gz",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path with old schema version",
|
||||
light: true,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 0,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2020, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
downloadDB: []downloadDB{
|
||||
{
|
||||
input: lightDB,
|
||||
output: downloadDBOutput{
|
||||
fileName: "testdata/test.db.gz",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path with --skip-update",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 1,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
skip: true,
|
||||
},
|
||||
{
|
||||
name: "skip downloading DB",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 1,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 10, 2, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "newer schema version",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 2,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 10, 2, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("the version of DB schema doesn't match. Local DB: 2, Expected: 1"),
|
||||
},
|
||||
{
|
||||
name: "DownloadDB returns an error",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 1,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
downloadDB: []downloadDB{
|
||||
{
|
||||
input: fullDB,
|
||||
output: downloadDBOutput{
|
||||
err: xerrors.New("download failed"),
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("failed to download the DB file: failed to download vulnerability DB: download failed"),
|
||||
},
|
||||
{
|
||||
name: "invalid gzip",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 1,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
downloadDB: []downloadDB{
|
||||
{
|
||||
input: fullDB,
|
||||
output: downloadDBOutput{
|
||||
fileName: "testdata/invalid.db.gz",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("unable to open new DB: failed to open db: invalid database"),
|
||||
},
|
||||
{
|
||||
name: "--skip-update on the first run",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
err: xerrors.New("this is the first run"),
|
||||
},
|
||||
skip: true,
|
||||
expectedError: xerrors.New("--skip-update cannot be specified on the first run"),
|
||||
},
|
||||
{
|
||||
name: "--skip-update with different schema version",
|
||||
light: false,
|
||||
clock: clocktesting.NewFakeClock(time.Date(2019, 10, 1, 0, 0, 0, 0, time.UTC)),
|
||||
getMetadata: getMetadataOutput{
|
||||
metadata: db.Metadata{
|
||||
Version: 0,
|
||||
Type: db.TypeFull,
|
||||
NextUpdate: time.Date(2019, 9, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
skip: true,
|
||||
expectedError: xerrors.New("--skip-update cannot be specified with the old DB"),
|
||||
},
|
||||
}
|
||||
|
||||
if err := log.InitLogger(false, true); err != nil {
|
||||
require.NoError(t, err, "failed to init logger")
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
mockConfig := new(MockConfig)
|
||||
mockConfig.On("GetMetadata").Return(
|
||||
tc.getMetadata.metadata, tc.getMetadata.err)
|
||||
|
||||
mockGitHubConfig := new(MockGitHubClient)
|
||||
for _, dd := range tc.downloadDB {
|
||||
var rc io.ReadCloser
|
||||
if dd.output.fileName != "" {
|
||||
f, err := os.Open(dd.output.fileName)
|
||||
assert.NoError(t, err, tc.name)
|
||||
rc = f
|
||||
}
|
||||
|
||||
mockGitHubConfig.On("DownloadDB", mock.Anything, dd.input).Return(
|
||||
rc, dd.output.err,
|
||||
)
|
||||
}
|
||||
|
||||
dir, err := ioutil.TempDir("", "db")
|
||||
require.NoError(t, err, tc.name)
|
||||
defer os.RemoveAll(dir)
|
||||
|
||||
err = db.Init(dir)
|
||||
require.NoError(t, err, tc.name)
|
||||
|
||||
client := Client{
|
||||
dbc: mockConfig,
|
||||
clock: tc.clock,
|
||||
githubClient: mockGitHubConfig,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
err = client.Download(ctx, "test", dir, tc.light, tc.skip)
|
||||
|
||||
switch {
|
||||
case tc.expectedError != nil:
|
||||
assert.EqualError(t, err, tc.expectedError.Error(), tc.name)
|
||||
default:
|
||||
assert.NoError(t, err, tc.name)
|
||||
}
|
||||
|
||||
mockConfig.AssertExpectations(t)
|
||||
mockGitHubConfig.AssertExpectations(t)
|
||||
})
|
||||
}
|
||||
}
|
||||
BIN
pkg/db/testdata/invalid.db.gz
vendored
Normal file
BIN
pkg/db/testdata/invalid.db.gz
vendored
Normal file
Binary file not shown.
BIN
pkg/db/testdata/test.db.gz
vendored
Normal file
BIN
pkg/db/testdata/test.db.gz
vendored
Normal file
Binary file not shown.
194
pkg/git/git.go
194
pkg/git/git.go
@@ -1,194 +0,0 @@
|
||||
package git
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"golang.org/x/xerrors"
|
||||
git "gopkg.in/src-d/go-git.v4"
|
||||
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
||||
"gopkg.in/src-d/go-git.v4/plumbing/storer"
|
||||
)
|
||||
|
||||
func CloneOrPull(url, repoPath string) (map[string]struct{}, error) {
|
||||
exists, err := utils.Exists(filepath.Join(repoPath, ".git"))
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to check if a file exists: %w", err)
|
||||
}
|
||||
|
||||
updatedFiles := map[string]struct{}{}
|
||||
if exists {
|
||||
log.Logger.Debug("git pull")
|
||||
files, err := pull(repoPath)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to pull repository: %w", err)
|
||||
}
|
||||
|
||||
for _, filename := range files {
|
||||
updatedFiles[strings.TrimSpace(filename)] = struct{}{}
|
||||
}
|
||||
} else {
|
||||
if !utils.IsCommandAvailable("git") {
|
||||
log.Logger.Warn("Recommend installing git (if not, DB update is very slow)")
|
||||
}
|
||||
log.Logger.Debug("remove an existed directory")
|
||||
|
||||
suffix := " It will take a while for the first time..."
|
||||
s := utils.NewSpinner(suffix)
|
||||
s.Start()
|
||||
defer s.Stop()
|
||||
|
||||
if err = os.RemoveAll(repoPath); err != nil {
|
||||
return nil, xerrors.Errorf("failed to remove an existed directory: %w", err)
|
||||
}
|
||||
|
||||
if err = os.MkdirAll(repoPath, 0700); err != nil {
|
||||
return nil, xerrors.Errorf("failed to mkdir: %w", err)
|
||||
}
|
||||
if err := clone(url, repoPath); err != nil {
|
||||
return nil, xerrors.Errorf("failed to clone repository: %w", err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Need to refresh all vulnerabilities
|
||||
if db.GetVersion() == "" {
|
||||
err = filepath.Walk(repoPath, func(path string, info os.FileInfo, err error) error {
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
rel, err := filepath.Rel(repoPath, path)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to get a relative path: %w", err)
|
||||
}
|
||||
updatedFiles[rel] = struct{}{}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in file walk: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
return updatedFiles, nil
|
||||
}
|
||||
|
||||
func clone(url, repoPath string) error {
|
||||
if utils.IsCommandAvailable("git") {
|
||||
return cloneByOSCommand(url, repoPath)
|
||||
}
|
||||
|
||||
_, err := git.PlainClone(repoPath, false, &git.CloneOptions{
|
||||
URL: url,
|
||||
})
|
||||
if err != nil && err != git.ErrRepositoryAlreadyExists {
|
||||
return xerrors.Errorf("unexpected error in git clone: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func cloneByOSCommand(url, repoPath string) error {
|
||||
commandAndArgs := []string{"clone", url, repoPath}
|
||||
_, err := utils.Exec("git", commandAndArgs)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in git clone: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func pull(repoPath string) ([]string, error) {
|
||||
if utils.IsCommandAvailable("git") {
|
||||
return pullByOSCommand(repoPath)
|
||||
}
|
||||
|
||||
r, err := git.PlainOpen(repoPath)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to open repository: %w", err)
|
||||
}
|
||||
|
||||
log.Logger.Debug("Retrieve the branch being pointed by HEAD")
|
||||
ref, err := r.Head()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get HEAD: %w", err)
|
||||
}
|
||||
|
||||
log.Logger.Debug("Get the working directory for the repository")
|
||||
w, err := r.Worktree()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get the working directory: %w", err)
|
||||
}
|
||||
|
||||
log.Logger.Debug("Pull the latest changes from the origin remote and merge into the current branch")
|
||||
err = w.Pull(&git.PullOptions{RemoteName: "origin"})
|
||||
if err != nil && err != git.NoErrAlreadyUpToDate {
|
||||
return nil, err
|
||||
} else if err == git.NoErrAlreadyUpToDate {
|
||||
return []string{}, nil
|
||||
}
|
||||
|
||||
log.Logger.Debug("Retrieve the commit history")
|
||||
commits, err := r.Log(&git.LogOptions{})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in git log: %w", err)
|
||||
}
|
||||
|
||||
log.Logger.Debug("Detect the updated files")
|
||||
var prevCommit *object.Commit
|
||||
var updatedFiles []string
|
||||
err = commits.ForEach(func(commit *object.Commit) error {
|
||||
if prevCommit == nil {
|
||||
prevCommit = commit
|
||||
return nil
|
||||
}
|
||||
|
||||
patch, err := commit.Patch(prevCommit)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in patch: %w", err)
|
||||
}
|
||||
for _, stat := range patch.Stats() {
|
||||
updatedFiles = append(updatedFiles, stat.Name)
|
||||
}
|
||||
|
||||
if commit.Hash == ref.Hash() {
|
||||
return storer.ErrStop
|
||||
}
|
||||
|
||||
prevCommit = commit
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in commit foreach: %w", err)
|
||||
}
|
||||
|
||||
return updatedFiles, nil
|
||||
}
|
||||
|
||||
func pullByOSCommand(repoPath string) ([]string, error) {
|
||||
gitDir := filepath.Join(repoPath, ".git")
|
||||
commandArgs := []string{"--git-dir", gitDir, "--work-tree", repoPath}
|
||||
|
||||
revParseCmd := []string{"rev-parse", "HEAD"}
|
||||
output, err := utils.Exec("git", append(commandArgs, revParseCmd...))
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in git rev-parse: %w", err)
|
||||
}
|
||||
commitHash := strings.TrimSpace(output)
|
||||
|
||||
pullCmd := []string{"pull", "origin", "master"}
|
||||
_, err = utils.Exec("git", append(commandArgs, pullCmd...))
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in git pull: %w", err)
|
||||
}
|
||||
|
||||
diffCmd := []string{"diff", commitHash, "HEAD", "--name-only"}
|
||||
output, err = utils.Exec("git", append(commandArgs, diffCmd...))
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in git diff: %w", err)
|
||||
}
|
||||
updatedFiles := strings.Split(strings.TrimSpace(output), "\n")
|
||||
return updatedFiles, nil
|
||||
}
|
||||
113
pkg/github/github.go
Normal file
113
pkg/github/github.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package github
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/google/go-github/v28/github"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
const (
|
||||
owner = "aquasecurity"
|
||||
repo = "trivy-db"
|
||||
)
|
||||
|
||||
type RepositoryInterface interface {
|
||||
ListReleases(ctx context.Context, opt *github.ListOptions) ([]*github.RepositoryRelease, *github.Response, error)
|
||||
DownloadAsset(ctx context.Context, id int64) (io.ReadCloser, string, error)
|
||||
}
|
||||
|
||||
type Repository struct {
|
||||
repository *github.RepositoriesService
|
||||
git *github.GitService
|
||||
owner string
|
||||
repoName string
|
||||
}
|
||||
|
||||
func (r Repository) ListReleases(ctx context.Context, opt *github.ListOptions) ([]*github.RepositoryRelease, *github.Response, error) {
|
||||
return r.repository.ListReleases(ctx, r.owner, r.repoName, opt)
|
||||
}
|
||||
|
||||
func (r Repository) DownloadAsset(ctx context.Context, id int64) (io.ReadCloser, string, error) {
|
||||
return r.repository.DownloadReleaseAsset(ctx, r.owner, r.repoName, id)
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
Repository RepositoryInterface
|
||||
}
|
||||
|
||||
func NewClient() Client {
|
||||
gc := github.NewClient(nil)
|
||||
|
||||
repo := Repository{
|
||||
repository: gc.Repositories,
|
||||
git: gc.Git,
|
||||
owner: owner,
|
||||
repoName: repo,
|
||||
}
|
||||
|
||||
return Client{
|
||||
Repository: repo,
|
||||
}
|
||||
}
|
||||
|
||||
func (c Client) DownloadDB(ctx context.Context, fileName string) (io.ReadCloser, error) {
|
||||
options := github.ListOptions{}
|
||||
releases, _, err := c.Repository.ListReleases(ctx, &options)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to list releases: %w", err)
|
||||
}
|
||||
|
||||
sort.Slice(releases, func(i, j int) bool {
|
||||
return releases[i].GetPublishedAt().After(releases[j].GetPublishedAt().Time)
|
||||
})
|
||||
|
||||
prefix := fmt.Sprintf("v%d", db.SchemaVersion)
|
||||
for _, release := range releases {
|
||||
log.Logger.Debugf("release name: %s", release.GetName())
|
||||
if !strings.HasPrefix(release.GetName(), prefix) {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, asset := range release.Assets {
|
||||
rc, err := c.downloadAsset(ctx, asset, fileName)
|
||||
if err != nil {
|
||||
log.Logger.Debug(err)
|
||||
continue
|
||||
}
|
||||
return rc, nil
|
||||
}
|
||||
|
||||
}
|
||||
return nil, xerrors.New("DB file not found")
|
||||
}
|
||||
|
||||
func (c Client) downloadAsset(ctx context.Context, asset github.ReleaseAsset, fileName string) (io.ReadCloser, error) {
|
||||
log.Logger.Debugf("asset name: %s", asset.GetName())
|
||||
if asset.GetName() != fileName {
|
||||
return nil, xerrors.New("file name doesn't match")
|
||||
}
|
||||
|
||||
rc, url, err := c.Repository.DownloadAsset(ctx, asset.GetID())
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("unable to download the asset: %w", err)
|
||||
}
|
||||
|
||||
if rc != nil {
|
||||
return rc, nil
|
||||
}
|
||||
|
||||
log.Logger.Debugf("asset URL: %s", url)
|
||||
resp, err := http.Get(url)
|
||||
if err != nil || resp.StatusCode != http.StatusOK {
|
||||
return nil, xerrors.Errorf("unable to download the asset via URL: %w", err)
|
||||
}
|
||||
return resp.Body, nil
|
||||
}
|
||||
467
pkg/github/github_test.go
Normal file
467
pkg/github/github_test.go
Normal file
@@ -0,0 +1,467 @@
|
||||
package github
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"path"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/google/go-github/v28/github"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
type MockRepository struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
func (_m *MockRepository) ListReleases(ctx context.Context, opt *github.ListOptions) (
|
||||
[]*github.RepositoryRelease, *github.Response, error) {
|
||||
ret := _m.Called(ctx, opt)
|
||||
ret0 := ret.Get(0)
|
||||
if ret0 == nil {
|
||||
return nil, nil, ret.Error(2)
|
||||
}
|
||||
releases, ok := ret0.([]*github.RepositoryRelease)
|
||||
if !ok {
|
||||
return nil, nil, ret.Error(2)
|
||||
}
|
||||
return releases, nil, ret.Error(2)
|
||||
}
|
||||
|
||||
func (_m *MockRepository) DownloadAsset(ctx context.Context, id int64) (io.ReadCloser, string, error) {
|
||||
ret := _m.Called(ctx, id)
|
||||
ret0 := ret.Get(0)
|
||||
if ret0 == nil {
|
||||
return nil, ret.String(1), ret.Error(2)
|
||||
}
|
||||
rc, ok := ret0.(io.ReadCloser)
|
||||
if !ok {
|
||||
return nil, ret.String(1), ret.Error(2)
|
||||
}
|
||||
return rc, ret.String(1), ret.Error(2)
|
||||
}
|
||||
|
||||
func TestClient_DownloadDB(t *testing.T) {
|
||||
type listReleasesOutput struct {
|
||||
releases []*github.RepositoryRelease
|
||||
response *github.Response
|
||||
err error
|
||||
}
|
||||
type listReleases struct {
|
||||
input string
|
||||
output listReleasesOutput
|
||||
}
|
||||
|
||||
type downloadAssetOutput struct {
|
||||
rc io.ReadCloser
|
||||
redirectPath string
|
||||
err error
|
||||
}
|
||||
type downloadAsset struct {
|
||||
input int64
|
||||
output downloadAssetOutput
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
fileName string
|
||||
filePaths []string
|
||||
listReleases []listReleases
|
||||
downloadAsset []downloadAsset
|
||||
expectedError error
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
// this release should be skipped due to the wrong prefix of the tag
|
||||
ID: github.Int64(2),
|
||||
Name: github.String("v2-2020010101"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 1, 1, 1, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(200),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2020123123"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 12, 31, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(100),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
downloadAsset: []downloadAsset{
|
||||
{
|
||||
input: 100,
|
||||
output: downloadAssetOutput{
|
||||
rc: ioutil.NopCloser(strings.NewReader("foo")),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path with redirect URL",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2020123123"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 12, 31, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(100),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
downloadAsset: []downloadAsset{
|
||||
{
|
||||
input: 100,
|
||||
output: downloadAssetOutput{
|
||||
redirectPath: "/happy",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path with inorder releases",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2019100123"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2019, 10, 1, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(100),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
// this release should be used because this is the latest
|
||||
ID: github.Int64(3),
|
||||
Name: github.String("v1-2019100200"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2019, 10, 2, 0, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(300),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: github.Int64(2),
|
||||
Name: github.String("v1-2019100122"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2019, 10, 1, 22, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(200),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
downloadAsset: []downloadAsset{
|
||||
{
|
||||
input: 300,
|
||||
output: downloadAssetOutput{
|
||||
rc: ioutil.NopCloser(strings.NewReader("foo")),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "happy path with no asset",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
// this release should be skipped due to no asset
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2019100123"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2019, 10, 1, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
{
|
||||
// this release should be skipped due to no asset
|
||||
ID: github.Int64(3),
|
||||
Name: github.String("v1-2019100200"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2019, 10, 2, 0, 59, 59, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
{
|
||||
// this release should be used because this release has assets
|
||||
ID: github.Int64(2),
|
||||
Name: github.String("v1-2019100122"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2019, 10, 1, 22, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(200),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
downloadAsset: []downloadAsset{
|
||||
{
|
||||
input: 200,
|
||||
output: downloadAssetOutput{
|
||||
rc: ioutil.NopCloser(strings.NewReader("foo")),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "no asset",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2020123000"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 12, 31, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("DB file not found"),
|
||||
},
|
||||
{
|
||||
name: "the file name doesn't match",
|
||||
fileName: "trivy-light.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2020123000"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 12, 31, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(100),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("DB file not found"),
|
||||
},
|
||||
{
|
||||
name: "ListReleases returns error",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
err: xerrors.New("something wrong"),
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("failed to list releases: something wrong"),
|
||||
},
|
||||
{
|
||||
name: "DownloadAsset returns error",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2020123000"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 12, 31, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(100),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
downloadAsset: []downloadAsset{
|
||||
{
|
||||
input: 100,
|
||||
output: downloadAssetOutput{
|
||||
err: xerrors.New("something wrong"),
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("DB file not found"),
|
||||
},
|
||||
{
|
||||
name: "404 error",
|
||||
fileName: "trivy.db.gz",
|
||||
listReleases: []listReleases{
|
||||
{
|
||||
input: mock.Anything,
|
||||
output: listReleasesOutput{
|
||||
releases: []*github.RepositoryRelease{
|
||||
{
|
||||
ID: github.Int64(1),
|
||||
Name: github.String("v1-2020123000"),
|
||||
PublishedAt: &github.Timestamp{
|
||||
Time: time.Date(2020, 12, 31, 23, 59, 59, 0, time.UTC),
|
||||
},
|
||||
Assets: []github.ReleaseAsset{
|
||||
{
|
||||
ID: github.Int64(100),
|
||||
Name: github.String("trivy.db.gz"),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
downloadAsset: []downloadAsset{
|
||||
{
|
||||
input: 100,
|
||||
output: downloadAssetOutput{
|
||||
redirectPath: "/not_found",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: xerrors.New("DB file not found"),
|
||||
},
|
||||
}
|
||||
|
||||
err := log.InitLogger(false, true)
|
||||
require.NoError(t, err, "Init logger failed")
|
||||
|
||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
switch r.URL.Path {
|
||||
case "/happy":
|
||||
_, _ = fmt.Fprintf(w, "happy")
|
||||
case "/not_found":
|
||||
http.NotFound(w, r)
|
||||
}
|
||||
return
|
||||
},
|
||||
))
|
||||
defer ts.Close()
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
mockRepo := new(MockRepository)
|
||||
for _, lr := range tc.listReleases {
|
||||
mockRepo.On("ListReleases", mock.Anything, lr.input).Return(
|
||||
lr.output.releases, lr.output.response, lr.output.err,
|
||||
)
|
||||
}
|
||||
for _, da := range tc.downloadAsset {
|
||||
var redirectURL string
|
||||
if da.output.redirectPath != "" {
|
||||
u, _ := url.Parse(ts.URL)
|
||||
u.Path = path.Join(u.Path, da.output.redirectPath)
|
||||
redirectURL = u.String()
|
||||
}
|
||||
mockRepo.On("DownloadAsset", mock.Anything, da.input).Return(
|
||||
da.output.rc, redirectURL, da.output.err,
|
||||
)
|
||||
}
|
||||
|
||||
client := Client{
|
||||
Repository: mockRepo,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
rc, err := client.DownloadDB(ctx, tc.fileName)
|
||||
|
||||
switch {
|
||||
case tc.expectedError != nil:
|
||||
assert.EqualError(t, err, tc.expectedError.Error(), tc.name)
|
||||
default:
|
||||
assert.NoError(t, err, tc.name)
|
||||
assert.NotNil(t, rc, tc.name)
|
||||
}
|
||||
|
||||
mockRepo.AssertExpectations(t)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -6,10 +6,12 @@ import (
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
|
||||
"github.com/olekukonko/tablewriter"
|
||||
)
|
||||
@@ -17,8 +19,31 @@ import (
|
||||
type Results []Result
|
||||
|
||||
type Result struct {
|
||||
FileName string `json:"file"`
|
||||
Vulnerabilities []vulnerability.DetectedVulnerability
|
||||
FileName string `json:"Target"`
|
||||
Vulnerabilities []types.DetectedVulnerability `json:"Vulnerabilities"`
|
||||
}
|
||||
|
||||
func WriteResults(format string, output io.Writer, results Results, outputTemplate string, light bool) error {
|
||||
var writer Writer
|
||||
switch format {
|
||||
case "table":
|
||||
writer = &TableWriter{Output: output, Light: light}
|
||||
case "json":
|
||||
writer = &JsonWriter{Output: output}
|
||||
case "template":
|
||||
tmpl, err := template.New("output template").Parse(outputTemplate)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error parsing template: %w", err)
|
||||
}
|
||||
writer = &TemplateWriter{Output: output, Template: tmpl}
|
||||
default:
|
||||
return xerrors.Errorf("unknown format: %v", format)
|
||||
}
|
||||
|
||||
if err := writer.Write(results); err != nil {
|
||||
return xerrors.Errorf("failed to write results: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Writer interface {
|
||||
@@ -27,6 +52,7 @@ type Writer interface {
|
||||
|
||||
type TableWriter struct {
|
||||
Output io.Writer
|
||||
Light bool
|
||||
}
|
||||
|
||||
func (tw TableWriter) Write(results Results) error {
|
||||
@@ -37,7 +63,11 @@ func (tw TableWriter) Write(results Results) error {
|
||||
}
|
||||
func (tw TableWriter) write(result Result) {
|
||||
table := tablewriter.NewWriter(tw.Output)
|
||||
table.SetHeader([]string{"Library", "Vulnerability ID", "Severity", "Installed Version", "Fixed Version", "Title"})
|
||||
header := []string{"Library", "Vulnerability ID", "Severity", "Installed Version", "Fixed Version"}
|
||||
if !tw.Light {
|
||||
header = append(header, "Title")
|
||||
}
|
||||
table.SetHeader(header)
|
||||
|
||||
severityCount := map[string]int{}
|
||||
for _, v := range result.Vulnerabilities {
|
||||
@@ -51,16 +81,22 @@ func (tw TableWriter) write(result Result) {
|
||||
if len(splittedTitle) >= 12 {
|
||||
title = strings.Join(splittedTitle[:12], " ") + "..."
|
||||
}
|
||||
var row []string
|
||||
if tw.Output == os.Stdout {
|
||||
table.Append([]string{v.PkgName, v.VulnerabilityID, vulnerability.ColorizeSeverity(v.Severity),
|
||||
v.InstalledVersion, v.FixedVersion, title})
|
||||
row = []string{v.PkgName, v.VulnerabilityID, dbTypes.ColorizeSeverity(v.Severity),
|
||||
v.InstalledVersion, v.FixedVersion}
|
||||
} else {
|
||||
table.Append([]string{v.PkgName, v.VulnerabilityID, v.Severity, v.InstalledVersion, v.FixedVersion, title})
|
||||
row = []string{v.PkgName, v.VulnerabilityID, v.Severity, v.InstalledVersion, v.FixedVersion}
|
||||
}
|
||||
|
||||
if !tw.Light {
|
||||
row = append(row, title)
|
||||
}
|
||||
table.Append(row)
|
||||
}
|
||||
|
||||
var results []string
|
||||
for _, severity := range vulnerability.SeverityNames {
|
||||
for _, severity := range dbTypes.SeverityNames {
|
||||
r := fmt.Sprintf("%s: %d", severity, severityCount[severity])
|
||||
results = append(results, r)
|
||||
}
|
||||
@@ -84,11 +120,7 @@ type JsonWriter struct {
|
||||
}
|
||||
|
||||
func (jw JsonWriter) Write(results Results) error {
|
||||
out := map[string][]vulnerability.DetectedVulnerability{}
|
||||
for _, result := range results {
|
||||
out[result.FileName] = result.Vulnerabilities
|
||||
}
|
||||
output, err := json.MarshalIndent(out, "", " ")
|
||||
output, err := json.MarshalIndent(results, "", " ")
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to marshal json: %w", err)
|
||||
}
|
||||
@@ -98,3 +130,16 @@ func (jw JsonWriter) Write(results Results) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type TemplateWriter struct {
|
||||
Output io.Writer
|
||||
Template *template.Template
|
||||
}
|
||||
|
||||
func (tw TemplateWriter) Write(results Results) error {
|
||||
err := tw.Template.Execute(tw.Output, results)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to write with template: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
248
pkg/report/writer_test.go
Normal file
248
pkg/report/writer_test.go
Normal file
@@ -0,0 +1,248 @@
|
||||
package report_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/report"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
func TestReportWriter_Table(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
detectedVulns []types.DetectedVulnerability
|
||||
expectedOutput string
|
||||
light bool
|
||||
}{
|
||||
{
|
||||
name: "happy path full",
|
||||
detectedVulns: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "foo",
|
||||
InstalledVersion: "1.2.3",
|
||||
FixedVersion: "3.4.5",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "foobar",
|
||||
Description: "baz",
|
||||
Severity: "HIGH",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedOutput: `+---------+------------------+----------+-------------------+---------------+--------+
|
||||
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
|
||||
+---------+------------------+----------+-------------------+---------------+--------+
|
||||
| foo | 123 | HIGH | 1.2.3 | 3.4.5 | foobar |
|
||||
+---------+------------------+----------+-------------------+---------------+--------+
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "happy path light",
|
||||
light: true,
|
||||
detectedVulns: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "foo",
|
||||
InstalledVersion: "1.2.3",
|
||||
FixedVersion: "3.4.5",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "foobar",
|
||||
Description: "baz",
|
||||
Severity: "HIGH",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedOutput: `+---------+------------------+----------+-------------------+---------------+
|
||||
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |
|
||||
+---------+------------------+----------+-------------------+---------------+
|
||||
| foo | 123 | HIGH | 1.2.3 | 3.4.5 |
|
||||
+---------+------------------+----------+-------------------+---------------+
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "no title for vuln",
|
||||
detectedVulns: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "foo",
|
||||
InstalledVersion: "1.2.3",
|
||||
FixedVersion: "3.4.5",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Description: "foobar",
|
||||
Severity: "HIGH",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedOutput: `+---------+------------------+----------+-------------------+---------------+--------+
|
||||
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
|
||||
+---------+------------------+----------+-------------------+---------------+--------+
|
||||
| foo | 123 | HIGH | 1.2.3 | 3.4.5 | foobar |
|
||||
+---------+------------------+----------+-------------------+---------------+--------+
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "long title for vuln",
|
||||
detectedVulns: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "foo",
|
||||
InstalledVersion: "1.2.3",
|
||||
FixedVersion: "3.4.5",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "a b c d e f g h i j k l m n o p q r s t u v",
|
||||
Severity: "HIGH",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedOutput: `+---------+------------------+----------+-------------------+---------------+----------------------------+
|
||||
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
|
||||
+---------+------------------+----------+-------------------+---------------+----------------------------+
|
||||
| foo | 123 | HIGH | 1.2.3 | 3.4.5 | a b c d e f g h i j k l... |
|
||||
+---------+------------------+----------+-------------------+---------------+----------------------------+
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "no vulns",
|
||||
detectedVulns: []types.DetectedVulnerability{},
|
||||
expectedOutput: ``,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
inputResults := report.Results{
|
||||
{
|
||||
FileName: "foo",
|
||||
Vulnerabilities: tc.detectedVulns,
|
||||
},
|
||||
}
|
||||
tableWritten := bytes.Buffer{}
|
||||
assert.NoError(t, report.WriteResults("table", &tableWritten, inputResults, "", tc.light), tc.name)
|
||||
assert.Equal(t, tc.expectedOutput, tableWritten.String(), tc.name)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestReportWriter_JSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
detectedVulns []types.DetectedVulnerability
|
||||
expectedJSON report.Results
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
detectedVulns: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "foo",
|
||||
InstalledVersion: "1.2.3",
|
||||
FixedVersion: "3.4.5",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "foobar",
|
||||
Description: "baz",
|
||||
Severity: "HIGH",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedJSON: report.Results{
|
||||
report.Result{
|
||||
FileName: "foojson",
|
||||
Vulnerabilities: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "foo",
|
||||
InstalledVersion: "1.2.3",
|
||||
FixedVersion: "3.4.5",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "foobar",
|
||||
Description: "baz",
|
||||
Severity: "HIGH",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
|
||||
jw := report.JsonWriter{}
|
||||
jsonWritten := bytes.Buffer{}
|
||||
jw.Output = &jsonWritten
|
||||
|
||||
inputResults := report.Results{
|
||||
{
|
||||
FileName: "foojson",
|
||||
Vulnerabilities: tc.detectedVulns,
|
||||
},
|
||||
}
|
||||
|
||||
assert.NoError(t, report.WriteResults("json", &jsonWritten, inputResults, "", false), tc.name)
|
||||
|
||||
writtenResults := report.Results{}
|
||||
errJson := json.Unmarshal([]byte(jsonWritten.String()), &writtenResults)
|
||||
assert.NoError(t, errJson, "invalid json written", tc.name)
|
||||
|
||||
assert.Equal(t, tc.expectedJSON, writtenResults, tc.name)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestReportWriter_Template(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
detectedVulns []types.DetectedVulnerability
|
||||
template string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "happy path",
|
||||
detectedVulns: []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "CVE-2019-0000",
|
||||
PkgName: "foo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityHigh.String(),
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "CVE-2019-0000",
|
||||
PkgName: "bar",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityHigh.String()},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "CVE-2019-0001",
|
||||
PkgName: "baz",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityCritical.String(),
|
||||
},
|
||||
},
|
||||
},
|
||||
template: "{{ range . }}{{ range .Vulnerabilities}}{{ println .VulnerabilityID .Severity }}{{ end }}{{ end }}",
|
||||
expected: "CVE-2019-0000 HIGH\nCVE-2019-0000 HIGH\nCVE-2019-0001 CRITICAL\n",
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
tmplWritten := bytes.Buffer{}
|
||||
inputResults := report.Results{
|
||||
{
|
||||
FileName: "foojson",
|
||||
Vulnerabilities: tc.detectedVulns,
|
||||
},
|
||||
}
|
||||
|
||||
assert.NoError(t, report.WriteResults("template", &tmplWritten, inputResults, tc.template, false))
|
||||
assert.Equal(t, tc.expected, tmplWritten.String())
|
||||
})
|
||||
}
|
||||
}
|
||||
178
pkg/run.go
178
pkg/run.go
@@ -1,43 +1,64 @@
|
||||
package pkg
|
||||
|
||||
import (
|
||||
"context"
|
||||
l "log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/aquasecurity/fanal/cache"
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
dbFile "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/vulnerability"
|
||||
"github.com/genuinetools/reg/registry"
|
||||
"github.com/knqyf263/fanal/cache"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/report"
|
||||
"github.com/knqyf263/trivy/pkg/scanner"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
)
|
||||
|
||||
func Run(c *cli.Context) (err error) {
|
||||
cliVersion := c.App.Version
|
||||
|
||||
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)
|
||||
if c.String("only-update") != "" || c.Bool("refresh") || c.Bool("auto-refresh") {
|
||||
log.Logger.Warn("--only-update, --refresh and --auto-refresh are unnecessary and ignored now. These commands will be removed in the next version.")
|
||||
}
|
||||
|
||||
cacheDir := c.String("cache-dir")
|
||||
utils.SetCacheDir(c.String("cache-dir"))
|
||||
log.Logger.Debugf("cache dir: %s", utils.CacheDir())
|
||||
|
||||
if err = db.Init(cacheDir); err != nil {
|
||||
return xerrors.Errorf("error in vulnerability DB initialize: %w", err)
|
||||
}
|
||||
|
||||
downloadDBOnly := c.Bool("download-db-only")
|
||||
skipUpdate := c.Bool("skip-update")
|
||||
if skipUpdate && downloadDBOnly {
|
||||
return xerrors.New("The --skip-update and --download-db-only option can not be specified both")
|
||||
}
|
||||
|
||||
light := c.Bool("light")
|
||||
client := dbFile.NewClient()
|
||||
ctx := context.Background()
|
||||
if err = client.Download(ctx, c.App.Version, cacheDir, light, skipUpdate); err != nil {
|
||||
return xerrors.Errorf("failed to download vulnerability DB: %w", err)
|
||||
}
|
||||
|
||||
if downloadDBOnly {
|
||||
return nil
|
||||
}
|
||||
|
||||
reset := c.Bool("reset")
|
||||
if reset {
|
||||
log.Logger.Info("Resetting...")
|
||||
@@ -56,58 +77,15 @@ func Run(c *cli.Context) (err error) {
|
||||
if err = cache.Clear(); err != nil {
|
||||
return xerrors.New("failed to remove image layer cache")
|
||||
}
|
||||
}
|
||||
|
||||
refresh := c.Bool("refresh")
|
||||
args := c.Args()
|
||||
var noTarget bool
|
||||
filePath := c.String("input")
|
||||
if filePath == "" && len(args) == 0 {
|
||||
noTarget = true
|
||||
if !reset && !clearCache && !refresh {
|
||||
log.Logger.Info(`trivy" requires at least 1 argument or --input option.`)
|
||||
cli.ShowAppHelpAndExit(c, 1)
|
||||
}
|
||||
}
|
||||
|
||||
autoRefresh := c.Bool("auto-refresh")
|
||||
skipUpdate := c.Bool("skip-update")
|
||||
if (refresh || autoRefresh) && skipUpdate {
|
||||
return xerrors.New("The --skip-update option can not be specified with the --refresh or --auto-refresh option")
|
||||
}
|
||||
|
||||
if err = db.Init(); err != nil {
|
||||
return xerrors.Errorf("error in vulnerability DB initialize: %w", err)
|
||||
}
|
||||
|
||||
needRefresh := false
|
||||
dbVersion := db.GetVersion()
|
||||
if dbVersion != "" && dbVersion != cliVersion {
|
||||
if !autoRefresh {
|
||||
return xerrors.New("Detected version update of trivy. Please try again with --refresh or --auto-refresh option")
|
||||
}
|
||||
needRefresh = true
|
||||
}
|
||||
|
||||
if refresh || needRefresh {
|
||||
log.Logger.Info("Refreshing DB...")
|
||||
if err = db.Reset(); err != nil {
|
||||
return xerrors.Errorf("error in refresh DB: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if !skipUpdate {
|
||||
if err = vulnsrc.Update(); err != nil {
|
||||
return xerrors.Errorf("error in vulnerability DB update: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// When specifying no image name and file name
|
||||
if noTarget {
|
||||
return nil
|
||||
}
|
||||
|
||||
utils.Quiet = c.Bool("quiet")
|
||||
args := c.Args()
|
||||
filePath := c.String("input")
|
||||
if filePath == "" && len(args) == 0 {
|
||||
log.Logger.Info(`trivy requires at least 1 argument or --input option.`)
|
||||
cli.ShowAppHelpAndExit(c, 1)
|
||||
}
|
||||
|
||||
o := c.String("output")
|
||||
output := os.Stdout
|
||||
@@ -117,16 +95,6 @@ func Run(c *cli.Context) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
var severities []vulnerability.Severity
|
||||
for _, s := range strings.Split(c.String("severity"), ",") {
|
||||
severity, err := vulnerability.NewSeverity(s)
|
||||
if err != nil {
|
||||
log.Logger.Infof("error in severity option: %s", err)
|
||||
cli.ShowAppHelpAndExit(c, 1)
|
||||
}
|
||||
severities = append(severities, severity)
|
||||
}
|
||||
|
||||
var imageName string
|
||||
if filePath == "" {
|
||||
imageName = args[0]
|
||||
@@ -143,36 +111,32 @@ func Run(c *cli.Context) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
vulns, err := scanner.ScanImage(imageName, filePath)
|
||||
timeout := c.Duration("timeout")
|
||||
scanOptions := types.ScanOptions{
|
||||
VulnType: strings.Split(c.String("vuln-type"), ","),
|
||||
Timeout: timeout,
|
||||
}
|
||||
|
||||
log.Logger.Debugf("Vulnerability type: %s", scanOptions.VulnType)
|
||||
|
||||
results, err := scanner.ScanImage(imageName, filePath, scanOptions)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in image scan: %w", err)
|
||||
}
|
||||
|
||||
var results report.Results
|
||||
severities := splitSeverity(c.String("severity"))
|
||||
ignoreFile := c.String("ignorefile")
|
||||
ignoreUnfixed := c.Bool("ignore-unfixed")
|
||||
for path, vuln := range vulns {
|
||||
results = append(results, report.Result{
|
||||
FileName: path,
|
||||
Vulnerabilities: vulnerability.FillAndFilter(vuln, severities, ignoreUnfixed),
|
||||
})
|
||||
vulnClient := vulnerability.NewClient()
|
||||
for i := range results {
|
||||
results[i].Vulnerabilities = vulnClient.FillAndFilter(results[i].Vulnerabilities,
|
||||
severities, ignoreUnfixed, ignoreFile, light)
|
||||
}
|
||||
|
||||
var writer report.Writer
|
||||
switch c.String("format") {
|
||||
case "table":
|
||||
writer = &report.TableWriter{Output: output}
|
||||
case "json":
|
||||
writer = &report.JsonWriter{Output: output}
|
||||
default:
|
||||
xerrors.New("unknown format")
|
||||
}
|
||||
|
||||
if err = writer.Write(results); err != nil {
|
||||
return xerrors.Errorf("failed to write results: %w", err)
|
||||
}
|
||||
|
||||
if err = db.SetVersion(cliVersion); err != nil {
|
||||
return xerrors.Errorf("unexpected error: %w", err)
|
||||
format := c.String("format")
|
||||
template := c.String("template")
|
||||
if err = report.WriteResults(format, output, results, template, light); err != nil {
|
||||
return xerrors.Errorf("unable to write results: %w", err)
|
||||
}
|
||||
|
||||
exitCode := c.Int("exit-code")
|
||||
@@ -186,3 +150,15 @@ func Run(c *cli.Context) (err error) {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func splitSeverity(severity string) []dbTypes.Severity {
|
||||
var severities []dbTypes.Severity
|
||||
for _, s := range strings.Split(severity, ",") {
|
||||
severity, err := dbTypes.NewSeverity(s)
|
||||
if err != nil {
|
||||
log.Logger.Warnf("unknown severity option: %s", err)
|
||||
}
|
||||
severities = append(severities, severity)
|
||||
}
|
||||
return severities
|
||||
}
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
package bundler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
const (
|
||||
dbURL = "https://github.com/rubysec/ruby-advisory-db.git"
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "ruby-advisory-db")
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
|
||||
type Advisory struct {
|
||||
Gem string
|
||||
Cve string
|
||||
Osvdb string
|
||||
Title string
|
||||
Url string
|
||||
Description string
|
||||
CvssV2 float64 `yaml:"cvss_v2"`
|
||||
CvssV3 float64 `yaml:"cvss_v3"`
|
||||
PatchedVersions []string `yaml:"patched_versions"`
|
||||
UnaffectedVersions []string `yaml:"unaffected_versions"`
|
||||
Related Related
|
||||
}
|
||||
|
||||
type Related struct {
|
||||
Cve []string
|
||||
Url []string
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return xerrors.Errorf("error in %s security DB update: %w", s.Type(), err)
|
||||
}
|
||||
s.db, err = s.walk()
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Scanner) walk() (AdvisoryDB, error) {
|
||||
advisoryDB := AdvisoryDB{}
|
||||
root := filepath.Join(repoPath, "gems")
|
||||
|
||||
var vulns []vulnerability.Vulnerability
|
||||
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
buf, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to read a file: %w", err)
|
||||
}
|
||||
|
||||
advisory := Advisory{}
|
||||
err = yaml.Unmarshal(buf, &advisory)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to unmarshal YAML: %w", err)
|
||||
}
|
||||
|
||||
// for detecting vulnerabilities
|
||||
advisories, ok := advisoryDB[advisory.Gem]
|
||||
if !ok {
|
||||
advisories = []Advisory{}
|
||||
}
|
||||
advisoryDB[advisory.Gem] = append(advisories, advisory)
|
||||
|
||||
// for displaying vulnerability detail
|
||||
var vulnerabilityID string
|
||||
if advisory.Cve != "" {
|
||||
vulnerabilityID = fmt.Sprintf("CVE-%s", advisory.Cve)
|
||||
} else if advisory.Osvdb != "" {
|
||||
vulnerabilityID = fmt.Sprintf("OSVDB-%s", advisory.Osvdb)
|
||||
}
|
||||
vulns = append(vulns, vulnerability.Vulnerability{
|
||||
ID: vulnerabilityID,
|
||||
CvssScore: advisory.CvssV2,
|
||||
CvssScoreV3: advisory.CvssV3,
|
||||
References: append([]string{advisory.Url}, advisory.Related.Url...),
|
||||
Title: advisory.Title,
|
||||
Description: advisory.Description,
|
||||
})
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in file walk: %w", err)
|
||||
}
|
||||
|
||||
if err = s.saveVulnerabilities(vulns); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return advisoryDB, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) saveVulnerabilities(vulns []vulnerability.Vulnerability) error {
|
||||
return vulnerability.BatchUpdate(func(b *bbolt.Bucket) error {
|
||||
for _, vuln := range vulns {
|
||||
if err := db.Put(b, vuln.ID, vulnerability.RubySec, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save %s vulnerability: %w", s.Type(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
@@ -1,34 +1,64 @@
|
||||
package bundler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/bundler"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/aquasecurity/go-dep-parser/pkg/bundler"
|
||||
ptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
|
||||
bundlerSrc "github.com/aquasecurity/trivy-db/pkg/vulnsrc/bundler"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
const (
|
||||
scannerType = "bundler"
|
||||
)
|
||||
|
||||
var (
|
||||
platformReplacer = strings.NewReplacer(
|
||||
"-java", "+java",
|
||||
"-mswin32", "+msin32",
|
||||
"-mswin64", "+mswin64",
|
||||
"-universal-mingw32", "+universal-mingw32",
|
||||
"-x64-mingw32", "+x64-mingw32",
|
||||
"-x86_64-mingw32", "+x86_64-mingw32",
|
||||
"-mingw32", "+mingw32",
|
||||
)
|
||||
)
|
||||
|
||||
type VulnSrc interface {
|
||||
Get(pkgName string) ([]bundlerSrc.Advisory, error)
|
||||
}
|
||||
|
||||
type Scanner struct {
|
||||
db AdvisoryDB
|
||||
vs VulnSrc
|
||||
}
|
||||
|
||||
func massageLockFileVersion(version string) string {
|
||||
// Move the platform into "metadata" semver section.
|
||||
// This is because otherwise we end up placing it in the "pre-release" section
|
||||
// of the semver value, and this breaks our version comparisons in the scanner.
|
||||
return platformReplacer.Replace(version)
|
||||
}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
return &Scanner{
|
||||
vs: bundlerSrc.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerability.DetectedVulnerability, error) {
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
for _, advisory := range s.db[pkgName] {
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]types.DetectedVulnerability, error) {
|
||||
advisories, err := s.vs.Get(pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get %s advisories: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, advisory := range advisories {
|
||||
if utils.MatchVersions(pkgVer, advisory.PatchedVersions) {
|
||||
continue
|
||||
}
|
||||
@@ -36,17 +66,9 @@ func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerabili
|
||||
continue
|
||||
}
|
||||
|
||||
var vulnerabilityID string
|
||||
if advisory.Cve != "" {
|
||||
vulnerabilityID = fmt.Sprintf("CVE-%s", advisory.Cve)
|
||||
} else if advisory.Osvdb != "" {
|
||||
vulnerabilityID = fmt.Sprintf("OSVDB-%s", advisory.Osvdb)
|
||||
}
|
||||
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
VulnerabilityID: vulnerabilityID,
|
||||
PkgName: strings.TrimSpace(advisory.Gem),
|
||||
Title: strings.TrimSpace(advisory.Title),
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.VulnerabilityID,
|
||||
PkgName: strings.TrimSpace(pkgName),
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: strings.Join(advisory.PatchedVersions, ", "),
|
||||
}
|
||||
@@ -60,6 +82,11 @@ func (s *Scanner) ParseLockfile(f *os.File) ([]ptypes.Library, error) {
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("invalid Gemfile.lock format: %w", err)
|
||||
}
|
||||
|
||||
for _, lib := range libs {
|
||||
lib.Version = massageLockFileVersion(lib.Version)
|
||||
}
|
||||
|
||||
return libs, nil
|
||||
}
|
||||
|
||||
|
||||
63
pkg/scanner/library/bundler/scan_test.go
Normal file
63
pkg/scanner/library/bundler/scan_test.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package bundler
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
|
||||
bundlerSrc "github.com/aquasecurity/trivy-db/pkg/vulnsrc/bundler"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
)
|
||||
|
||||
type MockVulnSrc struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
||||
func (_m *MockVulnSrc) Get(pkgName string) ([]bundlerSrc.Advisory, error) {
|
||||
ret := _m.Called(pkgName)
|
||||
ret0 := ret.Get(0)
|
||||
if ret0 == nil {
|
||||
return nil, ret.Error(1)
|
||||
}
|
||||
advisories, ok := ret0.([]bundlerSrc.Advisory)
|
||||
if !ok {
|
||||
return nil, ret.Error(1)
|
||||
}
|
||||
return advisories, ret.Error(1)
|
||||
}
|
||||
|
||||
func TestScanner_Detect(t *testing.T) {
|
||||
log.InitLogger(false, true)
|
||||
t.Run("Issue #108", func(t *testing.T) {
|
||||
// https://github.com/aquasecurity/trivy/issues/108
|
||||
// Validate that the massaging that happens when parsing the lockfile
|
||||
// allows us to better handle the platform metadata
|
||||
mockVulnSrc := new(MockVulnSrc)
|
||||
mockVulnSrc.On("Get", "ffi").Return(
|
||||
[]bundlerSrc.Advisory{
|
||||
{
|
||||
VulnerabilityID: "NotDetected",
|
||||
PatchedVersions: []string{">= 1.9.24"},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "Detected",
|
||||
PatchedVersions: []string{">= 1.9.26"},
|
||||
},
|
||||
}, nil)
|
||||
s := Scanner{
|
||||
vs: mockVulnSrc,
|
||||
}
|
||||
|
||||
versionStr := "1.9.25-x64-mingw32"
|
||||
versionStr = platformReplacer.Replace(versionStr)
|
||||
|
||||
v, _ := version.NewVersion(versionStr)
|
||||
|
||||
vulns, err := s.Detect("ffi", v)
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 1, len(vulns))
|
||||
})
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
package cargo
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/BurntSushi/toml"
|
||||
|
||||
"github.com/etcd-io/bbolt"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/git"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
dbURL = "https://github.com/RustSec/advisory-db.git"
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "rust-advisory-db")
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Lockfile
|
||||
|
||||
type Lockfile struct {
|
||||
Advisory `toml:"advisory"`
|
||||
}
|
||||
|
||||
type Advisory struct {
|
||||
Id string
|
||||
Package string
|
||||
Title string `toml:"title"`
|
||||
Url string
|
||||
Date string
|
||||
Description string
|
||||
Keywords []string
|
||||
PatchedVersions []string `toml:"patched_versions"`
|
||||
AffectedFunctions []string `toml:"affected_functions"`
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return xerrors.Errorf("error in %s security DB update: %w", s.Type(), err)
|
||||
}
|
||||
s.db, err = s.walk()
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Scanner) walk() (AdvisoryDB, error) {
|
||||
advisoryDB := AdvisoryDB{}
|
||||
root := filepath.Join(repoPath, "crates")
|
||||
|
||||
var vulns []vulnerability.Vulnerability
|
||||
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
buf, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to read a file: %w", err)
|
||||
}
|
||||
|
||||
advisory := Lockfile{}
|
||||
err = toml.Unmarshal(buf, &advisory)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to unmarshal TOML: %w", err)
|
||||
}
|
||||
|
||||
// for detecting vulnerabilities
|
||||
advisories, ok := advisoryDB[advisory.Package]
|
||||
if !ok {
|
||||
advisories = []Lockfile{}
|
||||
}
|
||||
advisoryDB[advisory.Package] = append(advisories, advisory)
|
||||
|
||||
// for displaying vulnerability detail
|
||||
vulns = append(vulns, vulnerability.Vulnerability{
|
||||
ID: advisory.Id,
|
||||
References: []string{advisory.Url},
|
||||
Title: advisory.Title,
|
||||
Description: advisory.Description,
|
||||
})
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in file walk: %w", err)
|
||||
}
|
||||
|
||||
if err = s.saveVulnerabilities(vulns); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return advisoryDB, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) saveVulnerabilities(vulns []vulnerability.Vulnerability) error {
|
||||
return vulnerability.BatchUpdate(func(b *bbolt.Bucket) error {
|
||||
for _, vuln := range vulns {
|
||||
if err := db.Put(b, vuln.ID, vulnerability.RustSec, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save %s vulnerability: %w", s.Type(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
@@ -4,12 +4,13 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
|
||||
"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"
|
||||
cargoSrc "github.com/aquasecurity/trivy-db/pkg/vulnsrc/cargo"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
@@ -18,24 +19,30 @@ const (
|
||||
)
|
||||
|
||||
type Scanner struct {
|
||||
db AdvisoryDB
|
||||
vs cargoSrc.VulnSrc
|
||||
}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
return &Scanner{
|
||||
vs: cargoSrc.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerability.DetectedVulnerability, error) {
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
for _, advisory := range s.db[pkgName] {
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]types.DetectedVulnerability, error) {
|
||||
advisories, err := s.vs.Get(pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get %s advisories: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, advisory := range advisories {
|
||||
if utils.MatchVersions(pkgVer, advisory.PatchedVersions) {
|
||||
continue
|
||||
}
|
||||
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.Id,
|
||||
PkgName: strings.TrimSpace(advisory.Package),
|
||||
Title: strings.TrimSpace(advisory.Title),
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.VulnerabilityID,
|
||||
PkgName: strings.TrimSpace(pkgName),
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: strings.Join(advisory.PatchedVersions, ", "),
|
||||
}
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
package composer
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"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/knqyf263/trivy/pkg/git"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
const (
|
||||
dbURL = "https://github.com/FriendsOfPHP/security-advisories"
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "php-security-advisories")
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
|
||||
type Advisory struct {
|
||||
Cve string
|
||||
Title string
|
||||
Link string
|
||||
Reference string
|
||||
Branches map[string]Branch
|
||||
}
|
||||
|
||||
type Branch struct {
|
||||
Versions []string
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return err
|
||||
}
|
||||
s.db, err = s.walk()
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Scanner) walk() (AdvisoryDB, error) {
|
||||
advisoryDB := AdvisoryDB{}
|
||||
var vulns []vulnerability.Vulnerability
|
||||
err := filepath.Walk(repoPath, func(path string, info os.FileInfo, err error) error {
|
||||
if info.IsDir() || !strings.HasPrefix(info.Name(), "CVE-") {
|
||||
return nil
|
||||
}
|
||||
buf, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
advisory := Advisory{}
|
||||
err = yaml.Unmarshal(buf, &advisory)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// for detecting vulnerabilities
|
||||
advisories, ok := advisoryDB[advisory.Reference]
|
||||
if !ok {
|
||||
advisories = []Advisory{}
|
||||
}
|
||||
advisoryDB[advisory.Reference] = append(advisories, advisory)
|
||||
|
||||
// for displaying vulnerability detail
|
||||
vulns = append(vulns, vulnerability.Vulnerability{
|
||||
ID: advisory.Cve,
|
||||
References: []string{advisory.Link},
|
||||
Title: advisory.Title,
|
||||
})
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in file walk: %w", err)
|
||||
}
|
||||
if err = s.saveVulnerabilities(vulns); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return advisoryDB, nil
|
||||
}
|
||||
|
||||
func (s Scanner) saveVulnerabilities(vulns []vulnerability.Vulnerability) error {
|
||||
return vulnerability.BatchUpdate(func(b *bbolt.Bucket) error {
|
||||
for _, vuln := range vulns {
|
||||
if err := db.Put(b, vuln.ID, vulnerability.PhpSecurityAdvisories, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save %s vulnerability: %w", s.Type(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
@@ -5,14 +5,15 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
|
||||
"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"
|
||||
composerSrc "github.com/aquasecurity/trivy-db/pkg/vulnsrc/composer"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -20,17 +21,24 @@ const (
|
||||
)
|
||||
|
||||
type Scanner struct {
|
||||
db AdvisoryDB
|
||||
vs composerSrc.VulnSrc
|
||||
}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
return &Scanner{
|
||||
vs: composerSrc.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerability.DetectedVulnerability, error) {
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]types.DetectedVulnerability, error) {
|
||||
ref := fmt.Sprintf("composer://%s", pkgName)
|
||||
for _, advisory := range s.db[ref] {
|
||||
advisories, err := s.vs.Get(ref)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get %s advisories: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, advisory := range advisories {
|
||||
var affectedVersions []string
|
||||
var patchedVersions []string
|
||||
for _, branch := range advisory.Branches {
|
||||
@@ -46,10 +54,9 @@ func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerabili
|
||||
continue
|
||||
}
|
||||
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.Cve,
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.VulnerabilityID,
|
||||
PkgName: pkgName,
|
||||
Title: strings.TrimSpace(advisory.Title),
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: strings.Join(patchedVersions, ", "),
|
||||
}
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
package node
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"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/knqyf263/trivy/pkg/git"
|
||||
)
|
||||
|
||||
const (
|
||||
dbURL = "https://github.com/nodejs/security-wg.git"
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "nodejs-security-wg")
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
|
||||
type Advisory struct {
|
||||
ID int
|
||||
Title string
|
||||
ModuleName string `json:"module_name""`
|
||||
Cves []string
|
||||
VulnerableVersions string `json:"vulnerable_versions"`
|
||||
PatchedVersions string `json:"patched_versions"`
|
||||
Overview string
|
||||
Recommendation string
|
||||
References []string
|
||||
CvssScoreNumber json.Number `json:"cvss_score"`
|
||||
CvssScore float64
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return err
|
||||
}
|
||||
s.db, err = s.walk()
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Scanner) walk() (AdvisoryDB, error) {
|
||||
advisoryDB := AdvisoryDB{}
|
||||
var vulns []vulnerability.Vulnerability
|
||||
err := filepath.Walk(filepath.Join(repoPath, "vuln"), func(path string, info os.FileInfo, err error) error {
|
||||
if info.IsDir() || !strings.HasSuffix(info.Name(), ".json") {
|
||||
return nil
|
||||
}
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
advisory := Advisory{}
|
||||
if err = json.NewDecoder(f).Decode(&advisory); err != nil {
|
||||
return err
|
||||
}
|
||||
advisory.ModuleName = strings.ToLower(advisory.ModuleName)
|
||||
|
||||
// `cvss_score` returns float or string like "4.8 (MEDIUM)"
|
||||
s := strings.Split(advisory.CvssScoreNumber.String(), " ")
|
||||
advisory.CvssScore, err = strconv.ParseFloat(s[0], 64)
|
||||
if err != nil {
|
||||
advisory.CvssScore = -1
|
||||
}
|
||||
|
||||
// for detecting vulnerabilities
|
||||
advisories, ok := advisoryDB[advisory.ModuleName]
|
||||
if !ok {
|
||||
advisories = []Advisory{}
|
||||
}
|
||||
advisoryDB[advisory.ModuleName] = append(advisories, advisory)
|
||||
|
||||
// for displaying vulnerability detail
|
||||
vulnerabilityIDs := advisory.Cves
|
||||
if len(vulnerabilityIDs) == 0 {
|
||||
vulnerabilityIDs = []string{fmt.Sprintf("NSWG-ECO-%d", advisory.ID)}
|
||||
}
|
||||
for _, vulnID := range vulnerabilityIDs {
|
||||
vulns = append(vulns, vulnerability.Vulnerability{
|
||||
ID: vulnID,
|
||||
CvssScore: advisory.CvssScore,
|
||||
References: advisory.References,
|
||||
Title: advisory.Title,
|
||||
Description: advisory.Overview,
|
||||
})
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in file walk: %w", err)
|
||||
}
|
||||
if err = s.saveVulnerabilities(vulns); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return advisoryDB, nil
|
||||
}
|
||||
|
||||
func (s Scanner) saveVulnerabilities(vulns []vulnerability.Vulnerability) error {
|
||||
return vulnerability.BatchUpdate(func(b *bbolt.Bucket) error {
|
||||
for _, vuln := range vulns {
|
||||
if err := db.Put(b, vuln.ID, vulnerability.NodejsSecurityWg, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save %s vulnerability: %w", s.Type(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
@@ -1,19 +1,18 @@
|
||||
package node
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
version "github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/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-db/pkg/vulnsrc/node"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -22,18 +21,26 @@ const (
|
||||
)
|
||||
|
||||
type Scanner struct {
|
||||
db AdvisoryDB
|
||||
scannerType string
|
||||
vs node.VulnSrc
|
||||
}
|
||||
|
||||
func NewScanner(scannerType string) *Scanner {
|
||||
return &Scanner{scannerType: scannerType}
|
||||
return &Scanner{
|
||||
scannerType: scannerType,
|
||||
vs: node.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerability.DetectedVulnerability, error) {
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]types.DetectedVulnerability, error) {
|
||||
replacer := strings.NewReplacer(".alpha", "-alpha", ".beta", "-beta", ".rc", "-rc", " <", ", <", " >", ", >")
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
for _, advisory := range s.db[pkgName] {
|
||||
advisories, err := s.vs.Get(pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get %s advisories: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, advisory := range advisories {
|
||||
// e.g. <= 2.15.0 || >= 3.0.0 <= 3.8.2
|
||||
// => {"<=2.15.0", ">= 3.0.0, <= 3.8.2"}
|
||||
var vulnerableVersions []string
|
||||
@@ -56,20 +63,13 @@ func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerabili
|
||||
continue
|
||||
}
|
||||
|
||||
if len(advisory.Cves) == 0 {
|
||||
advisory.Cves = []string{fmt.Sprintf("NSWG-ECO-%d", advisory.ID)}
|
||||
}
|
||||
|
||||
for _, cveID := range advisory.Cves {
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
VulnerabilityID: cveID,
|
||||
PkgName: pkgName,
|
||||
Title: strings.TrimSpace(advisory.Title),
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: strings.Join(patchedVersions, ", "),
|
||||
}
|
||||
vulns = append(vulns, vuln)
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.VulnerabilityID,
|
||||
PkgName: pkgName,
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: strings.Join(patchedVersions, ", "),
|
||||
}
|
||||
vulns = append(vulns, vuln)
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
package pipenv
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"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/knqyf263/trivy/pkg/git"
|
||||
)
|
||||
|
||||
const (
|
||||
dbURL = "https://github.com/pyupio/safety-db.git"
|
||||
)
|
||||
|
||||
var (
|
||||
repoPath = filepath.Join(utils.CacheDir(), "python-safety-db")
|
||||
)
|
||||
|
||||
type AdvisoryDB map[string][]Advisory
|
||||
|
||||
type Advisory struct {
|
||||
ID string
|
||||
Advisory string
|
||||
Cve string
|
||||
Specs []string
|
||||
Version string `json:"v"`
|
||||
}
|
||||
|
||||
func (s *Scanner) UpdateDB() (err error) {
|
||||
if _, err := git.CloneOrPull(dbURL, repoPath); err != nil {
|
||||
return err
|
||||
}
|
||||
s.db, err = s.parse()
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to parse python safety-db: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Scanner) parse() (AdvisoryDB, error) {
|
||||
advisoryDB := AdvisoryDB{}
|
||||
f, err := os.Open(filepath.Join(repoPath, "data", "insecure_full.json"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
// for detecting vulnerabilities
|
||||
if err = json.NewDecoder(f).Decode(&advisoryDB); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// for displaying vulnerability detail
|
||||
var vulns []vulnerability.Vulnerability
|
||||
for _, advisories := range advisoryDB {
|
||||
for _, advisory := range advisories {
|
||||
vulnerabilityID := advisory.Cve
|
||||
if vulnerabilityID == "" {
|
||||
vulnerabilityID = advisory.ID
|
||||
}
|
||||
vulns = append(vulns, vulnerability.Vulnerability{
|
||||
ID: vulnerabilityID,
|
||||
Title: advisory.Advisory,
|
||||
})
|
||||
}
|
||||
}
|
||||
if err = s.saveVulnerabilities(vulns); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return advisoryDB, nil
|
||||
}
|
||||
|
||||
func (s Scanner) saveVulnerabilities(vulns []vulnerability.Vulnerability) error {
|
||||
return vulnerability.BatchUpdate(func(b *bbolt.Bucket) error {
|
||||
for _, vuln := range vulns {
|
||||
if err := db.Put(b, vuln.ID, vulnerability.PythonSafetyDB, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save %s vulnerability: %w", s.Type(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
package pipenv
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/go-dep-parser/pkg/pipenv"
|
||||
ptypes "github.com/knqyf263/go-dep-parser/pkg/types"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
scannerType = "pipenv"
|
||||
)
|
||||
|
||||
type Scanner struct {
|
||||
db AdvisoryDB
|
||||
}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]vulnerability.DetectedVulnerability, error) {
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
for _, advisory := range s.db[pkgName] {
|
||||
if !utils.MatchVersions(pkgVer, advisory.Specs) {
|
||||
continue
|
||||
}
|
||||
|
||||
vulnerabilityID := advisory.Cve
|
||||
if vulnerabilityID == "" {
|
||||
vulnerabilityID = advisory.ID
|
||||
}
|
||||
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
VulnerabilityID: vulnerabilityID,
|
||||
PkgName: pkgName,
|
||||
Title: strings.TrimSpace(advisory.Advisory),
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: createFixedVersions(advisory.Specs),
|
||||
}
|
||||
vulns = append(vulns, vuln)
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func createFixedVersions(specs []string) string {
|
||||
var fixedVersions []string
|
||||
for _, spec := range specs {
|
||||
for _, s := range strings.Split(spec, ",") {
|
||||
if !strings.HasPrefix(s, "<=") && strings.HasPrefix(s, "<") {
|
||||
fixedVersions = append(fixedVersions, strings.TrimPrefix(s, "<"))
|
||||
}
|
||||
}
|
||||
}
|
||||
return strings.Join(fixedVersions, ", ")
|
||||
}
|
||||
|
||||
func (s *Scanner) ParseLockfile(f *os.File) ([]ptypes.Library, error) {
|
||||
libs, err := pipenv.Parse(f)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("invalid Pipfile.lock format: %w", err)
|
||||
}
|
||||
return libs, nil
|
||||
}
|
||||
func (s *Scanner) Type() string {
|
||||
return scannerType
|
||||
}
|
||||
96
pkg/scanner/library/python/scan.go
Normal file
96
pkg/scanner/library/python/scan.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package python
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/python"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"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/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/go-version"
|
||||
)
|
||||
|
||||
const (
|
||||
ScannerTypePipenv = "pipenv"
|
||||
ScannerTypePoetry = "poetry"
|
||||
)
|
||||
|
||||
type Scanner struct {
|
||||
scannerType string
|
||||
vs python.VulnSrc
|
||||
}
|
||||
|
||||
func NewScanner(scannerType string) *Scanner {
|
||||
return &Scanner{
|
||||
scannerType: scannerType,
|
||||
vs: python.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(pkgName string, pkgVer *version.Version) ([]types.DetectedVulnerability, error) {
|
||||
advisories, err := s.vs.Get(pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get %s advisories: %w", s.Type(), err)
|
||||
}
|
||||
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, advisory := range advisories {
|
||||
if !utils.MatchVersions(pkgVer, advisory.Specs) {
|
||||
continue
|
||||
}
|
||||
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: advisory.VulnerabilityID,
|
||||
PkgName: pkgName,
|
||||
InstalledVersion: pkgVer.String(),
|
||||
FixedVersion: createFixedVersions(advisory.Specs),
|
||||
}
|
||||
vulns = append(vulns, vuln)
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func createFixedVersions(specs []string) string {
|
||||
var fixedVersions []string
|
||||
for _, spec := range specs {
|
||||
for _, s := range strings.Split(spec, ",") {
|
||||
if !strings.HasPrefix(s, "<=") && strings.HasPrefix(s, "<") {
|
||||
fixedVersions = append(fixedVersions, strings.TrimPrefix(s, "<"))
|
||||
}
|
||||
}
|
||||
}
|
||||
return strings.Join(fixedVersions, ", ")
|
||||
}
|
||||
|
||||
func (s *Scanner) ParseLockfile(f *os.File) ([]ptypes.Library, error) {
|
||||
if s.Type() == ScannerTypePipenv {
|
||||
return s.parsePipenv(f)
|
||||
}
|
||||
return s.parsePoetry(f)
|
||||
}
|
||||
|
||||
func (s *Scanner) parsePipenv(f *os.File) ([]ptypes.Library, error) {
|
||||
libs, err := pipenv.Parse(f)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("invalid Pipfile.lock format: %w", err)
|
||||
}
|
||||
return libs, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) parsePoetry(f *os.File) ([]ptypes.Library, error) {
|
||||
libs, err := poetry.Parse(f)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("invalid poetry.lock format: %w", err)
|
||||
}
|
||||
return libs, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) Type() string {
|
||||
return s.scannerType
|
||||
}
|
||||
@@ -4,31 +4,30 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/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/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/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"
|
||||
"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/pipenv"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
type Scanner interface {
|
||||
UpdateDB() error
|
||||
ParseLockfile(*os.File) ([]ptypes.Library, error)
|
||||
Detect(string, *version.Version) ([]vulnerability.DetectedVulnerability, error)
|
||||
Detect(string, *version.Version) ([]types.DetectedVulnerability, error)
|
||||
Type() string
|
||||
}
|
||||
|
||||
@@ -46,20 +45,22 @@ func NewScanner(filename string) Scanner {
|
||||
case "yarn.lock":
|
||||
scanner = node.NewScanner(node.ScannerTypeYarn)
|
||||
case "Pipfile.lock":
|
||||
scanner = pipenv.NewScanner()
|
||||
scanner = python.NewScanner(python.ScannerTypePipenv)
|
||||
case "poetry.lock":
|
||||
scanner = python.NewScanner(python.ScannerTypePoetry)
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
return scanner
|
||||
}
|
||||
|
||||
func Scan(files extractor.FileMap) (map[string][]vulnerability.DetectedVulnerability, error) {
|
||||
func Scan(files extractor.FileMap, scanOptions types.ScanOptions) (map[string][]types.DetectedVulnerability, error) {
|
||||
results, err := analyzer.GetLibraries(files)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to analyze libraries: %w", err)
|
||||
}
|
||||
|
||||
vulnerabilities := map[string][]vulnerability.DetectedVulnerability{}
|
||||
vulnerabilities := map[string][]types.DetectedVulnerability{}
|
||||
for path, pkgs := range results {
|
||||
log.Logger.Debugf("Detecting library vulnerabilities, path: %s", path)
|
||||
scanner := NewScanner(filepath.Base(string(path)))
|
||||
@@ -72,14 +73,12 @@ func Scan(files extractor.FileMap) (map[string][]vulnerability.DetectedVulnerabi
|
||||
return nil, xerrors.Errorf("failed to scan %s vulnerabilities: %w", scanner.Type(), err)
|
||||
}
|
||||
|
||||
if len(vulns) != 0 {
|
||||
vulnerabilities[string(path)] = vulns
|
||||
}
|
||||
vulnerabilities[string(path)] = vulns
|
||||
}
|
||||
return vulnerabilities, nil
|
||||
}
|
||||
|
||||
func ScanFile(f *os.File) ([]vulnerability.DetectedVulnerability, error) {
|
||||
func ScanFile(f *os.File) ([]types.DetectedVulnerability, error) {
|
||||
scanner := NewScanner(filepath.Base(f.Name()))
|
||||
if scanner == nil {
|
||||
return nil, xerrors.New("unknown file type")
|
||||
@@ -97,15 +96,9 @@ func ScanFile(f *os.File) ([]vulnerability.DetectedVulnerability, error) {
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func scan(scanner Scanner, pkgs []ptypes.Library) ([]vulnerability.DetectedVulnerability, error) {
|
||||
log.Logger.Infof("Updating %s Security DB...", scanner.Type())
|
||||
err := scanner.UpdateDB()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to update %s advisories: %w", scanner.Type(), err)
|
||||
}
|
||||
|
||||
func scan(scanner Scanner, pkgs []ptypes.Library) ([]types.DetectedVulnerability, error) {
|
||||
log.Logger.Infof("Detecting %s vulnerabilities...", scanner.Type())
|
||||
var vulnerabilities []vulnerability.DetectedVulnerability
|
||||
var vulnerabilities []types.DetectedVulnerability
|
||||
for _, pkg := range pkgs {
|
||||
v, err := version.NewVersion(pkg.Version)
|
||||
if err != nil {
|
||||
|
||||
@@ -2,27 +2,54 @@ package alpine
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
"time"
|
||||
|
||||
version "github.com/knqyf263/go-rpm-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/alpine"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/alpine"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
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),
|
||||
}
|
||||
)
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
type Scanner struct {
|
||||
vs dbTypes.VulnSrc
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability.DetectedVulnerability, error) {
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{
|
||||
vs: alpine.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]types.DetectedVulnerability, error) {
|
||||
log.Logger.Info("Detecting Alpine vulnerabilities...")
|
||||
if strings.Count(osVer, ".") > 1 {
|
||||
osVer = osVer[:strings.LastIndex(osVer, ".")]
|
||||
@@ -30,9 +57,9 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
log.Logger.Debugf("alpine: os version: %s", osVer)
|
||||
log.Logger.Debugf("alpine: the number of packages: %d", len(pkgs))
|
||||
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, pkg := range pkgs {
|
||||
advisories, err := alpine.Get(osVer, pkg.Name)
|
||||
advisories, err := s.vs.Get(osVer, pkg.Name)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get alpine advisories: %w", err)
|
||||
}
|
||||
@@ -43,7 +70,7 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
for _, adv := range advisories {
|
||||
fixedVersion := version.NewVersion(adv.FixedVersion)
|
||||
if installedVersion.LessThan(fixedVersion) {
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: adv.VulnerabilityID,
|
||||
PkgName: pkg.Name,
|
||||
InstalledVersion: installed,
|
||||
@@ -55,3 +82,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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
82
pkg/scanner/ospkg/amazon/amazon.go
Normal file
82
pkg/scanner/ospkg/amazon/amazon.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package amazon
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
version "github.com/knqyf263/go-deb-version"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/amazon"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
type Scanner struct {
|
||||
l *zap.SugaredLogger
|
||||
ac dbTypes.VulnSrc
|
||||
}
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{
|
||||
l: log.Logger,
|
||||
ac: amazon.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]types.DetectedVulnerability, error) {
|
||||
log.Logger.Info("Detecting Amazon Linux vulnerabilities...")
|
||||
|
||||
osVer = strings.Fields(osVer)[0]
|
||||
if osVer != "2" {
|
||||
osVer = "1"
|
||||
}
|
||||
log.Logger.Debugf("amazon: os version: %s", osVer)
|
||||
log.Logger.Debugf("amazon: the number of packages: %d", len(pkgs))
|
||||
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, pkg := range pkgs {
|
||||
advisories, err := s.ac.Get(osVer, pkg.Name)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get amazon advisories: %w", err)
|
||||
}
|
||||
|
||||
installed := utils.FormatVersion(pkg)
|
||||
if installed == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
installedVersion, err := version.NewVersion(installed)
|
||||
if err != nil {
|
||||
log.Logger.Debugf("failed to parse Amazon Linux installed package version: %s", err)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, adv := range advisories {
|
||||
fixedVersion, err := version.NewVersion(adv.FixedVersion)
|
||||
if err != nil {
|
||||
log.Logger.Debugf("failed to parse Amazon Linux package version: %s", err)
|
||||
continue
|
||||
}
|
||||
|
||||
if installedVersion.LessThan(fixedVersion) {
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: adv.VulnerabilityID,
|
||||
PkgName: pkg.Name,
|
||||
InstalledVersion: installed,
|
||||
FixedVersion: adv.FixedVersion,
|
||||
}
|
||||
vulns = append(vulns, vuln)
|
||||
}
|
||||
}
|
||||
}
|
||||
return vulns, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) IsSupportedVersion(osFamily, osVer string) bool {
|
||||
return true
|
||||
}
|
||||
168
pkg/scanner/ospkg/amazon/amazon_test.go
Normal file
168
pkg/scanner/ospkg/amazon/amazon_test.go
Normal file
@@ -0,0 +1,168 @@
|
||||
package amazon
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
"go.uber.org/zap/zaptest/observer"
|
||||
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
type MockAmazonConfig struct {
|
||||
update func(string) error
|
||||
get func(string, string) ([]dbTypes.Advisory, error)
|
||||
}
|
||||
|
||||
func (mac MockAmazonConfig) Update(a string) error {
|
||||
if mac.update != nil {
|
||||
return mac.update(a)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mac MockAmazonConfig) Get(a string, b string) ([]dbTypes.Advisory, error) {
|
||||
if mac.get != nil {
|
||||
return mac.get(a, b)
|
||||
}
|
||||
return []dbTypes.Advisory{}, nil
|
||||
}
|
||||
|
||||
func TestScanner_Detect(t *testing.T) {
|
||||
t.Run("happy path", func(t *testing.T) {
|
||||
zc, recorder := observer.New(zapcore.DebugLevel)
|
||||
log.Logger = zap.New(zc).Sugar()
|
||||
s := &Scanner{
|
||||
l: log.Logger,
|
||||
ac: MockAmazonConfig{
|
||||
get: func(s string, s2 string) (advisories []dbTypes.Advisory, e error) {
|
||||
return []dbTypes.Advisory{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
FixedVersion: "3.0.0",
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
vuls, err := s.Detect("3.1.0", []analyzer.Package{
|
||||
{
|
||||
Name: "testpkg",
|
||||
Version: "2.1.0",
|
||||
Release: "hotfix",
|
||||
SrcRelease: "test-hotfix",
|
||||
SrcVersion: "2.1.0",
|
||||
},
|
||||
{
|
||||
Name: "foopkg",
|
||||
},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
PkgName: "testpkg",
|
||||
InstalledVersion: "2.1.0-hotfix",
|
||||
FixedVersion: "3.0.0",
|
||||
},
|
||||
}, vuls)
|
||||
|
||||
loggedMessages := getAllLoggedLogs(recorder)
|
||||
assert.Contains(t, loggedMessages, "amazon: os version: 1")
|
||||
assert.Contains(t, loggedMessages, "amazon: the number of packages: 2")
|
||||
})
|
||||
|
||||
t.Run("get vulnerabilities fails to fetch", func(t *testing.T) {
|
||||
_ = log.InitLogger(true, false)
|
||||
s := &Scanner{
|
||||
l: log.Logger,
|
||||
ac: MockAmazonConfig{
|
||||
get: func(s string, s2 string) (advisories []dbTypes.Advisory, e error) {
|
||||
return nil, errors.New("failed to fetch advisories")
|
||||
},
|
||||
},
|
||||
}
|
||||
vuls, err := s.Detect("foo", []analyzer.Package{
|
||||
{
|
||||
Name: "testpkg",
|
||||
},
|
||||
})
|
||||
assert.Equal(t, "failed to get amazon advisories: failed to fetch advisories", err.Error())
|
||||
assert.Empty(t, vuls)
|
||||
})
|
||||
|
||||
t.Run("invalid installed package version", func(t *testing.T) {
|
||||
zc, recorder := observer.New(zapcore.DebugLevel)
|
||||
log.Logger = zap.New(zc).Sugar()
|
||||
s := &Scanner{
|
||||
l: log.Logger,
|
||||
ac: MockAmazonConfig{
|
||||
get: func(s string, s2 string) (advisories []dbTypes.Advisory, e error) {
|
||||
return []dbTypes.Advisory{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
FixedVersion: "3.0.0",
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
vuls, err := s.Detect("3.1.0", []analyzer.Package{
|
||||
{
|
||||
Name: "testpkg",
|
||||
Version: "badsourceversion",
|
||||
},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []types.DetectedVulnerability(nil), vuls)
|
||||
loggedMessages := getAllLoggedLogs(recorder)
|
||||
assert.Contains(t, loggedMessages, "failed to parse Amazon Linux installed package version: upstream_version must start with digit")
|
||||
})
|
||||
|
||||
t.Run("invalid fixed package version", func(t *testing.T) {
|
||||
zc, recorder := observer.New(zapcore.DebugLevel)
|
||||
log.Logger = zap.New(zc).Sugar()
|
||||
s := &Scanner{
|
||||
l: log.Logger,
|
||||
ac: MockAmazonConfig{
|
||||
get: func(s string, s2 string) (advisories []dbTypes.Advisory, e error) {
|
||||
return []dbTypes.Advisory{
|
||||
{
|
||||
VulnerabilityID: "123",
|
||||
FixedVersion: "thisisbadversioning",
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
vuls, err := s.Detect("3.1.0", []analyzer.Package{
|
||||
{
|
||||
Name: "testpkg",
|
||||
Version: "3.1.0",
|
||||
},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []types.DetectedVulnerability(nil), vuls)
|
||||
loggedMessages := getAllLoggedLogs(recorder)
|
||||
assert.Contains(t, loggedMessages, "failed to parse Amazon Linux package version: upstream_version must start with digit")
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func getAllLoggedLogs(recorder *observer.ObservedLogs) []string {
|
||||
allLogs := recorder.AllUntimed()
|
||||
var loggedMessages []string
|
||||
for _, l := range allLogs {
|
||||
loggedMessages = append(loggedMessages, l.Message)
|
||||
}
|
||||
return loggedMessages
|
||||
}
|
||||
@@ -2,39 +2,68 @@ package debian
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/debian"
|
||||
debianoval "github.com/aquasecurity/trivy-db/pkg/vulnsrc/debian-oval"
|
||||
|
||||
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/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"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
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),
|
||||
}
|
||||
)
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
type Scanner struct {
|
||||
ovalVs dbTypes.VulnSrc
|
||||
vs dbTypes.VulnSrc
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability.DetectedVulnerability, error) {
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{
|
||||
ovalVs: debianoval.NewVulnSrc(),
|
||||
vs: debian.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]types.DetectedVulnerability, error) {
|
||||
log.Logger.Info("Detecting Debian vulnerabilities...")
|
||||
|
||||
if strings.Count(osVer, ".") > 0 {
|
||||
osVer = osVer[:strings.Index(osVer, ".")]
|
||||
}
|
||||
log.Logger.Debugf("debian: os version: %s", osVer)
|
||||
log.Logger.Debugf("debian: the number of packages: %s", len(pkgs))
|
||||
log.Logger.Debugf("debian: the number of packages: %d", len(pkgs))
|
||||
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, pkg := range pkgs {
|
||||
advisories, err := debianoval.Get(osVer, pkg.SrcName)
|
||||
advisories, err := s.ovalVs.Get(osVer, pkg.SrcName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get debian OVAL: %w", err)
|
||||
}
|
||||
@@ -54,7 +83,7 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
}
|
||||
|
||||
if installedVersion.LessThan(fixedVersion) {
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: adv.VulnerabilityID,
|
||||
PkgName: pkg.Name,
|
||||
InstalledVersion: installed,
|
||||
@@ -63,12 +92,12 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
vulns = append(vulns, vuln)
|
||||
}
|
||||
}
|
||||
advisories, err = debian.Get(osVer, pkg.SrcName)
|
||||
advisories, err = s.vs.Get(osVer, pkg.SrcName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get debian advisory: %w", err)
|
||||
}
|
||||
for _, adv := range advisories {
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: adv.VulnerabilityID,
|
||||
PkgName: pkg.Name,
|
||||
InstalledVersion: installed,
|
||||
@@ -78,3 +107,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,33 +2,62 @@ package redhat
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/redhat"
|
||||
|
||||
"github.com/knqyf263/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/redhat"
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/analyzer/os"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
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),
|
||||
}
|
||||
)
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
type Scanner struct {
|
||||
vs dbTypes.VulnSrc
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability.DetectedVulnerability, error) {
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{
|
||||
vs: redhat.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]types.DetectedVulnerability, error) {
|
||||
log.Logger.Info("Detecting RHEL/CentOS vulnerabilities...")
|
||||
if strings.Count(osVer, ".") > 0 {
|
||||
osVer = osVer[:strings.Index(osVer, ".")]
|
||||
}
|
||||
log.Logger.Debugf("redhat: os version: %s", osVer)
|
||||
log.Logger.Debugf("redhat: the number of packages: %s", len(pkgs))
|
||||
log.Logger.Debugf("redhat: the number of packages: %d", len(pkgs))
|
||||
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, pkg := range pkgs {
|
||||
advisories, err := redhat.Get(osVer, pkg.SrcName)
|
||||
advisories, err := s.vs.Get(osVer, pkg.SrcName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get Red Hat advisories: %w", err)
|
||||
}
|
||||
@@ -38,13 +67,13 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
for _, adv := range advisories {
|
||||
fixedVersion := version.NewVersion(adv.FixedVersion)
|
||||
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: adv.VulnerabilityID,
|
||||
PkgName: pkg.Name,
|
||||
InstalledVersion: installed,
|
||||
}
|
||||
if installedVersion.LessThan(fixedVersion) {
|
||||
vuln.FixedVersion = adv.FixedVersion
|
||||
vuln.FixedVersion = fixedVersion.String()
|
||||
vulns = append(vulns, vuln)
|
||||
} else if adv.FixedVersion == "" {
|
||||
vulns = append(vulns, vuln)
|
||||
@@ -53,3 +82,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,29 +1,34 @@
|
||||
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/debianbase"
|
||||
_ "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"
|
||||
ftypes "github.com/aquasecurity/fanal/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg/alpine"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/ospkg/amazon"
|
||||
"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/types"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
type Scanner interface {
|
||||
Detect(string, []analyzer.Package) ([]vulnerability.DetectedVulnerability, error)
|
||||
Detect(string, []analyzer.Package) ([]types.DetectedVulnerability, error)
|
||||
IsSupportedVersion(string, string) bool
|
||||
}
|
||||
|
||||
func Scan(files extractor.FileMap) (string, string, []vulnerability.DetectedVulnerability, error) {
|
||||
func Scan(files extractor.FileMap) (string, string, []types.DetectedVulnerability, error) {
|
||||
os, err := analyzer.GetOS(files)
|
||||
if err != nil {
|
||||
return "", "", nil, xerrors.Errorf("failed to analyze OS: %w", err)
|
||||
@@ -40,11 +45,17 @@ func Scan(files extractor.FileMap) (string, string, []vulnerability.DetectedVuln
|
||||
s = ubuntu.NewScanner()
|
||||
case fos.RedHat, fos.CentOS:
|
||||
s = redhat.NewScanner()
|
||||
case fos.Amazon:
|
||||
s = amazon.NewScanner()
|
||||
default:
|
||||
return "", "", nil, xerrors.Errorf("unsupported os : %s", os.Family)
|
||||
log.Logger.Warnf("unsupported os : %s", os.Family)
|
||||
return "", "", nil, nil
|
||||
}
|
||||
pkgs, err := analyzer.GetPackages(files)
|
||||
if err != nil {
|
||||
if xerrors.Is(err, ftypes.ErrNoRpmCmd) {
|
||||
log.Logger.Error("'rpm' command is not installed")
|
||||
}
|
||||
return "", "", nil, xerrors.Errorf("failed to analyze OS packages: %w", err)
|
||||
}
|
||||
log.Logger.Debugf("the number of packages: %d", len(pkgs))
|
||||
@@ -58,6 +69,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,30 +1,74 @@
|
||||
package ubuntu
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/ubuntu"
|
||||
|
||||
version "github.com/knqyf263/go-deb-version"
|
||||
"github.com/knqyf263/trivy/pkg/scanner/utils"
|
||||
"github.com/knqyf263/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"
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/scanner/utils"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
type Scanner struct{}
|
||||
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),
|
||||
}
|
||||
)
|
||||
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{}
|
||||
type Scanner struct {
|
||||
vs dbTypes.VulnSrc
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability.DetectedVulnerability, error) {
|
||||
func NewScanner() *Scanner {
|
||||
return &Scanner{
|
||||
vs: ubuntu.NewVulnSrc(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]types.DetectedVulnerability, error) {
|
||||
log.Logger.Info("Detecting Ubuntu vulnerabilities...")
|
||||
log.Logger.Debugf("ubuntu: os version: %s", osVer)
|
||||
log.Logger.Debugf("ubuntu: the number of packages: %s", len(pkgs))
|
||||
log.Logger.Debugf("ubuntu: the number of packages: %d", len(pkgs))
|
||||
|
||||
var vulns []vulnerability.DetectedVulnerability
|
||||
var vulns []types.DetectedVulnerability
|
||||
for _, pkg := range pkgs {
|
||||
advisories, err := ubuntu.Get(osVer, pkg.SrcName)
|
||||
advisories, err := s.vs.Get(osVer, pkg.SrcName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get Ubuntu advisories: %w", err)
|
||||
}
|
||||
@@ -37,7 +81,7 @@ func (s *Scanner) Detect(osVer string, pkgs []analyzer.Package) ([]vulnerability
|
||||
}
|
||||
|
||||
for _, adv := range advisories {
|
||||
vuln := vulnerability.DetectedVulnerability{
|
||||
vuln := types.DetectedVulnerability{
|
||||
VulnerabilityID: adv.VulnerabilityID,
|
||||
PkgName: pkg.Name,
|
||||
InstalledVersion: installed,
|
||||
@@ -62,3 +106,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)
|
||||
}
|
||||
|
||||
@@ -5,26 +5,35 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
|
||||
"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/vulnsrc/vulnerability"
|
||||
"github.com/aquasecurity/trivy/pkg/report"
|
||||
|
||||
"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"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
func ScanImage(imageName, filePath string) (map[string][]vulnerability.DetectedVulnerability, error) {
|
||||
var err error
|
||||
results := map[string][]vulnerability.DetectedVulnerability{}
|
||||
func ScanImage(imageName, filePath string, scanOptions types.ScanOptions) (report.Results, error) {
|
||||
results := report.Results{}
|
||||
ctx := context.Background()
|
||||
|
||||
var target string
|
||||
var files extractor.FileMap
|
||||
if imageName != "" {
|
||||
target = imageName
|
||||
files, err = analyzer.Analyze(ctx, imageName)
|
||||
dockerOption, err := types.GetDockerOption()
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to get docker option: %w", err)
|
||||
}
|
||||
|
||||
dockerOption.Timeout = scanOptions.Timeout
|
||||
files, err = analyzer.Analyze(ctx, imageName, dockerOption)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to analyze image: %w", err)
|
||||
}
|
||||
@@ -35,7 +44,7 @@ func ScanImage(imageName, filePath string) (map[string][]vulnerability.DetectedV
|
||||
return nil, xerrors.Errorf("failed to open stream: %w", err)
|
||||
}
|
||||
|
||||
files, err = analyzer.AnalyzeFromFile(ctx, rc)
|
||||
files, err = analyzer.AnalyzeFile(ctx, rc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -43,32 +52,49 @@ func ScanImage(imageName, filePath string) (map[string][]vulnerability.DetectedV
|
||||
return nil, xerrors.New("image name or image file must be specified")
|
||||
}
|
||||
|
||||
osFamily, osVersion, osVulns, err := ospkg.Scan(files)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to scan image: %w", err)
|
||||
|
||||
if utils.StringInSlice("os", scanOptions.VulnType) {
|
||||
osFamily, osVersion, osVulns, err := ospkg.Scan(files)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to scan image: %w", err)
|
||||
}
|
||||
if osFamily != "" {
|
||||
imageDetail := fmt.Sprintf("%s (%s %s)", target, osFamily, osVersion)
|
||||
results = append(results, report.Result{
|
||||
FileName: imageDetail,
|
||||
Vulnerabilities: osVulns,
|
||||
})
|
||||
}
|
||||
}
|
||||
imageDetail := fmt.Sprintf("%s (%s %s)", target, osFamily, osVersion)
|
||||
results[imageDetail] = osVulns
|
||||
|
||||
libVulns, err := library.Scan(files)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to scan libraries: %w", err)
|
||||
}
|
||||
for path, vulns := range libVulns {
|
||||
results[path] = vulns
|
||||
if utils.StringInSlice("library", scanOptions.VulnType) {
|
||||
libVulns, err := library.Scan(files, scanOptions)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to scan libraries: %w", err)
|
||||
}
|
||||
|
||||
var libResults report.Results
|
||||
for path, vulns := range libVulns {
|
||||
libResults = append(libResults, report.Result{
|
||||
FileName: path,
|
||||
Vulnerabilities: vulns,
|
||||
})
|
||||
}
|
||||
sort.Slice(libResults, func(i, j int) bool {
|
||||
return libResults[i].FileName < libResults[j].FileName
|
||||
})
|
||||
results = append(results, libResults...)
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func ScanFile(f *os.File) (map[string][]vulnerability.DetectedVulnerability, error) {
|
||||
func ScanFile(f *os.File) (report.Results, error) {
|
||||
vulns, err := library.ScanFile(f)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("failed to scan libraries in file: %w", err)
|
||||
}
|
||||
results := map[string][]vulnerability.DetectedVulnerability{
|
||||
f.Name(): vulns,
|
||||
results := report.Results{
|
||||
{FileName: f.Name(), Vulnerabilities: vulns},
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
@@ -4,10 +4,10 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/aquasecurity/fanal/analyzer"
|
||||
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/knqyf263/go-version"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
32
pkg/types/dockerConf.go
Normal file
32
pkg/types/dockerConf.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/aquasecurity/fanal/types"
|
||||
"github.com/caarlos0/env/v6"
|
||||
)
|
||||
|
||||
type DockerConfig struct {
|
||||
AuthURL string `env:"TRIVY_AUTH_URL"`
|
||||
UserName string `env:"TRIVY_USERNAME"`
|
||||
Password string `env:"TRIVY_PASSWORD"`
|
||||
Timeout time.Duration `env:"TRIVY_TIMEOUT_SEC" envDefault:"60s"`
|
||||
Insecure bool `env:"TRIVY_INSECURE" envDefault:"true"`
|
||||
NonSSL bool `env:"TRIVY_NON_SSL" envDefault:"false"`
|
||||
}
|
||||
|
||||
func GetDockerOption() (types.DockerOption, error) {
|
||||
cfg := DockerConfig{}
|
||||
if err := env.Parse(&cfg); err != nil {
|
||||
return types.DockerOption{}, err
|
||||
}
|
||||
return types.DockerOption{
|
||||
AuthURL: cfg.AuthURL,
|
||||
UserName: cfg.UserName,
|
||||
Password: cfg.Password,
|
||||
Timeout: cfg.Timeout,
|
||||
Insecure: cfg.Insecure,
|
||||
NonSSL: cfg.NonSSL,
|
||||
}, nil
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package types
|
||||
|
||||
type Library struct{
|
||||
Name string
|
||||
type Library struct {
|
||||
Name string
|
||||
Version string
|
||||
}
|
||||
|
||||
8
pkg/types/scanoptions.go
Normal file
8
pkg/types/scanoptions.go
Normal file
@@ -0,0 +1,8 @@
|
||||
package types
|
||||
|
||||
import "time"
|
||||
|
||||
type ScanOptions struct {
|
||||
VulnType []string
|
||||
Timeout time.Duration
|
||||
}
|
||||
@@ -1 +1,12 @@
|
||||
package types
|
||||
|
||||
import "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
|
||||
type DetectedVulnerability struct {
|
||||
VulnerabilityID string `json:",omitempty"`
|
||||
PkgName string `json:",omitempty"`
|
||||
InstalledVersion string `json:",omitempty"`
|
||||
FixedVersion string `json:",omitempty"`
|
||||
|
||||
types.Vulnerability
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ func (s *Spinner) Stop() {
|
||||
s.client.Stop()
|
||||
}
|
||||
|
||||
// TODO: Expose an interface for progressbar
|
||||
type ProgressBar struct {
|
||||
client *pb.ProgressBar
|
||||
}
|
||||
|
||||
@@ -8,30 +8,33 @@ 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 {
|
||||
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
@@ -51,10 +54,10 @@ func FileWalk(root string, targetFiles map[string]struct{}, walkFn func(r io.Rea
|
||||
}
|
||||
|
||||
f, err := os.Open(path)
|
||||
defer f.Close()
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to open file: %w", err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
if err = walkFn(f, path); err != nil {
|
||||
return err
|
||||
@@ -115,6 +118,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))
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
100
pkg/vulnerability/vulnerability.go
Normal file
100
pkg/vulnerability/vulnerability.go
Normal file
@@ -0,0 +1,100 @@
|
||||
package vulnerability
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/log"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
DefaultIgnoreFile = ".trivyignore"
|
||||
)
|
||||
|
||||
type Client struct {
|
||||
dbc db.Operations
|
||||
}
|
||||
|
||||
func NewClient() Client {
|
||||
return Client{
|
||||
dbc: db.Config{},
|
||||
}
|
||||
}
|
||||
|
||||
func (c Client) FillAndFilter(vulns []types.DetectedVulnerability, severities []dbTypes.Severity,
|
||||
ignoreUnfixed bool, ignoreFile string, light bool) []types.DetectedVulnerability {
|
||||
var err error
|
||||
var severity dbTypes.Severity
|
||||
|
||||
ignoredIDs := getIgnoredIDs(ignoreFile)
|
||||
var vulnerabilities []types.DetectedVulnerability
|
||||
for _, vuln := range vulns {
|
||||
var vulnerability dbTypes.Vulnerability
|
||||
if light {
|
||||
severity, err = c.dbc.GetSeverity(vuln.VulnerabilityID)
|
||||
vulnerability.Severity = severity.String()
|
||||
} else {
|
||||
vulnerability, err = c.dbc.GetVulnerability(vuln.VulnerabilityID)
|
||||
}
|
||||
if err != nil {
|
||||
log.Logger.Warn(err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Filter vulnerabilities by severity
|
||||
for _, s := range severities {
|
||||
if s.String() == vulnerability.Severity {
|
||||
vuln.Vulnerability = vulnerability
|
||||
|
||||
// Ignore unfixed vulnerabilities
|
||||
if ignoreUnfixed && vuln.FixedVersion == "" {
|
||||
continue
|
||||
} else if utils.StringInSlice(vuln.VulnerabilityID, ignoredIDs) {
|
||||
continue
|
||||
}
|
||||
vulnerabilities = append(vulnerabilities, vuln)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
sort.Slice(vulnerabilities, func(i, j int) bool {
|
||||
if vulnerabilities[i].PkgName != vulnerabilities[j].PkgName {
|
||||
return vulnerabilities[i].PkgName < vulnerabilities[j].PkgName
|
||||
}
|
||||
ret := dbTypes.CompareSeverityString(
|
||||
vulnerabilities[j].Severity, vulnerabilities[i].Severity,
|
||||
)
|
||||
if ret != 0 {
|
||||
return ret > 0
|
||||
}
|
||||
return vulnerabilities[i].VulnerabilityID < vulnerabilities[j].VulnerabilityID
|
||||
})
|
||||
return vulnerabilities
|
||||
}
|
||||
|
||||
func getIgnoredIDs(ignoreFile string) []string {
|
||||
f, err := os.Open(ignoreFile)
|
||||
if err != nil {
|
||||
// trivy must work even if no .trivyignore exist
|
||||
return nil
|
||||
}
|
||||
|
||||
var ignoredIDs []string
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
line = strings.TrimSpace(line)
|
||||
if strings.HasPrefix(line, "#") || line == "" {
|
||||
continue
|
||||
}
|
||||
ignoredIDs = append(ignoredIDs, line)
|
||||
}
|
||||
return ignoredIDs
|
||||
}
|
||||
190
pkg/vulnerability/vulnerability_test.go
Normal file
190
pkg/vulnerability/vulnerability_test.go
Normal file
@@ -0,0 +1,190 @@
|
||||
package vulnerability
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/aquasecurity/trivy-db/pkg/db"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
dbTypes "github.com/aquasecurity/trivy-db/pkg/types"
|
||||
"github.com/aquasecurity/trivy/pkg/types"
|
||||
)
|
||||
|
||||
func TestFillAndFilter(t *testing.T) {
|
||||
detectedVulns := []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "foo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityHigh],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "piyo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityCritical],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "bar",
|
||||
PkgName: "barpkg",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityLow],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "hoge",
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "baz",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityMedium],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
severities := []dbTypes.Severity{dbTypes.SeverityLow, dbTypes.SeverityCritical,
|
||||
dbTypes.SeverityMedium, dbTypes.SeverityHigh, dbTypes.SeverityUnknown}
|
||||
|
||||
mockDBConfig := new(db.MockDBConfig)
|
||||
getVulnerability := map[string]dbTypes.Vulnerability{
|
||||
"foo": {
|
||||
Title: "footitle",
|
||||
Description: "foodesc",
|
||||
Severity: dbTypes.SeverityHigh.String(),
|
||||
References: []string{"fooref"},
|
||||
},
|
||||
"bar": {
|
||||
Title: "bartitle",
|
||||
Description: "bardesc",
|
||||
Severity: dbTypes.SeverityLow.String(),
|
||||
References: []string{"barref"},
|
||||
},
|
||||
"baz": {
|
||||
Title: "baztitle",
|
||||
Description: "bazdesc",
|
||||
Severity: dbTypes.SeverityMedium.String(),
|
||||
References: []string{"bazref"},
|
||||
},
|
||||
"piyo": {
|
||||
Title: "piyotitle",
|
||||
Description: "piyodesc",
|
||||
Severity: dbTypes.SeverityCritical.String(),
|
||||
References: []string{"piyoref"},
|
||||
},
|
||||
"hoge": {
|
||||
Title: "hogetitle",
|
||||
Description: "hogedesc",
|
||||
Severity: dbTypes.SeverityUnknown.String(),
|
||||
References: []string{"hogeref"},
|
||||
},
|
||||
}
|
||||
|
||||
for pkgName, vulnerability := range getVulnerability {
|
||||
mockDBConfig.On("GetVulnerability", pkgName).Return(vulnerability, nil)
|
||||
|
||||
}
|
||||
getSeverity := map[string]dbTypes.Severity{
|
||||
"foo": dbTypes.SeverityHigh,
|
||||
"bar": dbTypes.SeverityLow,
|
||||
"baz": dbTypes.SeverityMedium,
|
||||
"piyo": dbTypes.SeverityCritical,
|
||||
"hoge": dbTypes.SeverityUnknown,
|
||||
}
|
||||
|
||||
for pkgName, severity := range getSeverity {
|
||||
mockDBConfig.On("GetSeverity", pkgName).Return(severity, nil)
|
||||
}
|
||||
|
||||
expected := []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "piyo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "piyotitle",
|
||||
Description: "piyodesc",
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityCritical],
|
||||
References: []string{"piyoref"},
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "foo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "footitle",
|
||||
Description: "foodesc",
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityHigh],
|
||||
References: []string{"fooref"},
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "baz",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "baztitle",
|
||||
Description: "bazdesc",
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityMedium],
|
||||
References: []string{"bazref"},
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "hoge",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "hogetitle",
|
||||
Description: "hogedesc",
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityUnknown],
|
||||
References: []string{"hogeref"},
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "bar",
|
||||
PkgName: "barpkg",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Title: "bartitle",
|
||||
Description: "bardesc",
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityLow],
|
||||
References: []string{"barref"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
client := Client{
|
||||
dbc: mockDBConfig,
|
||||
}
|
||||
actual := client.FillAndFilter(detectedVulns, severities, false, ".trivyignore", false)
|
||||
assert.Equal(t, expected, actual, "full db")
|
||||
|
||||
expected = []types.DetectedVulnerability{
|
||||
{
|
||||
VulnerabilityID: "piyo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityCritical],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "foo",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityHigh],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "baz",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityMedium],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "hoge",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityUnknown],
|
||||
},
|
||||
},
|
||||
{
|
||||
VulnerabilityID: "bar",
|
||||
PkgName: "barpkg",
|
||||
Vulnerability: dbTypes.Vulnerability{
|
||||
Severity: dbTypes.SeverityNames[dbTypes.SeverityLow],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
actual = client.FillAndFilter(detectedVulns, severities, false, ".trivyignore", true)
|
||||
assert.Equal(t, expected, actual, "light db")
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
alpineDir = "alpine"
|
||||
)
|
||||
|
||||
var (
|
||||
platformFormat = "alpine %s"
|
||||
)
|
||||
|
||||
func Update(dir string, updatedFiles map[string]struct{}) error {
|
||||
rootDir := filepath.Join(dir, alpineDir)
|
||||
targets, err := utils.FilterTargets(alpineDir, updatedFiles)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to filter target files: %w", err)
|
||||
} else if len(targets) == 0 {
|
||||
log.Logger.Debug("Alpine: no updated file")
|
||||
return nil
|
||||
}
|
||||
log.Logger.Debugf("Alpine updated files: %d", len(targets))
|
||||
|
||||
bar := utils.PbStartNew(len(targets))
|
||||
defer bar.Finish()
|
||||
|
||||
var cves []AlpineCVE
|
||||
err = utils.FileWalk(rootDir, targets, func(r io.Reader, path string) error {
|
||||
var cve AlpineCVE
|
||||
if err = json.NewDecoder(r).Decode(&cve); err != nil {
|
||||
return xerrors.Errorf("failed to decode Alpine JSON: %w", err)
|
||||
}
|
||||
cves = append(cves, cve)
|
||||
bar.Increment()
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in Alpine walk: %w", err)
|
||||
}
|
||||
|
||||
if err = save(cves); err != nil {
|
||||
return xerrors.Errorf("error in Alpine save: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func save(cves []AlpineCVE) error {
|
||||
log.Logger.Debug("Saving Alpine DB")
|
||||
|
||||
err := db.BatchUpdate(func(tx *bolt.Tx) error {
|
||||
for _, cve := range cves {
|
||||
platformName := fmt.Sprintf(platformFormat, cve.Release)
|
||||
pkgName := cve.Package
|
||||
advisory := Advisory{
|
||||
VulnerabilityID: cve.VulnerabilityID,
|
||||
FixedVersion: cve.FixedVersion,
|
||||
Repository: cve.Repository,
|
||||
}
|
||||
if err := db.PutNestedBucket(tx, platformName, pkgName, cve.VulnerabilityID, advisory); err != nil {
|
||||
return xerrors.Errorf("failed to save alpine advisory: %w", err)
|
||||
}
|
||||
|
||||
vuln := vulnerability.Vulnerability{
|
||||
Title: cve.Subject,
|
||||
Description: cve.Description,
|
||||
}
|
||||
if err := vulnerability.Put(tx, cve.VulnerabilityID, vulnerability.Alpine, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save alpine vulnerability: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in db batch update: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func Get(release string, pkgName string) ([]Advisory, error) {
|
||||
bucket := fmt.Sprintf(platformFormat, release)
|
||||
advisories, err := db.ForEach(bucket, pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in Alpine foreach: %w", err)
|
||||
}
|
||||
|
||||
var results []Advisory
|
||||
for _, v := range advisories {
|
||||
var advisory Advisory
|
||||
if err = json.Unmarshal(v, &advisory); err != nil {
|
||||
return nil, xerrors.Errorf("failed to unmarshal Alpine JSON: %w", err)
|
||||
}
|
||||
results = append(results, advisory)
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package alpine
|
||||
|
||||
type AlpineCVE struct {
|
||||
VulnerabilityID string
|
||||
Release string
|
||||
Package string
|
||||
Repository string
|
||||
FixedVersion string
|
||||
Subject string
|
||||
Description string
|
||||
}
|
||||
|
||||
type Advisory struct {
|
||||
VulnerabilityID string
|
||||
FixedVersion string
|
||||
Repository string
|
||||
}
|
||||
@@ -1,164 +0,0 @@
|
||||
package debianoval
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/debian"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
|
||||
|
||||
bolt "github.com/etcd-io/bbolt"
|
||||
"github.com/knqyf263/trivy/pkg/db"
|
||||
"github.com/knqyf263/trivy/pkg/log"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/knqyf263/trivy/pkg/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
debianDir = filepath.Join("oval", "debian")
|
||||
// e.g. debian oval 8
|
||||
platformFormat = "debian oval %s"
|
||||
)
|
||||
|
||||
func Update(dir string, updatedFiles map[string]struct{}) error {
|
||||
rootDir := filepath.Join(dir, debianDir)
|
||||
targets, err := utils.FilterTargets(debianDir, updatedFiles)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to filter target files: %w", err)
|
||||
} else if len(targets) == 0 {
|
||||
log.Logger.Debug("Debian OVAL: no updated file")
|
||||
return nil
|
||||
}
|
||||
log.Logger.Debugf("Debian OVAL updated files: %d", len(targets))
|
||||
|
||||
bar := utils.PbStartNew(len(targets))
|
||||
defer bar.Finish()
|
||||
|
||||
var cves []DebianOVAL
|
||||
err = utils.FileWalk(rootDir, targets, func(r io.Reader, path string) error {
|
||||
var cve DebianOVAL
|
||||
if err = json.NewDecoder(r).Decode(&cve); err != nil {
|
||||
return xerrors.Errorf("failed to decode Debian OVAL JSON: %w", err)
|
||||
}
|
||||
|
||||
dirs := strings.Split(path, string(os.PathSeparator))
|
||||
if len(dirs) < 3 {
|
||||
log.Logger.Debugf("invalid path: %s", path)
|
||||
return nil
|
||||
}
|
||||
cve.Release = dirs[len(dirs)-3]
|
||||
cves = append(cves, cve)
|
||||
bar.Increment()
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in Debian OVAL walk: %w", err)
|
||||
}
|
||||
|
||||
if err = save(cves); err != nil {
|
||||
return xerrors.Errorf("error in Debian OVAL save: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// from https://github.com/kotakanbe/goval-dictionary/blob/c462c07a5cd0b6de52f167e9aa4298083edfc356/models/debian.go#L53
|
||||
func walkDebian(cri Criteria, pkgs []Package) []Package {
|
||||
for _, c := range cri.Criterions {
|
||||
ss := strings.Split(c.Comment, " DPKG is earlier than ")
|
||||
if len(ss) != 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
// "0" means notyetfixed or erroneous information.
|
||||
// Not available because "0" includes erroneous info...
|
||||
if ss[1] == "0" {
|
||||
continue
|
||||
}
|
||||
pkgs = append(pkgs, Package{
|
||||
Name: ss[0],
|
||||
FixedVersion: strings.Split(ss[1], " ")[0],
|
||||
})
|
||||
}
|
||||
|
||||
if len(cri.Criterias) == 0 {
|
||||
return pkgs
|
||||
}
|
||||
for _, c := range cri.Criterias {
|
||||
pkgs = walkDebian(c, pkgs)
|
||||
}
|
||||
return pkgs
|
||||
}
|
||||
|
||||
func save(cves []DebianOVAL) error {
|
||||
log.Logger.Debug("Saving Debian OVAL")
|
||||
err := db.BatchUpdate(func(tx *bolt.Tx) error {
|
||||
for _, cve := range cves {
|
||||
affectedPkgs := walkDebian(cve.Criteria, []Package{})
|
||||
for _, affectedPkg := range affectedPkgs {
|
||||
// stretch => 9
|
||||
majorVersion, ok := debian.DebianReleasesMapping[cve.Release]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
platformName := fmt.Sprintf(platformFormat, majorVersion)
|
||||
cveID := cve.Metadata.Title
|
||||
advisory := vulnerability.Advisory{
|
||||
VulnerabilityID: cveID,
|
||||
FixedVersion: affectedPkg.FixedVersion,
|
||||
}
|
||||
if err := db.PutNestedBucket(tx, platformName, affectedPkg.Name, cveID, advisory); err != nil {
|
||||
return xerrors.Errorf("failed to save Debian OVAL advisory: %w", err)
|
||||
}
|
||||
|
||||
var references []string
|
||||
for _, ref := range cve.Metadata.References {
|
||||
references = append(references, ref.RefURL)
|
||||
}
|
||||
|
||||
vuln := vulnerability.Vulnerability{
|
||||
Description: cve.Metadata.Description,
|
||||
References: references,
|
||||
}
|
||||
|
||||
if err := vulnerability.Put(tx, cveID, vulnerability.DebianOVAL, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save Debian OVAL vulnerability: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in batch update: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func Get(release string, pkgName string) ([]vulnerability.Advisory, error) {
|
||||
bucket := fmt.Sprintf(platformFormat, release)
|
||||
advisories, err := db.ForEach(bucket, pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in Debian OVAL foreach: %w", err)
|
||||
}
|
||||
if len(advisories) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var results []vulnerability.Advisory
|
||||
for _, v := range advisories {
|
||||
var advisory vulnerability.Advisory
|
||||
if err = json.Unmarshal(v, &advisory); err != nil {
|
||||
return nil, xerrors.Errorf("failed to unmarshal Debian OVAL JSON: %w", err)
|
||||
}
|
||||
results = append(results, advisory)
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package debianoval
|
||||
|
||||
type DebianOVAL struct {
|
||||
Metadata Metadata
|
||||
Criteria Criteria
|
||||
Release string
|
||||
}
|
||||
|
||||
type Metadata struct {
|
||||
Title string
|
||||
AffectedList []Affected
|
||||
Description string
|
||||
References []Reference
|
||||
}
|
||||
|
||||
type Affected struct {
|
||||
Family string
|
||||
Platform string
|
||||
Product string
|
||||
}
|
||||
|
||||
type Criteria struct {
|
||||
Operator string
|
||||
Criterias []Criteria
|
||||
Criterions []Criterion
|
||||
}
|
||||
|
||||
type Reference struct {
|
||||
Source string
|
||||
RefID string
|
||||
RefURL string
|
||||
}
|
||||
|
||||
type Criterion struct {
|
||||
Negate bool
|
||||
TestRef string
|
||||
Comment string
|
||||
}
|
||||
|
||||
type Package struct {
|
||||
Name string
|
||||
FixedVersion string
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
package debian
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
"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"
|
||||
"golang.org/x/xerrors"
|
||||
)
|
||||
|
||||
const (
|
||||
debianDir = "debian"
|
||||
)
|
||||
|
||||
var (
|
||||
// e.g. debian 8
|
||||
platformFormat = "debian %s"
|
||||
DebianReleasesMapping = map[string]string{
|
||||
// Code names
|
||||
"squeeze": "6",
|
||||
"wheezy": "7",
|
||||
"jessie": "8",
|
||||
"stretch": "9",
|
||||
"buster": "10",
|
||||
"sid": "unstable",
|
||||
}
|
||||
)
|
||||
|
||||
func Update(dir string, updatedFiles map[string]struct{}) error {
|
||||
rootDir := filepath.Join(dir, debianDir)
|
||||
targets, err := utils.FilterTargets(debianDir, updatedFiles)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to filter target files: %w", err)
|
||||
} else if len(targets) == 0 {
|
||||
log.Logger.Debug("Debian: no updated file")
|
||||
return nil
|
||||
}
|
||||
log.Logger.Debugf("Debian updated files: %d", len(targets))
|
||||
|
||||
bar := utils.PbStartNew(len(targets))
|
||||
defer bar.Finish()
|
||||
|
||||
var cves []DebianCVE
|
||||
err = utils.FileWalk(rootDir, targets, func(r io.Reader, path string) error {
|
||||
var cve DebianCVE
|
||||
if err = json.NewDecoder(r).Decode(&cve); err != nil {
|
||||
return xerrors.Errorf("failed to decode Debian JSON: %w", err)
|
||||
}
|
||||
|
||||
cve.VulnerabilityID = strings.TrimSuffix(filepath.Base(path), ".json")
|
||||
cve.Package = filepath.Base(filepath.Dir(path))
|
||||
cves = append(cves, cve)
|
||||
|
||||
bar.Increment()
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in Debian walk: %w", err)
|
||||
}
|
||||
|
||||
if err = save(cves); err != nil {
|
||||
return xerrors.Errorf("error in Debian save: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func save(cves []DebianCVE) error {
|
||||
log.Logger.Debug("Saving Debian DB")
|
||||
err := db.BatchUpdate(func(tx *bolt.Tx) error {
|
||||
for _, cve := range cves {
|
||||
for _, release := range cve.Releases {
|
||||
for releaseStr := range release.Repositories {
|
||||
majorVersion, ok := DebianReleasesMapping[releaseStr]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
platformName := fmt.Sprintf(platformFormat, majorVersion)
|
||||
if release.Status != "open" {
|
||||
continue
|
||||
}
|
||||
advisory := vulnerability.Advisory{
|
||||
VulnerabilityID: cve.VulnerabilityID,
|
||||
//Severity: severityFromUrgency(release.Urgency),
|
||||
}
|
||||
if err := db.PutNestedBucket(tx, platformName, cve.Package, cve.VulnerabilityID, advisory); err != nil {
|
||||
return xerrors.Errorf("failed to save Debian advisory: %w", err)
|
||||
}
|
||||
|
||||
vuln := vulnerability.Vulnerability{
|
||||
Severity: severityFromUrgency(release.Urgency),
|
||||
Description: cve.Description,
|
||||
}
|
||||
|
||||
if err := vulnerability.Put(tx, cve.VulnerabilityID, vulnerability.Debian, vuln); err != nil {
|
||||
return xerrors.Errorf("failed to save Debian vulnerability: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("error in batch update: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func Get(release string, pkgName string) ([]vulnerability.Advisory, error) {
|
||||
bucket := fmt.Sprintf(platformFormat, release)
|
||||
advisories, err := db.ForEach(bucket, pkgName)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("error in Debian foreach: %w", err)
|
||||
}
|
||||
if len(advisories) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var results []vulnerability.Advisory
|
||||
for _, v := range advisories {
|
||||
var advisory vulnerability.Advisory
|
||||
if err = json.Unmarshal(v, &advisory); err != nil {
|
||||
return nil, xerrors.Errorf("failed to unmarshal Debian JSON: %w", err)
|
||||
}
|
||||
results = append(results, advisory)
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func severityFromUrgency(urgency string) vulnerability.Severity {
|
||||
switch urgency {
|
||||
case "not yet assigned":
|
||||
return vulnerability.SeverityUnknown
|
||||
|
||||
case "end-of-life", "unimportant", "low", "low*", "low**":
|
||||
return vulnerability.SeverityLow
|
||||
|
||||
case "medium", "medium*", "medium**":
|
||||
return vulnerability.SeverityMedium
|
||||
|
||||
case "high", "high*", "high**":
|
||||
return vulnerability.SeverityHigh
|
||||
default:
|
||||
return vulnerability.SeverityUnknown
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user