Compare commits
	
		
			90 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a0e592b934 | ||
| 
						 | 
					7eccc538bb | ||
| 
						 | 
					59daa8570a | ||
| 
						 | 
					3f52d318bc | ||
| 
						 | 
					11a7a0c934 | ||
| 
						 | 
					89f49b0e29 | ||
| 
						 | 
					72457cbf8e | ||
| 
						 | 
					c11ba27509 | ||
| 
						 | 
					8a611f9ba6 | ||
| 
						 | 
					4a73875e4d | ||
| 
						 | 
					d9d5e612ff | ||
| 
						 | 
					4d8599e4fc | ||
| 
						 | 
					59c7061d29 | ||
| 
						 | 
					996557c667 | ||
| 
						 | 
					519fb19a77 | ||
| 
						 | 
					36456cb151 | ||
| 
						 | 
					4ae87cc36c | ||
| 
						 | 
					b37df89fb1 | ||
| 
						 | 
					d18e7a751d | ||
| 
						 | 
					8d5ea98e50 | ||
| 
						 | 
					835dc08049 | ||
| 
						 | 
					62c9409fe9 | ||
| 
						 | 
					2374f578ed | ||
| 
						 | 
					34e2f033d8 | ||
| 
						 | 
					420825cacc | ||
| 
						 | 
					466ec93d8e | ||
| 
						 | 
					3f5bb6ab29 | ||
| 
						 | 
					ebe5f858c8 | ||
| 
						 | 
					9dd025437b | ||
| 
						 | 
					c0ebac305a | ||
| 
						 | 
					1f23ab7ba4 | ||
| 
						 | 
					ea3b63998d | ||
| 
						 | 
					3093426458 | ||
| 
						 | 
					37716feac7 | ||
| 
						 | 
					56b12c38d2 | ||
| 
						 | 
					749ead5d4a | ||
| 
						 | 
					3be50ab8da | ||
| 
						 | 
					649f4a6991 | ||
| 
						 | 
					0ff7641471 | ||
| 
						 | 
					1679bfae20 | ||
| 
						 | 
					45aa364436 | ||
| 
						 | 
					778516c4d9 | ||
| 
						 | 
					464d523c42 | ||
| 
						 | 
					0f6a1987d4 | ||
| 
						 | 
					20c6247ce5 | ||
| 
						 | 
					a10dd67e0f | ||
| 
						 | 
					5729ad6026 | ||
| 
						 | 
					9aa0d87a21 | ||
| 
						 | 
					fe3f1b9924 | ||
| 
						 | 
					00e52a88fa | ||
| 
						 | 
					5811dffe7a | ||
| 
						 | 
					7278982af4 | ||
| 
						 | 
					c17b4154ec | ||
| 
						 | 
					d6e74cce08 | ||
| 
						 | 
					3f80749241 | ||
| 
						 | 
					7f72b6ac69 | ||
| 
						 | 
					03e7b90b9f | ||
| 
						 | 
					7936b3533b | ||
| 
						 | 
					bd7e61d7cc | ||
| 
						 | 
					69214e0c22 | ||
| 
						 | 
					45bff26558 | ||
| 
						 | 
					b2e429ccc6 | ||
| 
						 | 
					76363c227b | ||
| 
						 | 
					d5a3e5c2c5 | ||
| 
						 | 
					2b02807ef0 | ||
| 
						 | 
					be659ae094 | ||
| 
						 | 
					b2c105adbc | ||
| 
						 | 
					c61f462948 | ||
| 
						 | 
					3ffed18e02 | ||
| 
						 | 
					f54e7257d1 | ||
| 
						 | 
					cc13b6a27c | ||
| 
						 | 
					8877db1979 | ||
| 
						 | 
					af58122c91 | ||
| 
						 | 
					b7ca5e5590 | ||
| 
						 | 
					69b6d875e6 | ||
| 
						 | 
					1fbd516b83 | ||
| 
						 | 
					dec5d3b165 | ||
| 
						 | 
					d5e2040cef | ||
| 
						 | 
					4326befdec | ||
| 
						 | 
					3d4a5d9917 | ||
| 
						 | 
					d770034788 | ||
| 
						 | 
					a977533c78 | ||
| 
						 | 
					c5e13dd5e4 | ||
| 
						 | 
					a8040fe4d2 | ||
| 
						 | 
					9e066008c3 | ||
| 
						 | 
					22c6601526 | ||
| 
						 | 
					425464fd76 | ||
| 
						 | 
					ccb0751ffd | ||
| 
						 | 
					f832de81b7 | ||
| 
						 | 
					8a37de0686 | 
							
								
								
									
										3
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
# These are supported funding model platforms
 | 
			
		||||
 | 
			
		||||
github: kotakanbe
 | 
			
		||||
							
								
								
									
										28
									
								
								.github/workflows/golangci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								.github/workflows/golangci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
name: golangci-lint
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    tags:
 | 
			
		||||
      - v*
 | 
			
		||||
    branches:
 | 
			
		||||
      - master
 | 
			
		||||
  pull_request:
 | 
			
		||||
jobs:
 | 
			
		||||
  golangci:
 | 
			
		||||
    name: lint
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
      - name: golangci-lint
 | 
			
		||||
        uses: golangci/golangci-lint-action@v1
 | 
			
		||||
        with:
 | 
			
		||||
          # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
 | 
			
		||||
          version: v1.26
 | 
			
		||||
          
 | 
			
		||||
          # Optional: working directory, useful for monorepos
 | 
			
		||||
          # working-directory: somedir
 | 
			
		||||
 | 
			
		||||
          # Optional: golangci-lint command line arguments.
 | 
			
		||||
          # args: --issues-exit-code=0
 | 
			
		||||
 | 
			
		||||
          # Optional: show only new issues if it's a pull request. The default value is `false`.
 | 
			
		||||
          # only-new-issues: true
 | 
			
		||||
							
								
								
									
										31
									
								
								.github/workflows/goreleaser.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.github/workflows/goreleaser.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
name: goreleaser
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    tags:
 | 
			
		||||
      - '*'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  goreleaser:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      -
 | 
			
		||||
        name: Checkout
 | 
			
		||||
        uses: actions/checkout@v2
 | 
			
		||||
      -
 | 
			
		||||
        name: Unshallow
 | 
			
		||||
        run: git fetch --prune --unshallow
 | 
			
		||||
      -
 | 
			
		||||
        name: Set up Go
 | 
			
		||||
        uses: actions/setup-go@v2
 | 
			
		||||
        with:
 | 
			
		||||
          go-version: 1.14
 | 
			
		||||
      -
 | 
			
		||||
        name: Run GoReleaser
 | 
			
		||||
        uses: goreleaser/goreleaser-action@v2
 | 
			
		||||
        with:
 | 
			
		||||
          version: latest
 | 
			
		||||
          args: release --rm-dist
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
name: Test
 | 
			
		||||
 | 
			
		||||
on: [pull_request]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    name: Build
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
 | 
			
		||||
    - name: Set up Go 1.x
 | 
			
		||||
      uses: actions/setup-go@v2
 | 
			
		||||
      with:
 | 
			
		||||
        go-version: 1.14.x
 | 
			
		||||
      id: go
 | 
			
		||||
 | 
			
		||||
    - name: Check out code into the Go module directory
 | 
			
		||||
      uses: actions/checkout@v2
 | 
			
		||||
 | 
			
		||||
    - name: Test
 | 
			
		||||
      run: make test
 | 
			
		||||
							
								
								
									
										22
									
								
								.github/workflows/tidy.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/tidy.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
name: go-mod-tidy-pr
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: "0 0 * * 1" # Weekly build
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  go-mod-tidy-pr:
 | 
			
		||||
    name: go-mod-tidy-pr
 | 
			
		||||
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
 | 
			
		||||
      - name: Run go-mod-tidy-pr
 | 
			
		||||
        uses: sue445/go-mod-tidy-pr@master
 | 
			
		||||
        with:
 | 
			
		||||
          github_token: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          git_user_name: kotakanbe
 | 
			
		||||
          git_user_email: kotakanbe@gmail.com
 | 
			
		||||
          go_version: 1.14.x
 | 
			
		||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -15,4 +15,4 @@ results/
 | 
			
		||||
!setup/docker/*
 | 
			
		||||
.DS_Store
 | 
			
		||||
dist/
 | 
			
		||||
.idea
 | 
			
		||||
.idea
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								.golangci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.golangci.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
name: golang-ci
 | 
			
		||||
 | 
			
		||||
linters-settings:
 | 
			
		||||
  errcheck:
 | 
			
		||||
    #exclude: /path/to/file.txt
 | 
			
		||||
 | 
			
		||||
linters:
 | 
			
		||||
  disable-all: true
 | 
			
		||||
  enable:
 | 
			
		||||
    - goimports
 | 
			
		||||
    - golint
 | 
			
		||||
    - govet
 | 
			
		||||
    - misspell
 | 
			
		||||
    - errcheck
 | 
			
		||||
    - staticcheck
 | 
			
		||||
    - prealloc
 | 
			
		||||
    - ineffassign
 | 
			
		||||
@@ -6,7 +6,8 @@ release:
 | 
			
		||||
    owner: future-architect
 | 
			
		||||
    name: vuls
 | 
			
		||||
builds:
 | 
			
		||||
- goos:
 | 
			
		||||
- id: vuls
 | 
			
		||||
  goos:
 | 
			
		||||
  - linux
 | 
			
		||||
  goarch:
 | 
			
		||||
  - amd64
 | 
			
		||||
@@ -15,10 +16,51 @@ builds:
 | 
			
		||||
      - -a
 | 
			
		||||
  ldflags: -s -w -X main.version={{.Version}} -X main.revision={{.Commit}} 
 | 
			
		||||
  binary: vuls
 | 
			
		||||
archive:
 | 
			
		||||
 | 
			
		||||
- id: trivy-to-vuls
 | 
			
		||||
  goos:
 | 
			
		||||
  - linux
 | 
			
		||||
  goarch:
 | 
			
		||||
  - amd64
 | 
			
		||||
  main: ./contrib/trivy/cmd/main.go
 | 
			
		||||
  binary: trivy-to-vuls
 | 
			
		||||
 | 
			
		||||
- id: future-vuls
 | 
			
		||||
  goos:
 | 
			
		||||
  - linux
 | 
			
		||||
  goarch:
 | 
			
		||||
  - amd64
 | 
			
		||||
  main: ./contrib/future-vuls/cmd/main.go
 | 
			
		||||
  binary: future-vuls
 | 
			
		||||
archives:
 | 
			
		||||
 | 
			
		||||
- id: vuls
 | 
			
		||||
  name_template: '{{ .Binary }}_{{.Version}}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
 | 
			
		||||
  builds:
 | 
			
		||||
  - vuls
 | 
			
		||||
  format: tar.gz
 | 
			
		||||
  files:
 | 
			
		||||
  - LICENSE
 | 
			
		||||
  - NOTICE
 | 
			
		||||
  - README*
 | 
			
		||||
  - CHANGELOG.md
 | 
			
		||||
 | 
			
		||||
- id: trivy-to-vuls
 | 
			
		||||
  name_template: '{{ .Binary }}_{{.Version}}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
 | 
			
		||||
  builds:
 | 
			
		||||
  - trivy-to-vuls
 | 
			
		||||
  format: tar.gz
 | 
			
		||||
  files:
 | 
			
		||||
  - LICENSE
 | 
			
		||||
  - NOTICE
 | 
			
		||||
  - README*
 | 
			
		||||
  - CHANGELOG.md
 | 
			
		||||
- id: future-vuls
 | 
			
		||||
  name_template: '{{ .Binary }}_{{.Version}}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
 | 
			
		||||
  builds:
 | 
			
		||||
 | 
			
		||||
  - future-vuls
 | 
			
		||||
  format: tar.gz
 | 
			
		||||
  name_template: '{{ .Binary }}_{{.Version}}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{
 | 
			
		||||
    .Arm }}{{ end }}'
 | 
			
		||||
  files:
 | 
			
		||||
  - LICENSE
 | 
			
		||||
  - NOTICE
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
language: go
 | 
			
		||||
 | 
			
		||||
go:
 | 
			
		||||
  - "1.12.x"
 | 
			
		||||
 | 
			
		||||
after_success:
 | 
			
		||||
  - test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash
 | 
			
		||||
@@ -11,7 +11,7 @@ COPY . $GOPATH/src/$REPOSITORY
 | 
			
		||||
RUN cd $GOPATH/src/$REPOSITORY && make install
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FROM alpine:3.7
 | 
			
		||||
FROM alpine:3.11
 | 
			
		||||
 | 
			
		||||
MAINTAINER hikachan sadayuki-matsuno
 | 
			
		||||
 | 
			
		||||
@@ -21,6 +21,7 @@ ENV WORKDIR /vuls
 | 
			
		||||
RUN apk add --no-cache \
 | 
			
		||||
        openssh-client \
 | 
			
		||||
        ca-certificates \
 | 
			
		||||
        git \
 | 
			
		||||
    && mkdir -p $WORKDIR $LOGDIR
 | 
			
		||||
 | 
			
		||||
COPY --from=builder /go/bin/vuls /usr/local/bin/
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								GNUmakefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								GNUmakefile
									
									
									
									
									
								
							@@ -28,7 +28,7 @@ all: build
 | 
			
		||||
build: main.go pretest fmt
 | 
			
		||||
	$(GO) build -a -ldflags "$(LDFLAGS)" -o vuls $<
 | 
			
		||||
 | 
			
		||||
b: 	main.go pretest
 | 
			
		||||
b: 	main.go pretest fmt
 | 
			
		||||
	$(GO) build -ldflags "$(LDFLAGS)" -o vuls $<
 | 
			
		||||
 | 
			
		||||
install: main.go pretest
 | 
			
		||||
@@ -65,5 +65,11 @@ cov:
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	echo $(PKGS) | xargs go clean || exit;
 | 
			
		||||
	echo $(PKGS) | xargs go clean || exit;
 | 
			
		||||
 | 
			
		||||
# trivy-to-vuls
 | 
			
		||||
build-trivy-to-vuls: pretest fmt
 | 
			
		||||
	$(GO) build -o trivy-to-vuls contrib/trivy/cmd/*.go
 | 
			
		||||
 | 
			
		||||
# future-vuls
 | 
			
		||||
build-future-vuls: pretest fmt
 | 
			
		||||
	$(GO) build -o future-vuls contrib/future-vuls/cmd/*.go
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										153
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										153
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,23 +1,21 @@
 | 
			
		||||
                    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 3, 29 June 2007
 | 
			
		||||
                    GNU AFFERO GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 3, 19 November 2007
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 | 
			
		||||
 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 | 
			
		||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
			
		||||
 of this license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
                            Preamble
 | 
			
		||||
 | 
			
		||||
  The GNU General Public License is a free, copyleft license for
 | 
			
		||||
software and other kinds of works.
 | 
			
		||||
  The GNU Affero General Public License is a free, copyleft license for
 | 
			
		||||
software and other kinds of works, specifically designed to ensure
 | 
			
		||||
cooperation with the community in the case of network server software.
 | 
			
		||||
 | 
			
		||||
  The licenses for most software and other practical works are designed
 | 
			
		||||
to take away your freedom to share and change the works.  By contrast,
 | 
			
		||||
the GNU General Public License is intended to guarantee your freedom to
 | 
			
		||||
our General Public Licenses are intended to guarantee your freedom to
 | 
			
		||||
share and change all versions of a program--to make sure it remains free
 | 
			
		||||
software for all its users.  We, the Free Software Foundation, use the
 | 
			
		||||
GNU General Public License for most of our software; it applies also to
 | 
			
		||||
any other work released this way by its authors.  You can apply it to
 | 
			
		||||
your programs, too.
 | 
			
		||||
software for all its users.
 | 
			
		||||
 | 
			
		||||
  When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price.  Our General Public Licenses are designed to make sure that you
 | 
			
		||||
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
 | 
			
		||||
want it, that you can change the software or use pieces of it in new
 | 
			
		||||
free programs, and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
  To protect your rights, we need to prevent others from denying you
 | 
			
		||||
these rights or asking you to surrender the rights.  Therefore, you have
 | 
			
		||||
certain responsibilities if you distribute copies of the software, or if
 | 
			
		||||
you modify it: responsibilities to respect the freedom of others.
 | 
			
		||||
  Developers that use our General Public Licenses protect your rights
 | 
			
		||||
with two steps: (1) assert copyright on the software, and (2) offer
 | 
			
		||||
you this License which gives you legal permission to copy, distribute
 | 
			
		||||
and/or modify the software.
 | 
			
		||||
 | 
			
		||||
  For example, if you distribute copies of such a program, whether
 | 
			
		||||
gratis or for a fee, you must pass on to the recipients the same
 | 
			
		||||
freedoms that you received.  You must make sure that they, too, receive
 | 
			
		||||
or can get the source code.  And you must show them these terms so they
 | 
			
		||||
know their rights.
 | 
			
		||||
  A secondary benefit of defending all users' freedom is that
 | 
			
		||||
improvements made in alternate versions of the program, if they
 | 
			
		||||
receive widespread use, become available for other developers to
 | 
			
		||||
incorporate.  Many developers of free software are heartened and
 | 
			
		||||
encouraged by the resulting cooperation.  However, in the case of
 | 
			
		||||
software used on network servers, this result may fail to come about.
 | 
			
		||||
The GNU General Public License permits making a modified version and
 | 
			
		||||
letting the public access it on a server without ever releasing its
 | 
			
		||||
source code to the public.
 | 
			
		||||
 | 
			
		||||
  Developers that use the GNU GPL protect your rights with two steps:
 | 
			
		||||
(1) assert copyright on the software, and (2) offer you this License
 | 
			
		||||
giving you legal permission to copy, distribute and/or modify it.
 | 
			
		||||
  The GNU Affero General Public License is designed specifically to
 | 
			
		||||
ensure that, in such cases, the modified source code becomes available
 | 
			
		||||
to the community.  It requires the operator of a network server to
 | 
			
		||||
provide the source code of the modified version running there to the
 | 
			
		||||
users of that server.  Therefore, public use of a modified version, on
 | 
			
		||||
a publicly accessible server, gives the public access to the source
 | 
			
		||||
code of the modified version.
 | 
			
		||||
 | 
			
		||||
  For the developers' and authors' protection, the GPL clearly explains
 | 
			
		||||
that there is no warranty for this free software.  For both users' and
 | 
			
		||||
authors' sake, the GPL requires that modified versions be marked as
 | 
			
		||||
changed, so that their problems will not be attributed erroneously to
 | 
			
		||||
authors of previous versions.
 | 
			
		||||
 | 
			
		||||
  Some devices are designed to deny users access to install or run
 | 
			
		||||
modified versions of the software inside them, although the manufacturer
 | 
			
		||||
can do so.  This is fundamentally incompatible with the aim of
 | 
			
		||||
protecting users' freedom to change the software.  The systematic
 | 
			
		||||
pattern of such abuse occurs in the area of products for individuals to
 | 
			
		||||
use, which is precisely where it is most unacceptable.  Therefore, we
 | 
			
		||||
have designed this version of the GPL to prohibit the practice for those
 | 
			
		||||
products.  If such problems arise substantially in other domains, we
 | 
			
		||||
stand ready to extend this provision to those domains in future versions
 | 
			
		||||
of the GPL, as needed to protect the freedom of users.
 | 
			
		||||
 | 
			
		||||
  Finally, every program is threatened constantly by software patents.
 | 
			
		||||
States should not allow patents to restrict development and use of
 | 
			
		||||
software on general-purpose computers, but in those that do, we wish to
 | 
			
		||||
avoid the special danger that patents applied to a free program could
 | 
			
		||||
make it effectively proprietary.  To prevent this, the GPL assures that
 | 
			
		||||
patents cannot be used to render the program non-free.
 | 
			
		||||
  An older license, called the Affero General Public License and
 | 
			
		||||
published by Affero, was designed to accomplish similar goals.  This is
 | 
			
		||||
a different license, not a version of the Affero GPL, but Affero has
 | 
			
		||||
released a new version of the Affero GPL which permits relicensing under
 | 
			
		||||
this license.
 | 
			
		||||
 | 
			
		||||
  The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
@@ -72,7 +60,7 @@ modification follow.
 | 
			
		||||
 | 
			
		||||
  0. Definitions.
 | 
			
		||||
 | 
			
		||||
  "This License" refers to version 3 of the GNU General Public License.
 | 
			
		||||
  "This License" refers to version 3 of the GNU Affero General Public License.
 | 
			
		||||
 | 
			
		||||
  "Copyright" also means copyright-like laws that apply to other kinds of
 | 
			
		||||
works, such as semiconductor masks.
 | 
			
		||||
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
 | 
			
		||||
the Program, the only way you could satisfy both those terms and this
 | 
			
		||||
License would be to refrain entirely from conveying the Program.
 | 
			
		||||
 | 
			
		||||
  13. Use with the GNU Affero General Public License.
 | 
			
		||||
  13. Remote Network Interaction; Use with the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, if you modify the
 | 
			
		||||
Program, your modified version must prominently offer all users
 | 
			
		||||
interacting with it remotely through a computer network (if your version
 | 
			
		||||
supports such interaction) an opportunity to receive the Corresponding
 | 
			
		||||
Source of your version by providing access to the Corresponding Source
 | 
			
		||||
from a network server at no charge, through some standard or customary
 | 
			
		||||
means of facilitating copying of software.  This Corresponding Source
 | 
			
		||||
shall include the Corresponding Source for any work covered by version 3
 | 
			
		||||
of the GNU General Public License that is incorporated pursuant to the
 | 
			
		||||
following paragraph.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, you have
 | 
			
		||||
permission to link or combine any covered work with a work licensed
 | 
			
		||||
under version 3 of the GNU Affero General Public License into a single
 | 
			
		||||
under version 3 of the GNU General Public License into a single
 | 
			
		||||
combined work, and to convey the resulting work.  The terms of this
 | 
			
		||||
License will continue to apply to the part which is the covered work,
 | 
			
		||||
but the special requirements of the GNU Affero General Public License,
 | 
			
		||||
section 13, concerning interaction through a network will apply to the
 | 
			
		||||
combination as such.
 | 
			
		||||
but the work with which it is combined will remain governed by version
 | 
			
		||||
3 of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
  14. Revised Versions of this License.
 | 
			
		||||
 | 
			
		||||
  The Free Software Foundation may publish revised and/or new versions of
 | 
			
		||||
the GNU General Public License from time to time.  Such new versions will
 | 
			
		||||
be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
the GNU Affero General Public License from time to time.  Such new versions
 | 
			
		||||
will be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
  Each version is given a distinguishing version number.  If the
 | 
			
		||||
Program specifies that a certain numbered version of the GNU General
 | 
			
		||||
Program specifies that a certain numbered version of the GNU Affero General
 | 
			
		||||
Public License "or any later version" applies to it, you have the
 | 
			
		||||
option of following the terms and conditions either of that numbered
 | 
			
		||||
version or of any later version published by the Free Software
 | 
			
		||||
Foundation.  If the Program does not specify a version number of the
 | 
			
		||||
GNU General Public License, you may choose any version ever published
 | 
			
		||||
GNU Affero General Public License, you may choose any version ever published
 | 
			
		||||
by the Free Software Foundation.
 | 
			
		||||
 | 
			
		||||
  If the Program specifies that a proxy can decide which future
 | 
			
		||||
versions of the GNU General Public License can be used, that proxy's
 | 
			
		||||
versions of the GNU Affero General Public License can be used, that proxy's
 | 
			
		||||
public statement of acceptance of a version permanently authorizes you
 | 
			
		||||
to choose that version for the Program.
 | 
			
		||||
 | 
			
		||||
@@ -631,44 +629,33 @@ to attach them to the start of each source file to most effectively
 | 
			
		||||
state the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    Vuls - Vulnerability Scanner
 | 
			
		||||
    Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software: you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
    it under the terms of the GNU Affero General Public License as published
 | 
			
		||||
    by the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
    GNU Affero General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License
 | 
			
		||||
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
    You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper mail.
 | 
			
		||||
 | 
			
		||||
  If the program does terminal interaction, make it output a short
 | 
			
		||||
notice like this when it starts in an interactive mode:
 | 
			
		||||
 | 
			
		||||
    Vuls  Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
			
		||||
    This is free software, and you are welcome to redistribute it
 | 
			
		||||
    under certain conditions; type `show c' for details.
 | 
			
		||||
 | 
			
		||||
The hypothetical commands `show w' and `show c' should show the appropriate
 | 
			
		||||
parts of the General Public License.  Of course, your program's commands
 | 
			
		||||
might be different; for a GUI interface, you would use an "about box".
 | 
			
		||||
  If your software can interact with users remotely through a computer
 | 
			
		||||
network, you should also make sure that it provides a way for users to
 | 
			
		||||
get its source.  For example, if your program is a web application, its
 | 
			
		||||
interface could display a "Source" link that leads users to an archive
 | 
			
		||||
of the code.  There are many ways you could offer source, and different
 | 
			
		||||
solutions will be better for different programs; see section 13 for the
 | 
			
		||||
specific requirements.
 | 
			
		||||
 | 
			
		||||
  You should also get your employer (if you work as a programmer) or school,
 | 
			
		||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
 | 
			
		||||
For more information on this, and how to apply and follow the GNU GPL, see
 | 
			
		||||
<http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
  The GNU General Public License does not permit incorporating your program
 | 
			
		||||
into proprietary programs.  If your program is a subroutine library, you
 | 
			
		||||
may consider it more useful to permit linking proprietary applications with
 | 
			
		||||
the library.  If this is what you want to do, use the GNU Lesser General
 | 
			
		||||
Public License instead of this License.  But first, please read
 | 
			
		||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
 | 
			
		||||
For more information on this, and how to apply and follow the GNU AGPL, see
 | 
			
		||||
<https://www.gnu.org/licenses/>.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							@@ -136,14 +136,16 @@ Vuls uses multiple vulnerability databases
 | 
			
		||||
 | 
			
		||||
### **Static** Analysis
 | 
			
		||||
 | 
			
		||||
Vuls v0.8.0 can scan Docker images using [knqyf263/trivy](https://github.com/knqyf263/trivy).
 | 
			
		||||
Following Registry supported.
 | 
			
		||||
**Image scan function is no longer supported from Vuls v0.9.5. Use Trivy directry**
 | 
			
		||||
 | 
			
		||||
- ECR
 | 
			
		||||
- GCR
 | 
			
		||||
- Local Image
 | 
			
		||||
~~Vuls v0.8.0 can scan Docker images using [knqyf263/trivy](https://github.com/knqyf263/trivy).
 | 
			
		||||
Following Registry supported.~~
 | 
			
		||||
 | 
			
		||||
For details, see [Scan docker image](https://vuls.io/docs/en/tutorial-scan-docker-image.html)
 | 
			
		||||
- ~~ECR~~
 | 
			
		||||
- ~~GCR~~
 | 
			
		||||
- ~~Local Image~~
 | 
			
		||||
 | 
			
		||||
~~For details, see [Scan docker image](https://vuls.io/docs/en/tutorial-scan-docker-image.html)~~  
 | 
			
		||||
 | 
			
		||||
### Scan vulnerabilities of non-OS-packages
 | 
			
		||||
 | 
			
		||||
@@ -170,7 +172,7 @@ Vuls has some options to detect the vulnerabilities
 | 
			
		||||
- Auto-generation of configuration file template
 | 
			
		||||
  - Auto-detection of servers set using CIDR, generate configuration file template
 | 
			
		||||
- Email and Slack notification is possible (supports Japanese language)
 | 
			
		||||
- Scan result is viewable on accessory software, TUI Viewer in a terminal or Web UI ([VulsRepo](https://github.com/future-architect/vulsrepo)).
 | 
			
		||||
- Scan result is viewable on accessory software, TUI Viewer in a terminal or Web UI ([VulsRepo](https://github.com/ishiDACo/vulsrepo)).
 | 
			
		||||
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2897
									
								
								alert/alert_jp.go
									
									
									
									
									
								
							
							
						
						
									
										2897
									
								
								alert/alert_jp.go
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,920 +0,0 @@
 | 
			
		||||
package alert
 | 
			
		||||
 | 
			
		||||
// AlertDictEn has USCERT alerts
 | 
			
		||||
var AlertDictEn = map[string]Alert{
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA08-352A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA08-352A",
 | 
			
		||||
		Title: `Microsoft Internet Explorer Data Binding Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA08-350A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA08-350A",
 | 
			
		||||
		Title: `Apple Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA08-344A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA08-344A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA08-340A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA08-340A",
 | 
			
		||||
		Title: `Sun Java Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA08-319A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA08-319A",
 | 
			
		||||
		Title: `Mozilla Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-132A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-132A",
 | 
			
		||||
		Title: `Microsoft PowerPoint Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-041A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-041A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-343A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-343A",
 | 
			
		||||
		Title: `Adobe Flash Vulnerabilities Affect Flash Player and Adobe AIR`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-218A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-218A",
 | 
			
		||||
		Title: `Apple Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-195A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-195A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-342A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-342A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-286B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-286B",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-160B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-160B",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-069A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-069A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-223A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-223A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-013A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-013A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple SMB Protocol Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-294A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-294A",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-020A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-020A",
 | 
			
		||||
		Title: `Microsoft Windows Does Not Disable AutoRun Properly`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-133A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-133A",
 | 
			
		||||
		Title: `Apple Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-022A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-022A",
 | 
			
		||||
		Title: `Apple QuickTime Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-051A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-051A",
 | 
			
		||||
		Title: `Adobe Acrobat and Reader Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-015A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-015A",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-251A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-251A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-209A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-209A",
 | 
			
		||||
		Title: `Microsoft Windows, Internet Explorer, and Active Template Library (ATL) Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-204A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-204A",
 | 
			
		||||
		Title: `Adobe Flash Vulnerability Affects Flash Player and Other Adobe Products`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-161A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-161A",
 | 
			
		||||
		Title: `Adobe Acrobat and Reader Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-133B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-133B",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat JavaScript Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-088A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-088A",
 | 
			
		||||
		Title: `Conficker Worm Targets Microsoft Windows Systems`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-314A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-314A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-105A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-105A",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-104A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-104A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-286A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-286A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA09-187A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA09-187A",
 | 
			
		||||
		Title: `Microsoft Video ActiveX Control Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-238A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-238A",
 | 
			
		||||
		Title: `Microsoft Windows Insecurely Loads Dynamic Libraries`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-159B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-159B",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-103B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-103B",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-021A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-021A",
 | 
			
		||||
		Title: `Microsoft Internet Explorer Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-012A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-012A",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-313A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-313A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-285A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-285A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-263A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-263A",
 | 
			
		||||
		Title: `Adobe Flash Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-103C": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-103C",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-040A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-040A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-194B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-194B",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-194A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-194A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-131A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-131A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-068A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-068A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-348A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-348A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-257A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-257A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-231A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-231A",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-222A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-222A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-162A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-162A",
 | 
			
		||||
		Title: `Adobe Flash and AIR Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-159A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-159A",
 | 
			
		||||
		Title: `Adobe Flash, Reader, and Acrobat Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-089A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-089A",
 | 
			
		||||
		Title: `Microsoft Internet Explorer Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-013A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-013A",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-287A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-287A",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-279A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-279A",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat Affected by Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-223A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-223A",
 | 
			
		||||
		Title: `Adobe Flash and AIR Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA10-012B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA10-012B",
 | 
			
		||||
		Title: `Microsoft Windows EOT Font and Adobe Flash Player 6 Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-165A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-165A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-067A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-067A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-039A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-039A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-222A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-222A",
 | 
			
		||||
		Title: `Adobe Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-193A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-193A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-201A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-201A",
 | 
			
		||||
		Title: `Oracle Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-166A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-166A",
 | 
			
		||||
		Title: `Adobe Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-130A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-130A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-312A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-312A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-286A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-286A",
 | 
			
		||||
		Title: `Apple Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-350A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-350A",
 | 
			
		||||
		Title: `Adobe Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-221A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-221A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-256A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-256A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-200A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-200A",
 | 
			
		||||
		Title: `Security Recommendations to Prevent Cyber Intrusions`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-102A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-102A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-011A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-011A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-347A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-347A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA11-284A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA11-284A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-262A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-262A",
 | 
			
		||||
		Title: `Microsoft Security Advisory for Internet Explorer Exploit`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-240A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-240A",
 | 
			
		||||
		Title: `Oracle Java 7 Security Manager Bypass Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-227A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-227A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-129A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-129A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-101B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-101B",
 | 
			
		||||
		Title: `Adobe Reader and Acrobat Security Updates and Architectural Improvements`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-010A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-010A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-006A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-006A",
 | 
			
		||||
		Title: `Wi-Fi Protected Setup (WPS) Vulnerable to Brute-Force Attack`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-265A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-265A",
 | 
			
		||||
		Title: `Microsoft Releases Patch for Internet Explorer Exploit`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-255A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-255A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-251A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-251A",
 | 
			
		||||
		Title: `Microsoft Update For Minimum Certificate Key Length`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-174A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-174A",
 | 
			
		||||
		Title: `Microsoft XML Core Services Attack Activity`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-164A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-164A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-101A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-101A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-318A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-318A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-283A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-283A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-346A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-346A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-192A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-192A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-073A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-073A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-045A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-045A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA12-024A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA12-024A",
 | 
			
		||||
		Title: `"Anonymous" DDoS Activity`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-134A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-134A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-043B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-043B",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-008A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-008A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-051A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-051A",
 | 
			
		||||
		Title: `Oracle Java Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-043A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-043A",
 | 
			
		||||
		Title: `Adobe Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-225A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-225A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-207A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-207A",
 | 
			
		||||
		Title: `Risks of Using the Intelligent Platform Management Interface (IPMI)`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-141A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-141A",
 | 
			
		||||
		Title: `Washington, DC Radio Station Web Site Compromises`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-175A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-175A",
 | 
			
		||||
		Title: `Risks of Default Passwords on the Internet`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-169A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-169A",
 | 
			
		||||
		Title: `Oracle Releases Updates for Javadoc and Other Java SE Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-168A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-168A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-100A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-100A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-088A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-088A",
 | 
			
		||||
		Title: `DNS Amplification Attacks`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-317A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-317A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-309A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-309A",
 | 
			
		||||
		Title: `CryptoLocker Ransomware Infections`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-288A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-288A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-064A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-064A",
 | 
			
		||||
		Title: `Oracle Java Contains Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-032A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-032A",
 | 
			
		||||
		Title: `Oracle Java Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-024A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-024A",
 | 
			
		||||
		Title: `Content Management Systems Security and Associated Risks`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-107A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-107A",
 | 
			
		||||
		Title: `Oracle Has Released Multiple Updates for Java SE`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-071A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-071A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-015A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-015A",
 | 
			
		||||
		Title: `Microsoft Releases Update for Internet Explorer Vulnerability CVE-2012-4792`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-010A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-010A",
 | 
			
		||||
		Title: `Oracle Java 7 Security Manager Bypass Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-253A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-253A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-193A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-193A",
 | 
			
		||||
		Title: `Exploit Tool Targets Vulnerabilities in McAfee ePolicy Orchestrator (ePO)`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA13-190A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA13-190A",
 | 
			
		||||
		Title: `Microsoft Updates for Multiple Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-323A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-323A",
 | 
			
		||||
		Title: `Microsoft Windows Kerberos KDC Remote Privilege Escalation Vulnerability `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-300A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-300A",
 | 
			
		||||
		Title: `Phishing Campaign Linked with “Dyre” Banking Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-295A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-295A",
 | 
			
		||||
		Title: `Crypto Ransomware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-318B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-318B",
 | 
			
		||||
		Title: `Microsoft Windows OLE Automation Array Remote Code Execution Vulnerability `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-317A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-317A",
 | 
			
		||||
		Title: `Apple iOS 'Masque Attack' Technique`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-290A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-290A",
 | 
			
		||||
		Title: `SSL 3.0 Protocol Vulnerability and POODLE Attack`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-017A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-017A",
 | 
			
		||||
		Title: `UDP-Based Amplification Attacks`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-002A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-002A",
 | 
			
		||||
		Title: `Malware Targeting Point of Sale Systems`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-318A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-318A",
 | 
			
		||||
		Title: `Microsoft Secure Channel (Schannel) Vulnerability (CVE-2014-6321) `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-310A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-310A",
 | 
			
		||||
		Title: `Microsoft Ending Support for Windows Server 2003 Operating System`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-268A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-268A",
 | 
			
		||||
		Title: `GNU Bourne-Again Shell (Bash) ‘Shellshock’ Vulnerability (CVE-2014-6271, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187, CVE-2014-6277 and CVE 2014-6278) `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-098A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-098A",
 | 
			
		||||
		Title: `OpenSSL 'Heartbleed' vulnerability (CVE-2014-0160)`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-353A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-353A",
 | 
			
		||||
		Title: `Targeted Destructive Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-329A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-329A",
 | 
			
		||||
		Title: `Regin Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-212A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-212A",
 | 
			
		||||
		Title: `Backoff Point-of-Sale Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-150A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-150A",
 | 
			
		||||
		Title: `GameOver Zeus P2P Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA14-013A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA14-013A",
 | 
			
		||||
		Title: `NTP Amplification Attacks Using CVE-2013-5211`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-195A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-195A",
 | 
			
		||||
		Title: `Adobe Flash and Microsoft Windows Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-337A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-337A",
 | 
			
		||||
		Title: `Dorkbot`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-240A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-240A",
 | 
			
		||||
		Title: `Controlling Outbound DNS Access`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-213A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-213A",
 | 
			
		||||
		Title: `Recent Email Phishing Campaigns – Mitigation and Response Recommendations`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-120A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-120A",
 | 
			
		||||
		Title: `Securing End-to-End Communications`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-119A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-119A",
 | 
			
		||||
		Title: `Top 30 Targeted High Risk Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-105A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-105A",
 | 
			
		||||
		Title: `Simda Botnet`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-103A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-103A",
 | 
			
		||||
		Title: `DNS Zone Transfer AXFR Requests May Leak Domain Information`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-098A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-098A",
 | 
			
		||||
		Title: `AAEH`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-314A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-314A",
 | 
			
		||||
		Title: `Compromised Web Servers and Web Shells - Threat Awareness and Guidance `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-286A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-286A",
 | 
			
		||||
		Title: `Dridex P2P Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA15-051A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA15-051A",
 | 
			
		||||
		Title: `Lenovo Superfish Adware Vulnerable to HTTPS Spoofing`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-187A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-187A",
 | 
			
		||||
		Title: `Symantec and Norton Security Products Contain Critical Vulnerabilities`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-144A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-144A",
 | 
			
		||||
		Title: `WPAD Name Collision Vulnerability`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-132A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-132A",
 | 
			
		||||
		Title: `Exploitation of SAP Business Applications`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-105A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-105A",
 | 
			
		||||
		Title: `Apple Ends Support for QuickTime for Windows; New Vulnerabilities Announced`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-091A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-091A",
 | 
			
		||||
		Title: `Ransomware and Recent Variants`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-336A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-336A",
 | 
			
		||||
		Title: `Avalanche (crimeware-as-a-service infrastructure)`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-288A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-288A",
 | 
			
		||||
		Title: `Heightened DDoS Threat Posed by Mirai and Other Botnets`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA16-250A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA16-250A",
 | 
			
		||||
		Title: `The Increasing Threat to Network Infrastructure Devices and Recommended Mitigations`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-117A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-117A",
 | 
			
		||||
		Title: `Intrusions Affecting Multiple Victims Across Multiple Sectors`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-318B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-318B",
 | 
			
		||||
		Title: `HIDDEN COBRA – North Korean Trojan: Volgmer`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-318A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-318A",
 | 
			
		||||
		Title: `HIDDEN COBRA – North Korean Remote Administration Tool: FALLCHILL`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-181A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-181A",
 | 
			
		||||
		Title: `Petya Ransomware `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-132A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-132A",
 | 
			
		||||
		Title: `Indicators Associated With WannaCry Ransomware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-075A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-075A",
 | 
			
		||||
		Title: `HTTPS Interception Weakens TLS Security`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-293A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-293A",
 | 
			
		||||
		Title: `Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-164A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-164A",
 | 
			
		||||
		Title: `HIDDEN COBRA – North Korea’s DDoS Botnet Infrastructure`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-163A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-163A",
 | 
			
		||||
		Title: `CrashOverride Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA17-156A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA17-156A",
 | 
			
		||||
		Title: `Reducing the Risk of SNMP Abuse`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-141A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-141A",
 | 
			
		||||
		Title: `Side-Channel Vulnerability Variants 3a and 4`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-086A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-086A",
 | 
			
		||||
		Title: `Brute Force Attacks Conducted by Cyber Actors `,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-004A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-004A",
 | 
			
		||||
		Title: `Meltdown and Spectre Side-Channel Vulnerability Guidance`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-331A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-331A",
 | 
			
		||||
		Title: `3ve – Major Online Ad Fraud Operation`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/AA18-284A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/AA18-284A",
 | 
			
		||||
		Title: `Publicly Available Tools Seen in Cyber Incidents Worldwide`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-276B": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-276B",
 | 
			
		||||
		Title: `Advanced Persistent Threat Activity Exploiting Managed Service Providers`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-275A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-275A",
 | 
			
		||||
		Title: `HIDDEN COBRA – FASTCash Campaign`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-201A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-201A",
 | 
			
		||||
		Title: `Emotet Malware`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-276A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-276A",
 | 
			
		||||
		Title: `Using Rigorous Credential Control to Mitigate Trusted Network Exploitation`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-149A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-149A",
 | 
			
		||||
		Title: `HIDDEN COBRA – Joanap Backdoor Trojan and Brambul Server Message Block Worm`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-145A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-145A",
 | 
			
		||||
		Title: `Cyber Actors Target Home and Office Routers and Networked Devices Worldwide`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-106A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-106A",
 | 
			
		||||
		Title: `Russian State-Sponsored Cyber Actors Targeting Network Infrastructure Devices`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
	"https://www.us-cert.gov/ncas/alerts/TA18-074A": {
 | 
			
		||||
		URL:   "https://www.us-cert.gov/ncas/alerts/TA18-074A",
 | 
			
		||||
		Title: `Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors`,
 | 
			
		||||
		Team:  "us",
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										534
									
								
								alert/cve_jp.go
									
									
									
									
									
								
							
							
						
						
									
										534
									
								
								alert/cve_jp.go
									
									
									
									
									
								
							@@ -1,534 +0,0 @@
 | 
			
		||||
package alert
 | 
			
		||||
 | 
			
		||||
// CveDictJa has CVE-ID key which included JPCERT alerts
 | 
			
		||||
var CveDictJa = map[string][]string{
 | 
			
		||||
	"CVE-2006-0003":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2006-0005":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2006-1173":    {"https://www.jpcert.or.jp/at/2006/at060008.html"},
 | 
			
		||||
	"CVE-2006-3014":    {"https://www.jpcert.or.jp/at/2006/at060009.html"},
 | 
			
		||||
	"CVE-2006-3059":    {"https://www.jpcert.or.jp/at/2006/at060009.html"},
 | 
			
		||||
	"CVE-2006-3086":    {"https://www.jpcert.or.jp/at/2006/at060009.html"},
 | 
			
		||||
	"CVE-2006-3643":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2006-3730":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2006-3877":    {"https://www.jpcert.or.jp/at/2007/at070005.html"},
 | 
			
		||||
	"CVE-2006-5198":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2006-5745":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2007-0015":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2007-0038":    {"https://www.jpcert.or.jp/at/2007/at070016.html"},
 | 
			
		||||
	"CVE-2008-4609":    {"https://www.jpcert.or.jp/at/2009/at090019.html"},
 | 
			
		||||
	"CVE-2010-0886":    {"https://www.jpcert.or.jp/at/2010/at100010.html"},
 | 
			
		||||
	"CVE-2010-0887":    {"https://www.jpcert.or.jp/at/2010/at100010.html"},
 | 
			
		||||
	"CVE-2011-1910":    {"https://www.jpcert.or.jp/at/2011/at110014.html"},
 | 
			
		||||
	"CVE-2011-2444":    {"https://www.jpcert.or.jp/at/2011/at110026.html"},
 | 
			
		||||
	"CVE-2011-2462":    {"https://www.jpcert.or.jp/at/2011/at110034.html"},
 | 
			
		||||
	"CVE-2011-2465":    {"https://www.jpcert.or.jp/at/2011/at110019.html"},
 | 
			
		||||
	"CVE-2011-3192":    {"https://www.jpcert.or.jp/at/2011/at110023.html"},
 | 
			
		||||
	"CVE-2011-3348":    {"https://www.jpcert.or.jp/at/2011/at110023.html"},
 | 
			
		||||
	"CVE-2011-3544":    {"https://www.jpcert.or.jp/at/2011/at110032.html"},
 | 
			
		||||
	"CVE-2011-4313":    {"https://www.jpcert.or.jp/at/2011/at110031.html"},
 | 
			
		||||
	"CVE-2012-0002":    {"https://www.jpcert.or.jp/at/2012/at120009.html"},
 | 
			
		||||
	"CVE-2012-0507":    {"https://www.jpcert.or.jp/at/2012/at120010.html"},
 | 
			
		||||
	"CVE-2012-0767":    {"https://www.jpcert.or.jp/at/2012/at120006.html"},
 | 
			
		||||
	"CVE-2012-0779":    {"https://www.jpcert.or.jp/at/2012/at120014.html"},
 | 
			
		||||
	"CVE-2012-0830":    {"https://www.jpcert.or.jp/at/2012/at120004.html"},
 | 
			
		||||
	"CVE-2012-2311":    {"https://www.jpcert.or.jp/at/2012/at120016.html"},
 | 
			
		||||
	"CVE-2012-4244":    {"https://www.jpcert.or.jp/at/2012/at120029.html"},
 | 
			
		||||
	"CVE-2012-4681":    {"https://www.jpcert.or.jp/at/2012/at120028.html"},
 | 
			
		||||
	"CVE-2012-4969":    {"https://www.jpcert.or.jp/at/2012/at120030.html"},
 | 
			
		||||
	"CVE-2012-5166":    {"https://www.jpcert.or.jp/at/2012/at120033.html"},
 | 
			
		||||
	"CVE-2013-0422":    {"https://www.jpcert.or.jp/at/2013/at130004.html"},
 | 
			
		||||
	"CVE-2013-1493":    {"https://www.jpcert.or.jp/at/2013/at130014.html"},
 | 
			
		||||
	"CVE-2013-2266":    {"https://www.jpcert.or.jp/at/2013/at130017.html"},
 | 
			
		||||
	"CVE-2013-2494":    {"https://www.jpcert.or.jp/at/2013/at130017.html"},
 | 
			
		||||
	"CVE-2013-3893":    {"https://www.jpcert.or.jp/at/2013/at130040.html", "https://www.jpcert.or.jp/at/2013/at130041.html"},
 | 
			
		||||
	"CVE-2013-3906":    {"https://www.jpcert.or.jp/at/2013/at130044.html"},
 | 
			
		||||
	"CVE-2013-3918":    {"https://www.jpcert.or.jp/at/2013/at130045.html"},
 | 
			
		||||
	"CVE-2013-3919":    {"https://www.jpcert.or.jp/at/2013/at130026.html"},
 | 
			
		||||
	"CVE-2013-4854":    {"https://www.jpcert.or.jp/at/2013/at130034.html"},
 | 
			
		||||
	"CVE-2014-0050":    {"https://www.jpcert.or.jp/at/2014/at140007.html"},
 | 
			
		||||
	"CVE-2014-0160":    {"https://www.jpcert.or.jp/at/2014/at140013.html"},
 | 
			
		||||
	"CVE-2014-0322":    {"https://www.jpcert.or.jp/at/2014/at140009.html"},
 | 
			
		||||
	"CVE-2014-1776":    {"https://www.jpcert.or.jp/at/2014/at140018.html", "https://www.jpcert.or.jp/at/2014/at140020.html"},
 | 
			
		||||
	"CVE-2014-3383":    {"https://www.jpcert.or.jp/at/2015/at150021.html"},
 | 
			
		||||
	"CVE-2014-3859":    {"https://www.jpcert.or.jp/at/2014/at140027.html"},
 | 
			
		||||
	"CVE-2014-4114":    {"https://www.jpcert.or.jp/at/2014/at140039.html"},
 | 
			
		||||
	"CVE-2014-6271":    {"https://www.jpcert.or.jp/at/2014/at140037.html", "https://www.jpcert.or.jp/at/2014/at140038.html"},
 | 
			
		||||
	"CVE-2014-6277":    {"https://www.jpcert.or.jp/at/2014/at140037.html"},
 | 
			
		||||
	"CVE-2014-6278":    {"https://www.jpcert.or.jp/at/2014/at140037.html"},
 | 
			
		||||
	"CVE-2014-6324":    {"https://www.jpcert.or.jp/at/2014/at140048.html"},
 | 
			
		||||
	"CVE-2014-6332":    {"https://www.jpcert.or.jp/at/2015/at150015.html"},
 | 
			
		||||
	"CVE-2014-6352":    {"https://www.jpcert.or.jp/at/2014/at140043.html"},
 | 
			
		||||
	"CVE-2014-7169":    {"https://www.jpcert.or.jp/at/2014/at140037.html"},
 | 
			
		||||
	"CVE-2014-7186":    {"https://www.jpcert.or.jp/at/2014/at140037.html"},
 | 
			
		||||
	"CVE-2014-7187":    {"https://www.jpcert.or.jp/at/2014/at140037.html"},
 | 
			
		||||
	"CVE-2014-8361":    {"https://www.jpcert.or.jp/at/2017/at170049.html"},
 | 
			
		||||
	"CVE-2014-8500":    {"https://www.jpcert.or.jp/at/2014/at140050.html"},
 | 
			
		||||
	"CVE-2014-9163":    {"https://www.jpcert.or.jp/at/2014/at140052.html"},
 | 
			
		||||
	"CVE-2015-0313":    {"https://www.jpcert.or.jp/at/2015/at150015.html"},
 | 
			
		||||
	"CVE-2015-1769":    {"https://www.jpcert.or.jp/at/2015/at150028.html"},
 | 
			
		||||
	"CVE-2015-5119":    {"https://www.jpcert.or.jp/at/2015/at150019.html"},
 | 
			
		||||
	"CVE-2015-5122":    {"https://www.jpcert.or.jp/at/2015/at150020.html"},
 | 
			
		||||
	"CVE-2015-5123":    {"https://www.jpcert.or.jp/at/2015/at150020.html"},
 | 
			
		||||
	"CVE-2015-5477":    {"https://www.jpcert.or.jp/at/2015/at150027.html"},
 | 
			
		||||
	"CVE-2015-5986":    {"https://www.jpcert.or.jp/at/2015/at150031.html"},
 | 
			
		||||
	"CVE-2015-6835":    {"https://www.jpcert.or.jp/at/2016/at160036.html"},
 | 
			
		||||
	"CVE-2015-7547":    {"https://www.jpcert.or.jp/at/2016/at160009.html"},
 | 
			
		||||
	"CVE-2015-7645":    {"https://www.jpcert.or.jp/at/2015/at150036.html", "https://www.jpcert.or.jp/at/2015/at150037.html"},
 | 
			
		||||
	"CVE-2015-8000":    {"https://www.jpcert.or.jp/at/2015/at150043.html"},
 | 
			
		||||
	"CVE-2015-8461":    {"https://www.jpcert.or.jp/at/2015/at150043.html"},
 | 
			
		||||
	"CVE-2015-8562":    {"https://www.jpcert.or.jp/at/2016/at160036.html"},
 | 
			
		||||
	"CVE-2015-8651":    {"https://www.jpcert.or.jp/at/2016/at160001.html"},
 | 
			
		||||
	"CVE-2015-8704":    {"https://www.jpcert.or.jp/at/2016/at160006.html"},
 | 
			
		||||
	"CVE-2015-8705":    {"https://www.jpcert.or.jp/at/2016/at160006.html"},
 | 
			
		||||
	"CVE-2016-0189":    {"https://www.jpcert.or.jp/at/2016/at160022.html"},
 | 
			
		||||
	"CVE-2016-0636":    {"https://www.jpcert.or.jp/at/2016/at160015.html"},
 | 
			
		||||
	"CVE-2016-0800":    {"https://www.jpcert.or.jp/at/2016/at160010.html"},
 | 
			
		||||
	"CVE-2016-1000109": {"https://www.jpcert.or.jp/at/2016/at160031.html"},
 | 
			
		||||
	"CVE-2016-1000110": {"https://www.jpcert.or.jp/at/2016/at160031.html"},
 | 
			
		||||
	"CVE-2016-1010":    {"https://www.jpcert.or.jp/at/2016/at160014.html"},
 | 
			
		||||
	"CVE-2016-1019":    {"https://www.jpcert.or.jp/at/2016/at160016.html"},
 | 
			
		||||
	"CVE-2016-1204":    {"https://www.jpcert.or.jp/at/2016/at160019.html"},
 | 
			
		||||
	"CVE-2016-1286":    {"https://www.jpcert.or.jp/at/2016/at160013.html", "https://www.jpcert.or.jp/at/2016/at160037.html"},
 | 
			
		||||
	"CVE-2016-2776":    {"https://www.jpcert.or.jp/at/2016/at160037.html"},
 | 
			
		||||
	"CVE-2016-3081":    {"https://www.jpcert.or.jp/at/2016/at160020.html"},
 | 
			
		||||
	"CVE-2016-3227":    {"https://www.jpcert.or.jp/at/2016/at160025.html"},
 | 
			
		||||
	"CVE-2016-3714":    {"https://www.jpcert.or.jp/at/2016/at160021.html"},
 | 
			
		||||
	"CVE-2016-3715":    {"https://www.jpcert.or.jp/at/2016/at160021.html"},
 | 
			
		||||
	"CVE-2016-3716":    {"https://www.jpcert.or.jp/at/2016/at160021.html"},
 | 
			
		||||
	"CVE-2016-3717":    {"https://www.jpcert.or.jp/at/2016/at160021.html"},
 | 
			
		||||
	"CVE-2016-3718":    {"https://www.jpcert.or.jp/at/2016/at160021.html"},
 | 
			
		||||
	"CVE-2016-4117":    {"https://www.jpcert.or.jp/at/2016/at160024.html"},
 | 
			
		||||
	"CVE-2016-4171":    {"https://www.jpcert.or.jp/at/2016/at160026.html"},
 | 
			
		||||
	"CVE-2016-4438":    {"https://www.jpcert.or.jp/at/2016/at160027.html"},
 | 
			
		||||
	"CVE-2016-5385":    {"https://www.jpcert.or.jp/at/2016/at160031.html"},
 | 
			
		||||
	"CVE-2016-5386":    {"https://www.jpcert.or.jp/at/2016/at160031.html"},
 | 
			
		||||
	"CVE-2016-5387":    {"https://www.jpcert.or.jp/at/2016/at160031.html"},
 | 
			
		||||
	"CVE-2016-5388":    {"https://www.jpcert.or.jp/at/2016/at160031.html"},
 | 
			
		||||
	"CVE-2016-6307":    {"https://www.jpcert.or.jp/at/2016/at160038.html"},
 | 
			
		||||
	"CVE-2016-6309":    {"https://www.jpcert.or.jp/at/2016/at160038.html"},
 | 
			
		||||
	"CVE-2016-7189":    {"https://www.jpcert.or.jp/at/2016/at160039.html"},
 | 
			
		||||
	"CVE-2016-7836":    {"https://www.jpcert.or.jp/at/2016/at160051.html", "https://www.jpcert.or.jp/at/2017/at170023.html"},
 | 
			
		||||
	"CVE-2016-7855":    {"https://www.jpcert.or.jp/at/2016/at160039.html", "https://www.jpcert.or.jp/at/2016/at160043.html"},
 | 
			
		||||
	"CVE-2016-7892":    {"https://www.jpcert.or.jp/at/2016/at160048.html", "https://www.jpcert.or.jp/at/2016/at160049.html"},
 | 
			
		||||
	"CVE-2016-8864":    {"https://www.jpcert.or.jp/at/2016/at160044.html"},
 | 
			
		||||
	"CVE-2016-9131":    {"https://www.jpcert.or.jp/at/2017/at170004.html"},
 | 
			
		||||
	"CVE-2016-9147":    {"https://www.jpcert.or.jp/at/2017/at170004.html"},
 | 
			
		||||
	"CVE-2016-9444":    {"https://www.jpcert.or.jp/at/2017/at170004.html"},
 | 
			
		||||
	"CVE-2016-9778":    {"https://www.jpcert.or.jp/at/2017/at170004.html"},
 | 
			
		||||
	"CVE-2017-0093":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0106":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0145":    {"https://www.jpcert.or.jp/at/2017/at170020.html"},
 | 
			
		||||
	"CVE-2017-0158":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0160":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0161":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-0162":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0163":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0180":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0181":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0199":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0200":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0201":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0202":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0205":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0210":    {"https://www.jpcert.or.jp/at/2017/at170015.html"},
 | 
			
		||||
	"CVE-2017-0221":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0222":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0224":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0227":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0228":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0229":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0235":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0236":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0240":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0250":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-0261":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0263":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0266":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0272":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0277":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0278":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0279":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0283":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-0290":    {"https://www.jpcert.or.jp/at/2017/at170019.html"},
 | 
			
		||||
	"CVE-2017-0291":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-0292":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-0293":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-0294":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-0781":    {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-0782":    {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-0783":    {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-0785":    {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-1000250": {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-1000251": {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-10271":   {"https://www.jpcert.or.jp/at/2018/at180004.html"},
 | 
			
		||||
	"CVE-2017-10845":   {"https://www.jpcert.or.jp/at/2017/at170034.html"},
 | 
			
		||||
	"CVE-2017-10846":   {"https://www.jpcert.or.jp/at/2017/at170034.html"},
 | 
			
		||||
	"CVE-2017-11223":   {"https://www.jpcert.or.jp/at/2017/at170031.html"},
 | 
			
		||||
	"CVE-2017-11292":   {"https://www.jpcert.or.jp/at/2017/at170040.html"},
 | 
			
		||||
	"CVE-2017-11762":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11763":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11764":   {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-11766":   {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-11771":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11779":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11792":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11793":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11796":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11798":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11799":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11800":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11802":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11804":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11805":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11806":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11807":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11808":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11809":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11810":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11811":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11812":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11813":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11819":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11821":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11822":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11826":   {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-11836":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11837":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11838":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11839":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11840":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11841":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11843":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11845":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11846":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11855":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11856":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11858":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11861":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11862":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11866":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11869":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11870":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11871":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11873":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11882":   {"https://www.jpcert.or.jp/at/2017/at170044.html"},
 | 
			
		||||
	"CVE-2017-11886":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11888":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11889":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11890":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11893":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11894":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11895":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11901":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11903":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11905":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11907":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11908":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11909":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11910":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11911":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11912":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11914":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11918":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11930":   {"https://www.jpcert.or.jp/at/2017/at170048.html"},
 | 
			
		||||
	"CVE-2017-11937":   {"https://www.jpcert.or.jp/at/2017/at170046.html"},
 | 
			
		||||
	"CVE-2017-12615":   {"https://www.jpcert.or.jp/at/2017/at170038.html"},
 | 
			
		||||
	"CVE-2017-12616":   {"https://www.jpcert.or.jp/at/2017/at170038.html"},
 | 
			
		||||
	"CVE-2017-12617":   {"https://www.jpcert.or.jp/at/2017/at170038.html"},
 | 
			
		||||
	"CVE-2017-13872":   {"https://www.jpcert.or.jp/at/2017/at170045.html"},
 | 
			
		||||
	"CVE-2017-14315":   {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-3135":    {"https://www.jpcert.or.jp/at/2017/at170007.html"},
 | 
			
		||||
	"CVE-2017-3136":    {"https://www.jpcert.or.jp/at/2017/at170016.html"},
 | 
			
		||||
	"CVE-2017-3137":    {"https://www.jpcert.or.jp/at/2017/at170016.html"},
 | 
			
		||||
	"CVE-2017-3138":    {"https://www.jpcert.or.jp/at/2017/at170016.html"},
 | 
			
		||||
	"CVE-2017-3142":    {"https://www.jpcert.or.jp/at/2017/at170024.html"},
 | 
			
		||||
	"CVE-2017-3143":    {"https://www.jpcert.or.jp/at/2017/at170024.html"},
 | 
			
		||||
	"CVE-2017-3145":    {"https://www.jpcert.or.jp/at/2018/at180005.html"},
 | 
			
		||||
	"CVE-2017-5638":    {"https://www.jpcert.or.jp/at/2017/at170009.html"},
 | 
			
		||||
	"CVE-2017-6753":    {"https://www.jpcert.or.jp/at/2017/at170028.html"},
 | 
			
		||||
	"CVE-2017-8463":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8464":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8496":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8497":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8499":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8517":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8520":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8522":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8524":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8527":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8528":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8543":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8548":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8549":    {"https://www.jpcert.or.jp/at/2017/at170022.html"},
 | 
			
		||||
	"CVE-2017-8584":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8589":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8591":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8594":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8595":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8596":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8598":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8601":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8603":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8604":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8605":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8606":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8607":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8608":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8609":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8610":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8617":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8618":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8619":    {"https://www.jpcert.or.jp/at/2017/at170027.html"},
 | 
			
		||||
	"CVE-2017-8620":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8622":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8628":    {"https://www.jpcert.or.jp/at/2017/at170037.html"},
 | 
			
		||||
	"CVE-2017-8634":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8635":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8636":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8638":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8639":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8640":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8641":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8645":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8646":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8647":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8649":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8653":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8655":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8656":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8657":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8660":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8661":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8669":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8670":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8671":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8672":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8674":    {"https://www.jpcert.or.jp/at/2017/at170032.html"},
 | 
			
		||||
	"CVE-2017-8676":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8682":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8686":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8696":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8727":    {"https://www.jpcert.or.jp/at/2017/at170039.html"},
 | 
			
		||||
	"CVE-2017-8728":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8729":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8731":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8734":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8737":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8738":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8740":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8741":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8747":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8748":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8749":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8750":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8751":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8752":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8753":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8755":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8756":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8757":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-8759":    {"https://www.jpcert.or.jp/at/2017/at170036.html"},
 | 
			
		||||
	"CVE-2017-9791":    {"https://www.jpcert.or.jp/at/2017/at170025.html"},
 | 
			
		||||
	"CVE-2017-9805":    {"https://www.jpcert.or.jp/at/2017/at170033.html"},
 | 
			
		||||
	"CVE-2018-0171":    {"https://www.jpcert.or.jp/at/2018/at180013.html"},
 | 
			
		||||
	"CVE-2018-0758":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0762":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0763":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0767":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0769":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0770":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0772":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0773":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0774":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0775":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0776":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0777":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0778":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0780":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0781":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0797":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0800":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0802":    {"https://www.jpcert.or.jp/at/2018/at180002.html"},
 | 
			
		||||
	"CVE-2018-0825":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0834":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0835":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0837":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0838":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0840":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0852":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0856":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0857":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0859":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0860":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0861":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-0870":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0872":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0874":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0876":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0889":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0893":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0930":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0931":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0932":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0933":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0934":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0936":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0937":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0939":    {"https://www.jpcert.or.jp/at/2018/at180011.html"},
 | 
			
		||||
	"CVE-2018-0943":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0945":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0946":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0950":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0951":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0953":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0954":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0955":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0959":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0961":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-0965":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-0979":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0980":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0981":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0988":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0990":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0991":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0993":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0994":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0995":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-0996":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1000":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1004":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1010":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1012":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1013":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1015":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1016":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1018":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1019":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1020":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-1022":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-1023":    {"https://www.jpcert.or.jp/at/2018/at180016.html"},
 | 
			
		||||
	"CVE-2018-11776":   {"https://www.jpcert.or.jp/at/2018/at180036.html"},
 | 
			
		||||
	"CVE-2018-1270":    {"https://www.jpcert.or.jp/at/2018/at180014.html"},
 | 
			
		||||
	"CVE-2018-1271":    {"https://www.jpcert.or.jp/at/2018/at180014.html"},
 | 
			
		||||
	"CVE-2018-1272":    {"https://www.jpcert.or.jp/at/2018/at180014.html"},
 | 
			
		||||
	"CVE-2018-1273":    {"https://www.jpcert.or.jp/at/2018/at180017.html"},
 | 
			
		||||
	"CVE-2018-1274":    {"https://www.jpcert.or.jp/at/2018/at180017.html"},
 | 
			
		||||
	"CVE-2018-1275":    {"https://www.jpcert.or.jp/at/2018/at180014.html"},
 | 
			
		||||
	"CVE-2018-12794":   {"https://www.jpcert.or.jp/at/2018/at180039.html"},
 | 
			
		||||
	"CVE-2018-1336":    {"https://www.jpcert.or.jp/at/2018/at180030.html"},
 | 
			
		||||
	"CVE-2018-15442":   {"https://www.jpcert.or.jp/at/2018/at180043.html"},
 | 
			
		||||
	"CVE-2018-15979":   {"https://www.jpcert.or.jp/at/2018/at180045.html"},
 | 
			
		||||
	"CVE-2018-2628":    {"https://www.jpcert.or.jp/at/2018/at180029.html"},
 | 
			
		||||
	"CVE-2018-2893":    {"https://www.jpcert.or.jp/at/2018/at180029.html"},
 | 
			
		||||
	"CVE-2018-2894":    {"https://www.jpcert.or.jp/at/2018/at180029.html"},
 | 
			
		||||
	"CVE-2018-2933":    {"https://www.jpcert.or.jp/at/2018/at180029.html"},
 | 
			
		||||
	"CVE-2018-2983":    {"https://www.jpcert.or.jp/at/2018/at180029.html"},
 | 
			
		||||
	"CVE-2018-2998":    {"https://www.jpcert.or.jp/at/2018/at180029.html"},
 | 
			
		||||
	"CVE-2018-4877":    {"https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-4878":    {"https://www.jpcert.or.jp/at/2018/at180006.html", "https://www.jpcert.or.jp/at/2018/at180008.html"},
 | 
			
		||||
	"CVE-2018-4945":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-5000":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-5001":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-5002":    {"https://www.jpcert.or.jp/at/2018/at180024.html", "https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-5740":    {"https://www.jpcert.or.jp/at/2018/at180031.html"},
 | 
			
		||||
	"CVE-2018-7600":    {"https://www.jpcert.or.jp/at/2018/at180012.html"},
 | 
			
		||||
	"CVE-2018-7602":    {"https://www.jpcert.or.jp/at/2018/at180019.html"},
 | 
			
		||||
	"CVE-2018-8034":    {"https://www.jpcert.or.jp/at/2018/at180030.html"},
 | 
			
		||||
	"CVE-2018-8037":    {"https://www.jpcert.or.jp/at/2018/at180030.html"},
 | 
			
		||||
	"CVE-2018-8110":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8111":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8114":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8120":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8122":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8128":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8130":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8133":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8137":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8139":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8154":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8174":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8178":    {"https://www.jpcert.or.jp/at/2018/at180021.html"},
 | 
			
		||||
	"CVE-2018-8213":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8225":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8229":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8231":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8236":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8242":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8249":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8251":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8262":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8266":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8267":    {"https://www.jpcert.or.jp/at/2018/at180025.html"},
 | 
			
		||||
	"CVE-2018-8273":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8274":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8275":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8279":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8280":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8286":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8288":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8290":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8291":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8294":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8296":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8301":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8302":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8324":    {"https://www.jpcert.or.jp/at/2018/at180028.html"},
 | 
			
		||||
	"CVE-2018-8332":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8344":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8345":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8350":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8355":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8367":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8371":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8372":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8373":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8377":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8380":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8381":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8385":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8387":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8390":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8397":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8403":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8414":    {"https://www.jpcert.or.jp/at/2018/at180034.html"},
 | 
			
		||||
	"CVE-2018-8420":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8421":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8439":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8440":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8447":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8453":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8456":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8457":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8459":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8460":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8461":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8464":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8465":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8466":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8467":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8473":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8475":    {"https://www.jpcert.or.jp/at/2018/at180038.html"},
 | 
			
		||||
	"CVE-2018-8476":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8489":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8490":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8491":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8494":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8505":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8509":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8510":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8511":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8513":    {"https://www.jpcert.or.jp/at/2018/at180041.html"},
 | 
			
		||||
	"CVE-2018-8541":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8542":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8543":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8544":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8551":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8553":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8555":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8556":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8557":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8588":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8589":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
	"CVE-2018-8609":    {"https://www.jpcert.or.jp/at/2018/at180046.html"},
 | 
			
		||||
}
 | 
			
		||||
@@ -1,96 +0,0 @@
 | 
			
		||||
package alert
 | 
			
		||||
 | 
			
		||||
// CveDictEn has CVE-ID key which included USCERT alerts
 | 
			
		||||
var CveDictEn = map[string][]string{
 | 
			
		||||
	"CVE-1999-0532": {"https://www.us-cert.gov/ncas/alerts/TA15-103A"},
 | 
			
		||||
	"CVE-2006-3227": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2008-0015": {"https://www.us-cert.gov/ncas/alerts/TA09-195A", "https://www.us-cert.gov/ncas/alerts/TA09-209A"},
 | 
			
		||||
	"CVE-2008-2244": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2009-0658": {"https://www.us-cert.gov/ncas/alerts/TA09-051A"},
 | 
			
		||||
	"CVE-2009-0927": {"https://www.us-cert.gov/ncas/alerts/TA13-141A"},
 | 
			
		||||
	"CVE-2009-1492": {"https://www.us-cert.gov/ncas/alerts/TA09-133B"},
 | 
			
		||||
	"CVE-2009-1493": {"https://www.us-cert.gov/ncas/alerts/TA09-133B"},
 | 
			
		||||
	"CVE-2009-1537": {"https://www.us-cert.gov/ncas/alerts/TA09-195A"},
 | 
			
		||||
	"CVE-2009-3103": {"https://www.us-cert.gov/ncas/alerts/TA17-181A"},
 | 
			
		||||
	"CVE-2009-3129": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2009-3674": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2009-3953": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2010-0018": {"https://www.us-cert.gov/ncas/alerts/TA10-012B"},
 | 
			
		||||
	"CVE-2010-0188": {"https://www.us-cert.gov/ncas/alerts/TA13-141A", "https://www.us-cert.gov/ncas/alerts/TA14-300A", "https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2010-0806": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2010-1297": {"https://www.us-cert.gov/ncas/alerts/TA10-162A", "https://www.us-cert.gov/ncas/alerts/TA10-159A"},
 | 
			
		||||
	"CVE-2010-2883": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2010-3333": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2011-0101": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2011-0611": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2011-2462": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2012-0158": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2012-1723": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2012-1856": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2012-1889": {"https://www.us-cert.gov/ncas/alerts/TA12-174A"},
 | 
			
		||||
	"CVE-2012-3174": {"https://www.us-cert.gov/ncas/alerts/TA13-010A"},
 | 
			
		||||
	"CVE-2012-4681": {"https://www.us-cert.gov/ncas/alerts/TA12-240A"},
 | 
			
		||||
	"CVE-2012-4792": {"https://www.us-cert.gov/ncas/alerts/TA13-015A", "https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-0074": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-0140": {"https://www.us-cert.gov/ncas/alerts/TA13-193A"},
 | 
			
		||||
	"CVE-2013-0141": {"https://www.us-cert.gov/ncas/alerts/TA13-193A"},
 | 
			
		||||
	"CVE-2013-0422": {"https://www.us-cert.gov/ncas/alerts/TA13-141A", "https://www.us-cert.gov/ncas/alerts/TA13-010A"},
 | 
			
		||||
	"CVE-2013-0625": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-0632": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-0809": {"https://www.us-cert.gov/ncas/alerts/TA13-064A"},
 | 
			
		||||
	"CVE-2013-1347": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-1493": {"https://www.us-cert.gov/ncas/alerts/TA13-064A"},
 | 
			
		||||
	"CVE-2013-1571": {"https://www.us-cert.gov/ncas/alerts/TA13-169A"},
 | 
			
		||||
	"CVE-2013-2465": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-2729": {"https://www.us-cert.gov/ncas/alerts/TA14-300A", "https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-3336": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2013-5211": {"https://www.us-cert.gov/ncas/alerts/TA14-017A", "https://www.us-cert.gov/ncas/alerts/TA14-013A"},
 | 
			
		||||
	"CVE-2013-5326": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-0160": {"https://www.us-cert.gov/ncas/alerts/TA14-098A", "https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-0322": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-0564": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-1761": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-1776": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-3393": {"https://www.us-cert.gov/ncas/alerts/TA16-250A"},
 | 
			
		||||
	"CVE-2014-3566": {"https://www.us-cert.gov/ncas/alerts/TA14-290A", "https://www.us-cert.gov/ncas/alerts/TA15-120A"},
 | 
			
		||||
	"CVE-2014-4114": {"https://www.us-cert.gov/ncas/alerts/TA15-119A"},
 | 
			
		||||
	"CVE-2014-6271": {"https://www.us-cert.gov/ncas/alerts/TA14-268A"},
 | 
			
		||||
	"CVE-2014-6277": {"https://www.us-cert.gov/ncas/alerts/TA14-268A"},
 | 
			
		||||
	"CVE-2014-6278": {"https://www.us-cert.gov/ncas/alerts/TA14-268A"},
 | 
			
		||||
	"CVE-2014-6321": {"https://www.us-cert.gov/ncas/alerts/TA14-318A"},
 | 
			
		||||
	"CVE-2014-6332": {"https://www.us-cert.gov/ncas/alerts/TA14-318B"},
 | 
			
		||||
	"CVE-2014-7169": {"https://www.us-cert.gov/ncas/alerts/TA14-268A"},
 | 
			
		||||
	"CVE-2014-7186": {"https://www.us-cert.gov/ncas/alerts/TA14-268A"},
 | 
			
		||||
	"CVE-2014-7187": {"https://www.us-cert.gov/ncas/alerts/TA14-268A"},
 | 
			
		||||
	"CVE-2014-8730": {"https://www.us-cert.gov/ncas/alerts/TA14-290A"},
 | 
			
		||||
	"CVE-2015-2387": {"https://www.us-cert.gov/ncas/alerts/TA15-195A"},
 | 
			
		||||
	"CVE-2015-5119": {"https://www.us-cert.gov/ncas/alerts/TA15-195A", "https://www.us-cert.gov/ncas/alerts/TA15-213A"},
 | 
			
		||||
	"CVE-2015-5122": {"https://www.us-cert.gov/ncas/alerts/TA15-195A"},
 | 
			
		||||
	"CVE-2015-5123": {"https://www.us-cert.gov/ncas/alerts/TA15-195A"},
 | 
			
		||||
	"CVE-2015-6585": {"https://www.us-cert.gov/ncas/alerts/TA17-164A"},
 | 
			
		||||
	"CVE-2015-8651": {"https://www.us-cert.gov/ncas/alerts/TA17-164A"},
 | 
			
		||||
	"CVE-2016-0034": {"https://www.us-cert.gov/ncas/alerts/TA17-164A"},
 | 
			
		||||
	"CVE-2016-1019": {"https://www.us-cert.gov/ncas/alerts/TA17-164A"},
 | 
			
		||||
	"CVE-2016-2207": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-2208": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-2209": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-2210": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-2211": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-3644": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-3645": {"https://www.us-cert.gov/ncas/alerts/TA16-187A"},
 | 
			
		||||
	"CVE-2016-4117": {"https://www.us-cert.gov/ncas/alerts/TA17-164A"},
 | 
			
		||||
	"CVE-2016-6366": {"https://www.us-cert.gov/ncas/alerts/TA16-250A"},
 | 
			
		||||
	"CVE-2016-6367": {"https://www.us-cert.gov/ncas/alerts/TA16-250A"},
 | 
			
		||||
	"CVE-2016-6415": {"https://www.us-cert.gov/ncas/alerts/TA16-250A"},
 | 
			
		||||
	"CVE-2016-6909": {"https://www.us-cert.gov/ncas/alerts/TA16-250A"},
 | 
			
		||||
	"CVE-2016-7089": {"https://www.us-cert.gov/ncas/alerts/TA16-250A"},
 | 
			
		||||
	"CVE-2017-0144": {"https://www.us-cert.gov/ncas/alerts/TA17-181A"},
 | 
			
		||||
	"CVE-2017-0145": {"https://www.us-cert.gov/ncas/alerts/TA17-181A"},
 | 
			
		||||
	"CVE-2017-3066": {"https://www.us-cert.gov/ncas/alerts/AA18-284A"},
 | 
			
		||||
	"CVE-2017-5715": {"https://www.us-cert.gov/ncas/alerts/TA18-141A", "https://www.us-cert.gov/ncas/alerts/TA18-004A"},
 | 
			
		||||
	"CVE-2017-5753": {"https://www.us-cert.gov/ncas/alerts/TA18-141A", "https://www.us-cert.gov/ncas/alerts/TA18-004A"},
 | 
			
		||||
	"CVE-2017-5754": {"https://www.us-cert.gov/ncas/alerts/TA18-141A", "https://www.us-cert.gov/ncas/alerts/TA18-004A"},
 | 
			
		||||
	"CVE-2018-1038": {"https://www.us-cert.gov/ncas/alerts/TA18-004A"},
 | 
			
		||||
	"CVE-2018-3639": {"https://www.us-cert.gov/ncas/alerts/TA18-141A"},
 | 
			
		||||
	"CVE-2018-3640": {"https://www.us-cert.gov/ncas/alerts/TA18-141A"},
 | 
			
		||||
}
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
package alert
 | 
			
		||||
 | 
			
		||||
// GenerateAlertDict returns XCERT alert slice by cveID
 | 
			
		||||
func GenerateAlertDict(cveID string, lang string) (alerts []Alert) {
 | 
			
		||||
	if lang == "ja" {
 | 
			
		||||
		if keys, ok := CveDictJa[cveID]; ok {
 | 
			
		||||
			for _, key := range keys {
 | 
			
		||||
				alerts = append(alerts, AlertDictJa[key])
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return alerts
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// default language is English
 | 
			
		||||
	if keys, ok := CveDictEn[cveID]; ok {
 | 
			
		||||
		for _, key := range keys {
 | 
			
		||||
			alerts = append(alerts, AlertDictEn[key])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return alerts
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								cache/bolt.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								cache/bolt.go
									
									
									
									
										vendored
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package cache
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								cache/bolt_test.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								cache/bolt_test.go
									
									
									
									
										vendored
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package cache
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -63,7 +46,7 @@ func TestSetupBolt(t *testing.T) {
 | 
			
		||||
		t.Errorf("Failed to open bolt: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	db.View(func(tx *bolt.Tx) error {
 | 
			
		||||
	_ = db.View(func(tx *bolt.Tx) error {
 | 
			
		||||
		bkt := tx.Bucket([]byte(metabucket))
 | 
			
		||||
		if bkt == nil {
 | 
			
		||||
			t.Errorf("Meta bucket nof found")
 | 
			
		||||
@@ -104,7 +87,7 @@ func TestEnsureBuckets(t *testing.T) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("Failed to open bolt: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
	db.View(func(tx *bolt.Tx) error {
 | 
			
		||||
	_ = db.View(func(tx *bolt.Tx) error {
 | 
			
		||||
		bkt := tx.Bucket([]byte(servername))
 | 
			
		||||
		if bkt == nil {
 | 
			
		||||
			t.Errorf("Meta bucket nof found")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								cache/db.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								cache/db.go
									
									
									
									
										vendored
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package cache
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -53,7 +36,7 @@ func (*ConfigtestCmd) Usage() string {
 | 
			
		||||
			[-log-dir=/path/to/log]
 | 
			
		||||
			[-ask-key-password]
 | 
			
		||||
			[-timeout=300]
 | 
			
		||||
			[-ssh-external]
 | 
			
		||||
			[-ssh-config]
 | 
			
		||||
			[-containers-only]
 | 
			
		||||
			[-http-proxy=http://192.168.0.1:8080]
 | 
			
		||||
			[-debug]
 | 
			
		||||
@@ -86,7 +69,7 @@ func (p *ConfigtestCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
		"Use Native Go implementation of SSH. Default: Use the external command")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.SSHConfig, "ssh-config", false,
 | 
			
		||||
		"Use SSH options specified in ssh_config preferentially")
 | 
			
		||||
		"[Deprecated] Use SSH options specified in ssh_config preferentially")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.ContainersOnly, "containers-only", false,
 | 
			
		||||
		"Test containers only. Default: Test both of hosts and containers")
 | 
			
		||||
@@ -96,7 +79,6 @@ func (p *ConfigtestCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
 | 
			
		||||
// Execute execute
 | 
			
		||||
func (p *ConfigtestCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 | 
			
		||||
	// Setup Logger
 | 
			
		||||
	util.Log = util.NewCustomLogger(c.ServerInfo{})
 | 
			
		||||
 | 
			
		||||
	if err := mkdirDotVuls(); err != nil {
 | 
			
		||||
@@ -125,6 +107,16 @@ func (p *ConfigtestCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interfa
 | 
			
		||||
		return subcommands.ExitUsageError
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Conf.SSHConfig {
 | 
			
		||||
		msg := []string{
 | 
			
		||||
			"-ssh-config is deprecated",
 | 
			
		||||
			"If you update Vuls and get this error, there may be incompatible changes in config.toml",
 | 
			
		||||
			"Please check config.toml template : https://vuls.io/docs/en/usage-settings.html",
 | 
			
		||||
		}
 | 
			
		||||
		util.Log.Errorf("%s", strings.Join(msg, "\n"))
 | 
			
		||||
		return subcommands.ExitUsageError
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var servernames []string
 | 
			
		||||
	if 0 < len(f.Args()) {
 | 
			
		||||
		servernames = f.Args()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -112,6 +95,11 @@ type        = "sqlite3"
 | 
			
		||||
sqlite3Path = "/path/to/go-exploitdb.sqlite3"
 | 
			
		||||
#url        = ""
 | 
			
		||||
 | 
			
		||||
[metasploit]
 | 
			
		||||
type        = "sqlite3"
 | 
			
		||||
sqlite3Path = "/path/to/go-msfdb.sqlite3"
 | 
			
		||||
#url        = ""
 | 
			
		||||
 | 
			
		||||
# https://vuls.io/docs/en/usage-settings.html#slack-section
 | 
			
		||||
#[slack]
 | 
			
		||||
#hookURL      = "https://hooks.slack.com/services/abc123/defghijklmnopqrstuvwxyz"
 | 
			
		||||
@@ -204,6 +192,7 @@ sqlite3Path = "/path/to/go-exploitdb.sqlite3"
 | 
			
		||||
host                = "{{$ip}}"
 | 
			
		||||
#port               = "22"
 | 
			
		||||
#user               = "root"
 | 
			
		||||
#sshConfigPath		= "/home/username/.ssh/config"
 | 
			
		||||
#keyPath            = "/home/username/.ssh/id_rsa"
 | 
			
		||||
#scanMode           = ["fast", "fast-root", "deep", "offline"]
 | 
			
		||||
#type               = "pseudo"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -23,26 +6,28 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/utils"
 | 
			
		||||
	c "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/exploit"
 | 
			
		||||
	"github.com/future-architect/vuls/gost"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/msf"
 | 
			
		||||
	"github.com/future-architect/vuls/oval"
 | 
			
		||||
	"github.com/future-architect/vuls/report"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	"github.com/google/subcommands"
 | 
			
		||||
	"github.com/k0kubun/pp"
 | 
			
		||||
	cvelog "github.com/kotakanbe/go-cve-dictionary/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ReportCmd is subcommand for reporting
 | 
			
		||||
type ReportCmd struct {
 | 
			
		||||
	configPath  string
 | 
			
		||||
	cveDict     c.GoCveDictConf
 | 
			
		||||
	ovalDict    c.GovalDictConf
 | 
			
		||||
	gostConf    c.GostConf
 | 
			
		||||
	exploitConf c.ExploitConf
 | 
			
		||||
	httpConf    c.HTTPConf
 | 
			
		||||
	configPath     string
 | 
			
		||||
	cveDict        c.GoCveDictConf
 | 
			
		||||
	ovalDict       c.GovalDictConf
 | 
			
		||||
	gostConf       c.GostConf
 | 
			
		||||
	exploitConf    c.ExploitConf
 | 
			
		||||
	metasploitConf c.MetasploitConf
 | 
			
		||||
	httpConf       c.HTTPConf
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Name return subcommand name
 | 
			
		||||
@@ -62,6 +47,7 @@ func (*ReportCmd) Usage() string {
 | 
			
		||||
		[-refresh-cve]
 | 
			
		||||
		[-cvss-over=7]
 | 
			
		||||
		[-diff]
 | 
			
		||||
		[-wp-ignore-inactive]
 | 
			
		||||
		[-ignore-unscored-cves]
 | 
			
		||||
		[-ignore-unfixed]
 | 
			
		||||
		[-ignore-github-dismissed]
 | 
			
		||||
@@ -87,6 +73,8 @@ func (*ReportCmd) Usage() string {
 | 
			
		||||
		[-http-proxy=http://192.168.0.1:8080]
 | 
			
		||||
		[-debug]
 | 
			
		||||
		[-debug-sql]
 | 
			
		||||
		[-quiet]
 | 
			
		||||
		[-no-progress]
 | 
			
		||||
		[-pipe]
 | 
			
		||||
		[-cvedb-type=sqlite3|mysql|postgres|redis|http]
 | 
			
		||||
		[-cvedb-sqlite3-path=/path/to/cve.sqlite3]
 | 
			
		||||
@@ -100,7 +88,11 @@ func (*ReportCmd) Usage() string {
 | 
			
		||||
		[-exploitdb-type=sqlite3|mysql|redis|http]
 | 
			
		||||
		[-exploitdb-sqlite3-path=/path/to/exploitdb.sqlite3]
 | 
			
		||||
		[-exploitdb-url=http://127.0.0.1:1326 or DB connection string]
 | 
			
		||||
		[-msfdb-type=sqlite3|mysql|redis|http]
 | 
			
		||||
		[-msfdb-sqlite3-path=/path/to/msfdb.sqlite3]
 | 
			
		||||
		[-msfdb-url=http://127.0.0.1:1327 or DB connection string]
 | 
			
		||||
		[-http="http://vuls-report-server"]
 | 
			
		||||
		[-trivy-cachedb-dir=/path/to/dir]
 | 
			
		||||
 | 
			
		||||
		[RFC3339 datetime format under results dir]
 | 
			
		||||
`
 | 
			
		||||
@@ -111,6 +103,8 @@ func (p *ReportCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	f.StringVar(&c.Conf.Lang, "lang", "en", "[en|ja]")
 | 
			
		||||
	f.BoolVar(&c.Conf.Debug, "debug", false, "debug mode")
 | 
			
		||||
	f.BoolVar(&c.Conf.DebugSQL, "debug-sql", false, "SQL debug mode")
 | 
			
		||||
	f.BoolVar(&c.Conf.Quiet, "quiet", false, "Quiet mode. No output on stdout")
 | 
			
		||||
	f.BoolVar(&c.Conf.NoProgress, "no-progress", false, "Suppress progress bar")
 | 
			
		||||
 | 
			
		||||
	wd, _ := os.Getwd()
 | 
			
		||||
	defaultConfPath := filepath.Join(wd, "config.toml")
 | 
			
		||||
@@ -131,6 +125,9 @@ func (p *ReportCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	f.BoolVar(&c.Conf.Diff, "diff", false,
 | 
			
		||||
		"Difference between previous result and current result ")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.WpIgnoreInactive, "wp-ignore-inactive", false,
 | 
			
		||||
		"ignore inactive on wordpress's plugin and theme")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.IgnoreUnscoredCves, "ignore-unscored-cves", false,
 | 
			
		||||
		"Don't report the unscored CVEs")
 | 
			
		||||
 | 
			
		||||
@@ -199,15 +196,21 @@ func (p *ReportCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	f.StringVar(&p.exploitConf.URL, "exploitdb-url", "",
 | 
			
		||||
		"http://exploit.com:1326 or DB connection string")
 | 
			
		||||
 | 
			
		||||
	f.StringVar(&p.metasploitConf.Type, "msfdb-type", "",
 | 
			
		||||
		"DB type of msf (sqlite3, mysql, postgres, redis or http)")
 | 
			
		||||
	f.StringVar(&p.metasploitConf.SQLite3Path, "msfdb-sqlite3-path", "", "/path/to/sqlite3")
 | 
			
		||||
	f.StringVar(&p.metasploitConf.URL, "msfdb-url", "",
 | 
			
		||||
		"http://metasploit.com:1327 or DB connection string")
 | 
			
		||||
 | 
			
		||||
	f.StringVar(&p.httpConf.URL, "http", "", "-to-http http://vuls-report")
 | 
			
		||||
 | 
			
		||||
	f.StringVar(&c.Conf.TrivyCacheDBDir, "trivy-cachedb-dir",
 | 
			
		||||
		utils.DefaultCacheDir(), "/path/to/dir")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Execute execute
 | 
			
		||||
func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 | 
			
		||||
	util.Log = util.NewCustomLogger(c.ServerInfo{})
 | 
			
		||||
	cvelog.SetLogger(c.Conf.LogDir, false, c.Conf.Debug, false)
 | 
			
		||||
 | 
			
		||||
	if err := c.Load(p.configPath, ""); err != nil {
 | 
			
		||||
		util.Log.Errorf("Error loading %s, %+v", p.configPath, err)
 | 
			
		||||
		return subcommands.ExitUsageError
 | 
			
		||||
@@ -217,6 +220,7 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
 | 
			
		||||
	c.Conf.OvalDict.Overwrite(p.ovalDict)
 | 
			
		||||
	c.Conf.Gost.Overwrite(p.gostConf)
 | 
			
		||||
	c.Conf.Exploit.Overwrite(p.exploitConf)
 | 
			
		||||
	c.Conf.Metasploit.Overwrite(p.metasploitConf)
 | 
			
		||||
	c.Conf.HTTP.Overwrite(p.httpConf)
 | 
			
		||||
 | 
			
		||||
	var dir string
 | 
			
		||||
@@ -400,12 +404,22 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
 | 
			
		||||
				return subcommands.ExitFailure
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c.Conf.Metasploit.URL != "" {
 | 
			
		||||
			err := msf.CheckHTTPHealth()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				util.Log.Errorf("metasploit HTTP server is not running. err: %+v", err)
 | 
			
		||||
				util.Log.Errorf("Run go-msfdb as server mode before reporting")
 | 
			
		||||
				return subcommands.ExitFailure
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		dbclient, locked, err := report.NewDBClient(report.DBClientConf{
 | 
			
		||||
			CveDictCnf:  c.Conf.CveDict,
 | 
			
		||||
			OvalDictCnf: c.Conf.OvalDict,
 | 
			
		||||
			GostCnf:     c.Conf.Gost,
 | 
			
		||||
			ExploitCnf:  c.Conf.Exploit,
 | 
			
		||||
			DebugSQL:    c.Conf.DebugSQL,
 | 
			
		||||
			CveDictCnf:    c.Conf.CveDict,
 | 
			
		||||
			OvalDictCnf:   c.Conf.OvalDict,
 | 
			
		||||
			GostCnf:       c.Conf.Gost,
 | 
			
		||||
			ExploitCnf:    c.Conf.Exploit,
 | 
			
		||||
			MetasploitCnf: c.Conf.Metasploit,
 | 
			
		||||
			DebugSQL:      c.Conf.DebugSQL,
 | 
			
		||||
		})
 | 
			
		||||
		if locked {
 | 
			
		||||
			util.Log.Errorf("SQLite3 is locked. Close other DB connections and try again. err: %+v", err)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -58,14 +41,19 @@ func (*ScanCmd) Usage() string {
 | 
			
		||||
		[-ssh-native-insecure]
 | 
			
		||||
		[-ssh-config]
 | 
			
		||||
		[-containers-only]
 | 
			
		||||
		[-libs-only]
 | 
			
		||||
		[-wordpress-only]
 | 
			
		||||
		[-skip-broken]
 | 
			
		||||
		[-http-proxy=http://192.168.0.1:8080]
 | 
			
		||||
		[-ask-key-password]
 | 
			
		||||
		[-timeout=300]
 | 
			
		||||
		[-timeout-scan=7200]
 | 
			
		||||
		[-debug]
 | 
			
		||||
		[-quiet]
 | 
			
		||||
		[-pipe]
 | 
			
		||||
		[-vvv]
 | 
			
		||||
		[-ips]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		[SERVER]...
 | 
			
		||||
`
 | 
			
		||||
@@ -74,6 +62,7 @@ func (*ScanCmd) Usage() string {
 | 
			
		||||
// SetFlags set flag
 | 
			
		||||
func (p *ScanCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	f.BoolVar(&c.Conf.Debug, "debug", false, "debug mode")
 | 
			
		||||
	f.BoolVar(&c.Conf.Quiet, "quiet", false, "Quiet mode. No output on stdout")
 | 
			
		||||
 | 
			
		||||
	wd, _ := os.Getwd()
 | 
			
		||||
	defaultConfPath := filepath.Join(wd, "config.toml")
 | 
			
		||||
@@ -93,13 +82,16 @@ func (p *ScanCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
		"Use Native Go implementation of SSH. Default: Use the external command")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.SSHConfig, "ssh-config", false,
 | 
			
		||||
		"Use SSH options specified in ssh_config preferentially")
 | 
			
		||||
		"[Deprecated] Use SSH options specified in ssh_config preferentially")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.ContainersOnly, "containers-only", false,
 | 
			
		||||
		"Scan running containers only. Default: Scan both of hosts and running containers")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.ImagesOnly, "images-only", false,
 | 
			
		||||
		"Scan container images only. Default: Scan both of hosts and images")
 | 
			
		||||
	f.BoolVar(&c.Conf.LibsOnly, "libs-only", false,
 | 
			
		||||
		"Scan libraries (lock files) specified in config.toml only.")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.WordPressOnly, "wordpress-only", false,
 | 
			
		||||
		"Scan WordPress only.")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.SkipBroken, "skip-broken", false,
 | 
			
		||||
		"[For CentOS] yum update changelog with --skip-broken option")
 | 
			
		||||
@@ -112,6 +104,8 @@ func (p *ScanCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.Pipe, "pipe", false, "Use stdin via PIPE")
 | 
			
		||||
 | 
			
		||||
	f.BoolVar(&c.Conf.DetectIPS, "ips", false, "retrieve IPS information")
 | 
			
		||||
	f.BoolVar(&c.Conf.Vvv, "vvv", false, "ssh -vvv")
 | 
			
		||||
 | 
			
		||||
	f.IntVar(&p.timeoutSec, "timeout", 5*60,
 | 
			
		||||
@@ -154,6 +148,16 @@ func (p *ScanCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{})
 | 
			
		||||
		return subcommands.ExitUsageError
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Conf.SSHConfig {
 | 
			
		||||
		msg := []string{
 | 
			
		||||
			"-ssh-config is deprecated",
 | 
			
		||||
			"If you update Vuls and get this error, there may be incompatible changes in config.toml",
 | 
			
		||||
			"Please check config.toml template : https://vuls.io/docs/en/usage-settings.html",
 | 
			
		||||
		}
 | 
			
		||||
		util.Log.Errorf("%s", strings.Join(msg, "\n"))
 | 
			
		||||
		return subcommands.ExitUsageError
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	util.Log.Info("Start scanning")
 | 
			
		||||
	util.Log.Infof("config: %s", p.configPath)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -30,22 +13,23 @@ import (
 | 
			
		||||
	c "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/exploit"
 | 
			
		||||
	"github.com/future-architect/vuls/gost"
 | 
			
		||||
	"github.com/future-architect/vuls/msf"
 | 
			
		||||
	"github.com/future-architect/vuls/oval"
 | 
			
		||||
	"github.com/future-architect/vuls/report"
 | 
			
		||||
	"github.com/future-architect/vuls/server"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	"github.com/google/subcommands"
 | 
			
		||||
	cvelog "github.com/kotakanbe/go-cve-dictionary/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ServerCmd is subcommand for server
 | 
			
		||||
type ServerCmd struct {
 | 
			
		||||
	configPath  string
 | 
			
		||||
	listen      string
 | 
			
		||||
	cveDict     c.GoCveDictConf
 | 
			
		||||
	ovalDict    c.GovalDictConf
 | 
			
		||||
	gostConf    c.GostConf
 | 
			
		||||
	exploitConf c.ExploitConf
 | 
			
		||||
	configPath     string
 | 
			
		||||
	listen         string
 | 
			
		||||
	cveDict        c.GoCveDictConf
 | 
			
		||||
	ovalDict       c.GovalDictConf
 | 
			
		||||
	gostConf       c.GostConf
 | 
			
		||||
	exploitConf    c.ExploitConf
 | 
			
		||||
	metasploitConf c.MetasploitConf
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Name return subcommand name
 | 
			
		||||
@@ -82,6 +66,9 @@ func (*ServerCmd) Usage() string {
 | 
			
		||||
		[-exploitdb-type=sqlite3|mysql|redis|http]
 | 
			
		||||
		[-exploitdb-sqlite3-path=/path/to/exploitdb.sqlite3]
 | 
			
		||||
		[-exploitdb-url=http://127.0.0.1:1326 or DB connection string]
 | 
			
		||||
		[-msfdb-type=sqlite3|mysql|redis|http]
 | 
			
		||||
		[-msfdb-sqlite3-path=/path/to/msfdb.sqlite3]
 | 
			
		||||
		[-msfdb-url=http://127.0.0.1:1327 or DB connection string]
 | 
			
		||||
 | 
			
		||||
		[RFC3339 datetime format under results dir]
 | 
			
		||||
`
 | 
			
		||||
@@ -143,13 +130,17 @@ func (p *ServerCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	f.StringVar(&p.exploitConf.SQLite3Path, "exploitdb-sqlite3-path", "", "/path/to/sqlite3")
 | 
			
		||||
	f.StringVar(&p.exploitConf.URL, "exploitdb-url", "",
 | 
			
		||||
		"http://exploit.com:1326 or DB connection string")
 | 
			
		||||
 | 
			
		||||
	f.StringVar(&p.metasploitConf.Type, "msfdb-type", "",
 | 
			
		||||
		"DB type of msf (sqlite3, mysql, postgres, redis or http)")
 | 
			
		||||
	f.StringVar(&p.metasploitConf.SQLite3Path, "msfdb-sqlite3-path", "", "/path/to/sqlite3")
 | 
			
		||||
	f.StringVar(&p.metasploitConf.URL, "msfdb-url", "",
 | 
			
		||||
		"http://metasploit.com:1327 or DB connection string")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Execute execute
 | 
			
		||||
func (p *ServerCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 | 
			
		||||
	util.Log = util.NewCustomLogger(c.ServerInfo{})
 | 
			
		||||
	cvelog.SetLogger(c.Conf.LogDir, false, c.Conf.Debug, false)
 | 
			
		||||
 | 
			
		||||
	if p.configPath != "" {
 | 
			
		||||
		if err := c.Load(p.configPath, ""); err != nil {
 | 
			
		||||
			util.Log.Errorf("Error loading %s. err: %+v", p.configPath, err)
 | 
			
		||||
@@ -161,6 +152,7 @@ func (p *ServerCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
 | 
			
		||||
	c.Conf.OvalDict.Overwrite(p.ovalDict)
 | 
			
		||||
	c.Conf.Gost.Overwrite(p.gostConf)
 | 
			
		||||
	c.Conf.Exploit.Overwrite(p.exploitConf)
 | 
			
		||||
	c.Conf.Metasploit.Overwrite(p.metasploitConf)
 | 
			
		||||
 | 
			
		||||
	util.Log.Info("Validating config...")
 | 
			
		||||
	if !c.Conf.ValidateOnReport() {
 | 
			
		||||
@@ -208,7 +200,35 @@ func (p *ServerCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	http.Handle("/vuls", server.VulsHandler{})
 | 
			
		||||
	if c.Conf.Metasploit.URL != "" {
 | 
			
		||||
		err := msf.CheckHTTPHealth()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			util.Log.Errorf("metasploit HTTP server is not running. err: %+v", err)
 | 
			
		||||
			util.Log.Errorf("Run go-msfdb as server mode before reporting")
 | 
			
		||||
			return subcommands.ExitFailure
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	dbclient, locked, err := report.NewDBClient(report.DBClientConf{
 | 
			
		||||
		CveDictCnf:    c.Conf.CveDict,
 | 
			
		||||
		OvalDictCnf:   c.Conf.OvalDict,
 | 
			
		||||
		GostCnf:       c.Conf.Gost,
 | 
			
		||||
		ExploitCnf:    c.Conf.Exploit,
 | 
			
		||||
		MetasploitCnf: c.Conf.Metasploit,
 | 
			
		||||
		DebugSQL:      c.Conf.DebugSQL,
 | 
			
		||||
	})
 | 
			
		||||
	if locked {
 | 
			
		||||
		util.Log.Errorf("SQLite3 is locked. Close other DB connections and try again: %+v", err)
 | 
			
		||||
		return subcommands.ExitFailure
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		util.Log.Errorf("Failed to init DB Clients. err: %+v", err)
 | 
			
		||||
		return subcommands.ExitFailure
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer dbclient.CloseDB()
 | 
			
		||||
 | 
			
		||||
	http.Handle("/vuls", server.VulsHandler{DBclient: *dbclient})
 | 
			
		||||
	http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		fmt.Fprintf(w, "ok")
 | 
			
		||||
	})
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -23,24 +6,26 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/utils"
 | 
			
		||||
	c "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/exploit"
 | 
			
		||||
	"github.com/future-architect/vuls/gost"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/msf"
 | 
			
		||||
	"github.com/future-architect/vuls/oval"
 | 
			
		||||
	"github.com/future-architect/vuls/report"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	"github.com/google/subcommands"
 | 
			
		||||
	cvelog "github.com/kotakanbe/go-cve-dictionary/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TuiCmd is Subcommand of host discovery mode
 | 
			
		||||
type TuiCmd struct {
 | 
			
		||||
	configPath  string
 | 
			
		||||
	cveDict     c.GoCveDictConf
 | 
			
		||||
	ovalDict    c.GovalDictConf
 | 
			
		||||
	gostConf    c.GostConf
 | 
			
		||||
	exploitConf c.ExploitConf
 | 
			
		||||
	configPath     string
 | 
			
		||||
	cveDict        c.GoCveDictConf
 | 
			
		||||
	ovalDict       c.GovalDictConf
 | 
			
		||||
	gostConf       c.GostConf
 | 
			
		||||
	exploitConf    c.ExploitConf
 | 
			
		||||
	metasploitConf c.MetasploitConf
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Name return subcommand name
 | 
			
		||||
@@ -63,6 +48,8 @@ func (*TuiCmd) Usage() string {
 | 
			
		||||
		[-log-dir=/path/to/log]
 | 
			
		||||
		[-debug]
 | 
			
		||||
		[-debug-sql]
 | 
			
		||||
		[-quiet]
 | 
			
		||||
		[-no-progress]
 | 
			
		||||
		[-pipe]
 | 
			
		||||
		[-cvedb-type=sqlite3|mysql|postgres|redis|http]
 | 
			
		||||
		[-cvedb-sqlite3-path=/path/to/cve.sqlite3]
 | 
			
		||||
@@ -76,6 +63,10 @@ func (*TuiCmd) Usage() string {
 | 
			
		||||
		[-exploitdb-type=sqlite3|mysql|redis|http]
 | 
			
		||||
		[-exploitdb-sqlite3-path=/path/to/exploitdb.sqlite3]
 | 
			
		||||
		[-exploitdb-url=http://127.0.0.1:1326 or DB connection string]
 | 
			
		||||
		[-msfdb-type=sqlite3|mysql|redis|http]
 | 
			
		||||
		[-msfdb-sqlite3-path=/path/to/msfdb.sqlite3]
 | 
			
		||||
		[-msfdb-url=http://127.0.0.1:1327 or DB connection string]
 | 
			
		||||
		[-trivy-cachedb-dir=/path/to/dir]
 | 
			
		||||
 | 
			
		||||
`
 | 
			
		||||
}
 | 
			
		||||
@@ -85,6 +76,8 @@ func (p *TuiCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	//  f.StringVar(&p.lang, "lang", "en", "[en|ja]")
 | 
			
		||||
	f.BoolVar(&c.Conf.DebugSQL, "debug-sql", false, "debug SQL")
 | 
			
		||||
	f.BoolVar(&c.Conf.Debug, "debug", false, "debug mode")
 | 
			
		||||
	f.BoolVar(&c.Conf.Quiet, "quiet", false, "Quiet mode. No output on stdout")
 | 
			
		||||
	f.BoolVar(&c.Conf.NoProgress, "no-progress", false, "Suppress progress bar")
 | 
			
		||||
 | 
			
		||||
	defaultLogDir := util.GetDefaultLogDir()
 | 
			
		||||
	f.StringVar(&c.Conf.LogDir, "log-dir", defaultLogDir, "/path/to/log")
 | 
			
		||||
@@ -138,25 +131,30 @@ func (p *TuiCmd) SetFlags(f *flag.FlagSet) {
 | 
			
		||||
	f.StringVar(&p.exploitConf.URL, "exploitdb-url", "",
 | 
			
		||||
		"http://exploit.com:1326 or DB connection string")
 | 
			
		||||
 | 
			
		||||
	f.StringVar(&p.metasploitConf.Type, "msfdb-type", "",
 | 
			
		||||
		"DB type of msf (sqlite3, mysql, postgres, redis or http)")
 | 
			
		||||
	f.StringVar(&p.metasploitConf.SQLite3Path, "msfdb-sqlite3-path", "", "/path/to/sqlite3")
 | 
			
		||||
	f.StringVar(&p.metasploitConf.URL, "msfdb-url", "",
 | 
			
		||||
		"http://metasploit.com:1327 or DB connection string")
 | 
			
		||||
 | 
			
		||||
	f.StringVar(&c.Conf.TrivyCacheDBDir, "trivy-cachedb-dir",
 | 
			
		||||
		utils.DefaultCacheDir(), "/path/to/dir")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Execute execute
 | 
			
		||||
func (p *TuiCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
 | 
			
		||||
	c.Conf.Lang = "en"
 | 
			
		||||
 | 
			
		||||
	// Setup Logger
 | 
			
		||||
	util.Log = util.NewCustomLogger(c.ServerInfo{})
 | 
			
		||||
	cvelog.SetLogger(c.Conf.LogDir, false, c.Conf.Debug, false)
 | 
			
		||||
 | 
			
		||||
	if err := c.Load(p.configPath, ""); err != nil {
 | 
			
		||||
		util.Log.Errorf("Error loading %s, err: %+v", p.configPath, err)
 | 
			
		||||
		return subcommands.ExitUsageError
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.Conf.Lang = "en"
 | 
			
		||||
	c.Conf.CveDict.Overwrite(p.cveDict)
 | 
			
		||||
	c.Conf.OvalDict.Overwrite(p.ovalDict)
 | 
			
		||||
	c.Conf.Gost.Overwrite(p.gostConf)
 | 
			
		||||
	c.Conf.Exploit.Overwrite(p.exploitConf)
 | 
			
		||||
	c.Conf.Metasploit.Overwrite(p.metasploitConf)
 | 
			
		||||
 | 
			
		||||
	var dir string
 | 
			
		||||
	var err error
 | 
			
		||||
@@ -222,12 +220,22 @@ func (p *TuiCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) s
 | 
			
		||||
			return subcommands.ExitFailure
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Conf.Metasploit.URL != "" {
 | 
			
		||||
		err := msf.CheckHTTPHealth()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			util.Log.Errorf("metasploit HTTP server is not running. err: %+v", err)
 | 
			
		||||
			util.Log.Errorf("Run go-msfdb as server mode before reporting")
 | 
			
		||||
			return subcommands.ExitFailure
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	dbclient, locked, err := report.NewDBClient(report.DBClientConf{
 | 
			
		||||
		CveDictCnf:  c.Conf.CveDict,
 | 
			
		||||
		OvalDictCnf: c.Conf.OvalDict,
 | 
			
		||||
		GostCnf:     c.Conf.Gost,
 | 
			
		||||
		ExploitCnf:  c.Conf.Exploit,
 | 
			
		||||
		DebugSQL:    c.Conf.DebugSQL,
 | 
			
		||||
		CveDictCnf:    c.Conf.CveDict,
 | 
			
		||||
		OvalDictCnf:   c.Conf.OvalDict,
 | 
			
		||||
		GostCnf:       c.Conf.Gost,
 | 
			
		||||
		ExploitCnf:    c.Conf.Exploit,
 | 
			
		||||
		MetasploitCnf: c.Conf.Metasploit,
 | 
			
		||||
		DebugSQL:      c.Conf.DebugSQL,
 | 
			
		||||
	})
 | 
			
		||||
	if locked {
 | 
			
		||||
		util.Log.Errorf("SQLite3 is locked. Close other DB connections and try again: %+v", err)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package commands
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										180
									
								
								config/config.go
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								config/config.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -28,13 +11,12 @@ import (
 | 
			
		||||
 | 
			
		||||
	syslog "github.com/RackSec/srslog"
 | 
			
		||||
	valid "github.com/asaskevich/govalidator"
 | 
			
		||||
	"github.com/knqyf263/fanal/types"
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Version of Vuls
 | 
			
		||||
var Version = "0.7.0"
 | 
			
		||||
var Version = "0.9.9"
 | 
			
		||||
 | 
			
		||||
// Revision of Git
 | 
			
		||||
var Revision string
 | 
			
		||||
@@ -106,6 +88,8 @@ type Config struct {
 | 
			
		||||
	LogDir     string `json:"logDir,omitempty"`
 | 
			
		||||
	ResultsDir string `json:"resultsDir,omitempty"`
 | 
			
		||||
	Pipe       bool   `json:"pipe,omitempty"`
 | 
			
		||||
	Quiet      bool   `json:"quiet,omitempty"`
 | 
			
		||||
	NoProgress bool   `json:"noProgress,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Default       ServerInfo            `json:"default,omitempty"`
 | 
			
		||||
	Servers       map[string]ServerInfo `json:"servers,omitempty"`
 | 
			
		||||
@@ -115,19 +99,26 @@ type Config struct {
 | 
			
		||||
	IgnoreUnfixed         bool `json:"ignoreUnfixed,omitempty"`
 | 
			
		||||
	IgnoreGitHubDismissed bool `json:"ignore_git_hub_dismissed,omitempty"`
 | 
			
		||||
 | 
			
		||||
	SSHNative      bool   `json:"sshNative,omitempty"`
 | 
			
		||||
	SSHConfig      bool   `json:"sshConfig,omitempty"`
 | 
			
		||||
	ContainersOnly bool   `json:"containersOnly,omitempty"`
 | 
			
		||||
	ImagesOnly     bool   `json:"imagesOnly,omitempty"`
 | 
			
		||||
	SkipBroken     bool   `json:"skipBroken,omitempty"`
 | 
			
		||||
	CacheDBPath    string `json:"cacheDBPath,omitempty"`
 | 
			
		||||
	Vvv            bool   `json:"vvv,omitempty"`
 | 
			
		||||
	UUID           bool   `json:"uuid,omitempty"`
 | 
			
		||||
	SSHNative bool `json:"sshNative,omitempty"`
 | 
			
		||||
	SSHConfig bool `json:"sshConfig,omitempty"`
 | 
			
		||||
 | 
			
		||||
	CveDict  GoCveDictConf `json:"cveDict,omitempty"`
 | 
			
		||||
	OvalDict GovalDictConf `json:"ovalDict,omitempty"`
 | 
			
		||||
	Gost     GostConf      `json:"gost,omitempty"`
 | 
			
		||||
	Exploit  ExploitConf   `json:"exploit,omitempty"`
 | 
			
		||||
	ContainersOnly bool `json:"containersOnly,omitempty"`
 | 
			
		||||
	LibsOnly       bool `json:"libsOnly,omitempty"`
 | 
			
		||||
	WordPressOnly  bool `json:"wordpressOnly,omitempty"`
 | 
			
		||||
 | 
			
		||||
	CacheDBPath     string `json:"cacheDBPath,omitempty"`
 | 
			
		||||
	TrivyCacheDBDir string `json:"trivyCacheDBDir,omitempty"`
 | 
			
		||||
 | 
			
		||||
	SkipBroken bool `json:"skipBroken,omitempty"`
 | 
			
		||||
	Vvv        bool `json:"vvv,omitempty"`
 | 
			
		||||
	UUID       bool `json:"uuid,omitempty"`
 | 
			
		||||
	DetectIPS  bool `json:"detectIps,omitempty"`
 | 
			
		||||
 | 
			
		||||
	CveDict    GoCveDictConf  `json:"cveDict,omitempty"`
 | 
			
		||||
	OvalDict   GovalDictConf  `json:"ovalDict,omitempty"`
 | 
			
		||||
	Gost       GostConf       `json:"gost,omitempty"`
 | 
			
		||||
	Exploit    ExploitConf    `json:"exploit,omitempty"`
 | 
			
		||||
	Metasploit MetasploitConf `json:"metasploit,omitempty"`
 | 
			
		||||
 | 
			
		||||
	Slack    SlackConf    `json:"-"`
 | 
			
		||||
	EMail    SMTPConf     `json:"-"`
 | 
			
		||||
@@ -162,11 +153,12 @@ type Config struct {
 | 
			
		||||
	FormatFullText    bool `json:"formatFullText,omitempty"`
 | 
			
		||||
	GZIP              bool `json:"gzip,omitempty"`
 | 
			
		||||
	Diff              bool `json:"diff,omitempty"`
 | 
			
		||||
	WpIgnoreInactive  bool `json:"wpIgnoreInactive,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateOnConfigtest validates
 | 
			
		||||
func (c Config) ValidateOnConfigtest() bool {
 | 
			
		||||
	errs := []error{}
 | 
			
		||||
	errs := c.checkSSHKeyExist()
 | 
			
		||||
 | 
			
		||||
	if runtime.GOOS == "windows" && !c.SSHNative {
 | 
			
		||||
		errs = append(errs, xerrors.New("-ssh-native-insecure is needed on windows"))
 | 
			
		||||
@@ -186,14 +178,7 @@ func (c Config) ValidateOnConfigtest() bool {
 | 
			
		||||
 | 
			
		||||
// ValidateOnScan validates configuration
 | 
			
		||||
func (c Config) ValidateOnScan() bool {
 | 
			
		||||
	errs := []error{}
 | 
			
		||||
 | 
			
		||||
	if len(c.ResultsDir) != 0 {
 | 
			
		||||
		if ok, _ := valid.IsFilePath(c.ResultsDir); !ok {
 | 
			
		||||
			errs = append(errs, xerrors.Errorf(
 | 
			
		||||
				"JSON base directory must be a *Absolute* file path. -results-dir: %s", c.ResultsDir))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	errs := c.checkSSHKeyExist()
 | 
			
		||||
 | 
			
		||||
	if runtime.GOOS == "windows" && !c.SSHNative {
 | 
			
		||||
		errs = append(errs, xerrors.New("-ssh-native-insecure is needed on windows"))
 | 
			
		||||
@@ -226,6 +211,21 @@ func (c Config) ValidateOnScan() bool {
 | 
			
		||||
	return len(errs) == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c Config) checkSSHKeyExist() (errs []error) {
 | 
			
		||||
	for serverName, v := range c.Servers {
 | 
			
		||||
		if v.Type == ServerTypePseudo {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if v.KeyPath != "" {
 | 
			
		||||
			if _, err := os.Stat(v.KeyPath); err != nil {
 | 
			
		||||
				errs = append(errs, xerrors.Errorf(
 | 
			
		||||
					"%s is invalid. keypath: %s not exists", serverName, v.KeyPath))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return errs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateOnReportDB validates configuration
 | 
			
		||||
func (c Config) ValidateOnReportDB() bool {
 | 
			
		||||
	errs := []error{}
 | 
			
		||||
@@ -233,11 +233,6 @@ func (c Config) ValidateOnReportDB() bool {
 | 
			
		||||
	if err := validateDB("cvedb", c.CveDict.Type, c.CveDict.SQLite3Path, c.CveDict.URL); err != nil {
 | 
			
		||||
		errs = append(errs, err)
 | 
			
		||||
	}
 | 
			
		||||
	if c.CveDict.Type == "sqlite3" {
 | 
			
		||||
		if _, err := os.Stat(c.CveDict.SQLite3Path); os.IsNotExist(err) {
 | 
			
		||||
			errs = append(errs, xerrors.Errorf("SQLite3 DB path (%s) is not exist: %s", "cvedb", c.CveDict.SQLite3Path))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := validateDB("ovaldb", c.OvalDict.Type, c.OvalDict.SQLite3Path, c.OvalDict.URL); err != nil {
 | 
			
		||||
		errs = append(errs, err)
 | 
			
		||||
@@ -251,6 +246,10 @@ func (c Config) ValidateOnReportDB() bool {
 | 
			
		||||
		errs = append(errs, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := validateDB("msfdb", c.Metasploit.Type, c.Metasploit.SQLite3Path, c.Metasploit.URL); err != nil {
 | 
			
		||||
		errs = append(errs, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, err := range errs {
 | 
			
		||||
		log.Error(err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -331,11 +330,6 @@ func (c Config) ValidateOnTui() bool {
 | 
			
		||||
	if err := validateDB("cvedb", c.CveDict.Type, c.CveDict.SQLite3Path, c.CveDict.URL); err != nil {
 | 
			
		||||
		errs = append(errs, err)
 | 
			
		||||
	}
 | 
			
		||||
	if c.CveDict.Type == "sqlite3" {
 | 
			
		||||
		if _, err := os.Stat(c.CveDict.SQLite3Path); os.IsNotExist(err) {
 | 
			
		||||
			errs = append(errs, xerrors.Errorf("SQLite3 DB path (%s) is not exist: %s", "cvedb", c.CveDict.SQLite3Path))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, err := range errs {
 | 
			
		||||
		log.Error(err)
 | 
			
		||||
@@ -596,7 +590,7 @@ func (c *TelegramConf) Validate() (errs []error) {
 | 
			
		||||
 | 
			
		||||
// SaasConf is stride config
 | 
			
		||||
type SaasConf struct {
 | 
			
		||||
	GroupID int    `json:"-"`
 | 
			
		||||
	GroupID int64  `json:"-"`
 | 
			
		||||
	Token   string `json:"-"`
 | 
			
		||||
	URL     string `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
@@ -1011,6 +1005,64 @@ func (cnf *ExploitConf) IsFetchViaHTTP() bool {
 | 
			
		||||
	return Conf.Exploit.Type == "http"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MetasploitConf is metasploit config
 | 
			
		||||
type MetasploitConf struct {
 | 
			
		||||
	// DB type for metasploit dictionary (sqlite3, mysql, postgres or redis)
 | 
			
		||||
	Type string
 | 
			
		||||
 | 
			
		||||
	// http://metasploit-dictionary.com:1324 or DB connection string
 | 
			
		||||
	URL string `json:"-"`
 | 
			
		||||
 | 
			
		||||
	// /path/to/metasploit.sqlite3
 | 
			
		||||
	SQLite3Path string `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cnf *MetasploitConf) setDefault() {
 | 
			
		||||
	if cnf.Type == "" {
 | 
			
		||||
		cnf.Type = "sqlite3"
 | 
			
		||||
	}
 | 
			
		||||
	if cnf.URL == "" && cnf.SQLite3Path == "" {
 | 
			
		||||
		wd, _ := os.Getwd()
 | 
			
		||||
		cnf.SQLite3Path = filepath.Join(wd, "go-msfdb.sqlite3")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const metasploitDBType = "METASPLOITDB_TYPE"
 | 
			
		||||
const metasploitDBURL = "METASPLOITDB_URL"
 | 
			
		||||
const metasploitDBPATH = "METASPLOITDB_SQLITE3_PATH"
 | 
			
		||||
 | 
			
		||||
// Overwrite set options with the following priority.
 | 
			
		||||
// 1. Command line option
 | 
			
		||||
// 2. Environment variable
 | 
			
		||||
// 3. config.toml
 | 
			
		||||
func (cnf *MetasploitConf) Overwrite(cmdOpt MetasploitConf) {
 | 
			
		||||
	if os.Getenv(metasploitDBType) != "" {
 | 
			
		||||
		cnf.Type = os.Getenv(metasploitDBType)
 | 
			
		||||
	}
 | 
			
		||||
	if os.Getenv(metasploitDBURL) != "" {
 | 
			
		||||
		cnf.URL = os.Getenv(metasploitDBURL)
 | 
			
		||||
	}
 | 
			
		||||
	if os.Getenv(metasploitDBPATH) != "" {
 | 
			
		||||
		cnf.SQLite3Path = os.Getenv(metasploitDBPATH)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if cmdOpt.Type != "" {
 | 
			
		||||
		cnf.Type = cmdOpt.Type
 | 
			
		||||
	}
 | 
			
		||||
	if cmdOpt.URL != "" {
 | 
			
		||||
		cnf.URL = cmdOpt.URL
 | 
			
		||||
	}
 | 
			
		||||
	if cmdOpt.SQLite3Path != "" {
 | 
			
		||||
		cnf.SQLite3Path = cmdOpt.SQLite3Path
 | 
			
		||||
	}
 | 
			
		||||
	cnf.setDefault()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsFetchViaHTTP returns wether fetch via http
 | 
			
		||||
func (cnf *MetasploitConf) IsFetchViaHTTP() bool {
 | 
			
		||||
	return Conf.Metasploit.Type == "http"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AWS is aws config
 | 
			
		||||
type AWS struct {
 | 
			
		||||
	// AWS profile to use
 | 
			
		||||
@@ -1046,7 +1098,9 @@ type ServerInfo struct {
 | 
			
		||||
	ServerName             string                      `toml:"-" json:"serverName,omitempty"`
 | 
			
		||||
	User                   string                      `toml:"user,omitempty" json:"user,omitempty"`
 | 
			
		||||
	Host                   string                      `toml:"host,omitempty" json:"host,omitempty"`
 | 
			
		||||
	JumpServer             []string                    `toml:"jumpServer,omitempty" json:"jumpServer,omitempty"`
 | 
			
		||||
	Port                   string                      `toml:"port,omitempty" json:"port,omitempty"`
 | 
			
		||||
	SSHConfigPath          string                      `toml:"sshConfigPath,omitempty" json:"sshConfigPath,omitempty"`
 | 
			
		||||
	KeyPath                string                      `toml:"keyPath,omitempty" json:"keyPath,omitempty"`
 | 
			
		||||
	KeyPassword            string                      `json:"-,omitempty" toml:"-"`
 | 
			
		||||
	CpeNames               []string                    `toml:"cpeNames,omitempty" json:"cpeNames,omitempty"`
 | 
			
		||||
@@ -1060,7 +1114,6 @@ type ServerInfo struct {
 | 
			
		||||
	IgnoreCves             []string                    `toml:"ignoreCves,omitempty" json:"ignoreCves,omitempty"`
 | 
			
		||||
	IgnorePkgsRegexp       []string                    `toml:"ignorePkgsRegexp,omitempty" json:"ignorePkgsRegexp,omitempty"`
 | 
			
		||||
	GitHubRepos            map[string]GitHubConf       `toml:"githubs" json:"githubs,omitempty"` // key: owner/repo
 | 
			
		||||
	Images                 map[string]Image            `toml:"images" json:"images,omitempty"`
 | 
			
		||||
	UUIDs                  map[string]string           `toml:"uuids,omitempty" json:"uuids,omitempty"`
 | 
			
		||||
	Memo                   string                      `toml:"memo,omitempty" json:"memo,omitempty"`
 | 
			
		||||
	Enablerepo             []string                    `toml:"enablerepo,omitempty" json:"enablerepo,omitempty"` // For CentOS, RHEL, Amazon
 | 
			
		||||
@@ -1078,7 +1131,6 @@ type ServerInfo struct {
 | 
			
		||||
 | 
			
		||||
	LogMsgAnsiColor string    `toml:"-" json:"-"` // DebugLog Color
 | 
			
		||||
	Container       Container `toml:"-" json:"-"`
 | 
			
		||||
	Image           Image     `toml:"-" json:"-"`
 | 
			
		||||
	Distro          Distro    `toml:"-" json:"-"`
 | 
			
		||||
	Mode            ScanMode  `toml:"-" json:"-"`
 | 
			
		||||
}
 | 
			
		||||
@@ -1100,17 +1152,6 @@ type WordPressConf struct {
 | 
			
		||||
	IgnoreInactive bool   `json:"ignoreInactive,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Image is a scan container image info
 | 
			
		||||
type Image struct {
 | 
			
		||||
	Name             string             `json:"name"`
 | 
			
		||||
	Tag              string             `json:"tag"`
 | 
			
		||||
	DockerOption     types.DockerOption `json:"dockerOption,omitempty"`
 | 
			
		||||
	Cpes             []string           `json:"cpes,omitempty"`
 | 
			
		||||
	OwaspDCXMLPath   string             `json:"owaspDCXMLPath"`
 | 
			
		||||
	IgnorePkgsRegexp []string           `json:"ignorePkgsRegexp,omitempty"`
 | 
			
		||||
	IgnoreCves       []string           `json:"ignoreCves,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GitHubConf is used for GitHub integration
 | 
			
		||||
type GitHubConf struct {
 | 
			
		||||
	Token string `json:"-"`
 | 
			
		||||
@@ -1209,21 +1250,18 @@ func (l Distro) String() string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MajorVersion returns Major version
 | 
			
		||||
func (l Distro) MajorVersion() (ver int, err error) {
 | 
			
		||||
func (l Distro) MajorVersion() (int, error) {
 | 
			
		||||
	if l.Family == Amazon {
 | 
			
		||||
		ss := strings.Fields(l.Release)
 | 
			
		||||
		if len(ss) == 1 {
 | 
			
		||||
			return 1, nil
 | 
			
		||||
		}
 | 
			
		||||
		ver, err = strconv.Atoi(ss[0])
 | 
			
		||||
		return
 | 
			
		||||
		return strconv.Atoi(ss[0])
 | 
			
		||||
	}
 | 
			
		||||
	if 0 < len(l.Release) {
 | 
			
		||||
		ver, err = strconv.Atoi(strings.Split(l.Release, ".")[0])
 | 
			
		||||
	} else {
 | 
			
		||||
		err = xerrors.New("Release is empty")
 | 
			
		||||
		return strconv.Atoi(strings.Split(l.Release, ".")[0])
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
	return 0, xerrors.New("Release is empty")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsContainer returns whether this ServerInfo is about container
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ func TestSyslogConfValidate(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMajorVersion(t *testing.T) {
 | 
			
		||||
func TestDistro_MajorVersion(t *testing.T) {
 | 
			
		||||
	var tests = []struct {
 | 
			
		||||
		in  Distro
 | 
			
		||||
		out int
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/xerrors"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
// Load loads configuration
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,6 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
@@ -53,6 +35,7 @@ func (c TOMLLoader) Load(pathToToml, keyPass string) error {
 | 
			
		||||
	Conf.OvalDict = conf.OvalDict
 | 
			
		||||
	Conf.Gost = conf.Gost
 | 
			
		||||
	Conf.Exploit = conf.Exploit
 | 
			
		||||
	Conf.Metasploit = conf.Metasploit
 | 
			
		||||
 | 
			
		||||
	d := conf.Default
 | 
			
		||||
	Conf.Default = d
 | 
			
		||||
@@ -69,22 +52,17 @@ func (c TOMLLoader) Load(pathToToml, keyPass string) error {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		s := ServerInfo{ServerName: serverName}
 | 
			
		||||
		s.Images = make(map[string]Image)
 | 
			
		||||
 | 
			
		||||
		// image are able to set any server type
 | 
			
		||||
		for name, image := range v.Images {
 | 
			
		||||
			if err := IsValidImage(image); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			s.Images[name] = image
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if v.Type != ServerTypePseudo {
 | 
			
		||||
			s.Host = v.Host
 | 
			
		||||
			if len(s.Host) == 0 {
 | 
			
		||||
				return xerrors.Errorf("%s is invalid. host is empty", serverName)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			s.JumpServer = v.JumpServer
 | 
			
		||||
			if len(s.JumpServer) == 0 {
 | 
			
		||||
				s.JumpServer = d.JumpServer
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			switch {
 | 
			
		||||
			case v.Port != "":
 | 
			
		||||
				s.Port = v.Port
 | 
			
		||||
@@ -105,17 +83,15 @@ func (c TOMLLoader) Load(pathToToml, keyPass string) error {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			s.SSHConfigPath = v.SSHConfigPath
 | 
			
		||||
			if len(s.SSHConfigPath) == 0 {
 | 
			
		||||
				s.SSHConfigPath = d.SSHConfigPath
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			s.KeyPath = v.KeyPath
 | 
			
		||||
			if len(s.KeyPath) == 0 {
 | 
			
		||||
				s.KeyPath = d.KeyPath
 | 
			
		||||
			}
 | 
			
		||||
			if s.KeyPath != "" {
 | 
			
		||||
				if _, err := os.Stat(s.KeyPath); err != nil {
 | 
			
		||||
					return xerrors.Errorf(
 | 
			
		||||
						"%s is invalid. keypath: %s not exists", serverName, s.KeyPath)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			s.KeyPassword = v.KeyPassword
 | 
			
		||||
			if len(s.KeyPassword) == 0 {
 | 
			
		||||
				s.KeyPassword = d.KeyPassword
 | 
			
		||||
@@ -317,14 +293,3 @@ func toCpeURI(cpename string) (string, error) {
 | 
			
		||||
	}
 | 
			
		||||
	return "", xerrors.Errorf("Unknow CPE format: %s", cpename)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsValidImage checks a container configuration
 | 
			
		||||
func IsValidImage(c Image) error {
 | 
			
		||||
	if c.Name == "" {
 | 
			
		||||
		return xerrors.New("Invalid arguments : no image name")
 | 
			
		||||
	}
 | 
			
		||||
	if c.Tag == "" {
 | 
			
		||||
		return xerrors.New("Invalid arguments : no image tag")
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								contrib/future-vuls/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								contrib/future-vuls/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
# future-vuls
 | 
			
		||||
 | 
			
		||||
## Main Features
 | 
			
		||||
 | 
			
		||||
- upload vuls results json to future-vuls
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
git clone https://github.com/future-architect/vuls.git
 | 
			
		||||
make build-future-vuls
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Command Reference
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Upload to FutureVuls
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
  future-vuls upload [flags]
 | 
			
		||||
 | 
			
		||||
Flags:
 | 
			
		||||
      --config string   config file (default is $HOME/.cobra.yaml)
 | 
			
		||||
  -g, --group-id int    future vuls group id, ENV: VULS_GROUP_ID
 | 
			
		||||
  -h, --help            help for upload
 | 
			
		||||
  -s, --stdin           input from stdin. ENV: VULS_STDIN
 | 
			
		||||
  -t, --token string    future vuls token
 | 
			
		||||
      --url string      future vuls upload url
 | 
			
		||||
      --uuid string     server uuid. ENV: VULS_SERVER_UUID
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
- update results json
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 cat results.json | future-vuls upload --stdin --token xxxx --url https://xxxx --group-id 1 --uuid xxxx
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										98
									
								
								contrib/future-vuls/cmd/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								contrib/future-vuls/cmd/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/report"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	configFile string
 | 
			
		||||
	stdIn      bool
 | 
			
		||||
	jsonDir    string
 | 
			
		||||
	serverUUID string
 | 
			
		||||
	groupID    int64
 | 
			
		||||
	token      string
 | 
			
		||||
	url        string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	var err error
 | 
			
		||||
	var cmdFvulsUploader = &cobra.Command{
 | 
			
		||||
		Use:   "upload",
 | 
			
		||||
		Short: "Upload to FutureVuls",
 | 
			
		||||
		Long:  `Upload to FutureVuls`,
 | 
			
		||||
		Run: func(cmd *cobra.Command, args []string) {
 | 
			
		||||
			if len(serverUUID) == 0 {
 | 
			
		||||
				serverUUID = os.Getenv("VULS_SERVER_UUID")
 | 
			
		||||
			}
 | 
			
		||||
			if groupID == 0 {
 | 
			
		||||
				envGroupID := os.Getenv("VULS_GROUP_ID")
 | 
			
		||||
				if groupID, err = strconv.ParseInt(envGroupID, 10, 64); err != nil {
 | 
			
		||||
					fmt.Printf("Invalid GroupID: %s\n", envGroupID)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if len(url) == 0 {
 | 
			
		||||
				url = os.Getenv("VULS_URL")
 | 
			
		||||
			}
 | 
			
		||||
			if len(token) == 0 {
 | 
			
		||||
				token = os.Getenv("VULS_TOKEN")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var scanResultJSON []byte
 | 
			
		||||
			if stdIn {
 | 
			
		||||
				reader := bufio.NewReader(os.Stdin)
 | 
			
		||||
				buf := new(bytes.Buffer)
 | 
			
		||||
				if _, err = buf.ReadFrom(reader); err != nil {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				scanResultJSON = buf.Bytes()
 | 
			
		||||
			} else {
 | 
			
		||||
				fmt.Println("use --stdin option")
 | 
			
		||||
				os.Exit(1)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var scanResult models.ScanResult
 | 
			
		||||
			if err = json.Unmarshal(scanResultJSON, &scanResult); err != nil {
 | 
			
		||||
				fmt.Println("Failed to parse json", err)
 | 
			
		||||
				os.Exit(1)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			scanResult.ServerUUID = serverUUID
 | 
			
		||||
 | 
			
		||||
			config.Conf.Saas.GroupID = groupID
 | 
			
		||||
			config.Conf.Saas.Token = token
 | 
			
		||||
			config.Conf.Saas.URL = url
 | 
			
		||||
			if err = (report.SaasWriter{}).Write(scanResult); err != nil {
 | 
			
		||||
				fmt.Println(err)
 | 
			
		||||
				os.Exit(1)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	cmdFvulsUploader.PersistentFlags().StringVar(&serverUUID, "uuid", "", "server uuid. ENV: VULS_SERVER_UUID")
 | 
			
		||||
	cmdFvulsUploader.PersistentFlags().StringVar(&configFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
 | 
			
		||||
	cmdFvulsUploader.PersistentFlags().BoolVarP(&stdIn, "stdin", "s", false, "input from stdin. ENV: VULS_STDIN")
 | 
			
		||||
	// TODO Read JSON file from directory
 | 
			
		||||
	//	cmdFvulsUploader.Flags().StringVarP(&jsonDir, "results-dir", "d", "./", "vuls scan results json dir")
 | 
			
		||||
	cmdFvulsUploader.PersistentFlags().Int64VarP(&groupID, "group-id", "g", 0, "future vuls group id, ENV: VULS_GROUP_ID")
 | 
			
		||||
	cmdFvulsUploader.PersistentFlags().StringVarP(&token, "token", "t", "", "future vuls token")
 | 
			
		||||
	cmdFvulsUploader.PersistentFlags().StringVar(&url, "url", "", "future vuls upload url")
 | 
			
		||||
 | 
			
		||||
	var rootCmd = &cobra.Command{Use: "future-vuls"}
 | 
			
		||||
	rootCmd.AddCommand(cmdFvulsUploader)
 | 
			
		||||
	if err = rootCmd.Execute(); err != nil {
 | 
			
		||||
		fmt.Println("Failed to execute command", err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/knqyf263/go-cpe/naming"
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
@@ -15,12 +16,11 @@ type analysis struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type dependency struct {
 | 
			
		||||
	Identifiers []identifier `xml:"identifiers>identifier"`
 | 
			
		||||
	Identifiers []vulnerabilityID `xml:"identifiers>vulnerabilityIds"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type identifier struct {
 | 
			
		||||
	Name string `xml:"name"`
 | 
			
		||||
	Type string `xml:"type,attr"`
 | 
			
		||||
type vulnerabilityID struct {
 | 
			
		||||
	ID string `xml:"id"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func appendIfMissing(slice []string, str string) []string {
 | 
			
		||||
@@ -55,11 +55,16 @@ func Parse(path string) ([]string, error) {
 | 
			
		||||
	cpes := []string{}
 | 
			
		||||
	for _, d := range anal.Dependencies {
 | 
			
		||||
		for _, ident := range d.Identifiers {
 | 
			
		||||
			if ident.Type == "cpe" {
 | 
			
		||||
				name := strings.TrimPrefix(ident.Name, "(")
 | 
			
		||||
				name = strings.TrimSuffix(name, ")")
 | 
			
		||||
				cpes = appendIfMissing(cpes, name)
 | 
			
		||||
			id := ident.ID // Start with cpe:2.3:
 | 
			
		||||
			// Convert from CPE 2.3 to CPE 2.2
 | 
			
		||||
			if strings.HasPrefix(id, "cpe:2.3:") {
 | 
			
		||||
				wfn, err := naming.UnbindFS(id)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return []string{}, err
 | 
			
		||||
				}
 | 
			
		||||
				id = naming.BindToURI(wfn)
 | 
			
		||||
			}
 | 
			
		||||
			cpes = appendIfMissing(cpes, id)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return cpes, nil
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								contrib/trivy/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								contrib/trivy/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
# trivy-to-vuls
 | 
			
		||||
 | 
			
		||||
## Main Features
 | 
			
		||||
 | 
			
		||||
- convert trivy's results json to vuls's report json
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
git clone https://github.com/future-architect/vuls.git
 | 
			
		||||
make build-trivy-to-vuls
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Command Reference
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
Parse trivy json to vuls results
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
  trivy-to-vuls parse [flags]
 | 
			
		||||
 | 
			
		||||
Flags:
 | 
			
		||||
  -h, --help                          help for parse
 | 
			
		||||
  -s, --stdin                         input from stdin
 | 
			
		||||
  -d, --trivy-json-dir string         trivy json dir (default "./")
 | 
			
		||||
  -f, --trivy-json-file-name string   trivy json file name (default "results.json")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
- use trivy output
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 trivy -q image -f=json python:3.4-alpine | trivy-to-vuls parse --stdin
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										78
									
								
								contrib/trivy/cmd/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								contrib/trivy/cmd/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/contrib/trivy/parser"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	serverUUID   string
 | 
			
		||||
	stdIn        bool
 | 
			
		||||
	jsonDir      string
 | 
			
		||||
	jsonFileName string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	var err error
 | 
			
		||||
	var cmdTrivyToVuls = &cobra.Command{
 | 
			
		||||
		Use:   "parse",
 | 
			
		||||
		Short: "Parse trivy json to vuls results",
 | 
			
		||||
		Long:  `Parse trivy json to vuls results`,
 | 
			
		||||
		Run: func(cmd *cobra.Command, args []string) {
 | 
			
		||||
			jsonFilePath := filepath.Join(jsonDir, jsonFileName)
 | 
			
		||||
			var trivyJSON []byte
 | 
			
		||||
			if stdIn {
 | 
			
		||||
				reader := bufio.NewReader(os.Stdin)
 | 
			
		||||
				buf := new(bytes.Buffer)
 | 
			
		||||
				if _, err = buf.ReadFrom(reader); err != nil {
 | 
			
		||||
					os.Exit(1)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				trivyJSON = buf.Bytes()
 | 
			
		||||
			} else {
 | 
			
		||||
				if trivyJSON, err = ioutil.ReadFile(jsonFilePath); err != nil {
 | 
			
		||||
					fmt.Println("Failed to read file", err)
 | 
			
		||||
					os.Exit(1)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			scanResult := &models.ScanResult{
 | 
			
		||||
				JSONVersion: models.JSONVersion,
 | 
			
		||||
				ScannedCves: models.VulnInfos{},
 | 
			
		||||
			}
 | 
			
		||||
			if scanResult, err = parser.Parse(trivyJSON, scanResult); err != nil {
 | 
			
		||||
				fmt.Println("Failed to execute command", err)
 | 
			
		||||
				os.Exit(1)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			var resultJSON []byte
 | 
			
		||||
			if resultJSON, err = json.MarshalIndent(scanResult, "", "   "); err != nil {
 | 
			
		||||
				fmt.Println("Failed to create json", err)
 | 
			
		||||
				os.Exit(1)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Println(string(resultJSON))
 | 
			
		||||
			return
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	cmdTrivyToVuls.Flags().BoolVarP(&stdIn, "stdin", "s", false, "input from stdin")
 | 
			
		||||
	cmdTrivyToVuls.Flags().StringVarP(&jsonDir, "trivy-json-dir", "d", "./", "trivy json dir")
 | 
			
		||||
	cmdTrivyToVuls.Flags().StringVarP(&jsonFileName, "trivy-json-file-name", "f", "results.json", "trivy json file name")
 | 
			
		||||
 | 
			
		||||
	var rootCmd = &cobra.Command{Use: "trivy-to-vuls"}
 | 
			
		||||
	rootCmd.AddCommand(cmdTrivyToVuls)
 | 
			
		||||
	if err = rootCmd.Execute(); err != nil {
 | 
			
		||||
		fmt.Println("Failed to execute command", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										164
									
								
								contrib/trivy/parser/parser.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								contrib/trivy/parser/parser.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,164 @@
 | 
			
		||||
package parser
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/aquasecurity/fanal/analyzer/os"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/report"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/types"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Parse :
 | 
			
		||||
func Parse(vulnJSON []byte, scanResult *models.ScanResult) (result *models.ScanResult, err error) {
 | 
			
		||||
	var trivyResults report.Results
 | 
			
		||||
	if err = json.Unmarshal(vulnJSON, &trivyResults); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pkgs := models.Packages{}
 | 
			
		||||
	vulnInfos := models.VulnInfos{}
 | 
			
		||||
	uniqueLibraryScannerPaths := map[string]models.LibraryScanner{}
 | 
			
		||||
	for _, trivyResult := range trivyResults {
 | 
			
		||||
		for _, vuln := range trivyResult.Vulnerabilities {
 | 
			
		||||
			if _, ok := vulnInfos[vuln.VulnerabilityID]; !ok {
 | 
			
		||||
				vulnInfos[vuln.VulnerabilityID] = models.VulnInfo{
 | 
			
		||||
					CveID: vuln.VulnerabilityID,
 | 
			
		||||
					Confidences: models.Confidences{
 | 
			
		||||
						{
 | 
			
		||||
							Score:           100,
 | 
			
		||||
							DetectionMethod: models.TrivyMatchStr,
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					AffectedPackages: models.PackageFixStatuses{},
 | 
			
		||||
					CveContents:      models.CveContents{},
 | 
			
		||||
					LibraryFixedIns:  models.LibraryFixedIns{},
 | 
			
		||||
					// VulnType : "",
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			vulnInfo := vulnInfos[vuln.VulnerabilityID]
 | 
			
		||||
			var notFixedYet bool
 | 
			
		||||
			fixState := ""
 | 
			
		||||
			if len(vuln.FixedVersion) == 0 {
 | 
			
		||||
				notFixedYet = true
 | 
			
		||||
				fixState = "Affected"
 | 
			
		||||
			}
 | 
			
		||||
			var references models.References
 | 
			
		||||
			for _, reference := range vuln.References {
 | 
			
		||||
				references = append(references, models.Reference{
 | 
			
		||||
					Source: "trivy",
 | 
			
		||||
					Link:   reference,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			sort.Slice(references, func(i, j int) bool {
 | 
			
		||||
				return references[i].Link < references[j].Link
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			vulnInfo.CveContents = models.CveContents{
 | 
			
		||||
				models.Trivy: models.CveContent{
 | 
			
		||||
					Cvss3Severity: vuln.Severity,
 | 
			
		||||
					References:    references,
 | 
			
		||||
					Title:         vuln.Title,
 | 
			
		||||
					Summary:       vuln.Description,
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
			// do only if image type is Vuln
 | 
			
		||||
			if IsTrivySupportedOS(trivyResult.Type) {
 | 
			
		||||
				pkgs[vuln.PkgName] = models.Package{
 | 
			
		||||
					Name:    vuln.PkgName,
 | 
			
		||||
					Version: vuln.InstalledVersion,
 | 
			
		||||
				}
 | 
			
		||||
				vulnInfo.AffectedPackages = append(vulnInfo.AffectedPackages, models.PackageFixStatus{
 | 
			
		||||
					Name:        vuln.PkgName,
 | 
			
		||||
					NotFixedYet: notFixedYet,
 | 
			
		||||
					FixState:    fixState,
 | 
			
		||||
					FixedIn:     vuln.FixedVersion,
 | 
			
		||||
				})
 | 
			
		||||
 | 
			
		||||
				// overwrite every time if os package
 | 
			
		||||
				scanResult.Family = trivyResult.Type
 | 
			
		||||
				scanResult.ServerName = trivyResult.Target
 | 
			
		||||
				scanResult.Optional = map[string]interface{}{
 | 
			
		||||
					"trivy-target": trivyResult.Target,
 | 
			
		||||
				}
 | 
			
		||||
				scanResult.ScannedAt = time.Now()
 | 
			
		||||
				scanResult.ScannedBy = "trivy"
 | 
			
		||||
				scanResult.ScannedVia = "trivy"
 | 
			
		||||
			} else {
 | 
			
		||||
				// LibraryScanの結果
 | 
			
		||||
				vulnInfo.LibraryFixedIns = append(vulnInfo.LibraryFixedIns, models.LibraryFixedIn{
 | 
			
		||||
					Key:     trivyResult.Type,
 | 
			
		||||
					Name:    vuln.PkgName,
 | 
			
		||||
					Path:    trivyResult.Target,
 | 
			
		||||
					FixedIn: vuln.FixedVersion,
 | 
			
		||||
				})
 | 
			
		||||
				libScanner := uniqueLibraryScannerPaths[trivyResult.Target]
 | 
			
		||||
				libScanner.Libs = append(libScanner.Libs, types.Library{
 | 
			
		||||
					Name:    vuln.PkgName,
 | 
			
		||||
					Version: vuln.InstalledVersion,
 | 
			
		||||
				})
 | 
			
		||||
				uniqueLibraryScannerPaths[trivyResult.Target] = libScanner
 | 
			
		||||
			}
 | 
			
		||||
			vulnInfos[vuln.VulnerabilityID] = vulnInfo
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// flatten and unique libraries
 | 
			
		||||
	libraryScanners := make([]models.LibraryScanner, 0, len(uniqueLibraryScannerPaths))
 | 
			
		||||
	for path, v := range uniqueLibraryScannerPaths {
 | 
			
		||||
		uniqueLibrary := map[string]types.Library{}
 | 
			
		||||
		for _, lib := range v.Libs {
 | 
			
		||||
			uniqueLibrary[lib.Name+lib.Version] = lib
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var libraries []types.Library
 | 
			
		||||
		for _, library := range uniqueLibrary {
 | 
			
		||||
			libraries = append(libraries, library)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		sort.Slice(libraries, func(i, j int) bool {
 | 
			
		||||
			return libraries[i].Name < libraries[j].Name
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		libscanner := models.LibraryScanner{
 | 
			
		||||
			Path: path,
 | 
			
		||||
			Libs: libraries,
 | 
			
		||||
		}
 | 
			
		||||
		libraryScanners = append(libraryScanners, libscanner)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Slice(libraryScanners, func(i, j int) bool {
 | 
			
		||||
		return libraryScanners[i].Path < libraryScanners[j].Path
 | 
			
		||||
	})
 | 
			
		||||
	scanResult.ScannedCves = vulnInfos
 | 
			
		||||
	scanResult.Packages = pkgs
 | 
			
		||||
	scanResult.LibraryScanners = libraryScanners
 | 
			
		||||
	return scanResult, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsTrivySupportedOS :
 | 
			
		||||
func IsTrivySupportedOS(family string) bool {
 | 
			
		||||
	supportedFamilies := []string{
 | 
			
		||||
		os.RedHat,
 | 
			
		||||
		os.Debian,
 | 
			
		||||
		os.Ubuntu,
 | 
			
		||||
		os.CentOS,
 | 
			
		||||
		os.Fedora,
 | 
			
		||||
		os.Amazon,
 | 
			
		||||
		os.Oracle,
 | 
			
		||||
		os.Windows,
 | 
			
		||||
		os.OpenSUSE,
 | 
			
		||||
		os.OpenSUSELeap,
 | 
			
		||||
		os.OpenSUSETumbleweed,
 | 
			
		||||
		os.SLES,
 | 
			
		||||
		os.Photon,
 | 
			
		||||
		os.Alpine,
 | 
			
		||||
	}
 | 
			
		||||
	for _, supportedFamily := range supportedFamilies {
 | 
			
		||||
		if family == supportedFamily {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5482
									
								
								contrib/trivy/parser/parser_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5482
									
								
								contrib/trivy/parser/parser_test.go
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										33
									
								
								cwe/cwe.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								cwe/cwe.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
package cwe
 | 
			
		||||
 | 
			
		||||
// CweTopTwentyfive2019 has CWE-ID in CWE Top 25
 | 
			
		||||
var CweTopTwentyfive2019 = map[string]string{
 | 
			
		||||
	"119": "1",
 | 
			
		||||
	"79":  "2",
 | 
			
		||||
	"20":  "3",
 | 
			
		||||
	"200": "4",
 | 
			
		||||
	"125": "5",
 | 
			
		||||
	"89":  "6",
 | 
			
		||||
	"416": "7",
 | 
			
		||||
	"190": "8",
 | 
			
		||||
	"352": "9",
 | 
			
		||||
	"22":  "10",
 | 
			
		||||
	"78":  "11",
 | 
			
		||||
	"787": "12",
 | 
			
		||||
	"287": "13",
 | 
			
		||||
	"476": "14",
 | 
			
		||||
	"732": "16",
 | 
			
		||||
	"434": "16",
 | 
			
		||||
	"611": "17",
 | 
			
		||||
	"94":  "18",
 | 
			
		||||
	"798": "19",
 | 
			
		||||
	"400": "20",
 | 
			
		||||
	"772": "21",
 | 
			
		||||
	"426": "22",
 | 
			
		||||
	"502": "23",
 | 
			
		||||
	"269": "24",
 | 
			
		||||
	"295": "25",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CweTopTwentyfive2019URL has CWE Top25 links
 | 
			
		||||
var CweTopTwentyfive2019URL = "https://cwe.mitre.org/top25/archive/2019/2019_cwe_top25.html"
 | 
			
		||||
							
								
								
									
										33
									
								
								cwe/sans.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								cwe/sans.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
package cwe
 | 
			
		||||
 | 
			
		||||
// SansTopTwentyfive has CWE-ID in CWE/SANS Top 25
 | 
			
		||||
var SansTopTwentyfive = map[string]string{
 | 
			
		||||
	"89":  "1",
 | 
			
		||||
	"78":  "2",
 | 
			
		||||
	"120": "3",
 | 
			
		||||
	"79":  "4",
 | 
			
		||||
	"306": "5",
 | 
			
		||||
	"862": "6",
 | 
			
		||||
	"798": "7",
 | 
			
		||||
	"311": "8",
 | 
			
		||||
	"434": "9",
 | 
			
		||||
	"807": "10",
 | 
			
		||||
	"250": "11",
 | 
			
		||||
	"352": "12",
 | 
			
		||||
	"22":  "13",
 | 
			
		||||
	"494": "14",
 | 
			
		||||
	"863": "15",
 | 
			
		||||
	"829": "16",
 | 
			
		||||
	"732": "17",
 | 
			
		||||
	"676": "18",
 | 
			
		||||
	"327": "19",
 | 
			
		||||
	"131": "20",
 | 
			
		||||
	"307": "21",
 | 
			
		||||
	"601": "22",
 | 
			
		||||
	"134": "23",
 | 
			
		||||
	"190": "24",
 | 
			
		||||
	"759": "25",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SansTopTwentyfiveURL is a URL of sans 25
 | 
			
		||||
var SansTopTwentyfiveURL = "https://www.sans.org/top25-software-errors/"
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package exploit
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -61,6 +44,9 @@ func FillWithExploit(driver db.DB, r *models.ScanResult) (nExploitCve int, err e
 | 
			
		||||
			return 0, nil
 | 
			
		||||
		}
 | 
			
		||||
		for cveID, vuln := range r.ScannedCves {
 | 
			
		||||
			if cveID == "" {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			es := driver.GetExploitByCveID(cveID)
 | 
			
		||||
			if len(es) == 0 {
 | 
			
		||||
				continue
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
package exploit
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSetPackageStates(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package exploit
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										146
									
								
								github/github.go
									
									
									
									
									
								
							
							
						
						
									
										146
									
								
								github/github.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package github
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -22,14 +5,13 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/errof"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	"github.com/k0kubun/pp"
 | 
			
		||||
	"golang.org/x/oauth2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -42,8 +24,9 @@ func FillGitHubSecurityAlerts(r *models.ScanResult, owner, repo, token string) (
 | 
			
		||||
	httpClient := oauth2.NewClient(context.Background(), src)
 | 
			
		||||
 | 
			
		||||
	// TODO Use `https://github.com/shurcooL/githubv4` if the tool supports vulnerabilityAlerts Endpoint
 | 
			
		||||
	// Memo : https://developer.github.com/v4/explorer/
 | 
			
		||||
	const jsonfmt = `{"query":
 | 
			
		||||
	"query { repository(owner:\"%s\", name:\"%s\") { url, vulnerabilityAlerts(first: %d, %s) { pageInfo{ endCursor, hasNextPage, startCursor}, edges { node { id, externalIdentifier, externalReference, fixedIn, packageName,  dismissReason, dismissedAt } } } } }"}`
 | 
			
		||||
	"query { repository(owner:\"%s\", name:\"%s\") { url vulnerabilityAlerts(first: %d, %s) { pageInfo { endCursor hasNextPage startCursor } edges { node { id dismissReason dismissedAt securityVulnerability{ package { name ecosystem } severity vulnerableVersionRange firstPatchedVersion { identifier } } securityAdvisory { description ghsaId permalink publishedAt summary updatedAt withdrawnAt origin severity references { url } identifiers { type value } } } } } } } "}`
 | 
			
		||||
	after := ""
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
@@ -60,7 +43,7 @@ func FillGitHubSecurityAlerts(r *models.ScanResult, owner, repo, token string) (
 | 
			
		||||
		// To toggle this preview and access data, need to provide a custom media type in the Accept header:
 | 
			
		||||
		// MEMO: I tried to get the affected version via GitHub API. Bit it seems difficult to determin the affected version if there are multiple dependency files such as package.json.
 | 
			
		||||
		// TODO remove this header if it is no longer preview status in the future.
 | 
			
		||||
		req.Header.Set("Accept", "application/vnd.github.vixen-preview+json")
 | 
			
		||||
		req.Header.Set("Accept", "application/vnd.github.package-deletes-preview+json")
 | 
			
		||||
		req.Header.Set("Content-Type", "application/json")
 | 
			
		||||
 | 
			
		||||
		resp, err := httpClient.Do(req)
 | 
			
		||||
@@ -68,16 +51,23 @@ func FillGitHubSecurityAlerts(r *models.ScanResult, owner, repo, token string) (
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		defer resp.Body.Close()
 | 
			
		||||
		alerts := SecurityAlerts{}
 | 
			
		||||
		if json.NewDecoder(resp.Body).Decode(&alerts); err != nil {
 | 
			
		||||
 | 
			
		||||
		body, err := ioutil.ReadAll(resp.Body)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		util.Log.Debugf("%s", pp.Sprint(alerts))
 | 
			
		||||
		alerts := SecurityAlerts{}
 | 
			
		||||
		if err := json.Unmarshal(body, &alerts); err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// util.Log.Debugf("%s", pp.Sprint(alerts))
 | 
			
		||||
		// util.Log.Debugf("%s", string(body))
 | 
			
		||||
		if alerts.Data.Repository.URL == "" {
 | 
			
		||||
			return 0, errof.New(
 | 
			
		||||
				errof.ErrFailedToAccessGithubAPI,
 | 
			
		||||
				fmt.Sprintf("Failed to access to GitHub API. Response: %#v", alerts),
 | 
			
		||||
				fmt.Sprintf("Failed to access to GitHub API. Response: %s", string(body)),
 | 
			
		||||
			)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -87,31 +77,45 @@ func FillGitHubSecurityAlerts(r *models.ScanResult, owner, repo, token string) (
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			pkgName := fmt.Sprintf("%s %s",
 | 
			
		||||
				alerts.Data.Repository.URL, v.Node.PackageName)
 | 
			
		||||
				alerts.Data.Repository.URL, v.Node.SecurityVulnerability.Package.Name)
 | 
			
		||||
 | 
			
		||||
			m := models.GitHubSecurityAlert{
 | 
			
		||||
				PackageName:   pkgName,
 | 
			
		||||
				FixedIn:       v.Node.FixedIn,
 | 
			
		||||
				AffectedRange: v.Node.AffectedRange,
 | 
			
		||||
				FixedIn:       v.Node.SecurityVulnerability.FirstPatchedVersion.Identifier,
 | 
			
		||||
				AffectedRange: v.Node.SecurityVulnerability.VulnerableVersionRange,
 | 
			
		||||
				Dismissed:     len(v.Node.DismissReason) != 0,
 | 
			
		||||
				DismissedAt:   v.Node.DismissedAt,
 | 
			
		||||
				DismissReason: v.Node.DismissReason,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			cveID := v.Node.ExternalIdentifier
 | 
			
		||||
 | 
			
		||||
			if val, ok := r.ScannedCves[cveID]; ok {
 | 
			
		||||
				val.GitHubSecurityAlerts = val.GitHubSecurityAlerts.Add(m)
 | 
			
		||||
				r.ScannedCves[cveID] = val
 | 
			
		||||
				nCVEs++
 | 
			
		||||
			} else {
 | 
			
		||||
				v := models.VulnInfo{
 | 
			
		||||
					CveID:                cveID,
 | 
			
		||||
					Confidences:          models.Confidences{models.GitHubMatch},
 | 
			
		||||
					GitHubSecurityAlerts: models.GitHubSecurityAlerts{m},
 | 
			
		||||
			cveIDs, other := []string{}, []string{}
 | 
			
		||||
			for _, identifier := range v.Node.SecurityAdvisory.Identifiers {
 | 
			
		||||
				if identifier.Type == "CVE" {
 | 
			
		||||
					cveIDs = append(cveIDs, identifier.Value)
 | 
			
		||||
				} else {
 | 
			
		||||
					other = append(other, identifier.Value)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// If CVE-ID has not been assigned, use the GHSA ID etc as a ID.
 | 
			
		||||
			if len(cveIDs) == 0 {
 | 
			
		||||
				cveIDs = other
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for _, cveID := range cveIDs {
 | 
			
		||||
				if val, ok := r.ScannedCves[cveID]; ok {
 | 
			
		||||
					val.GitHubSecurityAlerts = val.GitHubSecurityAlerts.Add(m)
 | 
			
		||||
					r.ScannedCves[cveID] = val
 | 
			
		||||
					nCVEs++
 | 
			
		||||
				} else {
 | 
			
		||||
					v := models.VulnInfo{
 | 
			
		||||
						CveID:                cveID,
 | 
			
		||||
						Confidences:          models.Confidences{models.GitHubMatch},
 | 
			
		||||
						GitHubSecurityAlerts: models.GitHubSecurityAlerts{m},
 | 
			
		||||
					}
 | 
			
		||||
					r.ScannedCves[cveID] = v
 | 
			
		||||
					nCVEs++
 | 
			
		||||
				}
 | 
			
		||||
				r.ScannedCves[cveID] = v
 | 
			
		||||
				nCVEs++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if !alerts.Data.Repository.VulnerabilityAlerts.PageInfo.HasNextPage {
 | 
			
		||||
@@ -126,26 +130,50 @@ func FillGitHubSecurityAlerts(r *models.ScanResult, owner, repo, token string) (
 | 
			
		||||
type SecurityAlerts struct {
 | 
			
		||||
	Data struct {
 | 
			
		||||
		Repository struct {
 | 
			
		||||
			URL                 string `json:"url,omitempty"`
 | 
			
		||||
			URL                 string `json:"url"`
 | 
			
		||||
			VulnerabilityAlerts struct {
 | 
			
		||||
				PageInfo struct {
 | 
			
		||||
					EndCursor   string `json:"endCursor,omitempty"`
 | 
			
		||||
					HasNextPage bool   `json:"hasNextPage,omitempty"`
 | 
			
		||||
					StartCursor string `json:"startCursor,omitempty"`
 | 
			
		||||
				} `json:"pageInfo,omitempty"`
 | 
			
		||||
					EndCursor   string `json:"endCursor"`
 | 
			
		||||
					HasNextPage bool   `json:"hasNextPage"`
 | 
			
		||||
					StartCursor string `json:"startCursor"`
 | 
			
		||||
				} `json:"pageInfo"`
 | 
			
		||||
				Edges []struct {
 | 
			
		||||
					Node struct {
 | 
			
		||||
						ID                 string    `json:"id,omitempty"`
 | 
			
		||||
						ExternalIdentifier string    `json:"externalIdentifier,omitempty"`
 | 
			
		||||
						ExternalReference  string    `json:"externalReference,omitempty"`
 | 
			
		||||
						FixedIn            string    `json:"fixedIn,omitempty"`
 | 
			
		||||
						AffectedRange      string    `json:"affectedRange,omitempty"`
 | 
			
		||||
						PackageName        string    `json:"packageName,omitempty"`
 | 
			
		||||
						DismissReason      string    `json:"dismissReason,omitempty"`
 | 
			
		||||
						DismissedAt        time.Time `json:"dismissedAt,omitempty"`
 | 
			
		||||
					} `json:"node,omitempty"`
 | 
			
		||||
				} `json:"edges,omitempty"`
 | 
			
		||||
			} `json:"vulnerabilityAlerts,omitempty"`
 | 
			
		||||
		} `json:"repository,omitempty"`
 | 
			
		||||
	} `json:"data,omitempty"`
 | 
			
		||||
						ID                    string    `json:"id"`
 | 
			
		||||
						DismissReason         string    `json:"dismissReason"`
 | 
			
		||||
						DismissedAt           time.Time `json:"dismissedAt"`
 | 
			
		||||
						SecurityVulnerability struct {
 | 
			
		||||
							Package struct {
 | 
			
		||||
								Name      string `json:"name"`
 | 
			
		||||
								Ecosystem string `json:"ecosystem"`
 | 
			
		||||
							} `json:"package"`
 | 
			
		||||
							Severity               string `json:"severity"`
 | 
			
		||||
							VulnerableVersionRange string `json:"vulnerableVersionRange"`
 | 
			
		||||
							FirstPatchedVersion    struct {
 | 
			
		||||
								Identifier string `json:"identifier"`
 | 
			
		||||
							} `json:"firstPatchedVersion"`
 | 
			
		||||
						} `json:"securityVulnerability"`
 | 
			
		||||
						SecurityAdvisory struct {
 | 
			
		||||
							Description string    `json:"description"`
 | 
			
		||||
							GhsaID      string    `json:"ghsaId"`
 | 
			
		||||
							Permalink   string    `json:"permalink"`
 | 
			
		||||
							PublishedAt time.Time `json:"publishedAt"`
 | 
			
		||||
							Summary     string    `json:"summary"`
 | 
			
		||||
							UpdatedAt   time.Time `json:"updatedAt"`
 | 
			
		||||
							WithdrawnAt time.Time `json:"withdrawnAt"`
 | 
			
		||||
							Origin      string    `json:"origin"`
 | 
			
		||||
							Severity    string    `json:"severity"`
 | 
			
		||||
							References  []struct {
 | 
			
		||||
								URL string `json:"url"`
 | 
			
		||||
							} `json:"references"`
 | 
			
		||||
							Identifiers []struct {
 | 
			
		||||
								Type  string `json:"type"`
 | 
			
		||||
								Value string `json:"value"`
 | 
			
		||||
							} `json:"identifiers"`
 | 
			
		||||
						} `json:"securityAdvisory"`
 | 
			
		||||
					} `json:"node"`
 | 
			
		||||
				} `json:"edges"`
 | 
			
		||||
			} `json:"vulnerabilityAlerts"`
 | 
			
		||||
		} `json:"repository"`
 | 
			
		||||
	} `json:"data"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										147
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								go.mod
									
									
									
									
									
								
							@@ -1,101 +1,56 @@
 | 
			
		||||
module github.com/future-architect/vuls
 | 
			
		||||
 | 
			
		||||
go 1.12
 | 
			
		||||
go 1.14
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	cloud.google.com/go v0.41.0 // indirect
 | 
			
		||||
	contrib.go.opencensus.io/exporter/ocagent v0.4.12 // indirect
 | 
			
		||||
	github.com/Azure/azure-sdk-for-go v28.1.0+incompatible
 | 
			
		||||
	github.com/Azure/go-autorest v12.0.0+incompatible // indirect
 | 
			
		||||
	github.com/BurntSushi/toml v0.3.1
 | 
			
		||||
	github.com/Microsoft/go-winio v0.4.12 // indirect
 | 
			
		||||
	github.com/RackSec/srslog v0.0.0-20180709174129-a4725f04ec91
 | 
			
		||||
	github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
 | 
			
		||||
	github.com/aws/aws-sdk-go v1.19.24
 | 
			
		||||
	github.com/boltdb/bolt v1.3.1
 | 
			
		||||
	github.com/cenkalti/backoff v2.1.1+incompatible
 | 
			
		||||
	github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect
 | 
			
		||||
	github.com/coreos/bbolt v1.3.3 // indirect
 | 
			
		||||
	github.com/coreos/etcd v3.3.13+incompatible // indirect
 | 
			
		||||
	github.com/coreos/go-semver v0.3.0 // indirect
 | 
			
		||||
	github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a // indirect
 | 
			
		||||
	github.com/dnaeon/go-vcr v1.0.1 // indirect
 | 
			
		||||
	github.com/elazarl/goproxy v0.0.0-20190703090003-6125c262ffb0 // indirect
 | 
			
		||||
	github.com/elazarl/goproxy/ext v0.0.0-20190703090003-6125c262ffb0 // indirect
 | 
			
		||||
	github.com/genuinetools/reg v0.16.1 // indirect
 | 
			
		||||
	github.com/go-kit/kit v0.9.0 // indirect
 | 
			
		||||
	github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect
 | 
			
		||||
	github.com/google/subcommands v1.0.1
 | 
			
		||||
	github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect
 | 
			
		||||
	github.com/gorilla/mux v1.7.1 // indirect
 | 
			
		||||
	github.com/gosuri/uitable v0.0.1
 | 
			
		||||
	github.com/grpc-ecosystem/grpc-gateway v1.9.3 // indirect
 | 
			
		||||
	github.com/hashicorp/go-version v1.2.0
 | 
			
		||||
	github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c
 | 
			
		||||
	github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c
 | 
			
		||||
	github.com/jroimartin/gocui v0.4.0
 | 
			
		||||
	github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
 | 
			
		||||
	github.com/k0kubun/pp v3.0.1+incompatible
 | 
			
		||||
	github.com/kisielk/errcheck v1.2.0 // indirect
 | 
			
		||||
	github.com/knqyf263/fanal v0.0.0-20190528042547-07e27879b658
 | 
			
		||||
	github.com/knqyf263/go-cpe v0.0.0-20180327054844-659663f6eca2
 | 
			
		||||
	github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d
 | 
			
		||||
	github.com/knqyf263/go-dep-parser v0.0.0-20190521150559-1ef8521d17a0
 | 
			
		||||
	github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936
 | 
			
		||||
	github.com/knqyf263/go-version v1.1.1
 | 
			
		||||
	github.com/knqyf263/gost v0.1.2
 | 
			
		||||
	github.com/knqyf263/trivy v0.1.1
 | 
			
		||||
	github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
 | 
			
		||||
	github.com/kotakanbe/go-cve-dictionary v0.0.0-20190327053454-5fe52611f0b8
 | 
			
		||||
	github.com/kotakanbe/go-pingscanner v0.1.0
 | 
			
		||||
	github.com/kotakanbe/goval-dictionary v0.1.3-0.20190613053258-078b163b76ec
 | 
			
		||||
	github.com/kotakanbe/logrus-prefixed-formatter v0.0.0-20180123152602-928f7356cb96
 | 
			
		||||
	github.com/kr/pty v1.1.8 // indirect
 | 
			
		||||
	github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 // indirect
 | 
			
		||||
	github.com/lusis/slack-test v0.0.0-20190426140909-c40012f20018 // indirect
 | 
			
		||||
	github.com/magiconair/properties v1.8.1 // indirect
 | 
			
		||||
	github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
 | 
			
		||||
	github.com/mitchellh/go-homedir v1.1.0
 | 
			
		||||
	github.com/mozqnet/go-exploitdb v0.0.0-20190426034301-a055cc2c195d
 | 
			
		||||
	github.com/nlopes/slack v0.4.0
 | 
			
		||||
	github.com/nsf/termbox-go v0.0.0-20190325093121-288510b9734e // indirect
 | 
			
		||||
	github.com/olekukonko/tablewriter v0.0.1
 | 
			
		||||
	github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
 | 
			
		||||
	github.com/parnurzeal/gorequest v0.2.15
 | 
			
		||||
	github.com/pelletier/go-toml v1.4.0 // indirect
 | 
			
		||||
	github.com/prometheus/common v0.6.0 // indirect
 | 
			
		||||
	github.com/prometheus/procfs v0.0.3 // indirect
 | 
			
		||||
	github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
 | 
			
		||||
	github.com/rogpeppe/fastuuid v1.1.0 // indirect
 | 
			
		||||
	github.com/rogpeppe/go-charset v0.0.0-20190617161244-0dc95cdf6f31 // indirect
 | 
			
		||||
	github.com/russross/blackfriday v2.0.0+incompatible // indirect
 | 
			
		||||
	github.com/satori/go.uuid v1.2.0 // indirect
 | 
			
		||||
	github.com/sirupsen/logrus v1.4.2
 | 
			
		||||
	github.com/smartystreets/assertions v1.0.0 // indirect
 | 
			
		||||
	github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect
 | 
			
		||||
	github.com/spf13/afero v1.2.2 // indirect
 | 
			
		||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
			
		||||
	github.com/ugorji/go v1.1.7 // indirect
 | 
			
		||||
	go.etcd.io/bbolt v1.3.3 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
 | 
			
		||||
	golang.org/x/exp v0.0.0-20190627132806-fd42eb6b336f // indirect
 | 
			
		||||
	golang.org/x/image v0.0.0-20190622003408-7e034cad6442 // indirect
 | 
			
		||||
	golang.org/x/mobile v0.0.0-20190607214518-6fa95d984e88 // indirect
 | 
			
		||||
	golang.org/x/mod v0.1.0 // indirect
 | 
			
		||||
	golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
 | 
			
		||||
	golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect
 | 
			
		||||
	golang.org/x/tools v0.0.0-20190702201734-44aeb8b7c377 // indirect
 | 
			
		||||
	golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373
 | 
			
		||||
	google.golang.org/genproto v0.0.0-20190701230453-710ae3a149df // indirect
 | 
			
		||||
	google.golang.org/grpc v1.22.0 // indirect
 | 
			
		||||
	gopkg.in/mattn/go-colorable.v0 v0.1.2 // indirect
 | 
			
		||||
	gopkg.in/mattn/go-isatty.v0 v0.0.8 // indirect
 | 
			
		||||
	honnef.co/go/tools v0.0.0-20190607181801-497c8f037f5a // indirect
 | 
			
		||||
replace (
 | 
			
		||||
	gopkg.in/mattn/go-colorable.v0 => github.com/mattn/go-colorable v0.1.0
 | 
			
		||||
	gopkg.in/mattn/go-isatty.v0 => github.com/mattn/go-isatty v0.0.6
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace github.com/genuinetools/reg => github.com/tomoyamachi/reg v0.16.2-0.20190418055600-c6010b917a55
 | 
			
		||||
 | 
			
		||||
replace gopkg.in/mattn/go-colorable.v0 => github.com/mattn/go-colorable v0.1.0
 | 
			
		||||
 | 
			
		||||
replace gopkg.in/mattn/go-isatty.v0 => github.com/mattn/go-isatty v0.0.6
 | 
			
		||||
require (
 | 
			
		||||
	github.com/Azure/azure-sdk-for-go v43.3.0+incompatible
 | 
			
		||||
	github.com/BurntSushi/toml v0.3.1
 | 
			
		||||
	github.com/RackSec/srslog v0.0.0-20180709174129-a4725f04ec91
 | 
			
		||||
	github.com/aquasecurity/fanal v0.0.0-20200615091807-df25cfa5f9af
 | 
			
		||||
	github.com/aquasecurity/trivy v0.9.1
 | 
			
		||||
	github.com/aquasecurity/trivy-db v0.0.0-20200616161554-cd5b3da29bc8
 | 
			
		||||
	github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
 | 
			
		||||
	github.com/aws/aws-sdk-go v1.33.21
 | 
			
		||||
	github.com/boltdb/bolt v1.3.1
 | 
			
		||||
	github.com/cenkalti/backoff v2.2.1+incompatible
 | 
			
		||||
	github.com/d4l3k/messagediff v1.2.2-0.20190829033028-7e0a312ae40b
 | 
			
		||||
	github.com/google/subcommands v1.2.0
 | 
			
		||||
	github.com/gosuri/uitable v0.0.4
 | 
			
		||||
	github.com/hashicorp/go-uuid v1.0.2
 | 
			
		||||
	github.com/hashicorp/go-version v1.2.1
 | 
			
		||||
	github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c
 | 
			
		||||
	github.com/jesseduffield/gocui v0.3.0
 | 
			
		||||
	github.com/k0kubun/pp v3.0.1+incompatible
 | 
			
		||||
	github.com/knqyf263/go-apk-version v0.0.0-20200609155635-041fdbb8563f
 | 
			
		||||
	github.com/knqyf263/go-cpe v0.0.0-20180327054844-659663f6eca2
 | 
			
		||||
	github.com/knqyf263/go-deb-version v0.0.0-20190517075300-09fca494f03d
 | 
			
		||||
	github.com/knqyf263/go-rpm-version v0.0.0-20170716094938-74609b86c936
 | 
			
		||||
	github.com/knqyf263/go-version v1.1.1
 | 
			
		||||
	github.com/knqyf263/gost v0.1.3
 | 
			
		||||
	github.com/kotakanbe/go-cve-dictionary v0.5.0
 | 
			
		||||
	github.com/kotakanbe/go-pingscanner v0.1.0
 | 
			
		||||
	github.com/kotakanbe/goval-dictionary v0.2.8
 | 
			
		||||
	github.com/kotakanbe/logrus-prefixed-formatter v0.0.0-20180123152602-928f7356cb96
 | 
			
		||||
	github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
 | 
			
		||||
	github.com/mitchellh/go-homedir v1.1.0
 | 
			
		||||
	github.com/mozqnet/go-exploitdb v0.0.0-20200612044106-ea30f49f0902
 | 
			
		||||
	github.com/nlopes/slack v0.6.0
 | 
			
		||||
	github.com/nsf/termbox-go v0.0.0-20200418040025-38ba6e5628f1 // indirect
 | 
			
		||||
	github.com/olekukonko/tablewriter v0.0.4
 | 
			
		||||
	github.com/parnurzeal/gorequest v0.2.16
 | 
			
		||||
	github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
 | 
			
		||||
	github.com/sirupsen/logrus v1.6.0
 | 
			
		||||
	github.com/spf13/afero v1.3.0
 | 
			
		||||
	github.com/spf13/cobra v1.0.0
 | 
			
		||||
	github.com/takuzoo3868/go-msfdb v0.1.1
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
 | 
			
		||||
	golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
 | 
			
		||||
	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
 | 
			
		||||
	golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
 | 
			
		||||
	k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								gost/base.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								gost/base.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	cnf "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/knqyf263/gost/db"
 | 
			
		||||
	"github.com/parnurzeal/gorequest"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Base is a base struct
 | 
			
		||||
type Base struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillCVEsWithRedHat fills cve information that has in Gost
 | 
			
		||||
func (b Base) FillCVEsWithRedHat(driver db.DB, r *models.ScanResult) error {
 | 
			
		||||
	return RedHat{}.fillFixed(driver, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckHTTPHealth do health check
 | 
			
		||||
func (b Base) CheckHTTPHealth() error {
 | 
			
		||||
	if !cnf.Conf.Gost.IsFetchViaHTTP() {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/health", cnf.Conf.Gost.URL)
 | 
			
		||||
	var errs []error
 | 
			
		||||
	var resp *http.Response
 | 
			
		||||
	resp, _, errs = gorequest.New().Get(url).End()
 | 
			
		||||
	//  resp, _, errs = gorequest.New().SetDebug(config.Conf.Debug).Get(url).End()
 | 
			
		||||
	//  resp, _, errs = gorequest.New().Proxy(api.httpProxy).Get(url).End()
 | 
			
		||||
	if 0 < len(errs) || resp == nil || resp.StatusCode != 200 {
 | 
			
		||||
		return xerrors.Errorf("Failed to connect to gost server. url: %s, errs: %w", url, errs)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckIfGostFetched checks if oval entries are in DB by family, release.
 | 
			
		||||
func (b Base) CheckIfGostFetched(driver db.DB, osFamily string) (fetched bool, err error) {
 | 
			
		||||
	//TODO
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckIfGostFresh checks if oval entries are fresh enough
 | 
			
		||||
func (b Base) CheckIfGostFresh(driver db.DB, osFamily string) (ok bool, err error) {
 | 
			
		||||
	//TODO
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -38,8 +21,23 @@ type packCves struct {
 | 
			
		||||
	cves      []models.CveContent
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithGost fills cve information that has in Gost
 | 
			
		||||
func (deb Debian) FillWithGost(driver db.DB, r *models.ScanResult, _ bool) (nCVEs int, err error) {
 | 
			
		||||
func (deb Debian) Supported(major string) bool {
 | 
			
		||||
	_, ok := map[string]string{
 | 
			
		||||
		"8":  "jessie",
 | 
			
		||||
		"9":  "stretch",
 | 
			
		||||
		"10": "buster",
 | 
			
		||||
	}[major]
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DetectUnfixed fills cve information that has in Gost
 | 
			
		||||
func (deb Debian) DetectUnfixed(driver db.DB, r *models.ScanResult, _ bool) (nCVEs int, err error) {
 | 
			
		||||
	if !deb.Supported(major(r.Release)) {
 | 
			
		||||
		// only logging
 | 
			
		||||
		util.Log.Warnf("Debian %s is not supported yet", r.Release)
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	linuxImage := "linux-image-" + r.RunningKernel.Release
 | 
			
		||||
	// Add linux and set the version of running kernel to search OVAL.
 | 
			
		||||
	if r.Container.ContainerID == "" {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								gost/debian_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								gost/debian_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import "testing"
 | 
			
		||||
 | 
			
		||||
func TestDebian_Supported(t *testing.T) {
 | 
			
		||||
	type fields struct {
 | 
			
		||||
		Base Base
 | 
			
		||||
	}
 | 
			
		||||
	type args struct {
 | 
			
		||||
		major string
 | 
			
		||||
	}
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name string
 | 
			
		||||
		args args
 | 
			
		||||
		want bool
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "8 is supported",
 | 
			
		||||
			args: args{
 | 
			
		||||
				major: "8",
 | 
			
		||||
			},
 | 
			
		||||
			want: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "9 is supported",
 | 
			
		||||
			args: args{
 | 
			
		||||
				major: "9",
 | 
			
		||||
			},
 | 
			
		||||
			want: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "10 is supported",
 | 
			
		||||
			args: args{
 | 
			
		||||
				major: "10",
 | 
			
		||||
			},
 | 
			
		||||
			want: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "11 is not supported yet",
 | 
			
		||||
			args: args{
 | 
			
		||||
				major: "11",
 | 
			
		||||
			},
 | 
			
		||||
			want: false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "empty string is not supported yet",
 | 
			
		||||
			args: args{
 | 
			
		||||
				major: "",
 | 
			
		||||
			},
 | 
			
		||||
			want: false,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for _, tt := range tests {
 | 
			
		||||
		t.Run(tt.name, func(t *testing.T) {
 | 
			
		||||
			deb := Debian{}
 | 
			
		||||
			if got := deb.Supported(tt.args.major); got != tt.want {
 | 
			
		||||
				t.Errorf("Debian.Supported() = %v, want %v", got, tt.want)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										75
									
								
								gost/gost.go
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								gost/gost.go
									
									
									
									
									
								
							@@ -1,37 +1,15 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	cnf "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/knqyf263/gost/db"
 | 
			
		||||
	"github.com/parnurzeal/gorequest"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Client is the interface of OVAL client.
 | 
			
		||||
type Client interface {
 | 
			
		||||
	FillWithGost(db.DB, *models.ScanResult, bool) (int, error)
 | 
			
		||||
	DetectUnfixed(db.DB, *models.ScanResult, bool) (int, error)
 | 
			
		||||
	FillCVEsWithRedHat(db.DB, *models.ScanResult) error
 | 
			
		||||
 | 
			
		||||
	//TODO implement
 | 
			
		||||
	// CheckHTTPHealth() error
 | 
			
		||||
@@ -53,52 +31,3 @@ func NewClient(family string) Client {
 | 
			
		||||
		return Pseudo{}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Base is a base struct
 | 
			
		||||
type Base struct {
 | 
			
		||||
	family string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckHTTPHealth do health check
 | 
			
		||||
func (b Base) CheckHTTPHealth() error {
 | 
			
		||||
	if !cnf.Conf.Gost.IsFetchViaHTTP() {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/health", cnf.Conf.Gost.URL)
 | 
			
		||||
	var errs []error
 | 
			
		||||
	var resp *http.Response
 | 
			
		||||
	resp, _, errs = gorequest.New().Get(url).End()
 | 
			
		||||
	//  resp, _, errs = gorequest.New().SetDebug(config.Conf.Debug).Get(url).End()
 | 
			
		||||
	//  resp, _, errs = gorequest.New().Proxy(api.httpProxy).Get(url).End()
 | 
			
		||||
	if 0 < len(errs) || resp == nil || resp.StatusCode != 200 {
 | 
			
		||||
		return xerrors.Errorf("Failed to connect to gost server. url: %s, errs: %w", url, errs)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckIfGostFetched checks if oval entries are in DB by family, release.
 | 
			
		||||
func (b Base) CheckIfGostFetched(driver db.DB, osFamily string) (fetched bool, err error) {
 | 
			
		||||
	//TODO
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckIfGostFresh checks if oval entries are fresh enough
 | 
			
		||||
func (b Base) CheckIfGostFresh(driver db.DB, osFamily string) (ok bool, err error) {
 | 
			
		||||
	//TODO
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Pseudo is Gost client except for RedHat family and Debian
 | 
			
		||||
type Pseudo struct {
 | 
			
		||||
	Base
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithGost fills cve information that has in Gost
 | 
			
		||||
func (pse Pseudo) FillWithGost(driver db.DB, r *models.ScanResult, _ bool) (int, error) {
 | 
			
		||||
	return 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func major(osVer string) (majorVersion string) {
 | 
			
		||||
	return strings.Split(osVer, ".")[0]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -30,12 +13,12 @@ type Microsoft struct {
 | 
			
		||||
	Base
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithGost fills cve information that has in Gost
 | 
			
		||||
func (ms Microsoft) FillWithGost(driver db.DB, r *models.ScanResult, _ bool) (nCVEs int, err error) {
 | 
			
		||||
// DetectUnfixed fills cve information that has in Gost
 | 
			
		||||
func (ms Microsoft) DetectUnfixed(driver db.DB, r *models.ScanResult, _ bool) (nCVEs int, err error) {
 | 
			
		||||
	if driver == nil {
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	var cveIDs []string
 | 
			
		||||
	cveIDs := []string{}
 | 
			
		||||
	for cveID := range r.ScannedCves {
 | 
			
		||||
		cveIDs = append(cveIDs, cveID)
 | 
			
		||||
	}
 | 
			
		||||
@@ -89,7 +72,7 @@ func (ms Microsoft) ConvertToModel(cve *gostmodels.MicrosoftCVE) *models.CveCont
 | 
			
		||||
	if 0 < len(cve.Workaround) {
 | 
			
		||||
		option["workaround"] = cve.Workaround
 | 
			
		||||
	}
 | 
			
		||||
	var kbids []string
 | 
			
		||||
	kbids := []string{}
 | 
			
		||||
	for _, kbid := range cve.KBIDs {
 | 
			
		||||
		kbids = append(kbids, kbid.KBID)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								gost/pseudo.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								gost/pseudo.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/knqyf263/gost/db"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Pseudo is Gost client except for RedHat family and Debian
 | 
			
		||||
type Pseudo struct {
 | 
			
		||||
	Base
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DetectUnfixed fills cve information that has in Gost
 | 
			
		||||
func (pse Pseudo) DetectUnfixed(driver db.DB, r *models.ScanResult, _ bool) (int, error) {
 | 
			
		||||
	return 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func major(osVer string) (majorVersion string) {
 | 
			
		||||
	return strings.Split(osVer, ".")[0]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -34,16 +17,13 @@ type RedHat struct {
 | 
			
		||||
	Base
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithGost fills cve information that has in Gost
 | 
			
		||||
func (red RedHat) FillWithGost(driver db.DB, r *models.ScanResult, ignoreWillNotFix bool) (nCVEs int, err error) {
 | 
			
		||||
	if nCVEs, err = red.fillUnfixed(driver, r, ignoreWillNotFix); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return nCVEs, red.fillFixed(driver, r)
 | 
			
		||||
// DetectUnfixed fills cve information that has in Gost
 | 
			
		||||
func (red RedHat) DetectUnfixed(driver db.DB, r *models.ScanResult, ignoreWillNotFix bool) (nCVEs int, err error) {
 | 
			
		||||
	return red.fillUnfixed(driver, r, ignoreWillNotFix)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (red RedHat) fillFixed(driver db.DB, r *models.ScanResult) error {
 | 
			
		||||
	var cveIDs []string
 | 
			
		||||
	cveIDs := []string{}
 | 
			
		||||
	for cveID, vuln := range r.ScannedCves {
 | 
			
		||||
		if _, ok := vuln.CveContents[models.RedHatAPI]; ok {
 | 
			
		||||
			continue
 | 
			
		||||
@@ -88,7 +68,7 @@ func (red RedHat) fillFixed(driver db.DB, r *models.ScanResult) error {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		for cveID, redCve := range driver.GetRedhatMulti(cveIDs) {
 | 
			
		||||
			if redCve.ID == 0 {
 | 
			
		||||
			if len(redCve.Name) == 0 {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			cveCont := red.ConvertToModel(&redCve)
 | 
			
		||||
@@ -159,8 +139,7 @@ func (red RedHat) fillUnfixed(driver db.DB, r *models.ScanResult, ignoreWillNotF
 | 
			
		||||
		}
 | 
			
		||||
		for _, pack := range r.Packages {
 | 
			
		||||
			// CVE-ID: RedhatCVE
 | 
			
		||||
			cves := map[string]gostmodels.RedhatCVE{}
 | 
			
		||||
			cves = driver.GetUnfixedCvesRedhat(major(r.Release), pack.Name, ignoreWillNotFix)
 | 
			
		||||
			cves := driver.GetUnfixedCvesRedhat(major(r.Release), pack.Name, ignoreWillNotFix)
 | 
			
		||||
			for _, cve := range cves {
 | 
			
		||||
				cveCont := red.ConvertToModel(&cve)
 | 
			
		||||
				v, ok := r.ScannedCves[cve.Name]
 | 
			
		||||
@@ -265,7 +244,7 @@ func (red RedHat) ConvertToModel(cve *gostmodels.RedhatCVE) *models.CveContent {
 | 
			
		||||
		v3severity = cve.ThreatSeverity
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var refs []models.Reference
 | 
			
		||||
	refs := []models.Reference{}
 | 
			
		||||
	for _, r := range cve.References {
 | 
			
		||||
		refs = append(refs, models.Reference{Link: r.Reference})
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								gost/util.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								gost/util.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package gost
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,108 @@
 | 
			
		||||
package libmanager
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/db"
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/log"
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	db2 "github.com/aquasecurity/trivy-db/pkg/db"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/db"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/github"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/indicator"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/log"
 | 
			
		||||
	"github.com/spf13/afero"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
	"k8s.io/utils/clock"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FillLibrary fills LibraryScanner informations
 | 
			
		||||
func FillLibrary(r *models.ScanResult) (totalCnt int, err error) {
 | 
			
		||||
	if len(r.LibraryScanners) == 0 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// initialize trivy's logger and db
 | 
			
		||||
	err = log.InitLogger(false)
 | 
			
		||||
	err = log.InitLogger(false, false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if err := db.Init(); err != nil {
 | 
			
		||||
 | 
			
		||||
	util.Log.Info("Updating library db...")
 | 
			
		||||
	if err := downloadDB(config.Version, config.Conf.TrivyCacheDBDir, config.Conf.NoProgress, false, false); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := db2.Init(config.Conf.TrivyCacheDBDir); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	defer db2.Close()
 | 
			
		||||
 | 
			
		||||
	for _, lib := range r.LibraryScanners {
 | 
			
		||||
		vinfos, err := lib.Scan()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		for _, vinfo := range vinfos {
 | 
			
		||||
			r.ScannedCves[vinfo.CveID] = vinfo
 | 
			
		||||
			vinfo.Confidences.AppendIfMissing(models.TrivyMatch)
 | 
			
		||||
			if v, ok := r.ScannedCves[vinfo.CveID]; !ok {
 | 
			
		||||
				r.ScannedCves[vinfo.CveID] = vinfo
 | 
			
		||||
			} else {
 | 
			
		||||
				v.LibraryFixedIns = append(v.LibraryFixedIns, vinfo.LibraryFixedIns...)
 | 
			
		||||
				r.ScannedCves[vinfo.CveID] = v
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		totalCnt += len(vinfos)
 | 
			
		||||
	}
 | 
			
		||||
	db.Close()
 | 
			
		||||
 | 
			
		||||
	return totalCnt, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func downloadDB(appVersion, cacheDir string, quiet, light, skipUpdate bool) error {
 | 
			
		||||
	client := initializeDBClient(cacheDir, quiet)
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
	needsUpdate, err := client.NeedsUpdate(appVersion, light, skipUpdate)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("database error: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if needsUpdate {
 | 
			
		||||
		util.Log.Info("Need to update DB")
 | 
			
		||||
		util.Log.Info("Downloading DB...")
 | 
			
		||||
		if err := client.Download(ctx, cacheDir, light); err != nil {
 | 
			
		||||
			return xerrors.Errorf("failed to download vulnerability DB: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
		if err = client.UpdateMetadata(cacheDir); err != nil {
 | 
			
		||||
			return xerrors.Errorf("unable to update database metadata: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// for debug
 | 
			
		||||
	if err := showDBInfo(cacheDir); err != nil {
 | 
			
		||||
		return xerrors.Errorf("failed to show database info: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func initializeDBClient(cacheDir string, quiet bool) db.Client {
 | 
			
		||||
	config := db2.Config{}
 | 
			
		||||
	client := github.NewClient()
 | 
			
		||||
	progressBar := indicator.NewProgressBar(quiet)
 | 
			
		||||
	realClock := clock.RealClock{}
 | 
			
		||||
	fs := afero.NewOsFs()
 | 
			
		||||
	metadata := db.NewMetadata(fs, cacheDir)
 | 
			
		||||
	dbClient := db.NewClient(config, client, progressBar, realClock, metadata)
 | 
			
		||||
	return dbClient
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func showDBInfo(cacheDir string) error {
 | 
			
		||||
	m := db.NewMetadata(afero.NewOsFs(), cacheDir)
 | 
			
		||||
	metadata, err := m.Get()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("something wrong with DB: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	util.Log.Debugf("DB Schema: %d, Type: %d, UpdatedAt: %s, NextUpdate: %s",
 | 
			
		||||
		metadata.Version, metadata.Type, metadata.UpdatedAt, metadata.NextUpdate)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								main.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,26 +1,9 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
 | 
			
		||||
	"github.com/aquasecurity/trivy-db/pkg/vulnsrc/vulnerability"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CveContents has CveContent
 | 
			
		||||
@@ -240,16 +223,18 @@ func NewCveContentType(name string) CveContentType {
 | 
			
		||||
		return WPVulnDB
 | 
			
		||||
	case "amazon":
 | 
			
		||||
		return Amazon
 | 
			
		||||
	case vulnerability.NodejsSecurityWg:
 | 
			
		||||
		return NodeSec
 | 
			
		||||
	case vulnerability.PythonSafetyDB:
 | 
			
		||||
		return PythonSec
 | 
			
		||||
	case vulnerability.RustSec:
 | 
			
		||||
		return RustSec
 | 
			
		||||
	case vulnerability.PhpSecurityAdvisories:
 | 
			
		||||
		return PhpSec
 | 
			
		||||
	case vulnerability.RubySec:
 | 
			
		||||
		return RubySec
 | 
			
		||||
	case "trivy":
 | 
			
		||||
		return Trivy
 | 
			
		||||
	// case vulnerability.NodejsSecurityWg:
 | 
			
		||||
	// 	return NodeSec
 | 
			
		||||
	// case vulnerability.PythonSafetyDB:
 | 
			
		||||
	// 	return PythonSec
 | 
			
		||||
	// case vulnerability.RustSec:
 | 
			
		||||
	// 	return RustSec
 | 
			
		||||
	// case vulnerability.PhpSecurityAdvisories:
 | 
			
		||||
	// 	return PhpSec
 | 
			
		||||
	// case vulnerability.RubySec:
 | 
			
		||||
	// 	return RubySec
 | 
			
		||||
	default:
 | 
			
		||||
		return Unknown
 | 
			
		||||
	}
 | 
			
		||||
@@ -295,20 +280,23 @@ const (
 | 
			
		||||
	// WPVulnDB is WordPress
 | 
			
		||||
	WPVulnDB CveContentType = "wpvulndb"
 | 
			
		||||
 | 
			
		||||
	// Trivy is Trivy
 | 
			
		||||
	Trivy CveContentType = "trivy"
 | 
			
		||||
 | 
			
		||||
	// NodeSec : for JS
 | 
			
		||||
	NodeSec CveContentType = "node"
 | 
			
		||||
	// NodeSec CveContentType = "node"
 | 
			
		||||
 | 
			
		||||
	// PythonSec : for PHP
 | 
			
		||||
	PythonSec CveContentType = "python"
 | 
			
		||||
	// // PythonSec : for PHP
 | 
			
		||||
	// PythonSec CveContentType = "python"
 | 
			
		||||
 | 
			
		||||
	// PhpSec : for PHP
 | 
			
		||||
	PhpSec CveContentType = "php"
 | 
			
		||||
	// // PhpSec : for PHP
 | 
			
		||||
	// PhpSec CveContentType = "php"
 | 
			
		||||
 | 
			
		||||
	// RubySec : for Ruby
 | 
			
		||||
	RubySec CveContentType = "ruby"
 | 
			
		||||
	// // RubySec : for Ruby
 | 
			
		||||
	// RubySec CveContentType = "ruby"
 | 
			
		||||
 | 
			
		||||
	// RustSec : for Rust
 | 
			
		||||
	RustSec CveContentType = "rust"
 | 
			
		||||
	// // RustSec : for Rust
 | 
			
		||||
	// RustSec CveContentType = "rust"
 | 
			
		||||
 | 
			
		||||
	// Unknown is Unknown
 | 
			
		||||
	Unknown CveContentType = "unknown"
 | 
			
		||||
@@ -330,11 +318,12 @@ var AllCveContetTypes = CveContentTypes{
 | 
			
		||||
	SUSE,
 | 
			
		||||
	DebianSecurityTracker,
 | 
			
		||||
	WPVulnDB,
 | 
			
		||||
	NodeSec,
 | 
			
		||||
	PythonSec,
 | 
			
		||||
	PhpSec,
 | 
			
		||||
	RubySec,
 | 
			
		||||
	RustSec,
 | 
			
		||||
	Trivy,
 | 
			
		||||
	// NodeSec,
 | 
			
		||||
	// PythonSec,
 | 
			
		||||
	// PhpSec,
 | 
			
		||||
	// RubySec,
 | 
			
		||||
	// RustSec,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Except returns CveContentTypes except for given args
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -3,15 +3,35 @@ package models
 | 
			
		||||
import (
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/aquasecurity/trivy-db/pkg/db"
 | 
			
		||||
	trivyDBTypes "github.com/aquasecurity/trivy-db/pkg/types"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/detector/library"
 | 
			
		||||
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/types"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/scanner/library"
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/vulnsrc/vulnerability"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
 | 
			
		||||
	"github.com/knqyf263/go-dep-parser/pkg/types"
 | 
			
		||||
	// "github.com/aquasecurity/go-dep-parser/pkg/types"
 | 
			
		||||
	"github.com/knqyf263/go-version"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LibraryScanners is an array of LibraryScanner
 | 
			
		||||
type LibraryScanners []LibraryScanner
 | 
			
		||||
 | 
			
		||||
// Find : find by name
 | 
			
		||||
func (lss LibraryScanners) Find(path, name string) map[string]types.Library {
 | 
			
		||||
	filtered := map[string]types.Library{}
 | 
			
		||||
	for _, ls := range lss {
 | 
			
		||||
		for _, lib := range ls.Libs {
 | 
			
		||||
			if ls.Path == path && lib.Name == name {
 | 
			
		||||
				filtered[ls.Path] = lib
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return filtered
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LibraryScanner has libraries information
 | 
			
		||||
type LibraryScanner struct {
 | 
			
		||||
	Path string
 | 
			
		||||
@@ -20,18 +40,11 @@ type LibraryScanner struct {
 | 
			
		||||
 | 
			
		||||
// Scan : scan target library
 | 
			
		||||
func (s LibraryScanner) Scan() ([]VulnInfo, error) {
 | 
			
		||||
	scanner := library.NewScanner(filepath.Base(string(s.Path)))
 | 
			
		||||
	if scanner == nil {
 | 
			
		||||
		return nil, xerrors.New("unknown file type")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	util.Log.Info("Updating library db...")
 | 
			
		||||
	err := scanner.UpdateDB()
 | 
			
		||||
	scanner, err := library.DriverFactory{}.NewDriver(filepath.Base(string(s.Path)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, xerrors.Errorf("failed to update %s advisories: %w", scanner.Type(), err)
 | 
			
		||||
		return nil, xerrors.Errorf("Faild to new a library driver: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var vulnerabilities []VulnInfo
 | 
			
		||||
	var vulnerabilities = []VulnInfo{}
 | 
			
		||||
	for _, pkg := range s.Libs {
 | 
			
		||||
		v, err := version.NewVersion(pkg.Version)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -43,6 +56,9 @@ func (s LibraryScanner) Scan() ([]VulnInfo, error) {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, xerrors.Errorf("failed to detect %s vulnerabilities: %w", scanner.Type(), err)
 | 
			
		||||
		}
 | 
			
		||||
		if len(tvulns) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		vulns := s.convertFanalToVuln(tvulns)
 | 
			
		||||
		vulnerabilities = append(vulnerabilities, vulns...)
 | 
			
		||||
@@ -51,68 +67,55 @@ func (s LibraryScanner) Scan() ([]VulnInfo, error) {
 | 
			
		||||
	return vulnerabilities, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s LibraryScanner) convertFanalToVuln(tvulns []vulnerability.DetectedVulnerability) (vulns []VulnInfo) {
 | 
			
		||||
func (s LibraryScanner) convertFanalToVuln(tvulns []types.DetectedVulnerability) (vulns []VulnInfo) {
 | 
			
		||||
	for _, tvuln := range tvulns {
 | 
			
		||||
		vinfo, _ := s.getVulnDetail(tvuln)
 | 
			
		||||
		vinfo, err := s.getVulnDetail(tvuln)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			util.Log.Debugf("failed to getVulnDetail. err: %s, tvun: %#v", err, tvuln)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		vulns = append(vulns, vinfo)
 | 
			
		||||
	}
 | 
			
		||||
	return vulns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s LibraryScanner) getVulnDetail(tvuln vulnerability.DetectedVulnerability) (vinfo VulnInfo, err error) {
 | 
			
		||||
	details, err := vulnerability.Get(tvuln.VulnerabilityID)
 | 
			
		||||
func (s LibraryScanner) getVulnDetail(tvuln types.DetectedVulnerability) (vinfo VulnInfo, err error) {
 | 
			
		||||
	vul, err := db.Config{}.GetVulnerability(tvuln.VulnerabilityID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return vinfo, err
 | 
			
		||||
	} else if len(details) == 0 {
 | 
			
		||||
		return vinfo, xerrors.Errorf("Unknown vulnID : %s", tvuln.VulnerabilityID)
 | 
			
		||||
	}
 | 
			
		||||
	vinfo.CveID = tvuln.VulnerabilityID
 | 
			
		||||
	vinfo.CveContents = getCveContents(details)
 | 
			
		||||
	if tvuln.FixedVersion != "" {
 | 
			
		||||
 | 
			
		||||
	vinfo.CveID = tvuln.VulnerabilityID
 | 
			
		||||
	vinfo.CveContents = getCveContents(tvuln.VulnerabilityID, vul)
 | 
			
		||||
	if tvuln.FixedVersion != "" {
 | 
			
		||||
		vinfo.LibraryFixedIns = []LibraryFixedIn{
 | 
			
		||||
			{
 | 
			
		||||
				Key:     s.GetLibraryKey(),
 | 
			
		||||
				Name:    tvuln.PkgName,
 | 
			
		||||
				FixedIn: tvuln.FixedVersion,
 | 
			
		||||
				Path:    s.Path,
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return vinfo, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getCveContents(details map[string]vulnerability.Vulnerability) (contents map[CveContentType]CveContent) {
 | 
			
		||||
func getCveContents(cveID string, vul trivyDBTypes.Vulnerability) (contents map[CveContentType]CveContent) {
 | 
			
		||||
	contents = map[CveContentType]CveContent{}
 | 
			
		||||
	for source, detail := range details {
 | 
			
		||||
		refs := []Reference{}
 | 
			
		||||
		for _, refURL := range detail.References {
 | 
			
		||||
			refs = append(refs, Reference{Source: refURL, Link: refURL})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		content := CveContent{
 | 
			
		||||
			Type:          NewCveContentType(source),
 | 
			
		||||
			CveID:         detail.ID,
 | 
			
		||||
			Title:         detail.Title,
 | 
			
		||||
			Summary:       detail.Description,
 | 
			
		||||
			Cvss3Score:    detail.CvssScoreV3,
 | 
			
		||||
			Cvss3Severity: string(detail.SeverityV3),
 | 
			
		||||
			Cvss2Score:    detail.CvssScore,
 | 
			
		||||
			Cvss2Severity: string(detail.Severity),
 | 
			
		||||
			References:    refs,
 | 
			
		||||
 | 
			
		||||
			//SourceLink    string            `json:"sourceLink"`
 | 
			
		||||
			//Cvss2Vector   string            `json:"cvss2Vector"`
 | 
			
		||||
			//Cvss3Vector   string            `json:"cvss3Vector"`
 | 
			
		||||
			//Cvss3Severity string            `json:"cvss3Severity"`
 | 
			
		||||
			//Cpes          []Cpe             `json:"cpes,omitempty"`
 | 
			
		||||
			//CweIDs        []string          `json:"cweIDs,omitempty"`
 | 
			
		||||
			//Published     time.Time         `json:"published"`
 | 
			
		||||
			//LastModified  time.Time         `json:"lastModified"`
 | 
			
		||||
			//Mitigation    string            `json:"mitigation"` // RedHat API
 | 
			
		||||
			//Optional      map[string]string `json:"optional,omitempty"`
 | 
			
		||||
		}
 | 
			
		||||
		contents[NewCveContentType(source)] = content
 | 
			
		||||
	refs := []Reference{}
 | 
			
		||||
	for _, refURL := range vul.References {
 | 
			
		||||
		refs = append(refs, Reference{Source: "trivy", Link: refURL})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	content := CveContent{
 | 
			
		||||
		Type:          Trivy,
 | 
			
		||||
		CveID:         cveID,
 | 
			
		||||
		Title:         vul.Title,
 | 
			
		||||
		Summary:       vul.Description,
 | 
			
		||||
		Cvss3Severity: string(vul.Severity),
 | 
			
		||||
		References:    refs,
 | 
			
		||||
	}
 | 
			
		||||
	contents[Trivy] = content
 | 
			
		||||
	return contents
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -122,7 +125,7 @@ var LibraryMap = map[string]string{
 | 
			
		||||
	"yarn.lock":         "node",
 | 
			
		||||
	"Gemfile.lock":      "ruby",
 | 
			
		||||
	"Cargo.lock":        "rust",
 | 
			
		||||
	"composer.json":     "php",
 | 
			
		||||
	"composer.lock":     "php",
 | 
			
		||||
	"Pipfile.lock":      "python",
 | 
			
		||||
	"poetry.lock":       "python",
 | 
			
		||||
}
 | 
			
		||||
@@ -138,4 +141,5 @@ type LibraryFixedIn struct {
 | 
			
		||||
	Key     string `json:"key,omitempty"`
 | 
			
		||||
	Name    string `json:"name,omitempty"`
 | 
			
		||||
	FixedIn string `json:"fixedIn,omitempty"`
 | 
			
		||||
	Path    string `json:"path,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,52 +1,96 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	godeptypes "github.com/knqyf263/go-dep-parser/pkg/types"
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/db"
 | 
			
		||||
	"github.com/knqyf263/trivy/pkg/log"
 | 
			
		||||
	"github.com/aquasecurity/trivy/pkg/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestScan(t *testing.T) {
 | 
			
		||||
	var tests = []struct {
 | 
			
		||||
func TestLibraryScanners_Find(t *testing.T) {
 | 
			
		||||
	type args struct {
 | 
			
		||||
		path string
 | 
			
		||||
		pkgs []godeptypes.Library
 | 
			
		||||
		name string
 | 
			
		||||
	}
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name string
 | 
			
		||||
		lss  LibraryScanners
 | 
			
		||||
		args args
 | 
			
		||||
		want map[string]types.Library
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			path: "app/package-lock.json",
 | 
			
		||||
			pkgs: []godeptypes.Library{
 | 
			
		||||
			name: "single file",
 | 
			
		||||
			lss: LibraryScanners{
 | 
			
		||||
				{
 | 
			
		||||
					Name:    "jquery",
 | 
			
		||||
					Version: "2.2.4",
 | 
			
		||||
					Path: "/pathA",
 | 
			
		||||
					Libs: []types.Library{
 | 
			
		||||
						{
 | 
			
		||||
							Name:    "libA",
 | 
			
		||||
							Version: "1.0.0",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Name:    "@babel/traverse",
 | 
			
		||||
					Version: "7.4.4",
 | 
			
		||||
			},
 | 
			
		||||
			args: args{"/pathA", "libA"},
 | 
			
		||||
			want: map[string]types.Library{
 | 
			
		||||
				"/pathA": {
 | 
			
		||||
					Name:    "libA",
 | 
			
		||||
					Version: "1.0.0",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "multi file",
 | 
			
		||||
			lss: LibraryScanners{
 | 
			
		||||
				{
 | 
			
		||||
					Path: "/pathA",
 | 
			
		||||
					Libs: []types.Library{
 | 
			
		||||
						{
 | 
			
		||||
							Name:    "libA",
 | 
			
		||||
							Version: "1.0.0",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Path: "/pathB",
 | 
			
		||||
					Libs: []types.Library{
 | 
			
		||||
						{
 | 
			
		||||
							Name:    "libA",
 | 
			
		||||
							Version: "1.0.5",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			args: args{"/pathA", "libA"},
 | 
			
		||||
			want: map[string]types.Library{
 | 
			
		||||
				"/pathA": {
 | 
			
		||||
					Name:    "libA",
 | 
			
		||||
					Version: "1.0.0",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "miss",
 | 
			
		||||
			lss: LibraryScanners{
 | 
			
		||||
				{
 | 
			
		||||
					Path: "/pathA",
 | 
			
		||||
					Libs: []types.Library{
 | 
			
		||||
						{
 | 
			
		||||
							Name:    "libA",
 | 
			
		||||
							Version: "1.0.0",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			args: args{"/pathA", "libB"},
 | 
			
		||||
			want: map[string]types.Library{},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := log.InitLogger(false); err != nil {
 | 
			
		||||
		t.Errorf("trivy logger failed")
 | 
			
		||||
	for _, tt := range tests {
 | 
			
		||||
		t.Run(tt.name, func(t *testing.T) {
 | 
			
		||||
			if got := tt.lss.Find(tt.args.path, tt.args.name); !reflect.DeepEqual(got, tt.want) {
 | 
			
		||||
				t.Errorf("LibraryScanners.Find() = %v, want %v", got, tt.want)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := db.Init(); err != nil {
 | 
			
		||||
		t.Errorf("trivy db.Init failed")
 | 
			
		||||
	}
 | 
			
		||||
	for _, v := range tests {
 | 
			
		||||
		lib := LibraryScanner{
 | 
			
		||||
			Path: v.path,
 | 
			
		||||
			Libs: v.pkgs,
 | 
			
		||||
		}
 | 
			
		||||
		actual, err := lib.Scan()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("error occurred")
 | 
			
		||||
		}
 | 
			
		||||
		if len(actual) == 0 {
 | 
			
		||||
			t.Errorf("no vuln found : actual: %v\n", actual)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	db.Close()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
// JSONVersion is JSON Version
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -137,18 +120,23 @@ func (p Package) FormatNewVer() string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FormatVersionFromTo formats installed and new package version
 | 
			
		||||
func (p Package) FormatVersionFromTo(notFixedYet bool, status string) string {
 | 
			
		||||
func (p Package) FormatVersionFromTo(stat PackageFixStatus) string {
 | 
			
		||||
	to := p.FormatNewVer()
 | 
			
		||||
	if notFixedYet {
 | 
			
		||||
		if status != "" {
 | 
			
		||||
			to = status
 | 
			
		||||
	if stat.NotFixedYet {
 | 
			
		||||
		if stat.FixState != "" {
 | 
			
		||||
			to = stat.FixState
 | 
			
		||||
		} else {
 | 
			
		||||
			to = "Not Fixed Yet"
 | 
			
		||||
		}
 | 
			
		||||
	} else if p.NewVersion == "" {
 | 
			
		||||
		to = "Unknown"
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%s-%s -> %s", p.Name, p.FormatVer(), to)
 | 
			
		||||
	var fixedIn string
 | 
			
		||||
	if stat.FixedIn != "" {
 | 
			
		||||
		fixedIn = fmt.Sprintf(" (FixedIn: %s)", stat.FixedIn)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%s-%s -> %s%s",
 | 
			
		||||
		p.Name, p.FormatVer(), to, fixedIn)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FormatChangelog formats the changelog
 | 
			
		||||
@@ -207,6 +195,7 @@ type NeedRestartProcess struct {
 | 
			
		||||
type SrcPackage struct {
 | 
			
		||||
	Name        string   `json:"name"`
 | 
			
		||||
	Version     string   `json:"version"`
 | 
			
		||||
	Arch        string   `json:"arch"`
 | 
			
		||||
	BinaryNames []string `json:"binaryNames"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -191,3 +175,125 @@ func TestFindByBinName(t *testing.T) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPackage_FormatVersionFromTo(t *testing.T) {
 | 
			
		||||
	type fields struct {
 | 
			
		||||
		Name             string
 | 
			
		||||
		Version          string
 | 
			
		||||
		Release          string
 | 
			
		||||
		NewVersion       string
 | 
			
		||||
		NewRelease       string
 | 
			
		||||
		Arch             string
 | 
			
		||||
		Repository       string
 | 
			
		||||
		Changelog        Changelog
 | 
			
		||||
		AffectedProcs    []AffectedProcess
 | 
			
		||||
		NeedRestartProcs []NeedRestartProcess
 | 
			
		||||
	}
 | 
			
		||||
	type args struct {
 | 
			
		||||
		stat PackageFixStatus
 | 
			
		||||
	}
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name   string
 | 
			
		||||
		fields fields
 | 
			
		||||
		args   args
 | 
			
		||||
		want   string
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "fixed",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				Name:       "packA",
 | 
			
		||||
				Version:    "1.0.0",
 | 
			
		||||
				Release:    "a",
 | 
			
		||||
				NewVersion: "1.0.1",
 | 
			
		||||
				NewRelease: "b",
 | 
			
		||||
			},
 | 
			
		||||
			args: args{
 | 
			
		||||
				stat: PackageFixStatus{
 | 
			
		||||
					NotFixedYet: false,
 | 
			
		||||
					FixedIn:     "1.0.1-b",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: "packA-1.0.0-a -> 1.0.1-b (FixedIn: 1.0.1-b)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "nfy",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				Name:    "packA",
 | 
			
		||||
				Version: "1.0.0",
 | 
			
		||||
				Release: "a",
 | 
			
		||||
			},
 | 
			
		||||
			args: args{
 | 
			
		||||
				stat: PackageFixStatus{
 | 
			
		||||
					NotFixedYet: true,
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: "packA-1.0.0-a -> Not Fixed Yet",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "nfy",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				Name:    "packA",
 | 
			
		||||
				Version: "1.0.0",
 | 
			
		||||
				Release: "a",
 | 
			
		||||
			},
 | 
			
		||||
			args: args{
 | 
			
		||||
				stat: PackageFixStatus{
 | 
			
		||||
					NotFixedYet: false,
 | 
			
		||||
					FixedIn:     "1.0.1-b",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: "packA-1.0.0-a -> Unknown (FixedIn: 1.0.1-b)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "nfy2",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				Name:    "packA",
 | 
			
		||||
				Version: "1.0.0",
 | 
			
		||||
				Release: "a",
 | 
			
		||||
			},
 | 
			
		||||
			args: args{
 | 
			
		||||
				stat: PackageFixStatus{
 | 
			
		||||
					NotFixedYet: true,
 | 
			
		||||
					FixedIn:     "1.0.1-b",
 | 
			
		||||
					FixState:    "open",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: "packA-1.0.0-a -> open (FixedIn: 1.0.1-b)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "nfy3",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				Name:    "packA",
 | 
			
		||||
				Version: "1.0.0",
 | 
			
		||||
				Release: "a",
 | 
			
		||||
			},
 | 
			
		||||
			args: args{
 | 
			
		||||
				stat: PackageFixStatus{
 | 
			
		||||
					NotFixedYet: true,
 | 
			
		||||
					FixedIn:     "1.0.1-b",
 | 
			
		||||
					FixState:    "open",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			want: "packA-1.0.0-a -> open (FixedIn: 1.0.1-b)",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for _, tt := range tests {
 | 
			
		||||
		t.Run(tt.name, func(t *testing.T) {
 | 
			
		||||
			p := Package{
 | 
			
		||||
				Name:             tt.fields.Name,
 | 
			
		||||
				Version:          tt.fields.Version,
 | 
			
		||||
				Release:          tt.fields.Release,
 | 
			
		||||
				NewVersion:       tt.fields.NewVersion,
 | 
			
		||||
				NewRelease:       tt.fields.NewRelease,
 | 
			
		||||
				Arch:             tt.fields.Arch,
 | 
			
		||||
				Repository:       tt.fields.Repository,
 | 
			
		||||
				Changelog:        tt.fields.Changelog,
 | 
			
		||||
				AffectedProcs:    tt.fields.AffectedProcs,
 | 
			
		||||
				NeedRestartProcs: tt.fields.NeedRestartProcs,
 | 
			
		||||
			}
 | 
			
		||||
			if got := p.FormatVersionFromTo(tt.args.stat); got != tt.want {
 | 
			
		||||
				t.Errorf("Package.FormatVersionFromTo() = %v, want %v", got, tt.want)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -24,8 +7,6 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/alert"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/cwe"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
@@ -43,7 +24,6 @@ type ScanResult struct {
 | 
			
		||||
	Family           string                `json:"family"`
 | 
			
		||||
	Release          string                `json:"release"`
 | 
			
		||||
	Container        Container             `json:"container"`
 | 
			
		||||
	Image            Image                 `json:"image"`
 | 
			
		||||
	Platform         Platform              `json:"platform"`
 | 
			
		||||
	IPv4Addrs        []string              `json:"ipv4Addrs,omitempty"` // only global unicast address (https://golang.org/pkg/net/#IP.IsGlobalUnicast)
 | 
			
		||||
	IPv6Addrs        []string              `json:"ipv6Addrs,omitempty"` // only global unicast address (https://golang.org/pkg/net/#IP.IsGlobalUnicast)
 | 
			
		||||
@@ -68,7 +48,7 @@ type ScanResult struct {
 | 
			
		||||
	Packages          Packages               `json:"packages"`
 | 
			
		||||
	SrcPackages       SrcPackages            `json:",omitempty"`
 | 
			
		||||
	WordPressPackages *WordPressPackages     `json:",omitempty"`
 | 
			
		||||
	LibraryScanners   []LibraryScanner       `json:"libScanners"`
 | 
			
		||||
	LibraryScanners   LibraryScanners        `json:"libraries,omitempty"`
 | 
			
		||||
	CweDict           CweDict                `json:"cweDict,omitempty"`
 | 
			
		||||
	Optional          map[string]interface{} `json:",omitempty"`
 | 
			
		||||
	Config            struct {
 | 
			
		||||
@@ -81,7 +61,7 @@ type ScanResult struct {
 | 
			
		||||
type CweDict map[string]CweDictEntry
 | 
			
		||||
 | 
			
		||||
// Get the name, url, top10URL for the specified cweID, lang
 | 
			
		||||
func (c CweDict) Get(cweID, lang string) (name, url, top10Rank, top10URL string) {
 | 
			
		||||
func (c CweDict) Get(cweID, lang string) (name, url, top10Rank, top10URL, cweTop25Rank, cweTop25URL, sansTop25Rank, sansTop25URL string) {
 | 
			
		||||
	cweNum := strings.TrimPrefix(cweID, "CWE-")
 | 
			
		||||
	switch config.Conf.Lang {
 | 
			
		||||
	case "ja":
 | 
			
		||||
@@ -89,6 +69,14 @@ func (c CweDict) Get(cweID, lang string) (name, url, top10Rank, top10URL string)
 | 
			
		||||
			top10Rank = dict.OwaspTopTen2017
 | 
			
		||||
			top10URL = cwe.OwaspTopTen2017GitHubURLJa[dict.OwaspTopTen2017]
 | 
			
		||||
		}
 | 
			
		||||
		if dict, ok := c[cweNum]; ok && dict.CweTopTwentyfive2019 != "" {
 | 
			
		||||
			cweTop25Rank = dict.CweTopTwentyfive2019
 | 
			
		||||
			cweTop25URL = cwe.CweTopTwentyfive2019URL
 | 
			
		||||
		}
 | 
			
		||||
		if dict, ok := c[cweNum]; ok && dict.SansTopTwentyfive != "" {
 | 
			
		||||
			sansTop25Rank = dict.SansTopTwentyfive
 | 
			
		||||
			sansTop25URL = cwe.SansTopTwentyfiveURL
 | 
			
		||||
		}
 | 
			
		||||
		if dict, ok := cwe.CweDictJa[cweNum]; ok {
 | 
			
		||||
			name = dict.Name
 | 
			
		||||
			url = fmt.Sprintf("http://jvndb.jvn.jp/ja/cwe/%s.html", cweID)
 | 
			
		||||
@@ -103,6 +91,14 @@ func (c CweDict) Get(cweID, lang string) (name, url, top10Rank, top10URL string)
 | 
			
		||||
			top10Rank = dict.OwaspTopTen2017
 | 
			
		||||
			top10URL = cwe.OwaspTopTen2017GitHubURLEn[dict.OwaspTopTen2017]
 | 
			
		||||
		}
 | 
			
		||||
		if dict, ok := c[cweNum]; ok && dict.CweTopTwentyfive2019 != "" {
 | 
			
		||||
			cweTop25Rank = dict.CweTopTwentyfive2019
 | 
			
		||||
			cweTop25URL = cwe.CweTopTwentyfive2019URL
 | 
			
		||||
		}
 | 
			
		||||
		if dict, ok := c[cweNum]; ok && dict.SansTopTwentyfive != "" {
 | 
			
		||||
			sansTop25Rank = dict.SansTopTwentyfive
 | 
			
		||||
			sansTop25URL = cwe.SansTopTwentyfiveURL
 | 
			
		||||
		}
 | 
			
		||||
		url = fmt.Sprintf("https://cwe.mitre.org/data/definitions/%s.html", cweID)
 | 
			
		||||
		if dict, ok := cwe.CweDictEn[cweNum]; ok {
 | 
			
		||||
			name = dict.Name
 | 
			
		||||
@@ -113,15 +109,11 @@ func (c CweDict) Get(cweID, lang string) (name, url, top10Rank, top10URL string)
 | 
			
		||||
 | 
			
		||||
// CweDictEntry is a entry of CWE
 | 
			
		||||
type CweDictEntry struct {
 | 
			
		||||
	En              *cwe.Cwe `json:"en,omitempty"`
 | 
			
		||||
	Ja              *cwe.Cwe `json:"ja,omitempty"`
 | 
			
		||||
	OwaspTopTen2017 string   `json:"owaspTopTen2017"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetAlertsByCveID return alerts fetched by cveID
 | 
			
		||||
func GetAlertsByCveID(cveID string, lang string) (alerts []alert.Alert) {
 | 
			
		||||
	alerts = alert.GenerateAlertDict(cveID, lang)
 | 
			
		||||
	return alerts
 | 
			
		||||
	En                   *cwe.Cwe `json:"en,omitempty"`
 | 
			
		||||
	Ja                   *cwe.Cwe `json:"ja,omitempty"`
 | 
			
		||||
	OwaspTopTen2017      string   `json:"owaspTopTen2017"`
 | 
			
		||||
	CweTopTwentyfive2019 string   `json:"cweTopTwentyfive2019"`
 | 
			
		||||
	SansTopTwentyfive    string   `json:"sansTopTwentyfive"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Kernel has the Release, version and whether need restart
 | 
			
		||||
@@ -203,7 +195,7 @@ func (r ScanResult) FilterUnfixed() ScanResult {
 | 
			
		||||
 | 
			
		||||
// FilterIgnorePkgs is filter function.
 | 
			
		||||
func (r ScanResult) FilterIgnorePkgs() ScanResult {
 | 
			
		||||
	ignorePkgsRegexps := []string{}
 | 
			
		||||
	var ignorePkgsRegexps []string
 | 
			
		||||
	if len(r.Container.Name) == 0 {
 | 
			
		||||
		ignorePkgsRegexps = config.Conf.Servers[r.ServerName].IgnorePkgsRegexp
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -280,7 +272,7 @@ func (r ScanResult) FilterInactiveWordPressLibs() ScanResult {
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReportFileName returns the filename on localhost without extention
 | 
			
		||||
// ReportFileName returns the filename on localhost without extension
 | 
			
		||||
func (r ScanResult) ReportFileName() (name string) {
 | 
			
		||||
	if len(r.Container.ContainerID) == 0 {
 | 
			
		||||
		return fmt.Sprintf("%s", r.ServerName)
 | 
			
		||||
@@ -288,7 +280,7 @@ func (r ScanResult) ReportFileName() (name string) {
 | 
			
		||||
	return fmt.Sprintf("%s@%s", r.Container.Name, r.ServerName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReportKeyName returns the name of key on S3, Azure-Blob without extention
 | 
			
		||||
// ReportKeyName returns the name of key on S3, Azure-Blob without extension
 | 
			
		||||
func (r ScanResult) ReportKeyName() (name string) {
 | 
			
		||||
	timestr := r.ScannedAt.Format(time.RFC3339)
 | 
			
		||||
	if len(r.Container.ContainerID) == 0 {
 | 
			
		||||
@@ -354,13 +346,14 @@ func (r ScanResult) FormatTextReportHeadedr() string {
 | 
			
		||||
		buf.WriteString("=")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return fmt.Sprintf("%s\n%s\n%s, %s, %s, %s, %s\n",
 | 
			
		||||
	return fmt.Sprintf("%s\n%s\n%s, %s, %s, %s, %s, %s\n",
 | 
			
		||||
		r.ServerInfo(),
 | 
			
		||||
		buf.String(),
 | 
			
		||||
		r.ScannedCves.FormatCveSummary(),
 | 
			
		||||
		r.ScannedCves.FormatFixedStatus(r.Packages),
 | 
			
		||||
		r.FormatUpdatablePacksSummary(),
 | 
			
		||||
		r.FormatExploitCveSummary(),
 | 
			
		||||
		r.FormatMetasploitCveSummary(),
 | 
			
		||||
		r.FormatAlertSummary(),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
@@ -396,6 +389,17 @@ func (r ScanResult) FormatExploitCveSummary() string {
 | 
			
		||||
	return fmt.Sprintf("%d exploits", nExploitCve)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FormatMetasploitCveSummary returns a summary of exploit cve
 | 
			
		||||
func (r ScanResult) FormatMetasploitCveSummary() string {
 | 
			
		||||
	nMetasploitCve := 0
 | 
			
		||||
	for _, vuln := range r.ScannedCves {
 | 
			
		||||
		if 0 < len(vuln.Metasploits) {
 | 
			
		||||
			nMetasploitCve++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%d modules", nMetasploitCve)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FormatAlertSummary returns a summary of XCERT alerts
 | 
			
		||||
func (r ScanResult) FormatAlertSummary() string {
 | 
			
		||||
	jaCnt := 0
 | 
			
		||||
@@ -442,11 +446,6 @@ func (r ScanResult) IsContainer() bool {
 | 
			
		||||
	return 0 < len(r.Container.ContainerID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsImage returns whether this ServerInfo is about container
 | 
			
		||||
func (r ScanResult) IsImage() bool {
 | 
			
		||||
	return 0 < len(r.Image.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsDeepScanMode checks if the scan mode is deep scan mode.
 | 
			
		||||
func (r ScanResult) IsDeepScanMode() bool {
 | 
			
		||||
	for _, s := range r.Config.Scan.Servers {
 | 
			
		||||
@@ -468,12 +467,6 @@ type Container struct {
 | 
			
		||||
	UUID        string `json:"uuid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Image has Container information
 | 
			
		||||
type Image struct {
 | 
			
		||||
	Name string `json:"name"`
 | 
			
		||||
	Tag  string `json:"tag"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Platform has platform information
 | 
			
		||||
type Platform struct {
 | 
			
		||||
	Name       string `json:"name"` // aws or azure or gcp or other...
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -23,60 +6,18 @@ import (
 | 
			
		||||
	cvedict "github.com/kotakanbe/go-cve-dictionary/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ConvertNvdXMLToModel convert NVD to CveContent
 | 
			
		||||
func ConvertNvdXMLToModel(cveID string, nvd *cvedict.NvdXML) *CveContent {
 | 
			
		||||
	if nvd == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var cpes []Cpe
 | 
			
		||||
	for _, c := range nvd.Cpes {
 | 
			
		||||
		cpes = append(cpes, Cpe{
 | 
			
		||||
			FormattedString: c.FormattedString,
 | 
			
		||||
			URI:             c.URI,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var refs []Reference
 | 
			
		||||
	for _, r := range nvd.References {
 | 
			
		||||
		refs = append(refs, Reference{
 | 
			
		||||
			Link:   r.Link,
 | 
			
		||||
			Source: r.Source,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cweIDs := []string{}
 | 
			
		||||
	for _, cid := range nvd.Cwes {
 | 
			
		||||
		cweIDs = append(cweIDs, cid.CweID)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &CveContent{
 | 
			
		||||
		Type:          Nvd,
 | 
			
		||||
		CveID:         cveID,
 | 
			
		||||
		Summary:       nvd.Summary,
 | 
			
		||||
		Cvss2Score:    nvd.Cvss2.BaseScore,
 | 
			
		||||
		Cvss2Vector:   nvd.Cvss2.VectorString,
 | 
			
		||||
		Cvss2Severity: nvd.Cvss2.Severity,
 | 
			
		||||
		SourceLink:    "https://nvd.nist.gov/vuln/detail/" + cveID,
 | 
			
		||||
		// Cpes:          cpes,
 | 
			
		||||
		CweIDs:       cweIDs,
 | 
			
		||||
		References:   refs,
 | 
			
		||||
		Published:    nvd.PublishedDate,
 | 
			
		||||
		LastModified: nvd.LastModifiedDate,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConvertJvnToModel convert JVN to CveContent
 | 
			
		||||
func ConvertJvnToModel(cveID string, jvn *cvedict.Jvn) *CveContent {
 | 
			
		||||
	if jvn == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var cpes []Cpe
 | 
			
		||||
	for _, c := range jvn.Cpes {
 | 
			
		||||
		cpes = append(cpes, Cpe{
 | 
			
		||||
			FormattedString: c.FormattedString,
 | 
			
		||||
			URI:             c.URI,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	// var cpes = []Cpe{}
 | 
			
		||||
	// for _, c := range jvn.Cpes {
 | 
			
		||||
	// 	cpes = append(cpes, Cpe{
 | 
			
		||||
	// 		FormattedString: c.FormattedString,
 | 
			
		||||
	// 		URI:             c.URI,
 | 
			
		||||
	// 	})
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	refs := []Reference{}
 | 
			
		||||
	for _, r := range jvn.References {
 | 
			
		||||
@@ -110,15 +51,15 @@ func ConvertNvdJSONToModel(cveID string, nvd *cvedict.NvdJSON) *CveContent {
 | 
			
		||||
	if nvd == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var cpes []Cpe
 | 
			
		||||
	for _, c := range nvd.Cpes {
 | 
			
		||||
		cpes = append(cpes, Cpe{
 | 
			
		||||
			FormattedString: c.FormattedString,
 | 
			
		||||
			URI:             c.URI,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	// var cpes = []Cpe{}
 | 
			
		||||
	// for _, c := range nvd.Cpes {
 | 
			
		||||
	// 	cpes = append(cpes, Cpe{
 | 
			
		||||
	// 		FormattedString: c.FormattedString,
 | 
			
		||||
	// 		URI:             c.URI,
 | 
			
		||||
	// 	})
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	var refs []Reference
 | 
			
		||||
	var refs = []Reference{}
 | 
			
		||||
	for _, r := range nvd.References {
 | 
			
		||||
		refs = append(refs, Reference{
 | 
			
		||||
			Link:   r.Link,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -24,8 +7,6 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/alert"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	exploitmodels "github.com/mozqnet/go-exploitdb/models"
 | 
			
		||||
)
 | 
			
		||||
@@ -155,9 +136,10 @@ func (ps PackageFixStatuses) Sort() {
 | 
			
		||||
 | 
			
		||||
// PackageFixStatus has name and other status abount the package
 | 
			
		||||
type PackageFixStatus struct {
 | 
			
		||||
	Name        string `json:"name"`
 | 
			
		||||
	NotFixedYet bool   `json:"notFixedYet"`
 | 
			
		||||
	FixState    string `json:"fixState"`
 | 
			
		||||
	Name        string `json:"name,omitempty"`
 | 
			
		||||
	NotFixedYet bool   `json:"notFixedYet,omitempty"`
 | 
			
		||||
	FixState    string `json:"fixState,omitempty"`
 | 
			
		||||
	FixedIn     string `json:"fixedIn,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// VulnInfo has a vulnerability information and unsecure packages
 | 
			
		||||
@@ -168,6 +150,7 @@ type VulnInfo struct {
 | 
			
		||||
	DistroAdvisories     DistroAdvisories     `json:"distroAdvisories,omitempty"` // for Aamazon, RHEL, FreeBSD
 | 
			
		||||
	CveContents          CveContents          `json:"cveContents,omitempty"`
 | 
			
		||||
	Exploits             []Exploit            `json:"exploits,omitempty"`
 | 
			
		||||
	Metasploits          []Metasploit         `json:"metasploits,omitempty"`
 | 
			
		||||
	AlertDict            AlertDict            `json:"alertDict,omitempty"`
 | 
			
		||||
	CpeURIs              []string             `json:"cpeURIs,omitempty"` // CpeURIs related to this CVE defined in config.toml
 | 
			
		||||
	GitHubSecurityAlerts GitHubSecurityAlerts `json:"gitHubSecurityAlerts,omitempty"`
 | 
			
		||||
@@ -177,6 +160,13 @@ type VulnInfo struct {
 | 
			
		||||
	VulnType string `json:"vulnType,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Alert has XCERT alert information
 | 
			
		||||
type Alert struct {
 | 
			
		||||
	URL   string `json:"url,omitempty"`
 | 
			
		||||
	Title string `json:"title,omitempty"`
 | 
			
		||||
	Team  string `json:"team,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GitHubSecurityAlerts is a list of GitHubSecurityAlert
 | 
			
		||||
type GitHubSecurityAlerts []GitHubSecurityAlert
 | 
			
		||||
 | 
			
		||||
@@ -211,6 +201,14 @@ type GitHubSecurityAlert struct {
 | 
			
		||||
// LibraryFixedIns is a list of Library's FixedIn
 | 
			
		||||
type LibraryFixedIns []LibraryFixedIn
 | 
			
		||||
 | 
			
		||||
// Names return a slice of names
 | 
			
		||||
func (lfs LibraryFixedIns) Names() (names []string) {
 | 
			
		||||
	for _, lf := range lfs {
 | 
			
		||||
		names = append(names, lf.Name)
 | 
			
		||||
	}
 | 
			
		||||
	return names
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WpPackageFixStats is a list of WpPackageFixStatus
 | 
			
		||||
type WpPackageFixStats []WpPackageFixStatus
 | 
			
		||||
 | 
			
		||||
@@ -248,7 +246,7 @@ func (v VulnInfo) Titles(lang, myFamily string) (values []CveContentStr) {
 | 
			
		||||
		values = append(values, CveContentStr{RedHatAPI, cont.Title})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	order := CveContentTypes{Nvd, NvdXML, NewCveContentType(myFamily)}
 | 
			
		||||
	order := CveContentTypes{Trivy, Nvd, NvdXML, NewCveContentType(myFamily)}
 | 
			
		||||
	order = append(order, AllCveContetTypes.Except(append(order, Jvn)...)...)
 | 
			
		||||
	for _, ctype := range order {
 | 
			
		||||
		// Only JVN has meaningful title. so return first 100 char of summary
 | 
			
		||||
@@ -288,7 +286,7 @@ func (v VulnInfo) Summaries(lang, myFamily string) (values []CveContentStr) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	order := CveContentTypes{Nvd, NvdXML, NewCveContentType(myFamily)}
 | 
			
		||||
	order := CveContentTypes{Trivy, NewCveContentType(myFamily), Nvd, NvdXML}
 | 
			
		||||
	order = append(order, AllCveContetTypes.Except(append(order, Jvn)...)...)
 | 
			
		||||
	for _, ctype := range order {
 | 
			
		||||
		if cont, found := v.CveContents[ctype]; found && 0 < len(cont.Summary) {
 | 
			
		||||
@@ -426,6 +424,18 @@ func (v VulnInfo) Cvss3Scores() (values []CveContentCvss) {
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if cont, found := v.CveContents[Trivy]; found && cont.Cvss3Severity != "" {
 | 
			
		||||
		values = append(values, CveContentCvss{
 | 
			
		||||
			Type: Trivy,
 | 
			
		||||
			Value: Cvss{
 | 
			
		||||
				Type:     CVSS3,
 | 
			
		||||
				Score:    severityToV2ScoreRoughly(cont.Cvss3Severity),
 | 
			
		||||
				Severity: strings.ToUpper(cont.Cvss3Severity),
 | 
			
		||||
			},
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -546,16 +556,17 @@ func (v VulnInfo) MaxCvss2Score() CveContentCvss {
 | 
			
		||||
func (v VulnInfo) AttackVector() string {
 | 
			
		||||
	for _, cnt := range v.CveContents {
 | 
			
		||||
		if strings.HasPrefix(cnt.Cvss2Vector, "AV:N") ||
 | 
			
		||||
			strings.HasPrefix(cnt.Cvss3Vector, "CVSS:3.0/AV:N") {
 | 
			
		||||
			return "N"
 | 
			
		||||
			strings.Contains(cnt.Cvss3Vector, "AV:N") {
 | 
			
		||||
			return "AV:N"
 | 
			
		||||
		} else if strings.HasPrefix(cnt.Cvss2Vector, "AV:A") ||
 | 
			
		||||
			strings.HasPrefix(cnt.Cvss3Vector, "CVSS:3.0/AV:A") {
 | 
			
		||||
			return "A"
 | 
			
		||||
			strings.Contains(cnt.Cvss3Vector, "AV:A") {
 | 
			
		||||
			return "AV:A"
 | 
			
		||||
		} else if strings.HasPrefix(cnt.Cvss2Vector, "AV:L") ||
 | 
			
		||||
			strings.HasPrefix(cnt.Cvss3Vector, "CVSS:3.0/AV:L") {
 | 
			
		||||
			return "L"
 | 
			
		||||
		} else if strings.HasPrefix(cnt.Cvss3Vector, "CVSS:3.0/AV:P") {
 | 
			
		||||
			return "P"
 | 
			
		||||
			strings.Contains(cnt.Cvss3Vector, "AV:L") {
 | 
			
		||||
			return "AV:L"
 | 
			
		||||
		} else if strings.Contains(cnt.Cvss3Vector, "AV:P") {
 | 
			
		||||
			// no AV:P in CVSS v2
 | 
			
		||||
			return "AV:P"
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if cont, found := v.CveContents[DebianSecurityTracker]; found {
 | 
			
		||||
@@ -577,6 +588,13 @@ func (v VulnInfo) PatchStatus(packs Packages) string {
 | 
			
		||||
			return "unfixed"
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Fast and offline mode can not get the candidate version.
 | 
			
		||||
		// Vuls can be considered as 'fixed' if not-fixed-yet==true and
 | 
			
		||||
		// the fixed-in-version (information in the oval) is not an empty.
 | 
			
		||||
		if p.FixedIn != "" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// fast, offline mode doesn't have new version
 | 
			
		||||
		if pack, ok := packs[p.Name]; ok {
 | 
			
		||||
			if pack.NewVersion == "" {
 | 
			
		||||
@@ -627,15 +645,6 @@ func (c Cvss) Format() string {
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cvss2ScoreToSeverity(score float64) string {
 | 
			
		||||
	if 7.0 <= score {
 | 
			
		||||
		return "HIGH"
 | 
			
		||||
	} else if 4.0 <= score {
 | 
			
		||||
		return "MEDIUM"
 | 
			
		||||
	}
 | 
			
		||||
	return "LOW"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Amazon Linux Security Advisory
 | 
			
		||||
// Critical, Important, Medium, Low
 | 
			
		||||
// https://alas.aws.amazon.com/
 | 
			
		||||
@@ -783,15 +792,18 @@ type Exploit struct {
 | 
			
		||||
	BinaryURL    *string                   `json:"binaryURL,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AlertDict has target cve's JPCERT and USCERT alert data
 | 
			
		||||
type AlertDict struct {
 | 
			
		||||
	Ja []alert.Alert `json:"ja"`
 | 
			
		||||
	En []alert.Alert `json:"en"`
 | 
			
		||||
// Metasploit :
 | 
			
		||||
type Metasploit struct {
 | 
			
		||||
	Name        string   `json:"name"`
 | 
			
		||||
	Title       string   `json:"title"`
 | 
			
		||||
	Description string   `json:"description,omitempty"`
 | 
			
		||||
	URLs        []string `json:",omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasAlert returns whether or not it has En or Ja entries.
 | 
			
		||||
func (a AlertDict) HasAlert() bool {
 | 
			
		||||
	return len(a.En) != 0 || len(a.Ja) != 0
 | 
			
		||||
// AlertDict has target cve's JPCERT and USCERT alert data
 | 
			
		||||
type AlertDict struct {
 | 
			
		||||
	Ja []Alert `json:"ja"`
 | 
			
		||||
	En []Alert `json:"en"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FormatSource returns which source has this alert
 | 
			
		||||
@@ -863,6 +875,9 @@ const (
 | 
			
		||||
	// DebianSecurityTrackerMatchStr is a String representation of DebianSecurityTrackerMatch
 | 
			
		||||
	DebianSecurityTrackerMatchStr = "DebianSecurityTrackerMatch"
 | 
			
		||||
 | 
			
		||||
	// TrivyMatchStr is a String representation of Trivy
 | 
			
		||||
	TrivyMatchStr = "TrivyMatch"
 | 
			
		||||
 | 
			
		||||
	// ChangelogExactMatchStr is a String representation of ChangelogExactMatch
 | 
			
		||||
	ChangelogExactMatchStr = "ChangelogExactMatch"
 | 
			
		||||
 | 
			
		||||
@@ -901,6 +916,9 @@ var (
 | 
			
		||||
	// DebianSecurityTrackerMatch ranking how confident the CVE-ID was deteted correctly
 | 
			
		||||
	DebianSecurityTrackerMatch = Confidence{100, DebianSecurityTrackerMatchStr, 0}
 | 
			
		||||
 | 
			
		||||
	// TrivyMatch ranking how confident the CVE-ID was deteted correctly
 | 
			
		||||
	TrivyMatch = Confidence{100, TrivyMatchStr, 0}
 | 
			
		||||
 | 
			
		||||
	// ChangelogExactMatch is a ranking how confident the CVE-ID was deteted correctly
 | 
			
		||||
	ChangelogExactMatch = Confidence{95, ChangelogExactMatchStr, 3}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -159,14 +143,14 @@ func TestSummaries(t *testing.T) {
 | 
			
		||||
					Type:  Jvn,
 | 
			
		||||
					Value: "Title JVN\nSummary JVN",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Type:  NvdXML,
 | 
			
		||||
					Value: "Summary NVD",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Type:  RedHat,
 | 
			
		||||
					Value: "Summary RedHat",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Type:  NvdXML,
 | 
			
		||||
					Value: "Summary NVD",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		// lang: en
 | 
			
		||||
@@ -193,14 +177,14 @@ func TestSummaries(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			out: []CveContentStr{
 | 
			
		||||
				{
 | 
			
		||||
					Type:  NvdXML,
 | 
			
		||||
					Value: "Summary NVD",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Type:  RedHat,
 | 
			
		||||
					Value: "Summary RedHat",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Type:  NvdXML,
 | 
			
		||||
					Value: "Summary NVD",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		// lang: empty
 | 
			
		||||
@@ -1096,3 +1080,86 @@ func TestDistroAdvisories_AppendIfMissing(t *testing.T) {
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestVulnInfo_AttackVector(t *testing.T) {
 | 
			
		||||
	type fields struct {
 | 
			
		||||
		CveContents CveContents
 | 
			
		||||
	}
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name   string
 | 
			
		||||
		fields fields
 | 
			
		||||
		want   string
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "2.0:N",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				CveContents: NewCveContents(
 | 
			
		||||
					CveContent{
 | 
			
		||||
						Type:        "foo",
 | 
			
		||||
						Cvss2Vector: "AV:N/AC:L/Au:N/C:C/I:C/A:C",
 | 
			
		||||
					},
 | 
			
		||||
				),
 | 
			
		||||
			},
 | 
			
		||||
			want: "AV:N",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "2.0:A",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				CveContents: NewCveContents(
 | 
			
		||||
					CveContent{
 | 
			
		||||
						Type:        "foo",
 | 
			
		||||
						Cvss2Vector: "AV:A/AC:L/Au:N/C:C/I:C/A:C",
 | 
			
		||||
					},
 | 
			
		||||
				),
 | 
			
		||||
			},
 | 
			
		||||
			want: "AV:A",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "2.0:L",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				CveContents: NewCveContents(
 | 
			
		||||
					CveContent{
 | 
			
		||||
						Type:        "foo",
 | 
			
		||||
						Cvss2Vector: "AV:L/AC:L/Au:N/C:C/I:C/A:C",
 | 
			
		||||
					},
 | 
			
		||||
				),
 | 
			
		||||
			},
 | 
			
		||||
			want: "AV:L",
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			name: "3.0:N",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				CveContents: NewCveContents(
 | 
			
		||||
					CveContent{
 | 
			
		||||
						Type:        "foo",
 | 
			
		||||
						Cvss3Vector: "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
 | 
			
		||||
					},
 | 
			
		||||
				),
 | 
			
		||||
			},
 | 
			
		||||
			want: "AV:N",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "3.1:N",
 | 
			
		||||
			fields: fields{
 | 
			
		||||
				CveContents: NewCveContents(
 | 
			
		||||
					CveContent{
 | 
			
		||||
						Type:        "foo",
 | 
			
		||||
						Cvss3Vector: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
 | 
			
		||||
					},
 | 
			
		||||
				),
 | 
			
		||||
			},
 | 
			
		||||
			want: "AV:N",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for _, tt := range tests {
 | 
			
		||||
		t.Run(tt.name, func(t *testing.T) {
 | 
			
		||||
			v := VulnInfo{
 | 
			
		||||
				CveContents: tt.fields.CveContents,
 | 
			
		||||
			}
 | 
			
		||||
			if got := v.AttackVector(); got != tt.want {
 | 
			
		||||
				t.Errorf("VulnInfo.AttackVector() = %v, want %v", got, tt.want)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
// WordPressPackages has Core version, plugins and themes.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										73
									
								
								msf/msf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								msf/msf.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
package msf
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	cnf "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/parnurzeal/gorequest"
 | 
			
		||||
	"github.com/takuzoo3868/go-msfdb/db"
 | 
			
		||||
	metasploitmodels "github.com/takuzoo3868/go-msfdb/models"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FillWithMetasploit fills metasploit module information that has in module
 | 
			
		||||
func FillWithMetasploit(driver db.DB, r *models.ScanResult) (nMetasploitCve int, err error) {
 | 
			
		||||
	if driver == nil {
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	for cveID, vuln := range r.ScannedCves {
 | 
			
		||||
		if cveID == "" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		ms := driver.GetModuleByCveID(cveID)
 | 
			
		||||
		if len(ms) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		modules := ConvertToModels(ms)
 | 
			
		||||
		vuln.Metasploits = modules
 | 
			
		||||
		r.ScannedCves[cveID] = vuln
 | 
			
		||||
		nMetasploitCve++
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nMetasploitCve, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConvertToModels converts gost model to vuls model
 | 
			
		||||
func ConvertToModels(ms []*metasploitmodels.Metasploit) (modules []models.Metasploit) {
 | 
			
		||||
	for _, m := range ms {
 | 
			
		||||
		var links []string
 | 
			
		||||
		if 0 < len(m.References) {
 | 
			
		||||
			for _, u := range m.References {
 | 
			
		||||
				links = append(links, u.Link)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		module := models.Metasploit{
 | 
			
		||||
			Name:        m.Name,
 | 
			
		||||
			Title:       m.Title,
 | 
			
		||||
			Description: m.Description,
 | 
			
		||||
			URLs:        links,
 | 
			
		||||
		}
 | 
			
		||||
		modules = append(modules, module)
 | 
			
		||||
	}
 | 
			
		||||
	return modules
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckHTTPHealth do health check
 | 
			
		||||
func CheckHTTPHealth() error {
 | 
			
		||||
	if !cnf.Conf.Metasploit.IsFetchViaHTTP() {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/health", cnf.Conf.Metasploit.URL)
 | 
			
		||||
	var errs []error
 | 
			
		||||
	var resp *http.Response
 | 
			
		||||
	resp, _, errs = gorequest.New().Get(url).End()
 | 
			
		||||
	//  resp, _, errs = gorequest.New().SetDebug(config.Conf.Debug).Get(url).End()
 | 
			
		||||
	//  resp, _, errs = gorequest.New().Proxy(api.httpProxy).Get(url).End()
 | 
			
		||||
	if 0 < len(errs) || resp == nil || resp.StatusCode != 200 {
 | 
			
		||||
		return xerrors.Errorf("Failed to connect to metasploit server. url: %s, errs: %w", url, errs)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										254
									
								
								oval/debian.go
									
									
									
									
									
								
							
							
						
						
									
										254
									
								
								oval/debian.go
									
									
									
									
									
								
							@@ -1,24 +1,8 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
@@ -59,17 +43,28 @@ func (o DebianBase) update(r *models.ScanResult, defPacks defPacks) {
 | 
			
		||||
		vinfo.CveContents = cveContents
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// uniq(vinfo.PackNames + defPacks.actuallyAffectedPackNames)
 | 
			
		||||
	// uniq(vinfo.PackNames + defPacks.binpkgStat)
 | 
			
		||||
	for _, pack := range vinfo.AffectedPackages {
 | 
			
		||||
		defPacks.actuallyAffectedPackNames[pack.Name] = pack.NotFixedYet
 | 
			
		||||
		defPacks.binpkgFixstat[pack.Name] = fixStat{
 | 
			
		||||
			notFixedYet: pack.NotFixedYet,
 | 
			
		||||
			fixedIn:     pack.FixedIn,
 | 
			
		||||
			isSrcPack:   false,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// update notFixedYet of SrcPackage
 | 
			
		||||
	for binName := range defPacks.actuallyAffectedPackNames {
 | 
			
		||||
	// Update package status of source packages.
 | 
			
		||||
	// In the case of Debian based Linux, sometimes source package name is difined as affected package in OVAL.
 | 
			
		||||
	// To display binary package name showed in apt-get, need to convert source name to binary name.
 | 
			
		||||
	for binName := range defPacks.binpkgFixstat {
 | 
			
		||||
		if srcPack, ok := r.SrcPackages.FindByBinName(binName); ok {
 | 
			
		||||
			for _, p := range defPacks.def.AffectedPacks {
 | 
			
		||||
				if p.Name == srcPack.Name {
 | 
			
		||||
					defPacks.actuallyAffectedPackNames[binName] = p.NotFixedYet
 | 
			
		||||
					defPacks.binpkgFixstat[binName] = fixStat{
 | 
			
		||||
						notFixedYet: p.NotFixedYet,
 | 
			
		||||
						fixedIn:     p.Version,
 | 
			
		||||
						isSrcPack:   true,
 | 
			
		||||
						srcPackName: srcPack.Name,
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -81,7 +76,7 @@ func (o DebianBase) update(r *models.ScanResult, defPacks defPacks) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o DebianBase) convertToModel(def *ovalmodels.Definition) *models.CveContent {
 | 
			
		||||
	var refs []models.Reference
 | 
			
		||||
	refs := []models.Reference{}
 | 
			
		||||
	for _, r := range def.References {
 | 
			
		||||
		refs = append(refs, models.Reference{
 | 
			
		||||
			Link:   r.RefURL,
 | 
			
		||||
@@ -151,9 +146,9 @@ func (o Debian) FillWithOval(driver db.DB, r *models.ScanResult) (nCVEs int, err
 | 
			
		||||
	for _, defPacks := range relatedDefs.entries {
 | 
			
		||||
		// Remove "linux" added above for oval search
 | 
			
		||||
		// linux is not a real package name (key of affected packages in OVAL)
 | 
			
		||||
		if notFixedYet, ok := defPacks.actuallyAffectedPackNames["linux"]; ok {
 | 
			
		||||
			defPacks.actuallyAffectedPackNames[linuxImage] = notFixedYet
 | 
			
		||||
			delete(defPacks.actuallyAffectedPackNames, "linux")
 | 
			
		||||
		if notFixedYet, ok := defPacks.binpkgFixstat["linux"]; ok {
 | 
			
		||||
			defPacks.binpkgFixstat[linuxImage] = notFixedYet
 | 
			
		||||
			delete(defPacks.binpkgFixstat, "linux")
 | 
			
		||||
			for i, p := range defPacks.def.AffectedPacks {
 | 
			
		||||
				if p.Name == "linux" {
 | 
			
		||||
					p.Name = linuxImage
 | 
			
		||||
@@ -195,61 +190,135 @@ func (o Ubuntu) FillWithOval(driver db.DB, r *models.ScanResult) (nCVEs int, err
 | 
			
		||||
	switch major(r.Release) {
 | 
			
		||||
	case "14":
 | 
			
		||||
		kernelNamesInOval := []string{
 | 
			
		||||
			"linux",
 | 
			
		||||
			"linux-aws",
 | 
			
		||||
			"linux-azure",
 | 
			
		||||
			"linux-firmware",
 | 
			
		||||
			"linux-lts-utopic",
 | 
			
		||||
			"linux-lts-vivid",
 | 
			
		||||
			"linux-lts-wily",
 | 
			
		||||
			"linux-lts-xenial",
 | 
			
		||||
			"linux-meta",
 | 
			
		||||
			"linux-meta-aws",
 | 
			
		||||
			"linux-meta-azure",
 | 
			
		||||
			"linux-meta-lts-xenial",
 | 
			
		||||
			"linux-signed",
 | 
			
		||||
			"linux-signed-azure",
 | 
			
		||||
			"linux-signed-lts-xenial",
 | 
			
		||||
			"linux",
 | 
			
		||||
		}
 | 
			
		||||
		return o.fillWithOval(driver, r, kernelNamesInOval)
 | 
			
		||||
	case "16":
 | 
			
		||||
		kernelNamesInOval := []string{
 | 
			
		||||
			"linux-image-aws",
 | 
			
		||||
			"linux-image-aws-hwe",
 | 
			
		||||
			"linux-image-azure",
 | 
			
		||||
			"linux-image-extra-virtual",
 | 
			
		||||
			"linux-image-extra-virtual-lts-utopic",
 | 
			
		||||
			"linux-image-extra-virtual-lts-vivid",
 | 
			
		||||
			"linux-image-extra-virtual-lts-wily",
 | 
			
		||||
			"linux-image-extra-virtual-lts-xenial",
 | 
			
		||||
			"linux-image-gcp",
 | 
			
		||||
			"linux-image-generic-lpae",
 | 
			
		||||
			"linux-image-generic-lpae-hwe-16.04",
 | 
			
		||||
			"linux-image-generic-lpae-lts-utopic",
 | 
			
		||||
			"linux-image-generic-lpae-lts-vivid",
 | 
			
		||||
			"linux-image-generic-lpae-lts-wily",
 | 
			
		||||
			"linux-image-generic-lpae-lts-xenial",
 | 
			
		||||
			"linux-image-generic-lts-utopic",
 | 
			
		||||
			"linux-image-generic-lts-vivid",
 | 
			
		||||
			"linux-image-generic-lts-wily",
 | 
			
		||||
			"linux-image-generic-lts-xenial",
 | 
			
		||||
			"linux-image-gke",
 | 
			
		||||
			"linux-image-hwe-generic-trusty",
 | 
			
		||||
			"linux-image-hwe-virtual-trusty",
 | 
			
		||||
			"linux-image-kvm",
 | 
			
		||||
			"linux-image-lowlatency",
 | 
			
		||||
			"linux-image-lowlatency-lts-utopic",
 | 
			
		||||
			"linux-image-lowlatency-lts-vivid",
 | 
			
		||||
			"linux-image-lowlatency-lts-wily",
 | 
			
		||||
			"linux-aws",
 | 
			
		||||
			"linux-aws-hwe",
 | 
			
		||||
			"linux-azure",
 | 
			
		||||
			"linux-euclid",
 | 
			
		||||
			"linux-flo",
 | 
			
		||||
			"linux-gcp",
 | 
			
		||||
			"linux-gke",
 | 
			
		||||
			"linux-goldfish",
 | 
			
		||||
			"linux-hwe",
 | 
			
		||||
			"linux-kvm",
 | 
			
		||||
			"linux-mako",
 | 
			
		||||
			"linux-meta",
 | 
			
		||||
			"linux-meta-aws",
 | 
			
		||||
			"linux-meta-aws-hwe",
 | 
			
		||||
			"linux-meta-azure",
 | 
			
		||||
			"linux-meta-gcp",
 | 
			
		||||
			"linux-meta-hwe",
 | 
			
		||||
			"linux-meta-kvm",
 | 
			
		||||
			"linux-meta-oracle",
 | 
			
		||||
			"linux-meta-raspi2",
 | 
			
		||||
			"linux-meta-snapdragon",
 | 
			
		||||
			"linux-oem",
 | 
			
		||||
			"linux-oracle",
 | 
			
		||||
			"linux-raspi2",
 | 
			
		||||
			"linux-signed",
 | 
			
		||||
			"linux-signed-azure",
 | 
			
		||||
			"linux-signed-gcp",
 | 
			
		||||
			"linux-signed-hwe",
 | 
			
		||||
			"linux-signed-oracle",
 | 
			
		||||
			"linux-snapdragon",
 | 
			
		||||
			"linux",
 | 
			
		||||
		}
 | 
			
		||||
		return o.fillWithOval(driver, r, kernelNamesInOval)
 | 
			
		||||
	case "18":
 | 
			
		||||
		kernelNamesInOval := []string{
 | 
			
		||||
			"linux-image-aws",
 | 
			
		||||
			"linux-image-azure",
 | 
			
		||||
			"linux-image-extra-virtual",
 | 
			
		||||
			"linux-image-gcp",
 | 
			
		||||
			"linux-image-generic-lpae",
 | 
			
		||||
			"linux-image-kvm",
 | 
			
		||||
			"linux-image-lowlatency",
 | 
			
		||||
			"linux-image-oem",
 | 
			
		||||
			"linux-image-oracle",
 | 
			
		||||
			"linux-image-raspi2",
 | 
			
		||||
			"linux-image-snapdragon",
 | 
			
		||||
			"linux-image-virtual",
 | 
			
		||||
			"linux-aws",
 | 
			
		||||
			"linux-aws-5.0",
 | 
			
		||||
			"linux-azure",
 | 
			
		||||
			"linux-gcp",
 | 
			
		||||
			"linux-gcp-5.3",
 | 
			
		||||
			"linux-gke-4.15",
 | 
			
		||||
			"linux-gke-5.0",
 | 
			
		||||
			"linux-gke-5.3",
 | 
			
		||||
			"linux-hwe",
 | 
			
		||||
			"linux-kvm",
 | 
			
		||||
			"linux-meta",
 | 
			
		||||
			"linux-meta-aws",
 | 
			
		||||
			"linux-meta-aws-5.0",
 | 
			
		||||
			"linux-meta-azure",
 | 
			
		||||
			"linux-meta-gcp",
 | 
			
		||||
			"linux-meta-gcp-5.3",
 | 
			
		||||
			"linux-meta-gke-4.15",
 | 
			
		||||
			"linux-meta-gke-5.0",
 | 
			
		||||
			"linux-meta-gke-5.3",
 | 
			
		||||
			"linux-meta-hwe",
 | 
			
		||||
			"linux-meta-kvm",
 | 
			
		||||
			"linux-meta-oem",
 | 
			
		||||
			"linux-meta-oem-osp1",
 | 
			
		||||
			"linux-meta-oracle",
 | 
			
		||||
			"linux-meta-oracle-5.0",
 | 
			
		||||
			"linux-meta-oracle-5.3",
 | 
			
		||||
			"linux-meta-raspi2",
 | 
			
		||||
			"linux-meta-raspi2-5.3",
 | 
			
		||||
			"linux-meta-snapdragon",
 | 
			
		||||
			"linux-oem",
 | 
			
		||||
			"linux-oem-osp1",
 | 
			
		||||
			"linux-oracle",
 | 
			
		||||
			"linux-oracle-5.0",
 | 
			
		||||
			"linux-oracle-5.3",
 | 
			
		||||
			"linux-raspi2",
 | 
			
		||||
			"linux-raspi2-5.3",
 | 
			
		||||
			"linux-signed",
 | 
			
		||||
			"linux-signed-azure",
 | 
			
		||||
			"linux-signed-gcp",
 | 
			
		||||
			"linux-signed-gcp-5.3",
 | 
			
		||||
			"linux-signed-gke-4.15",
 | 
			
		||||
			"linux-signed-gke-5.0",
 | 
			
		||||
			"linux-signed-gke-5.3",
 | 
			
		||||
			"linux-signed-hwe",
 | 
			
		||||
			"linux-signed-oem",
 | 
			
		||||
			"linux-signed-oem-osp1",
 | 
			
		||||
			"linux-signed-oracle",
 | 
			
		||||
			"linux-signed-oracle-5.0",
 | 
			
		||||
			"linux-signed-oracle-5.3",
 | 
			
		||||
			"linux-snapdragon",
 | 
			
		||||
			"linux",
 | 
			
		||||
		}
 | 
			
		||||
		return o.fillWithOval(driver, r, kernelNamesInOval)
 | 
			
		||||
	case "20":
 | 
			
		||||
		kernelNamesInOval := []string{
 | 
			
		||||
			"linux-aws",
 | 
			
		||||
			"linux-azure",
 | 
			
		||||
			"linux-gcp",
 | 
			
		||||
			"linux-kvm",
 | 
			
		||||
			"linux-meta",
 | 
			
		||||
			"linux-meta-aws",
 | 
			
		||||
			"linux-meta-azure",
 | 
			
		||||
			"linux-meta-gcp",
 | 
			
		||||
			"linux-meta-kvm",
 | 
			
		||||
			"linux-meta-oem-5.6",
 | 
			
		||||
			"linux-meta-oracle",
 | 
			
		||||
			"linux-meta-raspi",
 | 
			
		||||
			"linux-meta-riscv",
 | 
			
		||||
			"linux-oem-5.6",
 | 
			
		||||
			"linux-oracle",
 | 
			
		||||
			"linux-raspi",
 | 
			
		||||
			"linux-raspi2",
 | 
			
		||||
			"linux-riscv",
 | 
			
		||||
			"linux-signed",
 | 
			
		||||
			"linux-signed-azure",
 | 
			
		||||
			"linux-signed-gcp",
 | 
			
		||||
			"linux-signed-oem-5.6",
 | 
			
		||||
			"linux-signed-oracle",
 | 
			
		||||
			"linux",
 | 
			
		||||
		}
 | 
			
		||||
		return o.fillWithOval(driver, r, kernelNamesInOval)
 | 
			
		||||
	}
 | 
			
		||||
@@ -257,12 +326,12 @@ func (o Ubuntu) FillWithOval(driver db.DB, r *models.ScanResult) (nCVEs int, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o Ubuntu) fillWithOval(driver db.DB, r *models.ScanResult, kernelNamesInOval []string) (nCVEs int, err error) {
 | 
			
		||||
	// kernel names in OVAL except for linux-image-generic
 | 
			
		||||
	linuxImage := "linux-image-" + r.RunningKernel.Release
 | 
			
		||||
	runningKernelVersion := ""
 | 
			
		||||
	kernelPkgInOVAL := ""
 | 
			
		||||
	isOVALKernelPkgAdded := true
 | 
			
		||||
	isOVALKernelPkgAdded := false
 | 
			
		||||
	unusedKernels := []models.Package{}
 | 
			
		||||
	copiedSourcePkgs := models.SrcPackages{}
 | 
			
		||||
 | 
			
		||||
	if r.Container.ContainerID == "" {
 | 
			
		||||
		if v, ok := r.Packages[linuxImage]; ok {
 | 
			
		||||
@@ -287,17 +356,31 @@ func (o Ubuntu) fillWithOval(driver db.DB, r *models.ScanResult, kernelNamesInOv
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if kernelPkgInOVAL == "" {
 | 
			
		||||
			if r.Release == "14" {
 | 
			
		||||
				kernelPkgInOVAL = "linux"
 | 
			
		||||
			} else if _, ok := r.Packages["linux-image-generic"]; !ok {
 | 
			
		||||
				util.Log.Warnf("The OVAL name of the running kernel image %s is not found. So vulns of linux-image-generic wll be detected. server: %s",
 | 
			
		||||
					r.RunningKernel.Version, r.ServerName)
 | 
			
		||||
				kernelPkgInOVAL = "linux-image-generic"
 | 
			
		||||
			} else {
 | 
			
		||||
				isOVALKernelPkgAdded = false
 | 
			
		||||
		// Remove linux-* in order to detect only vulnerabilities in the running kernel.
 | 
			
		||||
		for n := range r.Packages {
 | 
			
		||||
			if n != kernelPkgInOVAL && strings.HasPrefix(n, "linux-") {
 | 
			
		||||
				unusedKernels = append(unusedKernels, r.Packages[n])
 | 
			
		||||
				delete(r.Packages, n)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		for srcPackName, srcPack := range r.SrcPackages {
 | 
			
		||||
			copiedSourcePkgs[srcPackName] = srcPack
 | 
			
		||||
			targetBianryNames := []string{}
 | 
			
		||||
			for _, n := range srcPack.BinaryNames {
 | 
			
		||||
				if n == kernelPkgInOVAL || !strings.HasPrefix(n, "linux-") {
 | 
			
		||||
					targetBianryNames = append(targetBianryNames, n)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			srcPack.BinaryNames = targetBianryNames
 | 
			
		||||
			r.SrcPackages[srcPackName] = srcPack
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if kernelPkgInOVAL == "" {
 | 
			
		||||
			util.Log.Warnf("The OVAL name of the running kernel image %+v is not found. So vulns of `linux` wll be detected. server: %s",
 | 
			
		||||
				r.RunningKernel, r.ServerName)
 | 
			
		||||
			kernelPkgInOVAL = "linux"
 | 
			
		||||
			isOVALKernelPkgAdded = true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if runningKernelVersion != "" {
 | 
			
		||||
			r.Packages[kernelPkgInOVAL] = models.Package{
 | 
			
		||||
@@ -324,13 +407,14 @@ func (o Ubuntu) fillWithOval(driver db.DB, r *models.ScanResult, kernelNamesInOv
 | 
			
		||||
	for _, p := range unusedKernels {
 | 
			
		||||
		r.Packages[p.Name] = p
 | 
			
		||||
	}
 | 
			
		||||
	r.SrcPackages = copiedSourcePkgs
 | 
			
		||||
 | 
			
		||||
	for _, defPacks := range relatedDefs.entries {
 | 
			
		||||
		// Remove "linux" added above to search for oval
 | 
			
		||||
		// Remove "linux" added above for searching oval
 | 
			
		||||
		// "linux" is not a real package name (key of affected packages in OVAL)
 | 
			
		||||
		if nfy, ok := defPacks.actuallyAffectedPackNames[kernelPkgInOVAL]; isOVALKernelPkgAdded && ok {
 | 
			
		||||
			defPacks.actuallyAffectedPackNames[linuxImage] = nfy
 | 
			
		||||
			delete(defPacks.actuallyAffectedPackNames, kernelPkgInOVAL)
 | 
			
		||||
		if nfy, ok := defPacks.binpkgFixstat[kernelPkgInOVAL]; isOVALKernelPkgAdded && ok {
 | 
			
		||||
			defPacks.binpkgFixstat[linuxImage] = nfy
 | 
			
		||||
			delete(defPacks.binpkgFixstat, kernelPkgInOVAL)
 | 
			
		||||
			for i, p := range defPacks.def.AffectedPacks {
 | 
			
		||||
				if p.Name == kernelPkgInOVAL {
 | 
			
		||||
					p.Name = linuxImage
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -49,8 +33,11 @@ func TestPackNamesOfUpdateDebian(t *testing.T) {
 | 
			
		||||
						CveID: "CVE-2000-1000",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
					"packB": true,
 | 
			
		||||
				binpkgFixstat: map[string]fixStat{
 | 
			
		||||
					"packB": {
 | 
			
		||||
						notFixedYet: true,
 | 
			
		||||
						fixedIn:     "1.0.0",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			out: models.ScanResult{
 | 
			
		||||
@@ -58,7 +45,7 @@ func TestPackNamesOfUpdateDebian(t *testing.T) {
 | 
			
		||||
					"CVE-2000-1000": models.VulnInfo{
 | 
			
		||||
						AffectedPackages: models.PackageFixStatuses{
 | 
			
		||||
							{Name: "packA"},
 | 
			
		||||
							{Name: "packB", NotFixedYet: true},
 | 
			
		||||
							{Name: "packB", NotFixedYet: true, FixedIn: "1.0.0"},
 | 
			
		||||
							{Name: "packC"},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
@@ -73,7 +60,7 @@ func TestPackNamesOfUpdateDebian(t *testing.T) {
 | 
			
		||||
		e := tt.out.ScannedCves["CVE-2000-1000"].AffectedPackages
 | 
			
		||||
		a := tt.in.ScannedCves["CVE-2000-1000"].AffectedPackages
 | 
			
		||||
		if !reflect.DeepEqual(a, e) {
 | 
			
		||||
			t.Errorf("[%d] expected: %v\n  actual: %v\n", i, e, a)
 | 
			
		||||
			t.Errorf("[%d] expected: %#v\n  actual: %#v\n", i, e, a)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								oval/oval.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								oval/oval.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -137,10 +120,16 @@ func (o RedHatBase) update(r *models.ScanResult, defPacks defPacks) (nCVEs int)
 | 
			
		||||
 | 
			
		||||
		// uniq(vinfo.PackNames + defPacks.actuallyAffectedPackNames)
 | 
			
		||||
		for _, pack := range vinfo.AffectedPackages {
 | 
			
		||||
			if nfy, ok := defPacks.actuallyAffectedPackNames[pack.Name]; !ok {
 | 
			
		||||
				defPacks.actuallyAffectedPackNames[pack.Name] = pack.NotFixedYet
 | 
			
		||||
			} else if nfy {
 | 
			
		||||
				defPacks.actuallyAffectedPackNames[pack.Name] = true
 | 
			
		||||
			if stat, ok := defPacks.binpkgFixstat[pack.Name]; !ok {
 | 
			
		||||
				defPacks.binpkgFixstat[pack.Name] = fixStat{
 | 
			
		||||
					notFixedYet: pack.NotFixedYet,
 | 
			
		||||
					fixedIn:     pack.FixedIn,
 | 
			
		||||
				}
 | 
			
		||||
			} else if stat.notFixedYet {
 | 
			
		||||
				defPacks.binpkgFixstat[pack.Name] = fixStat{
 | 
			
		||||
					notFixedYet: true,
 | 
			
		||||
					fixedIn:     pack.FixedIn,
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		vinfo.AffectedPackages = defPacks.toPackStatuses()
 | 
			
		||||
@@ -152,7 +141,7 @@ func (o RedHatBase) update(r *models.ScanResult, defPacks defPacks) (nCVEs int)
 | 
			
		||||
 | 
			
		||||
func (o RedHatBase) convertToDistroAdvisory(def *ovalmodels.Definition) *models.DistroAdvisory {
 | 
			
		||||
	advisoryID := def.Title
 | 
			
		||||
	if o.family == config.RedHat || o.family == config.CentOS {
 | 
			
		||||
	if (o.family == config.RedHat || o.family == config.CentOS) && len(advisoryID) > 0 {
 | 
			
		||||
		ss := strings.Fields(def.Title)
 | 
			
		||||
		advisoryID = strings.TrimSuffix(ss[0], ":")
 | 
			
		||||
	}
 | 
			
		||||
@@ -236,12 +225,17 @@ func (o RedHatBase) parseCvss2(scoreVector string) (score float64, vector string
 | 
			
		||||
// 5.6/CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L
 | 
			
		||||
func (o RedHatBase) parseCvss3(scoreVector string) (score float64, vector string) {
 | 
			
		||||
	var err error
 | 
			
		||||
	ss := strings.Split(scoreVector, "/CVSS:3.0/")
 | 
			
		||||
	if 1 < len(ss) {
 | 
			
		||||
		if score, err = strconv.ParseFloat(ss[0], 64); err != nil {
 | 
			
		||||
			return 0, ""
 | 
			
		||||
	for _, s := range []string{
 | 
			
		||||
		"/CVSS:3.0/",
 | 
			
		||||
		"/CVSS:3.1/",
 | 
			
		||||
	} {
 | 
			
		||||
		ss := strings.Split(scoreVector, s)
 | 
			
		||||
		if 1 < len(ss) {
 | 
			
		||||
			if score, err = strconv.ParseFloat(ss[0], 64); err != nil {
 | 
			
		||||
				return 0, ""
 | 
			
		||||
			}
 | 
			
		||||
			return score, strings.TrimPrefix(s, "/") + ss[1]
 | 
			
		||||
		}
 | 
			
		||||
		return score, fmt.Sprintf("CVSS:3.0/%s", ss[1])
 | 
			
		||||
	}
 | 
			
		||||
	return 0, ""
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -75,6 +59,13 @@ func TestParseCvss3(t *testing.T) {
 | 
			
		||||
				vector: "CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L",
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			in: "6.1/CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L",
 | 
			
		||||
			out: out{
 | 
			
		||||
				score:  6.1,
 | 
			
		||||
				vector: "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L",
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			in: "",
 | 
			
		||||
			out: out{
 | 
			
		||||
@@ -119,8 +110,11 @@ func TestPackNamesOfUpdate(t *testing.T) {
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
					"packB": true,
 | 
			
		||||
				binpkgFixstat: map[string]fixStat{
 | 
			
		||||
					"packB": {
 | 
			
		||||
						notFixedYet: true,
 | 
			
		||||
						fixedIn:     "1.0.0",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			out: models.ScanResult{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								oval/suse.go
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								oval/suse.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -92,7 +75,10 @@ func (o SUSE) update(r *models.ScanResult, defPacks defPacks) {
 | 
			
		||||
 | 
			
		||||
	// uniq(vinfo.PackNames + defPacks.actuallyAffectedPackNames)
 | 
			
		||||
	for _, pack := range vinfo.AffectedPackages {
 | 
			
		||||
		defPacks.actuallyAffectedPackNames[pack.Name] = pack.NotFixedYet
 | 
			
		||||
		defPacks.binpkgFixstat[pack.Name] = fixStat{
 | 
			
		||||
			notFixedYet: pack.NotFixedYet,
 | 
			
		||||
			fixedIn:     pack.FixedIn,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	vinfo.AffectedPackages = defPacks.toPackStatuses()
 | 
			
		||||
	vinfo.AffectedPackages.Sort()
 | 
			
		||||
@@ -100,7 +86,7 @@ func (o SUSE) update(r *models.ScanResult, defPacks defPacks) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (o SUSE) convertToModel(def *ovalmodels.Definition) *models.CveContent {
 | 
			
		||||
	var refs []models.Reference
 | 
			
		||||
	refs := []models.Reference{}
 | 
			
		||||
	for _, r := range def.References {
 | 
			
		||||
		refs = append(refs, models.Reference{
 | 
			
		||||
			Link:   r.RefURL,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										126
									
								
								oval/util.go
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								oval/util.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package oval
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -28,6 +11,7 @@ import (
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	apkver "github.com/knqyf263/go-apk-version"
 | 
			
		||||
	debver "github.com/knqyf263/go-deb-version"
 | 
			
		||||
	rpmver "github.com/knqyf263/go-rpm-version"
 | 
			
		||||
	"github.com/kotakanbe/goval-dictionary/db"
 | 
			
		||||
@@ -44,32 +28,42 @@ type defPacks struct {
 | 
			
		||||
	def ovalmodels.Definition
 | 
			
		||||
 | 
			
		||||
	// BinaryPackageName : NotFixedYet
 | 
			
		||||
	actuallyAffectedPackNames map[string]bool
 | 
			
		||||
	binpkgFixstat map[string]fixStat
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type fixStat struct {
 | 
			
		||||
	notFixedYet bool
 | 
			
		||||
	fixedIn     string
 | 
			
		||||
	isSrcPack   bool
 | 
			
		||||
	srcPackName string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e defPacks) toPackStatuses() (ps models.PackageFixStatuses) {
 | 
			
		||||
	for name, notFixedYet := range e.actuallyAffectedPackNames {
 | 
			
		||||
	for name, stat := range e.binpkgFixstat {
 | 
			
		||||
		ps = append(ps, models.PackageFixStatus{
 | 
			
		||||
			Name:        name,
 | 
			
		||||
			NotFixedYet: notFixedYet,
 | 
			
		||||
			NotFixedYet: stat.notFixedYet,
 | 
			
		||||
			FixedIn:     stat.fixedIn,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *ovalResult) upsert(def ovalmodels.Definition, packName string, notFixedYet bool) (upserted bool) {
 | 
			
		||||
func (e *ovalResult) upsert(def ovalmodels.Definition, packName string, fstat fixStat) (upserted bool) {
 | 
			
		||||
	// alpine's entry is empty since Alpine secdb is not OVAL format
 | 
			
		||||
	if def.DefinitionID != "" {
 | 
			
		||||
		for i, entry := range e.entries {
 | 
			
		||||
			if entry.def.DefinitionID == def.DefinitionID {
 | 
			
		||||
				e.entries[i].actuallyAffectedPackNames[packName] = notFixedYet
 | 
			
		||||
				e.entries[i].binpkgFixstat[packName] = fstat
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	e.entries = append(e.entries, defPacks{
 | 
			
		||||
		def:                       def,
 | 
			
		||||
		actuallyAffectedPackNames: map[string]bool{packName: notFixedYet},
 | 
			
		||||
		def: def,
 | 
			
		||||
		binpkgFixstat: map[string]fixStat{
 | 
			
		||||
			packName: fstat,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
@@ -151,17 +145,27 @@ func getDefsByPackNameViaHTTP(r *models.ScanResult) (
 | 
			
		||||
		select {
 | 
			
		||||
		case res := <-resChan:
 | 
			
		||||
			for _, def := range res.defs {
 | 
			
		||||
				affected, notFixedYet := isOvalDefAffected(def, res.request, r.Family, r.RunningKernel)
 | 
			
		||||
				affected, notFixedYet, fixedIn := isOvalDefAffected(def, res.request, r.Family, r.RunningKernel)
 | 
			
		||||
				if !affected {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if res.request.isSrcPack {
 | 
			
		||||
					for _, n := range res.request.binaryPackNames {
 | 
			
		||||
						relatedDefs.upsert(def, n, false)
 | 
			
		||||
						fs := fixStat{
 | 
			
		||||
							srcPackName: res.request.packName,
 | 
			
		||||
							isSrcPack:   true,
 | 
			
		||||
							notFixedYet: notFixedYet,
 | 
			
		||||
							fixedIn:     fixedIn,
 | 
			
		||||
						}
 | 
			
		||||
						relatedDefs.upsert(def, n, fs)
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					relatedDefs.upsert(def, res.request.packName, notFixedYet)
 | 
			
		||||
					fs := fixStat{
 | 
			
		||||
						notFixedYet: notFixedYet,
 | 
			
		||||
						fixedIn:     fixedIn,
 | 
			
		||||
					}
 | 
			
		||||
					relatedDefs.upsert(def, res.request.packName, fs)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case err := <-errChan:
 | 
			
		||||
@@ -233,27 +237,38 @@ func getDefsByPackNameFromOvalDB(driver db.DB, r *models.ScanResult) (relatedDef
 | 
			
		||||
			packName:        pack.Name,
 | 
			
		||||
			binaryPackNames: pack.BinaryNames,
 | 
			
		||||
			versionRelease:  pack.Version,
 | 
			
		||||
			arch:            pack.Arch,
 | 
			
		||||
			isSrcPack:       true,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, req := range requests {
 | 
			
		||||
		definitions, err := driver.GetByPackName(r.Release, req.packName, req.arch)
 | 
			
		||||
		definitions, err := driver.GetByPackName(r.Family, r.Release, req.packName, req.arch)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return relatedDefs, xerrors.Errorf("Failed to get %s OVAL info by package: %#v, err: %w", r.Family, req, err)
 | 
			
		||||
		}
 | 
			
		||||
		for _, def := range definitions {
 | 
			
		||||
			affected, notFixedYet := isOvalDefAffected(def, req, r.Family, r.RunningKernel)
 | 
			
		||||
			affected, notFixedYet, fixedIn := isOvalDefAffected(def, req, r.Family, r.RunningKernel)
 | 
			
		||||
			if !affected {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if req.isSrcPack {
 | 
			
		||||
				for _, n := range req.binaryPackNames {
 | 
			
		||||
					relatedDefs.upsert(def, n, false)
 | 
			
		||||
				for _, binName := range req.binaryPackNames {
 | 
			
		||||
					fs := fixStat{
 | 
			
		||||
						notFixedYet: false,
 | 
			
		||||
						isSrcPack:   true,
 | 
			
		||||
						fixedIn:     fixedIn,
 | 
			
		||||
						srcPackName: req.packName,
 | 
			
		||||
					}
 | 
			
		||||
					relatedDefs.upsert(def, binName, fs)
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				relatedDefs.upsert(def, req.packName, notFixedYet)
 | 
			
		||||
				fs := fixStat{
 | 
			
		||||
					notFixedYet: notFixedYet,
 | 
			
		||||
					fixedIn:     fixedIn,
 | 
			
		||||
				}
 | 
			
		||||
				relatedDefs.upsert(def, req.packName, fs)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -271,7 +286,7 @@ func major(version string) string {
 | 
			
		||||
	return ver[0:strings.Index(ver, ".")]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isOvalDefAffected(def ovalmodels.Definition, req request, family string, running models.Kernel) (affected, notFixedYet bool) {
 | 
			
		||||
func isOvalDefAffected(def ovalmodels.Definition, req request, family string, running models.Kernel) (affected, notFixedYet bool, fixedIn string) {
 | 
			
		||||
	for _, ovalPack := range def.AffectedPacks {
 | 
			
		||||
		if req.packName != ovalPack.Name {
 | 
			
		||||
			continue
 | 
			
		||||
@@ -290,7 +305,7 @@ func isOvalDefAffected(def ovalmodels.Definition, req request, family string, ru
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ovalPack.NotFixedYet {
 | 
			
		||||
			return true, true
 | 
			
		||||
			return true, true, ovalPack.Version
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Compare between the installed version vs the version in OVAL
 | 
			
		||||
@@ -298,9 +313,14 @@ func isOvalDefAffected(def ovalmodels.Definition, req request, family string, ru
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			util.Log.Debugf("Failed to parse versions: %s, Ver: %#v, OVAL: %#v, DefID: %s",
 | 
			
		||||
				err, req.versionRelease, ovalPack, def.DefinitionID)
 | 
			
		||||
			return false, false
 | 
			
		||||
			return false, false, ovalPack.Version
 | 
			
		||||
		}
 | 
			
		||||
		if less {
 | 
			
		||||
			if req.isSrcPack {
 | 
			
		||||
				// Unable to judge whether fixed or not-fixed of src package(Ubuntu, Debian)
 | 
			
		||||
				return true, false, ovalPack.Version
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// If the version of installed is less than in OVAL
 | 
			
		||||
			switch family {
 | 
			
		||||
			case config.RedHat,
 | 
			
		||||
@@ -309,7 +329,7 @@ func isOvalDefAffected(def ovalmodels.Definition, req request, family string, ru
 | 
			
		||||
				config.Debian,
 | 
			
		||||
				config.Ubuntu:
 | 
			
		||||
				// Use fixed state in OVAL for these distros.
 | 
			
		||||
				return true, false
 | 
			
		||||
				return true, false, ovalPack.Version
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// But CentOS can't judge whether fixed or unfixed.
 | 
			
		||||
@@ -320,7 +340,7 @@ func isOvalDefAffected(def ovalmodels.Definition, req request, family string, ru
 | 
			
		||||
			// In these mode, the blow field was set empty.
 | 
			
		||||
			// Vuls can not judge fixed or unfixed.
 | 
			
		||||
			if req.newVersionRelease == "" {
 | 
			
		||||
				return true, false
 | 
			
		||||
				return true, false, ovalPack.Version
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// compare version: newVer vs oval
 | 
			
		||||
@@ -328,26 +348,37 @@ func isOvalDefAffected(def ovalmodels.Definition, req request, family string, ru
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				util.Log.Debugf("Failed to parse versions: %s, NewVer: %#v, OVAL: %#v, DefID: %s",
 | 
			
		||||
					err, req.newVersionRelease, ovalPack, def.DefinitionID)
 | 
			
		||||
				return false, false
 | 
			
		||||
				return false, false, ovalPack.Version
 | 
			
		||||
			}
 | 
			
		||||
			return true, less
 | 
			
		||||
			return true, less, ovalPack.Version
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false, false
 | 
			
		||||
	return false, false, ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var centosVerPattern = regexp.MustCompile(`\.[es]l(\d+)(?:_\d+)?(?:\.centos)?`)
 | 
			
		||||
var esVerPattern = regexp.MustCompile(`\.el(\d+)(?:_\d+)?`)
 | 
			
		||||
 | 
			
		||||
func lessThan(family, versionRelease string, packB ovalmodels.Package) (bool, error) {
 | 
			
		||||
func lessThan(family, newVer string, packInOVAL ovalmodels.Package) (bool, error) {
 | 
			
		||||
	switch family {
 | 
			
		||||
	case config.Debian,
 | 
			
		||||
		config.Ubuntu:
 | 
			
		||||
		vera, err := debver.NewVersion(versionRelease)
 | 
			
		||||
		vera, err := debver.NewVersion(newVer)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
		verb, err := debver.NewVersion(packB.Version)
 | 
			
		||||
		verb, err := debver.NewVersion(packInOVAL.Version)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
		return vera.LessThan(verb), nil
 | 
			
		||||
 | 
			
		||||
	case config.Alpine:
 | 
			
		||||
		vera, err := apkver.NewVersion(newVer)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
		verb, err := apkver.NewVersion(packInOVAL.Version)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
@@ -355,16 +386,15 @@ func lessThan(family, versionRelease string, packB ovalmodels.Package) (bool, er
 | 
			
		||||
 | 
			
		||||
	case config.Oracle,
 | 
			
		||||
		config.SUSEEnterpriseServer,
 | 
			
		||||
		config.Alpine,
 | 
			
		||||
		config.Amazon:
 | 
			
		||||
		vera := rpmver.NewVersion(versionRelease)
 | 
			
		||||
		verb := rpmver.NewVersion(packB.Version)
 | 
			
		||||
		vera := rpmver.NewVersion(newVer)
 | 
			
		||||
		verb := rpmver.NewVersion(packInOVAL.Version)
 | 
			
		||||
		return vera.LessThan(verb), nil
 | 
			
		||||
 | 
			
		||||
	case config.RedHat,
 | 
			
		||||
		config.CentOS:
 | 
			
		||||
		vera := rpmver.NewVersion(centosVerPattern.ReplaceAllString(versionRelease, ".el$1"))
 | 
			
		||||
		verb := rpmver.NewVersion(esVerPattern.ReplaceAllString(packB.Version, ".el$1"))
 | 
			
		||||
		vera := rpmver.NewVersion(centosVerPattern.ReplaceAllString(newVer, ".el$1"))
 | 
			
		||||
		verb := rpmver.NewVersion(esVerPattern.ReplaceAllString(packInOVAL.Version, ".el$1"))
 | 
			
		||||
		return vera.LessThan(verb), nil
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
 
 | 
			
		||||
@@ -12,12 +12,12 @@ import (
 | 
			
		||||
 | 
			
		||||
func TestUpsert(t *testing.T) {
 | 
			
		||||
	var tests = []struct {
 | 
			
		||||
		res         ovalResult
 | 
			
		||||
		def         ovalmodels.Definition
 | 
			
		||||
		packName    string
 | 
			
		||||
		notFixedYet bool
 | 
			
		||||
		upserted    bool
 | 
			
		||||
		out         ovalResult
 | 
			
		||||
		res      ovalResult
 | 
			
		||||
		def      ovalmodels.Definition
 | 
			
		||||
		packName string
 | 
			
		||||
		fixStat  fixStat
 | 
			
		||||
		upserted bool
 | 
			
		||||
		out      ovalResult
 | 
			
		||||
	}{
 | 
			
		||||
		//insert
 | 
			
		||||
		{
 | 
			
		||||
@@ -25,17 +25,23 @@ func TestUpsert(t *testing.T) {
 | 
			
		||||
			def: ovalmodels.Definition{
 | 
			
		||||
				DefinitionID: "1111",
 | 
			
		||||
			},
 | 
			
		||||
			packName:    "pack1",
 | 
			
		||||
			notFixedYet: true,
 | 
			
		||||
			upserted:    false,
 | 
			
		||||
			packName: "pack1",
 | 
			
		||||
			fixStat: fixStat{
 | 
			
		||||
				notFixedYet: true,
 | 
			
		||||
				fixedIn:     "1.0.0",
 | 
			
		||||
			},
 | 
			
		||||
			upserted: false,
 | 
			
		||||
			out: ovalResult{
 | 
			
		||||
				[]defPacks{
 | 
			
		||||
					{
 | 
			
		||||
						def: ovalmodels.Definition{
 | 
			
		||||
							DefinitionID: "1111",
 | 
			
		||||
						},
 | 
			
		||||
						actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
							"pack1": true,
 | 
			
		||||
						binpkgFixstat: map[string]fixStat{
 | 
			
		||||
							"pack1": {
 | 
			
		||||
								notFixedYet: true,
 | 
			
		||||
								fixedIn:     "1.0.0",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
@@ -49,16 +55,22 @@ func TestUpsert(t *testing.T) {
 | 
			
		||||
						def: ovalmodels.Definition{
 | 
			
		||||
							DefinitionID: "1111",
 | 
			
		||||
						},
 | 
			
		||||
						actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
							"pack1": true,
 | 
			
		||||
						binpkgFixstat: map[string]fixStat{
 | 
			
		||||
							"pack1": {
 | 
			
		||||
								notFixedYet: true,
 | 
			
		||||
								fixedIn:     "1.0.0",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						def: ovalmodels.Definition{
 | 
			
		||||
							DefinitionID: "2222",
 | 
			
		||||
						},
 | 
			
		||||
						actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
							"pack3": true,
 | 
			
		||||
						binpkgFixstat: map[string]fixStat{
 | 
			
		||||
							"pack3": {
 | 
			
		||||
								notFixedYet: true,
 | 
			
		||||
								fixedIn:     "2.0.0",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
@@ -66,26 +78,38 @@ func TestUpsert(t *testing.T) {
 | 
			
		||||
			def: ovalmodels.Definition{
 | 
			
		||||
				DefinitionID: "1111",
 | 
			
		||||
			},
 | 
			
		||||
			packName:    "pack2",
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			upserted:    true,
 | 
			
		||||
			packName: "pack2",
 | 
			
		||||
			fixStat: fixStat{
 | 
			
		||||
				notFixedYet: false,
 | 
			
		||||
				fixedIn:     "3.0.0",
 | 
			
		||||
			},
 | 
			
		||||
			upserted: true,
 | 
			
		||||
			out: ovalResult{
 | 
			
		||||
				[]defPacks{
 | 
			
		||||
					{
 | 
			
		||||
						def: ovalmodels.Definition{
 | 
			
		||||
							DefinitionID: "1111",
 | 
			
		||||
						},
 | 
			
		||||
						actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
							"pack1": true,
 | 
			
		||||
							"pack2": false,
 | 
			
		||||
						binpkgFixstat: map[string]fixStat{
 | 
			
		||||
							"pack1": {
 | 
			
		||||
								notFixedYet: true,
 | 
			
		||||
								fixedIn:     "1.0.0",
 | 
			
		||||
							},
 | 
			
		||||
							"pack2": {
 | 
			
		||||
								notFixedYet: false,
 | 
			
		||||
								fixedIn:     "3.0.0",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						def: ovalmodels.Definition{
 | 
			
		||||
							DefinitionID: "2222",
 | 
			
		||||
						},
 | 
			
		||||
						actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
							"pack3": true,
 | 
			
		||||
						binpkgFixstat: map[string]fixStat{
 | 
			
		||||
							"pack3": {
 | 
			
		||||
								notFixedYet: true,
 | 
			
		||||
								fixedIn:     "2.0.0",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
@@ -93,7 +117,7 @@ func TestUpsert(t *testing.T) {
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for i, tt := range tests {
 | 
			
		||||
		upserted := tt.res.upsert(tt.def, tt.packName, tt.notFixedYet)
 | 
			
		||||
		upserted := tt.res.upsert(tt.def, tt.packName, tt.fixStat)
 | 
			
		||||
		if tt.upserted != upserted {
 | 
			
		||||
			t.Errorf("[%d]\nexpected: %t\n  actual: %t\n", i, tt.upserted, upserted)
 | 
			
		||||
		}
 | 
			
		||||
@@ -121,17 +145,27 @@ func TestDefpacksToPackStatuses(t *testing.T) {
 | 
			
		||||
							{
 | 
			
		||||
								Name:        "a",
 | 
			
		||||
								NotFixedYet: true,
 | 
			
		||||
								Version:     "1.0.0",
 | 
			
		||||
							},
 | 
			
		||||
							{
 | 
			
		||||
								Name:        "b",
 | 
			
		||||
								NotFixedYet: false,
 | 
			
		||||
								Version:     "2.0.0",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					actuallyAffectedPackNames: map[string]bool{
 | 
			
		||||
						"a": true,
 | 
			
		||||
						"b": true,
 | 
			
		||||
						"c": true,
 | 
			
		||||
					binpkgFixstat: map[string]fixStat{
 | 
			
		||||
						"a": {
 | 
			
		||||
							notFixedYet: true,
 | 
			
		||||
							fixedIn:     "1.0.0",
 | 
			
		||||
							isSrcPack:   false,
 | 
			
		||||
						},
 | 
			
		||||
						"b": {
 | 
			
		||||
							notFixedYet: true,
 | 
			
		||||
							fixedIn:     "1.0.0",
 | 
			
		||||
							isSrcPack:   true,
 | 
			
		||||
							srcPackName: "lib-b",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
@@ -139,14 +173,12 @@ func TestDefpacksToPackStatuses(t *testing.T) {
 | 
			
		||||
				{
 | 
			
		||||
					Name:        "a",
 | 
			
		||||
					NotFixedYet: true,
 | 
			
		||||
					FixedIn:     "1.0.0",
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Name:        "b",
 | 
			
		||||
					NotFixedYet: true,
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Name:        "c",
 | 
			
		||||
					NotFixedYet: true,
 | 
			
		||||
					FixedIn:     "1.0.0",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
@@ -173,6 +205,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
		in          in
 | 
			
		||||
		affected    bool
 | 
			
		||||
		notFixedYet bool
 | 
			
		||||
		fixedIn     string
 | 
			
		||||
	}{
 | 
			
		||||
		// 0. Ubuntu ovalpack.NotFixedYet == true
 | 
			
		||||
		{
 | 
			
		||||
@@ -187,6 +220,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
						{
 | 
			
		||||
							Name:        "b",
 | 
			
		||||
							NotFixedYet: true,
 | 
			
		||||
							Version:     "1.0.0",
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
@@ -196,6 +230,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: true,
 | 
			
		||||
			fixedIn:     "1.0.0",
 | 
			
		||||
		},
 | 
			
		||||
		// 1. Ubuntu
 | 
			
		||||
		//   ovalpack.NotFixedYet == false
 | 
			
		||||
@@ -226,6 +261,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "1.0.0-1",
 | 
			
		||||
		},
 | 
			
		||||
		// 2. Ubuntu
 | 
			
		||||
		//   ovalpack.NotFixedYet == false
 | 
			
		||||
@@ -285,6 +321,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			fixedIn:     "1.0.0-3",
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
		},
 | 
			
		||||
		// 4. Ubuntu
 | 
			
		||||
@@ -318,6 +355,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "1.0.0-2",
 | 
			
		||||
		},
 | 
			
		||||
		// 5 RedHat
 | 
			
		||||
		{
 | 
			
		||||
@@ -345,6 +383,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 6 RedHat
 | 
			
		||||
		{
 | 
			
		||||
@@ -372,6 +411,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 7 RedHat
 | 
			
		||||
		{
 | 
			
		||||
@@ -451,6 +491,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 10 RedHat
 | 
			
		||||
		{
 | 
			
		||||
@@ -478,6 +519,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 11 RedHat
 | 
			
		||||
		{
 | 
			
		||||
@@ -504,6 +546,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 12 RedHat
 | 
			
		||||
		{
 | 
			
		||||
@@ -583,6 +626,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 15
 | 
			
		||||
		{
 | 
			
		||||
@@ -662,6 +706,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: true,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 18
 | 
			
		||||
		{
 | 
			
		||||
@@ -689,6 +734,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 19
 | 
			
		||||
		{
 | 
			
		||||
@@ -716,6 +762,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		// 20
 | 
			
		||||
		{
 | 
			
		||||
@@ -794,6 +841,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			in: in{
 | 
			
		||||
@@ -870,6 +918,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: true,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			in: in{
 | 
			
		||||
@@ -896,6 +945,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			in: in{
 | 
			
		||||
@@ -922,6 +972,7 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "0:1.2.3-45.el6_7.8",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			in: in{
 | 
			
		||||
@@ -1021,20 +1072,24 @@ func TestIsOvalDefAffected(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			affected:    true,
 | 
			
		||||
			notFixedYet: false,
 | 
			
		||||
			fixedIn:     "3.1.0",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	for i, tt := range tests {
 | 
			
		||||
		affected, notFixedYet := isOvalDefAffected(tt.in.def, tt.in.req, tt.in.family, tt.in.kernel)
 | 
			
		||||
		affected, notFixedYet, fixedIn := isOvalDefAffected(tt.in.def, tt.in.req, tt.in.family, tt.in.kernel)
 | 
			
		||||
		if tt.affected != affected {
 | 
			
		||||
			t.Errorf("[%d] affected\nexpected: %v\n  actual: %v\n", i, tt.affected, affected)
 | 
			
		||||
		}
 | 
			
		||||
		if tt.notFixedYet != notFixedYet {
 | 
			
		||||
			t.Errorf("[%d] notfixedyet\nexpected: %v\n  actual: %v\n", i, tt.notFixedYet, notFixedYet)
 | 
			
		||||
		}
 | 
			
		||||
		if tt.fixedIn != fixedIn {
 | 
			
		||||
			t.Errorf("[%d] fixedIn\nexpected: %v\n  actual: %v\n", i, tt.fixedIn, fixedIn)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMajor(t *testing.T) {
 | 
			
		||||
func Test_major(t *testing.T) {
 | 
			
		||||
	var tests = []struct {
 | 
			
		||||
		in       string
 | 
			
		||||
		expected string
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package report
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -30,7 +13,7 @@ import (
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	cvedb "github.com/kotakanbe/go-cve-dictionary/db"
 | 
			
		||||
	cve "github.com/kotakanbe/go-cve-dictionary/models"
 | 
			
		||||
	cvemodels "github.com/kotakanbe/go-cve-dictionary/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CveClient is api client of CVE disctionary service.
 | 
			
		||||
@@ -66,18 +49,21 @@ func (api cvedictClient) CheckHealth() error {
 | 
			
		||||
 | 
			
		||||
type response struct {
 | 
			
		||||
	Key       string
 | 
			
		||||
	CveDetail cve.CveDetail
 | 
			
		||||
	CveDetail cvemodels.CveDetail
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (api cvedictClient) FetchCveDetails(driver cvedb.DB, cveIDs []string) (cveDetails []cve.CveDetail, err error) {
 | 
			
		||||
func (api cvedictClient) FetchCveDetails(driver cvedb.DB, cveIDs []string) (cveDetails []cvemodels.CveDetail, err error) {
 | 
			
		||||
	if !config.Conf.CveDict.IsFetchViaHTTP() {
 | 
			
		||||
		if driver == nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		for _, cveID := range cveIDs {
 | 
			
		||||
			cveDetail, err := driver.Get(cveID)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, xerrors.Errorf("Failed to fetch CVE. err: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
			if len(cveDetail.CveID) == 0 {
 | 
			
		||||
				cveDetails = append(cveDetails, cve.CveDetail{
 | 
			
		||||
				cveDetails = append(cveDetails, cvemodels.CveDetail{
 | 
			
		||||
					CveID: cveID,
 | 
			
		||||
				})
 | 
			
		||||
			} else {
 | 
			
		||||
@@ -124,7 +110,7 @@ func (api cvedictClient) FetchCveDetails(driver cvedb.DB, cveIDs []string) (cveD
 | 
			
		||||
		select {
 | 
			
		||||
		case res := <-resChan:
 | 
			
		||||
			if len(res.CveDetail.CveID) == 0 {
 | 
			
		||||
				cveDetails = append(cveDetails, cve.CveDetail{
 | 
			
		||||
				cveDetails = append(cveDetails, cvemodels.CveDetail{
 | 
			
		||||
					CveID: res.Key,
 | 
			
		||||
				})
 | 
			
		||||
			} else {
 | 
			
		||||
@@ -165,7 +151,7 @@ func (api cvedictClient) httpGet(key, url string, resChan chan<- response, errCh
 | 
			
		||||
		errChan <- xerrors.Errorf("HTTP Error: %w", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	cveDetail := cve.CveDetail{}
 | 
			
		||||
	cveDetail := cvemodels.CveDetail{}
 | 
			
		||||
	if err := json.Unmarshal([]byte(body), &cveDetail); err != nil {
 | 
			
		||||
		errChan <- xerrors.Errorf("Failed to Unmarshall. body: %s, err: %w", body, err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -176,7 +162,7 @@ func (api cvedictClient) httpGet(key, url string, resChan chan<- response, errCh
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (api cvedictClient) FetchCveDetailsByCpeName(driver cvedb.DB, cpeName string) ([]cve.CveDetail, error) {
 | 
			
		||||
func (api cvedictClient) FetchCveDetailsByCpeName(driver cvedb.DB, cpeName string) ([]cvemodels.CveDetail, error) {
 | 
			
		||||
	if config.Conf.CveDict.IsFetchViaHTTP() {
 | 
			
		||||
		api.baseURL = config.Conf.CveDict.URL
 | 
			
		||||
		url, err := util.URLPathJoin(api.baseURL, "cpes")
 | 
			
		||||
@@ -191,7 +177,7 @@ func (api cvedictClient) FetchCveDetailsByCpeName(driver cvedb.DB, cpeName strin
 | 
			
		||||
	return driver.GetByCpeURI(cpeName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (api cvedictClient) httpPost(key, url string, query map[string]string) ([]cve.CveDetail, error) {
 | 
			
		||||
func (api cvedictClient) httpPost(key, url string, query map[string]string) ([]cvemodels.CveDetail, error) {
 | 
			
		||||
	var body string
 | 
			
		||||
	var errs []error
 | 
			
		||||
	var resp *http.Response
 | 
			
		||||
@@ -215,7 +201,7 @@ func (api cvedictClient) httpPost(key, url string, query map[string]string) ([]c
 | 
			
		||||
		return nil, xerrors.Errorf("HTTP Error: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cveDetails := []cve.CveDetail{}
 | 
			
		||||
	cveDetails := []cvemodels.CveDetail{}
 | 
			
		||||
	if err := json.Unmarshal([]byte(body), &cveDetails); err != nil {
 | 
			
		||||
		return nil,
 | 
			
		||||
			xerrors.Errorf("Failed to Unmarshall. body: %s, err: %w", body, err)
 | 
			
		||||
 
 | 
			
		||||
@@ -9,24 +9,27 @@ import (
 | 
			
		||||
	cvedb "github.com/kotakanbe/go-cve-dictionary/db"
 | 
			
		||||
	ovaldb "github.com/kotakanbe/goval-dictionary/db"
 | 
			
		||||
	exploitdb "github.com/mozqnet/go-exploitdb/db"
 | 
			
		||||
	metasploitdb "github.com/takuzoo3868/go-msfdb/db"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DBClient is a dictionarie's db client for reporting
 | 
			
		||||
type DBClient struct {
 | 
			
		||||
	CveDB     cvedb.DB
 | 
			
		||||
	OvalDB    ovaldb.DB
 | 
			
		||||
	GostDB    gostdb.DB
 | 
			
		||||
	ExploitDB exploitdb.DB
 | 
			
		||||
	CveDB        cvedb.DB
 | 
			
		||||
	OvalDB       ovaldb.DB
 | 
			
		||||
	GostDB       gostdb.DB
 | 
			
		||||
	ExploitDB    exploitdb.DB
 | 
			
		||||
	MetasploitDB metasploitdb.DB
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DBClientConf has a configuration of Vulnerability DBs
 | 
			
		||||
type DBClientConf struct {
 | 
			
		||||
	CveDictCnf  config.GoCveDictConf
 | 
			
		||||
	OvalDictCnf config.GovalDictConf
 | 
			
		||||
	GostCnf     config.GostConf
 | 
			
		||||
	ExploitCnf  config.ExploitConf
 | 
			
		||||
	DebugSQL    bool
 | 
			
		||||
	CveDictCnf    config.GoCveDictConf
 | 
			
		||||
	OvalDictCnf   config.GovalDictConf
 | 
			
		||||
	GostCnf       config.GostConf
 | 
			
		||||
	ExploitCnf    config.ExploitConf
 | 
			
		||||
	MetasploitCnf config.MetasploitConf
 | 
			
		||||
	DebugSQL      bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewDBClient returns db clients
 | 
			
		||||
@@ -66,11 +69,21 @@ func NewDBClient(cnf DBClientConf) (dbclient *DBClient, locked bool, err error)
 | 
			
		||||
			cnf.ExploitCnf.SQLite3Path, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	metasploitdb, locked, err := NewMetasploitDB(cnf)
 | 
			
		||||
	if locked {
 | 
			
		||||
		return nil, true, xerrors.Errorf("metasploitDB is locked: %s",
 | 
			
		||||
			cnf.MetasploitCnf.SQLite3Path)
 | 
			
		||||
	} else if err != nil {
 | 
			
		||||
		util.Log.Warnf("Unable to use metasploitDB: %s, err: %s",
 | 
			
		||||
			cnf.MetasploitCnf.SQLite3Path, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &DBClient{
 | 
			
		||||
		CveDB:     cveDriver,
 | 
			
		||||
		OvalDB:    ovaldb,
 | 
			
		||||
		GostDB:    gostdb,
 | 
			
		||||
		ExploitDB: exploitdb,
 | 
			
		||||
		CveDB:        cveDriver,
 | 
			
		||||
		OvalDB:       ovaldb,
 | 
			
		||||
		GostDB:       gostdb,
 | 
			
		||||
		ExploitDB:    exploitdb,
 | 
			
		||||
		MetasploitDB: metasploitdb,
 | 
			
		||||
	}, false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -83,6 +96,10 @@ func NewCveDB(cnf DBClientConf) (driver cvedb.DB, locked bool, err error) {
 | 
			
		||||
	path := cnf.CveDictCnf.URL
 | 
			
		||||
	if cnf.CveDictCnf.Type == "sqlite3" {
 | 
			
		||||
		path = cnf.CveDictCnf.SQLite3Path
 | 
			
		||||
		if _, err := os.Stat(path); os.IsNotExist(err) {
 | 
			
		||||
			util.Log.Warnf("--cvedb-path=%s file not found. [CPE-scan](https://vuls.io/docs/en/usage-scan-non-os-packages.html#cpe-scan) needs cve-dictionary. if you specify cpe in config.toml, fetch cve-dictionary before reporting. For details, see `https://github.com/kotakanbe/go-cve-dictionary#deploy-go-cve-dictionary`", path)
 | 
			
		||||
			return nil, false, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	util.Log.Debugf("Open cve-dictionary db (%s): %s", cnf.CveDictCnf.Type, path)
 | 
			
		||||
@@ -104,7 +121,7 @@ func NewOvalDB(cnf DBClientConf) (driver ovaldb.DB, locked bool, err error) {
 | 
			
		||||
		path = cnf.OvalDictCnf.SQLite3Path
 | 
			
		||||
 | 
			
		||||
		if _, err := os.Stat(path); os.IsNotExist(err) {
 | 
			
		||||
			util.Log.Warnf("--ovaldb-path=%s is not found. It's recommended to use OVAL to improve scanning accuracy. For details, see https://github.com/kotakanbe/goval-dictionary#usage", path)
 | 
			
		||||
			util.Log.Warnf("--ovaldb-path=%s file not found", path)
 | 
			
		||||
			return nil, false, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -131,7 +148,7 @@ func NewGostDB(cnf DBClientConf) (driver gostdb.DB, locked bool, err error) {
 | 
			
		||||
		path = cnf.GostCnf.SQLite3Path
 | 
			
		||||
 | 
			
		||||
		if _, err := os.Stat(path); os.IsNotExist(err) {
 | 
			
		||||
			util.Log.Warnf("--gostdb-path=%s is not found. If the scan target server is Debian, RHEL or CentOS, it's recommended to use gost to improve scanning accuracy. To use gost database, see https://github.com/knqyf263/gost#fetch-redhat", path)
 | 
			
		||||
			util.Log.Warnf("--gostdb-path=%s file not found. Vuls can detect `patch-not-released-CVE-ID` using gost if the scan target server is Debian, RHEL or CentOS, For details, see `https://github.com/knqyf263/gost#fetch-redhat`", path)
 | 
			
		||||
			return nil, false, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -157,7 +174,7 @@ func NewExploitDB(cnf DBClientConf) (driver exploitdb.DB, locked bool, err error
 | 
			
		||||
		path = cnf.ExploitCnf.SQLite3Path
 | 
			
		||||
 | 
			
		||||
		if _, err := os.Stat(path); os.IsNotExist(err) {
 | 
			
		||||
			util.Log.Warnf("--exploitdb-path=%s is not found. It's recommended to use exploit to improve scanning accuracy. To use exploit db database, see https://github.com/mozqnet/go-exploitdb", path)
 | 
			
		||||
			util.Log.Warnf("--exploitdb-path=%s file not found. Fetch go-exploit-db before reporting if you want to display exploit codes of detected CVE-IDs. For details, see `https://github.com/mozqnet/go-exploitdb`", path)
 | 
			
		||||
			return nil, false, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -173,6 +190,32 @@ func NewExploitDB(cnf DBClientConf) (driver exploitdb.DB, locked bool, err error
 | 
			
		||||
	return driver, false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMetasploitDB returns db client for Metasploit
 | 
			
		||||
func NewMetasploitDB(cnf DBClientConf) (driver metasploitdb.DB, locked bool, err error) {
 | 
			
		||||
	if config.Conf.Metasploit.IsFetchViaHTTP() {
 | 
			
		||||
		return nil, false, nil
 | 
			
		||||
	}
 | 
			
		||||
	path := cnf.MetasploitCnf.URL
 | 
			
		||||
	if cnf.MetasploitCnf.Type == "sqlite3" {
 | 
			
		||||
		path = cnf.MetasploitCnf.SQLite3Path
 | 
			
		||||
 | 
			
		||||
		if _, err := os.Stat(path); os.IsNotExist(err) {
 | 
			
		||||
			util.Log.Warnf("--msfdb-path=%s file not found. Fetch go-msfdb before reporting if you want to display metasploit modules of detected CVE-IDs. For details, see `https://github.com/takuzoo3868/go-msfdb`", path)
 | 
			
		||||
			return nil, false, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	util.Log.Debugf("Open metasploit db (%s): %s", cnf.MetasploitCnf.Type, path)
 | 
			
		||||
	if driver, locked, err = metasploitdb.NewDB(cnf.MetasploitCnf.Type, path, cnf.DebugSQL, false); err != nil {
 | 
			
		||||
		if locked {
 | 
			
		||||
			util.Log.Errorf("metasploitDB is locked. err: %+v", err)
 | 
			
		||||
			return nil, true, err
 | 
			
		||||
		}
 | 
			
		||||
		return nil, false, err
 | 
			
		||||
	}
 | 
			
		||||
	return driver, false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CloseDB close dbs
 | 
			
		||||
func (d DBClient) CloseDB() {
 | 
			
		||||
	if d.CveDB != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										118
									
								
								report/email.go
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								report/email.go
									
									
									
									
									
								
							@@ -1,23 +1,7 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/mail"
 | 
			
		||||
@@ -71,14 +55,15 @@ func (w EMailWriter) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	summary := ""
 | 
			
		||||
	var summary string
 | 
			
		||||
	if config.Conf.IgnoreUnscoredCves {
 | 
			
		||||
		summary = fmt.Sprintf("Total: %d (High:%d Medium:%d Low:%d)",
 | 
			
		||||
			m["High"]+m["Medium"]+m["Low"], m["High"], m["Medium"], m["Low"])
 | 
			
		||||
	} else {
 | 
			
		||||
		summary = fmt.Sprintf("Total: %d (High:%d Medium:%d Low:%d ?:%d)",
 | 
			
		||||
			m["High"]+m["Medium"]+m["Low"]+m["Unknown"],
 | 
			
		||||
			m["High"], m["Medium"], m["Low"], m["Unknown"])
 | 
			
		||||
	}
 | 
			
		||||
	summary = fmt.Sprintf("Total: %d (High:%d Medium:%d Low:%d ?:%d)",
 | 
			
		||||
		m["High"]+m["Medium"]+m["Low"]+m["Unknown"],
 | 
			
		||||
		m["High"], m["Medium"], m["Low"], m["Unknown"])
 | 
			
		||||
	origmessage := message
 | 
			
		||||
	if conf.FormatOneEMail {
 | 
			
		||||
		message = fmt.Sprintf("One Line Summary\r\n================\r\n%s", formatOneLineSummary(rs...))
 | 
			
		||||
@@ -103,6 +88,61 @@ type emailSender struct {
 | 
			
		||||
	send func(string, smtp.Auth, string, []string, []byte) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func smtps(emailConf config.SMTPConf, message string) (err error) {
 | 
			
		||||
	auth := smtp.PlainAuth("",
 | 
			
		||||
		emailConf.User,
 | 
			
		||||
		emailConf.Password,
 | 
			
		||||
		emailConf.SMTPAddr,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	//TLS Config
 | 
			
		||||
	tlsConfig := &tls.Config{
 | 
			
		||||
		ServerName: emailConf.SMTPAddr,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	smtpServer := net.JoinHostPort(emailConf.SMTPAddr, emailConf.SMTPPort)
 | 
			
		||||
	//New TLS connection
 | 
			
		||||
	con, err := tls.Dial("tcp", smtpServer, tlsConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to create TLS connection: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer con.Close()
 | 
			
		||||
 | 
			
		||||
	c, err := smtp.NewClient(con, emailConf.SMTPAddr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to create new client: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	if err = c.Auth(auth); err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to authenticate: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	if err = c.Mail(emailConf.From); err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to send Mail command: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	for _, to := range emailConf.To {
 | 
			
		||||
		if err = c.Rcpt(to); err != nil {
 | 
			
		||||
			return xerrors.Errorf("Failed to send Rcpt command: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	w, err := c.Data()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to send Data command: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	_, err = w.Write([]byte(message))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to write EMail message: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = w.Close()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to close Writer: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = c.Quit()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to close connection: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *emailSender) Send(subject, body string) (err error) {
 | 
			
		||||
	emailConf := e.conf
 | 
			
		||||
	to := strings.Join(emailConf.To[:], ", ")
 | 
			
		||||
@@ -129,20 +169,28 @@ func (e *emailSender) Send(subject, body string) (err error) {
 | 
			
		||||
	smtpServer := net.JoinHostPort(emailConf.SMTPAddr, emailConf.SMTPPort)
 | 
			
		||||
 | 
			
		||||
	if emailConf.User != "" && emailConf.Password != "" {
 | 
			
		||||
		err = e.send(
 | 
			
		||||
			smtpServer,
 | 
			
		||||
			smtp.PlainAuth(
 | 
			
		||||
				"",
 | 
			
		||||
				emailConf.User,
 | 
			
		||||
				emailConf.Password,
 | 
			
		||||
				emailConf.SMTPAddr,
 | 
			
		||||
			),
 | 
			
		||||
			emailConf.From,
 | 
			
		||||
			mailAddresses,
 | 
			
		||||
			[]byte(message),
 | 
			
		||||
		)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return xerrors.Errorf("Failed to send emails: %w", err)
 | 
			
		||||
		switch emailConf.SMTPPort {
 | 
			
		||||
		case "465":
 | 
			
		||||
			err := smtps(emailConf, message)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return xerrors.Errorf("Failed to send emails: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			err = e.send(
 | 
			
		||||
				smtpServer,
 | 
			
		||||
				smtp.PlainAuth(
 | 
			
		||||
					"",
 | 
			
		||||
					emailConf.User,
 | 
			
		||||
					emailConf.Password,
 | 
			
		||||
					emailConf.SMTPAddr,
 | 
			
		||||
				),
 | 
			
		||||
				emailConf.From,
 | 
			
		||||
				mailAddresses,
 | 
			
		||||
				[]byte(message),
 | 
			
		||||
			)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return xerrors.Errorf("Failed to send emails: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
package report
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Architect, Inc. Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -34,7 +17,9 @@ type HTTPRequestWriter struct{}
 | 
			
		||||
func (w HTTPRequestWriter) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
	for _, r := range rs {
 | 
			
		||||
		b := new(bytes.Buffer)
 | 
			
		||||
		json.NewEncoder(b).Encode(r)
 | 
			
		||||
		if err := json.NewEncoder(b).Encode(r); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		_, err = http.Post(c.Conf.HTTP.URL, "application/json; charset=utf-8", b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										218
									
								
								report/report.go
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								report/report.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -39,14 +22,17 @@ import (
 | 
			
		||||
	"github.com/future-architect/vuls/github"
 | 
			
		||||
	"github.com/future-architect/vuls/gost"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/future-architect/vuls/msf"
 | 
			
		||||
	"github.com/future-architect/vuls/oval"
 | 
			
		||||
	"github.com/future-architect/vuls/util"
 | 
			
		||||
	"github.com/future-architect/vuls/wordpress"
 | 
			
		||||
	"github.com/hashicorp/uuid"
 | 
			
		||||
	"github.com/hashicorp/go-uuid"
 | 
			
		||||
	gostdb "github.com/knqyf263/gost/db"
 | 
			
		||||
	cvedb "github.com/kotakanbe/go-cve-dictionary/db"
 | 
			
		||||
	cvemodels "github.com/kotakanbe/go-cve-dictionary/models"
 | 
			
		||||
	ovaldb "github.com/kotakanbe/goval-dictionary/db"
 | 
			
		||||
	exploitdb "github.com/mozqnet/go-exploitdb/db"
 | 
			
		||||
	metasploitdb "github.com/takuzoo3868/go-msfdb/db"
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -60,6 +46,7 @@ func FillCveInfos(dbclient DBClient, rs []models.ScanResult, dir string) ([]mode
 | 
			
		||||
	var filledResults []models.ScanResult
 | 
			
		||||
	reportedAt := time.Now()
 | 
			
		||||
	hostname, _ := os.Hostname()
 | 
			
		||||
	wpVulnCaches := map[string]string{}
 | 
			
		||||
	for _, r := range rs {
 | 
			
		||||
		if c.Conf.RefreshCve || needToRefreshCve(r) {
 | 
			
		||||
			if ovalSupported(&r) {
 | 
			
		||||
@@ -99,7 +86,7 @@ func FillCveInfos(dbclient DBClient, rs []models.ScanResult, dir string) ([]mode
 | 
			
		||||
			// Integrations
 | 
			
		||||
			githubInts := GithubSecurityAlerts(c.Conf.Servers[r.ServerName].GitHubRepos)
 | 
			
		||||
 | 
			
		||||
			wpOpt := WordPressOption{c.Conf.Servers[r.ServerName].WordPress.WPVulnDBToken}
 | 
			
		||||
			wpOpt := WordPressOption{c.Conf.Servers[r.ServerName].WordPress.WPVulnDBToken, &wpVulnCaches}
 | 
			
		||||
 | 
			
		||||
			if err := FillCveInfo(dbclient,
 | 
			
		||||
				&r,
 | 
			
		||||
@@ -174,7 +161,6 @@ func FillCveInfo(dbclient DBClient, r *models.ScanResult, cpeURIs []string, igno
 | 
			
		||||
		r.FormatServerName(), nCVEs)
 | 
			
		||||
 | 
			
		||||
	nCVEs, err = FillWithOval(dbclient.OvalDB, r)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to fill with OVAL: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -224,9 +210,13 @@ func FillCveInfo(dbclient DBClient, r *models.ScanResult, cpeURIs []string, igno
 | 
			
		||||
	util.Log.Infof("%s: %d exploits are detected",
 | 
			
		||||
		r.FormatServerName(), nExploitCve)
 | 
			
		||||
 | 
			
		||||
	enAlertCnt, jaAlertCnt := fillAlerts(r)
 | 
			
		||||
	util.Log.Infof("%s: en: %d, ja: %d alerts are detected",
 | 
			
		||||
		r.FormatServerName(), enAlertCnt, jaAlertCnt)
 | 
			
		||||
	util.Log.Infof("Fill metasploit module information with Metasploit-DB")
 | 
			
		||||
	nMetasploitCve, err := FillWithMetasploit(dbclient.MetasploitDB, r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to fill with metasploit: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	util.Log.Infof("%s: %d modules are detected",
 | 
			
		||||
		r.FormatServerName(), nMetasploitCve)
 | 
			
		||||
 | 
			
		||||
	fillCweDict(r)
 | 
			
		||||
	return nil
 | 
			
		||||
@@ -234,7 +224,7 @@ func FillCveInfo(dbclient DBClient, r *models.ScanResult, cpeURIs []string, igno
 | 
			
		||||
 | 
			
		||||
// fillCveDetail fetches NVD, JVN from CVE Database
 | 
			
		||||
func fillCveDetail(driver cvedb.DB, r *models.ScanResult) error {
 | 
			
		||||
	var cveIDs []string
 | 
			
		||||
	cveIDs := []string{}
 | 
			
		||||
	for _, v := range r.ScannedCves {
 | 
			
		||||
		cveIDs = append(cveIDs, v.CveID)
 | 
			
		||||
	}
 | 
			
		||||
@@ -245,11 +235,9 @@ func fillCveDetail(driver cvedb.DB, r *models.ScanResult) error {
 | 
			
		||||
	}
 | 
			
		||||
	for _, d := range ds {
 | 
			
		||||
		nvd := models.ConvertNvdJSONToModel(d.CveID, d.NvdJSON)
 | 
			
		||||
		if nvd == nil {
 | 
			
		||||
			nvd = models.ConvertNvdXMLToModel(d.CveID, d.NvdXML)
 | 
			
		||||
		}
 | 
			
		||||
		jvn := models.ConvertJvnToModel(d.CveID, d.Jvn)
 | 
			
		||||
 | 
			
		||||
		alerts := fillCertAlerts(&d)
 | 
			
		||||
		for cveID, vinfo := range r.ScannedCves {
 | 
			
		||||
			if vinfo.CveID == d.CveID {
 | 
			
		||||
				if vinfo.CveContents == nil {
 | 
			
		||||
@@ -260,6 +248,7 @@ func fillCveDetail(driver cvedb.DB, r *models.ScanResult) error {
 | 
			
		||||
						vinfo.CveContents[con.Type] = *con
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				vinfo.AlertDict = alerts
 | 
			
		||||
				r.ScannedCves[cveID] = vinfo
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
@@ -268,6 +257,28 @@ func fillCveDetail(driver cvedb.DB, r *models.ScanResult) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fillCertAlerts(cvedetail *cvemodels.CveDetail) (dict models.AlertDict) {
 | 
			
		||||
	if cvedetail.NvdJSON != nil {
 | 
			
		||||
		for _, cert := range cvedetail.NvdJSON.Certs {
 | 
			
		||||
			dict.En = append(dict.En, models.Alert{
 | 
			
		||||
				URL:   cert.Link,
 | 
			
		||||
				Title: cert.Title,
 | 
			
		||||
				Team:  "us",
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if cvedetail.Jvn != nil {
 | 
			
		||||
		for _, cert := range cvedetail.Jvn.Certs {
 | 
			
		||||
			dict.Ja = append(dict.Ja, models.Alert{
 | 
			
		||||
				URL:   cert.Link,
 | 
			
		||||
				Title: cert.Title,
 | 
			
		||||
				Team:  "jp",
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return dict
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithOval fetches OVAL database
 | 
			
		||||
func FillWithOval(driver ovaldb.DB, r *models.ScanResult) (nCVEs int, err error) {
 | 
			
		||||
	var ovalClient oval.Client
 | 
			
		||||
@@ -313,7 +324,7 @@ func FillWithOval(driver ovaldb.DB, r *models.ScanResult) (nCVEs int, err error)
 | 
			
		||||
 | 
			
		||||
	if !c.Conf.OvalDict.IsFetchViaHTTP() {
 | 
			
		||||
		if driver == nil {
 | 
			
		||||
			return 0, nil
 | 
			
		||||
			return 0, xerrors.Errorf("You have to fetch OVAL data for %s before reporting. For details, see `https://github.com/kotakanbe/goval-dictionary#usage`", r.Family)
 | 
			
		||||
		}
 | 
			
		||||
		if err = driver.NewOvalDB(ovalFamily); err != nil {
 | 
			
		||||
			return 0, xerrors.Errorf("Failed to New Oval DB. err: %w", err)
 | 
			
		||||
@@ -326,7 +337,7 @@ func FillWithOval(driver ovaldb.DB, r *models.ScanResult) (nCVEs int, err error)
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return 0, xerrors.Errorf("OVAL entries of %s %s are not found. Fetch OVAL before reporting. For details, see https://github.com/kotakanbe/goval-dictionary#usage", ovalFamily, r.Release)
 | 
			
		||||
		return 0, xerrors.Errorf("OVAL entries of %s %s are not found. Fetch OVAL before reporting. For details, see `https://github.com/kotakanbe/goval-dictionary#usage`", ovalFamily, r.Release)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = ovalClient.CheckIfOvalFresh(driver, ovalFamily, r.Release)
 | 
			
		||||
@@ -343,7 +354,10 @@ func FillWithGost(driver gostdb.DB, r *models.ScanResult, ignoreWillNotFix bool)
 | 
			
		||||
	gostClient := gost.NewClient(r.Family)
 | 
			
		||||
	// TODO chekc if fetched
 | 
			
		||||
	// TODO chekc if fresh enough
 | 
			
		||||
	return gostClient.FillWithGost(driver, r, ignoreWillNotFix)
 | 
			
		||||
	if nCVEs, err = gostClient.DetectUnfixed(driver, r, ignoreWillNotFix); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return nCVEs, gostClient.FillCVEsWithRedHat(driver, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithExploit fills Exploits with exploit dataabase
 | 
			
		||||
@@ -354,7 +368,18 @@ func FillWithExploit(driver exploitdb.DB, r *models.ScanResult) (nExploitCve int
 | 
			
		||||
	return exploit.FillWithExploit(driver, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FillWithMetasploit fills metasploit modules with metasploit database
 | 
			
		||||
// https://github.com/takuzoo3868/go-msfdb
 | 
			
		||||
func FillWithMetasploit(driver metasploitdb.DB, r *models.ScanResult) (nMetasploitCve int, err error) {
 | 
			
		||||
	return msf.FillWithMetasploit(driver, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fillVulnByCpeURIs(driver cvedb.DB, r *models.ScanResult, cpeURIs []string) (nCVEs int, err error) {
 | 
			
		||||
	if len(cpeURIs) != 0 && driver == nil && !config.Conf.CveDict.IsFetchViaHTTP() {
 | 
			
		||||
		return 0, xerrors.Errorf("cpeURIs %s specified, but cve-dictionary DB not found. Fetch cve-dictionary beofre reporting. For details, see `https://github.com/kotakanbe/go-cve-dictionary#deploy-go-cve-dictionary`",
 | 
			
		||||
			cpeURIs)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, name := range cpeURIs {
 | 
			
		||||
		details, err := CveClient.FetchCveDetailsByCpeName(driver, name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -421,14 +446,15 @@ func (g GithubSecurityAlertOption) apply(r *models.ScanResult, ints *integration
 | 
			
		||||
 | 
			
		||||
// WordPressOption :
 | 
			
		||||
type WordPressOption struct {
 | 
			
		||||
	token string
 | 
			
		||||
	token        string
 | 
			
		||||
	wpVulnCaches *map[string]string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (g WordPressOption) apply(r *models.ScanResult, ints *integrationResults) (err error) {
 | 
			
		||||
	if g.token == "" {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	n, err := wordpress.FillWordPress(r, g.token)
 | 
			
		||||
	n, err := wordpress.FillWordPress(r, g.token, g.wpVulnCaches)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf("Failed to fetch from WPVulnDB. Check the WPVulnDBToken in config.toml. err: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -456,6 +482,12 @@ func fillCweDict(r *models.ScanResult) {
 | 
			
		||||
			if rank, ok := cwe.OwaspTopTen2017[id]; ok {
 | 
			
		||||
				entry.OwaspTopTen2017 = rank
 | 
			
		||||
			}
 | 
			
		||||
			if rank, ok := cwe.CweTopTwentyfive2019[id]; ok {
 | 
			
		||||
				entry.CweTopTwentyfive2019 = rank
 | 
			
		||||
			}
 | 
			
		||||
			if rank, ok := cwe.SansTopTwentyfive[id]; ok {
 | 
			
		||||
				entry.SansTopTwentyfive = rank
 | 
			
		||||
			}
 | 
			
		||||
			entry.En = &e
 | 
			
		||||
		} else {
 | 
			
		||||
			util.Log.Debugf("CWE-ID %s is not found in English CWE Dict", id)
 | 
			
		||||
@@ -467,6 +499,12 @@ func fillCweDict(r *models.ScanResult) {
 | 
			
		||||
				if rank, ok := cwe.OwaspTopTen2017[id]; ok {
 | 
			
		||||
					entry.OwaspTopTen2017 = rank
 | 
			
		||||
				}
 | 
			
		||||
				if rank, ok := cwe.CweTopTwentyfive2019[id]; ok {
 | 
			
		||||
					entry.CweTopTwentyfive2019 = rank
 | 
			
		||||
				}
 | 
			
		||||
				if rank, ok := cwe.SansTopTwentyfive[id]; ok {
 | 
			
		||||
					entry.SansTopTwentyfive = rank
 | 
			
		||||
				}
 | 
			
		||||
				entry.Ja = &e
 | 
			
		||||
			} else {
 | 
			
		||||
				util.Log.Debugf("CWE-ID %s is not found in Japanese CWE Dict", id)
 | 
			
		||||
@@ -479,39 +517,29 @@ func fillCweDict(r *models.ScanResult) {
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fillAlerts(r *models.ScanResult) (enCnt int, jaCnt int) {
 | 
			
		||||
	for cveID, vuln := range r.ScannedCves {
 | 
			
		||||
		enAs, jaAs := models.GetAlertsByCveID(cveID, "en"), models.GetAlertsByCveID(cveID, "ja")
 | 
			
		||||
		vuln.AlertDict = models.AlertDict{
 | 
			
		||||
			Ja: jaAs,
 | 
			
		||||
			En: enAs,
 | 
			
		||||
		}
 | 
			
		||||
		r.ScannedCves[cveID] = vuln
 | 
			
		||||
		enCnt += len(enAs)
 | 
			
		||||
		jaCnt += len(jaAs)
 | 
			
		||||
	}
 | 
			
		||||
	return enCnt, jaCnt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const reUUID = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"
 | 
			
		||||
 | 
			
		||||
// Scanning with the -containers-only, -images-only flag at scan time, the UUID of Container Host may not be generated,
 | 
			
		||||
// Scanning with the -containers-only flag at scan time, the UUID of Container Host may not be generated,
 | 
			
		||||
// so check it. Otherwise create a UUID of the Container Host and set it.
 | 
			
		||||
func getOrCreateServerUUID(r models.ScanResult, server c.ServerInfo) (serverUUID string) {
 | 
			
		||||
func getOrCreateServerUUID(r models.ScanResult, server c.ServerInfo) (serverUUID string, err error) {
 | 
			
		||||
	if id, ok := server.UUIDs[r.ServerName]; !ok {
 | 
			
		||||
		serverUUID = uuid.GenerateUUID()
 | 
			
		||||
		if serverUUID, err = uuid.GenerateUUID(); err != nil {
 | 
			
		||||
			return "", xerrors.Errorf("Failed to generate UUID: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		matched, err := regexp.MatchString(reUUID, id)
 | 
			
		||||
		if !matched || err != nil {
 | 
			
		||||
			serverUUID = uuid.GenerateUUID()
 | 
			
		||||
			if serverUUID, err = uuid.GenerateUUID(); err != nil {
 | 
			
		||||
				return "", xerrors.Errorf("Failed to generate UUID: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return serverUUID
 | 
			
		||||
	return serverUUID, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EnsureUUIDs generate a new UUID of the scan target server if UUID is not assigned yet.
 | 
			
		||||
// And then set the generated UUID to config.toml and scan results.
 | 
			
		||||
func EnsureUUIDs(configPath string, results models.ScanResults) error {
 | 
			
		||||
func EnsureUUIDs(configPath string, results models.ScanResults) (err error) {
 | 
			
		||||
	// Sort Host->Container
 | 
			
		||||
	sort.Slice(results, func(i, j int) bool {
 | 
			
		||||
		if results[i].ServerName == results[j].ServerName {
 | 
			
		||||
@@ -520,6 +548,7 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error {
 | 
			
		||||
		return results[i].ServerName < results[j].ServerName
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	re := regexp.MustCompile(reUUID)
 | 
			
		||||
	for i, r := range results {
 | 
			
		||||
		server := c.Conf.Servers[r.ServerName]
 | 
			
		||||
		if server.UUIDs == nil {
 | 
			
		||||
@@ -529,21 +558,20 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error {
 | 
			
		||||
		name := ""
 | 
			
		||||
		if r.IsContainer() {
 | 
			
		||||
			name = fmt.Sprintf("%s@%s", r.Container.Name, r.ServerName)
 | 
			
		||||
			if uuid := getOrCreateServerUUID(r, server); uuid != "" {
 | 
			
		||||
				server.UUIDs[r.ServerName] = uuid
 | 
			
		||||
			serverUUID, err := getOrCreateServerUUID(r, server)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else if r.IsImage() {
 | 
			
		||||
			name = fmt.Sprintf("%s:%s@%s", r.Image.Name, r.Image.Tag, r.ServerName)
 | 
			
		||||
			if uuid := getOrCreateServerUUID(r, server); uuid != "" {
 | 
			
		||||
				server.UUIDs[r.ServerName] = uuid
 | 
			
		||||
			if serverUUID != "" {
 | 
			
		||||
				server.UUIDs[r.ServerName] = serverUUID
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			name = r.ServerName
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if id, ok := server.UUIDs[name]; ok {
 | 
			
		||||
			matched, err := regexp.MatchString(reUUID, id)
 | 
			
		||||
			if !matched || err != nil {
 | 
			
		||||
			ok := re.MatchString(id)
 | 
			
		||||
			if !ok || err != nil {
 | 
			
		||||
				util.Log.Warnf("UUID is invalid. Re-generate UUID %s: %s", id, err)
 | 
			
		||||
			} else {
 | 
			
		||||
				if r.IsContainer() {
 | 
			
		||||
@@ -558,16 +586,19 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Generate a new UUID and set to config and scan result
 | 
			
		||||
		id := uuid.GenerateUUID()
 | 
			
		||||
		server.UUIDs[name] = id
 | 
			
		||||
		serverUUID, err := uuid.GenerateUUID()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		server.UUIDs[name] = serverUUID
 | 
			
		||||
		server = cleanForTOMLEncoding(server, c.Conf.Default)
 | 
			
		||||
		c.Conf.Servers[r.ServerName] = server
 | 
			
		||||
 | 
			
		||||
		if r.IsContainer() {
 | 
			
		||||
			results[i].Container.UUID = id
 | 
			
		||||
			results[i].Container.UUID = serverUUID
 | 
			
		||||
			results[i].ServerUUID = server.UUIDs[r.ServerName]
 | 
			
		||||
		} else {
 | 
			
		||||
			results[i].ServerUUID = id
 | 
			
		||||
			results[i].ServerUUID = serverUUID
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -590,6 +621,7 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error {
 | 
			
		||||
	ovalDict := &c.Conf.OvalDict
 | 
			
		||||
	gost := &c.Conf.Gost
 | 
			
		||||
	exploit := &c.Conf.Exploit
 | 
			
		||||
	metasploit := &c.Conf.Metasploit
 | 
			
		||||
	http := &c.Conf.HTTP
 | 
			
		||||
	if http.URL == "" {
 | 
			
		||||
		http = nil
 | 
			
		||||
@@ -631,38 +663,40 @@ func EnsureUUIDs(configPath string, results models.ScanResults) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c := struct {
 | 
			
		||||
		CveDict  *c.GoCveDictConf `toml:"cveDict"`
 | 
			
		||||
		OvalDict *c.GovalDictConf `toml:"ovalDict"`
 | 
			
		||||
		Gost     *c.GostConf      `toml:"gost"`
 | 
			
		||||
		Exploit  *c.ExploitConf   `toml:"exploit"`
 | 
			
		||||
		Slack    *c.SlackConf     `toml:"slack"`
 | 
			
		||||
		Email    *c.SMTPConf      `toml:"email"`
 | 
			
		||||
		HTTP     *c.HTTPConf      `toml:"http"`
 | 
			
		||||
		Syslog   *c.SyslogConf    `toml:"syslog"`
 | 
			
		||||
		AWS      *c.AWS           `toml:"aws"`
 | 
			
		||||
		Azure    *c.Azure         `toml:"azure"`
 | 
			
		||||
		Stride   *c.StrideConf    `toml:"stride"`
 | 
			
		||||
		HipChat  *c.HipChatConf   `toml:"hipChat"`
 | 
			
		||||
		ChatWork *c.ChatWorkConf  `toml:"chatWork"`
 | 
			
		||||
		Saas     *c.SaasConf      `toml:"saas"`
 | 
			
		||||
		CveDict    *c.GoCveDictConf  `toml:"cveDict"`
 | 
			
		||||
		OvalDict   *c.GovalDictConf  `toml:"ovalDict"`
 | 
			
		||||
		Gost       *c.GostConf       `toml:"gost"`
 | 
			
		||||
		Exploit    *c.ExploitConf    `toml:"exploit"`
 | 
			
		||||
		Metasploit *c.MetasploitConf `toml:"metasploit"`
 | 
			
		||||
		Slack      *c.SlackConf      `toml:"slack"`
 | 
			
		||||
		Email      *c.SMTPConf       `toml:"email"`
 | 
			
		||||
		HTTP       *c.HTTPConf       `toml:"http"`
 | 
			
		||||
		Syslog     *c.SyslogConf     `toml:"syslog"`
 | 
			
		||||
		AWS        *c.AWS            `toml:"aws"`
 | 
			
		||||
		Azure      *c.Azure          `toml:"azure"`
 | 
			
		||||
		Stride     *c.StrideConf     `toml:"stride"`
 | 
			
		||||
		HipChat    *c.HipChatConf    `toml:"hipChat"`
 | 
			
		||||
		ChatWork   *c.ChatWorkConf   `toml:"chatWork"`
 | 
			
		||||
		Saas       *c.SaasConf       `toml:"saas"`
 | 
			
		||||
 | 
			
		||||
		Default c.ServerInfo            `toml:"default"`
 | 
			
		||||
		Servers map[string]c.ServerInfo `toml:"servers"`
 | 
			
		||||
	}{
 | 
			
		||||
		CveDict:  cveDict,
 | 
			
		||||
		OvalDict: ovalDict,
 | 
			
		||||
		Gost:     gost,
 | 
			
		||||
		Exploit:  exploit,
 | 
			
		||||
		Slack:    slack,
 | 
			
		||||
		Email:    email,
 | 
			
		||||
		HTTP:     http,
 | 
			
		||||
		Syslog:   syslog,
 | 
			
		||||
		AWS:      aws,
 | 
			
		||||
		Azure:    azure,
 | 
			
		||||
		Stride:   stride,
 | 
			
		||||
		HipChat:  hipChat,
 | 
			
		||||
		ChatWork: chatWork,
 | 
			
		||||
		Saas:     saas,
 | 
			
		||||
		CveDict:    cveDict,
 | 
			
		||||
		OvalDict:   ovalDict,
 | 
			
		||||
		Gost:       gost,
 | 
			
		||||
		Exploit:    exploit,
 | 
			
		||||
		Metasploit: metasploit,
 | 
			
		||||
		Slack:      slack,
 | 
			
		||||
		Email:      email,
 | 
			
		||||
		HTTP:       http,
 | 
			
		||||
		Syslog:     syslog,
 | 
			
		||||
		AWS:        aws,
 | 
			
		||||
		Azure:      azure,
 | 
			
		||||
		Stride:     stride,
 | 
			
		||||
		HipChat:    hipChat,
 | 
			
		||||
		ChatWork:   chatWork,
 | 
			
		||||
		Saas:       saas,
 | 
			
		||||
 | 
			
		||||
		Default: c.Conf.Default,
 | 
			
		||||
		Servers: c.Conf.Servers,
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,10 @@ func TestGetOrCreateServerUUID(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for testcase, v := range cases {
 | 
			
		||||
		uuid := getOrCreateServerUUID(v.scanResult, v.server)
 | 
			
		||||
		uuid, err := getOrCreateServerUUID(v.scanResult, v.server)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("%s", err)
 | 
			
		||||
		}
 | 
			
		||||
		if (uuid == defaultUUID) != v.isDefault {
 | 
			
		||||
			t.Errorf("%s : expected isDefault %t got %s", testcase, v.isDefault, uuid)
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								report/s3.go
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								report/s3.go
									
									
									
									
									
								
							@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -40,16 +23,24 @@ import (
 | 
			
		||||
// S3Writer writes results to S3
 | 
			
		||||
type S3Writer struct{}
 | 
			
		||||
 | 
			
		||||
func getS3() *s3.S3 {
 | 
			
		||||
	Config := &aws.Config{
 | 
			
		||||
func getS3() (*s3.S3, error) {
 | 
			
		||||
	ses, err := session.NewSession()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	config := &aws.Config{
 | 
			
		||||
		Region: aws.String(c.Conf.AWS.Region),
 | 
			
		||||
		Credentials: credentials.NewChainCredentials([]credentials.Provider{
 | 
			
		||||
			&credentials.EnvProvider{},
 | 
			
		||||
			&credentials.SharedCredentialsProvider{Filename: "", Profile: c.Conf.AWS.Profile},
 | 
			
		||||
			&ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())},
 | 
			
		||||
			&ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(ses)},
 | 
			
		||||
		}),
 | 
			
		||||
	}
 | 
			
		||||
	return s3.New(session.New(Config))
 | 
			
		||||
	s, err := session.NewSession(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return s3.New(s), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Write results to S3
 | 
			
		||||
@@ -59,7 +50,10 @@ func (w S3Writer) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	svc := getS3()
 | 
			
		||||
	svc, err := getS3()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Conf.FormatOneLineText {
 | 
			
		||||
		timestr := rs[0].ScannedAt.Format(time.RFC3339)
 | 
			
		||||
@@ -116,7 +110,11 @@ func (w S3Writer) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
 | 
			
		||||
// CheckIfBucketExists check the existence of S3 bucket
 | 
			
		||||
func CheckIfBucketExists() error {
 | 
			
		||||
	svc := getS3()
 | 
			
		||||
	svc, err := getS3()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := svc.ListBuckets(&s3.ListBucketsInput{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return xerrors.Errorf(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -51,7 +34,7 @@ type TempCredential struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type payload struct {
 | 
			
		||||
	GroupID      int    `json:"GroupID"`
 | 
			
		||||
	GroupID      int64  `json:"GroupID"`
 | 
			
		||||
	Token        string `json:"Token"`
 | 
			
		||||
	ScannedBy    string `json:"ScannedBy"`
 | 
			
		||||
	ScannedIPv4s string `json:"ScannedIPv4s"`
 | 
			
		||||
@@ -156,6 +139,7 @@ func (w SaasWriter) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
				tempCredential.S3Bucket, s3Key, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	util.Log.Infof("done")
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -33,12 +16,6 @@ import (
 | 
			
		||||
	"golang.org/x/xerrors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type field struct {
 | 
			
		||||
	Title string `json:"title"`
 | 
			
		||||
	Value string `json:"value"`
 | 
			
		||||
	Short bool   `json:"short"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type message struct {
 | 
			
		||||
	Text        string             `json:"text"`
 | 
			
		||||
	Username    string             `json:"username"`
 | 
			
		||||
@@ -87,8 +64,11 @@ func (w SlackWriter) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var ts string
 | 
			
		||||
			if _, ts, err = api.PostMessage(channel,
 | 
			
		||||
				summary, msgPrms); err != nil {
 | 
			
		||||
			if _, ts, err = api.PostMessage(
 | 
			
		||||
				channel,
 | 
			
		||||
				slack.MsgOptionText(summary, true),
 | 
			
		||||
				slack.MsgOptionPostMessageParameters(msgPrms),
 | 
			
		||||
			); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@@ -100,10 +80,14 @@ func (w SlackWriter) Write(rs ...models.ScanResult) (err error) {
 | 
			
		||||
				params := slack.PostMessageParameters{
 | 
			
		||||
					Username:        conf.AuthUser,
 | 
			
		||||
					IconEmoji:       conf.IconEmoji,
 | 
			
		||||
					Attachments:     m[k],
 | 
			
		||||
					ThreadTimestamp: ts,
 | 
			
		||||
				}
 | 
			
		||||
				if _, _, err = api.PostMessage(channel, "", params); err != nil {
 | 
			
		||||
				if _, _, err = api.PostMessage(
 | 
			
		||||
					channel,
 | 
			
		||||
					slack.MsgOptionText("", false),
 | 
			
		||||
					slack.MsgOptionPostMessageParameters(params),
 | 
			
		||||
					slack.MsgOptionAttachments(m[k]...),
 | 
			
		||||
				); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -339,14 +323,24 @@ func attachmentText(vinfo models.VulnInfo, osFamily string, cweDict map[string]m
 | 
			
		||||
func cweIDs(vinfo models.VulnInfo, osFamily string, cweDict models.CweDict) string {
 | 
			
		||||
	links := []string{}
 | 
			
		||||
	for _, c := range vinfo.CveContents.UniqCweIDs(osFamily) {
 | 
			
		||||
		name, url, top10Rank, top10URL := cweDict.Get(c.Value, osFamily)
 | 
			
		||||
		name, url, top10Rank, top10URL, cweTop25Rank, cweTop25URL, sansTop25Rank, sansTop25URL := cweDict.Get(c.Value, osFamily)
 | 
			
		||||
		line := ""
 | 
			
		||||
		if top10Rank != "" {
 | 
			
		||||
			line = fmt.Sprintf("<%s|[OWASP Top %s]>",
 | 
			
		||||
				top10URL, top10Rank)
 | 
			
		||||
		}
 | 
			
		||||
		links = append(links, fmt.Sprintf("%s <%s|%s>: %s",
 | 
			
		||||
			line, url, c.Value, name))
 | 
			
		||||
		if cweTop25Rank != "" {
 | 
			
		||||
			line = fmt.Sprintf("<%s|[CWE Top %s]>",
 | 
			
		||||
				cweTop25URL, cweTop25Rank)
 | 
			
		||||
		}
 | 
			
		||||
		if sansTop25Rank != "" {
 | 
			
		||||
			line = fmt.Sprintf("<%s|[CWE/SANS Top %s]>",
 | 
			
		||||
				sansTop25URL, sansTop25Rank)
 | 
			
		||||
		}
 | 
			
		||||
		if top10Rank == "" && cweTop25Rank == "" && sansTop25Rank == "" {
 | 
			
		||||
			links = append(links, fmt.Sprintf("%s <%s|%s>: %s",
 | 
			
		||||
				line, url, c.Value, name))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(links, "\n")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,3 @@
 | 
			
		||||
/* Vuls - Vulnerability Scanner
 | 
			
		||||
Copyright (C) 2016  Future Corporation , Japan.
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package report
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user