dobby 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -0
  3. data/.rubocop.yml +30 -0
  4. data/.rubocop_todo.yml +42 -0
  5. data/.travis.yml +12 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +8 -0
  8. data/CONTRIBUTING.md +60 -0
  9. data/Gemfile +8 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +103 -0
  12. data/Rakefile +8 -0
  13. data/bin/console +7 -0
  14. data/bin/setup +8 -0
  15. data/config/default.yml +8 -0
  16. data/dobby.gemspec +58 -0
  17. data/lib/dobby.rb +51 -0
  18. data/lib/dobby/builtins.rb +17 -0
  19. data/lib/dobby/cli.rb +64 -0
  20. data/lib/dobby/configuration.rb +58 -0
  21. data/lib/dobby/database.rb +62 -0
  22. data/lib/dobby/defect.rb +74 -0
  23. data/lib/dobby/dpkg.rb +21 -0
  24. data/lib/dobby/error.rb +6 -0
  25. data/lib/dobby/flag_manager.rb +67 -0
  26. data/lib/dobby/flags.yml +8 -0
  27. data/lib/dobby/formatter/abstract_formatter.rb +25 -0
  28. data/lib/dobby/formatter/colorizable.rb +41 -0
  29. data/lib/dobby/formatter/formatter_set.rb +79 -0
  30. data/lib/dobby/formatter/json_formatter.rb +42 -0
  31. data/lib/dobby/formatter/simple_formatter.rb +54 -0
  32. data/lib/dobby/options.rb +149 -0
  33. data/lib/dobby/package.rb +156 -0
  34. data/lib/dobby/package_source/abstract_package_source.rb +17 -0
  35. data/lib/dobby/package_source/dpkg_status_file.rb +85 -0
  36. data/lib/dobby/runner.rb +152 -0
  37. data/lib/dobby/scanner.rb +128 -0
  38. data/lib/dobby/severity.rb +66 -0
  39. data/lib/dobby/strategy.rb +168 -0
  40. data/lib/dobby/update_response.rb +19 -0
  41. data/lib/dobby/version.rb +24 -0
  42. data/lib/dobby/vuln_source/abstract_vuln_source.rb +26 -0
  43. data/lib/dobby/vuln_source/debian.rb +166 -0
  44. data/lib/dobby/vuln_source/ubuntu.rb +229 -0
  45. metadata +45 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 142cdae9558311a203acb38b453482bd4e75ce9fcf6d801da64d4816b9afcf58
4
- data.tar.gz: 0f85b49a7d03f4c97599d155f266010bad43c610aba4e5965568976e3b236588
3
+ metadata.gz: 23c15914a886f6ab773bf9123073dd7073839ec0d4cdac9c540b14dde7bcaaeb
4
+ data.tar.gz: fc562ad46721be21d3fef9069284d94ff01eab45128717d4d618cb8e7273ee68
5
5
  SHA512:
6
- metadata.gz: e0782eacf803d612e2c1d261063016de084ba58102df9416dff0bbdb16b23c8085027b515c4fe959a079f5392045e2b279df1e1fff1750b6f893bf4a0b2caecf
7
- data.tar.gz: 5a64a64e3d559be8996e41dac99f44b22b42fc4fb02075b7a319855ee95060c8a4a6d9f6b8a01e2e279c52c8ce636360773ea4fbc4554966b737fc53d21d6c77
6
+ metadata.gz: 487605c97b5052aa3731f9f92509cea471bb892ed6e72beb1f87f591e485c8993dd727d807dff7ff0454b0737268d9990756edc6d2758386035b963aed13d515
7
+ data.tar.gz: '09022e4f223629ebfb9d52e6bbc3140a710a9bb10b8dbc27c2eb0d5d8583db774cc4ffb58b869b5d6407a2acb5c4608acf4cc01c108f8fd3b60ee1c9802f3f05'
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ .byebug_history
14
+ .rspec
15
+
16
+ Gemfile.lock
@@ -0,0 +1,30 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ AllowSymlinksInCacheRootDirectory: true
5
+ TargetRubyVersion: 2.3
6
+
7
+ Metrics/BlockLength:
8
+ Exclude:
9
+ - 'spec/**/*'
10
+
11
+ Metrics/LineLength:
12
+ Max: 100
13
+
14
+ Metrics/ParameterLists:
15
+ Exclude:
16
+ - 'lib/dobby/package.rb'
17
+
18
+ Style/CaseEquality:
19
+ Exclude:
20
+ - 'lib/dobby/package.rb'
21
+ - 'spec/dobby/package_spec.rb'
22
+
23
+ Style/NumericPredicate:
24
+ Exclude:
25
+ - 'spec/**/*'
26
+ - 'lib/dobby/package.rb'
27
+
28
+ Style/Documentation:
29
+ Exclude:
30
+ - 'spec/**/*'
@@ -0,0 +1,42 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-08-28 07:57:28 -0700 using RuboCop version 0.58.2.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 5
10
+ Metrics/AbcSize:
11
+ Max: 45
12
+
13
+ # Offense count: 1
14
+ # Configuration parameters: CountComments, ExcludedMethods.
15
+ # ExcludedMethods: refine
16
+ Metrics/BlockLength:
17
+ Max: 33
18
+
19
+ # Offense count: 1
20
+ # Configuration parameters: CountComments.
21
+ Metrics/ClassLength:
22
+ Max: 130
23
+
24
+ # Offense count: 1
25
+ Metrics/CyclomaticComplexity:
26
+ Max: 12
27
+
28
+ # Offense count: 5
29
+ # Configuration parameters: CountComments.
30
+ Metrics/MethodLength:
31
+ Max: 52
32
+
33
+ # Offense count: 1
34
+ Metrics/PerceivedComplexity:
35
+ Max: 14
36
+
37
+ # Offense count: 2
38
+ Style/Documentation:
39
+ Exclude:
40
+ - 'spec/**/*'
41
+ - 'lib/debsecan/configuration.rb'
42
+ - 'lib/debsecan/options.rb'
@@ -0,0 +1,12 @@
1
+ sudo: false
2
+ cache: bundler
3
+ language: ruby
4
+ rvm:
5
+ - 2.2
6
+ - 2.3
7
+ - 2.4
8
+ - 2.5
9
+ - ruby-head
10
+ before_install: gem install bundler -v 1.16.2
11
+ install:
12
+ - bundle install
@@ -0,0 +1,2 @@
1
+ --markup markdown
2
+ --hide-void-return
@@ -0,0 +1,8 @@
1
+ # Change log
2
+
3
+ ## 0.1.0
4
+
5
+ Initial release. ([@bannable][])
6
+
7
+ [@bannable]: https://github.com/bannable
8
+
@@ -0,0 +1,60 @@
1
+ # Contributing
2
+
3
+ If you discover issues, have ideas for improvements or new features,
4
+ please report them to the [issue tracker][1] of the repository or
5
+ submit a pull request. Please, try to follow these guidelines when you
6
+ do so.
7
+
8
+ ## Issue reporting
9
+
10
+ * Check that the issue has not already been reported.
11
+ * Check that the issue has not already been fixed in the latest code
12
+ (a.k.a. `master`).
13
+ * Be clear, concise and precise in your description of the problem.
14
+ * Open an issue with a descriptive title and a summary in grammatically correct,
15
+ complete sentences.
16
+ * Include the gem version, `Dobby::VERSION`.
17
+ * Include any relevant code to the issue summary.
18
+
19
+ ## Pull requests
20
+ * Read [how to properly contribute to open source projects on GitHub][2].
21
+ * Fork the project.
22
+ * Use a topic/feature branch to easily amend a pull request later, if necessary.
23
+ * Write [good commit messages][3].
24
+ * Use the same coding conventions as the rest of the project.
25
+ * Commit and push until you are happy with your contribution.
26
+ * If your change has a corresponding open GitHub issue, prefix the commit message with `[Fix #github-issue-number]`.
27
+ * Make sure to add tests for it. This is important so I don't break it
28
+ in a future version unintentionally.
29
+ * Add an entry to the [Changelog](CHANGELOG.md) accordingly. See [changelog entry format](#changelog-entry-format).
30
+ * Please try not to mess with the Rakefile, version, or history. If
31
+ you want to have your own version, or is otherwise necessary, that
32
+ is fine, but please isolate to its own commit so I can cherry-pick
33
+ around it.
34
+ * Make sure the test suite is passing and the code you wrote doesn't produce
35
+ RuboCop offenses
36
+ * [Squash related commits together][5].
37
+ * Open a [pull request][4] that relates to *only* one subject with a clear title
38
+ and description in grammatically correct, complete sentences.
39
+
40
+ ### Changelog entry format
41
+
42
+ Here is an example:
43
+
44
+ ```
45
+ * Add the `fixed_by_target` method to show what is resolved if a Package is theoretically upgraded. ([@bannable][])
46
+ ```
47
+
48
+ * Mark it up in [Markdown syntax][6].
49
+ * The entry line should start with `* ` (an asterisk and a space).
50
+ * If the change has a related GitHub issue (e.g. a bug fix for a reported issue), put a link to the issue as `[#123](https://github.com/bbatsov/rubocop/issues/123): `.
51
+ * Describe the brief of the change. The sentence should end with a punctuation.
52
+ * At the end of the entry, add an implicit link to your GitHub user page as `([@username][])`.
53
+ * If this is your first contribution to RuboCop project, add a link definition for the implicit link to the bottom of the changelog as `[@username]: https://github.com/username`.
54
+
55
+ [1]: https://github.com/meraki/dobby/issues
56
+ [2]: http://gun.io/blog/how-to-github-fork-branch-and-pull-request
57
+ [3]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
58
+ [4]: https://help.github.com/articles/using-pull-requests
59
+ [5]: http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
60
+ [6]: http://daringfireball.net/projects/markdown/syntax
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
+
7
+ # Specify your gem's dependencies in dobby.gemspec
8
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Joe Truba
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,103 @@
1
+ # Dobby
2
+
3
+ Static analyzer library for DPKG-versioned packages.
4
+
5
+ This tool takes a set of versioned packages and compares those versions against
6
+ a source of version vulnerability information. The tool can implement arbitrary
7
+ strategies to this end, and at Meraki helps to answer these questions:
8
+
9
+ >On the current system or across all of our servers, which packages on those servers
10
+ >are impacted by published vulnerabilities?
11
+
12
+ >Of the packages with published vulnerabilities, which have fix versions currently
13
+ >available in the repository upstream, and what are those fix versions for each
14
+ >distribution?
15
+
16
+ >If a process is running version 1 of a service, and version 2 is installed
17
+ >on the system, which vulnerabilities (if any) are addressed by a service restart?
18
+
19
+ For building the package set, included is `DpkgStatusFile`, which by default builds
20
+ a package set from `/var/lib/dpkg/status`, but can read and parase any similarly
21
+ formatted file.
22
+
23
+ For vulnerability information source, two strategies are included:
24
+ * `VulnSource::Debian`: Retrieve CVE/etc information from the Debian Security Tracker.
25
+ * `VulnSource::Ubuntu`: Checkout and parse the Ubuntu Security Tracker using bzr.
26
+
27
+ Initializing the vulnerability database can be expensive in time, bandwidth
28
+ and space. It is recommended that you initialize only a single vulnerability
29
+ database for processing multiple package sets.
30
+
31
+ ## Usage
32
+
33
+ As a gem:
34
+ ```ruby
35
+ require 'dobby'
36
+ package_set = []
37
+ [file1, file2].each do |f|
38
+ package_set << Dobby::PackageSource::DpkgStatusFile.new(file_path: f)
39
+ end
40
+
41
+ strategy = Dobby::VulnSource::Debian.new
42
+ database = Dobby::Database.new(strategy)
43
+ scanner = Dobby::Scanner.new(nil, database)
44
+
45
+ package_set.each do |package_source|
46
+ packages = package_source.parse
47
+ scanner.packages = packages
48
+ puts scanner.scan
49
+ end
50
+ ```
51
+
52
+ From the command line:
53
+ ```
54
+ # Output issues for the current system as pretty text to stdout
55
+ dobby /var/lib/dpkg/status
56
+
57
+ # ... and also write issues as JSON to file.json
58
+ dobby -f simple -f json -o file.json /var/lib/dpkg/status
59
+
60
+ # Show issues for multiple files
61
+ dobby file1 file2 file3
62
+ ```
63
+
64
+ As a gem with a custom output formatter:
65
+ ```ruby
66
+ # my_custom_executor.rb
67
+ require 'dobby'
68
+ require 'my/custom/formatter'
69
+
70
+ cli = Dobby::CLI.new
71
+ cli.run
72
+
73
+ # CLI:
74
+ my_custom_executor.rb -f My::Custom::Formatter /var/lib/dpkg/status
75
+ ```
76
+
77
+ ## Compatibility
78
+
79
+ Dobby supports the following Ruby implementations:
80
+
81
+ * MRI 2.2
82
+ * MRI 2.3
83
+ * MRI 2.4
84
+ * MRI 2.5
85
+ * MRI trunk
86
+
87
+ ## Building
88
+
89
+ ```
90
+ rake build
91
+ ```
92
+
93
+ ## Contributing
94
+
95
+ If you have found a bug or have a feature idea, take a look at the [contribution guidelines](CONTRIBUTING.md).
96
+
97
+ ## Changelog
98
+
99
+ The changelog is available [here](CHANGELOG.md).
100
+
101
+ ## License
102
+
103
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'dobby'
6
+
7
+ Pry.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,8 @@
1
+ # DO NOT EDIT THIS FILE! IT HAS BEEN AUTO-GENERATED.
2
+ #
3
+ # To make changes, use script/dobby_filter.rb
4
+ #
5
+ ---
6
+ :whitelist: {}
7
+ :allowed: {}
8
+
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('lib/dobby/version', __dir__)
4
+
5
+ # rubocop:disable Metrics/BlockLength
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'dobby'
8
+ spec.version = Dobby::Version::STRING
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ['Joe Truba']
11
+ spec.email = ['joe@bannable.net']
12
+
13
+ spec.summary = 'Vulnerability reporter for dpkg systems'
14
+ spec.description = <<-DESCRIPTION
15
+ Library for injesting descriptions of dpkg based systems (primarily
16
+ Debian and Ubuntu), vulnerability database for those distributions and identifying
17
+ which installed packages are impacted by which vulnerability defects, if any.
18
+ DESCRIPTION
19
+
20
+ spec.homepage = 'https://github.com/bannable/dobby'
21
+ spec.license = 'MIT'
22
+
23
+ spec.required_ruby_version = ['~> 2', '>= 2.2']
24
+
25
+ spec.metadata = {
26
+ 'changelog_uri' => 'https://github.com/bannable/dobby/blob/master/CHANGELOG.md',
27
+ 'source_code_uri' => 'https://github.com/bannable/dobby',
28
+ 'bug_tracker_uri' => 'https://github.com/bannable/dobby/issues'
29
+ }
30
+
31
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
32
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
+ end
34
+
35
+ spec.bindir = 'exe'
36
+ spec.executables = ['dobby']
37
+
38
+ spec.add_development_dependency 'rake', '~> 12.0'
39
+ spec.add_development_dependency 'rspec', '~> 3.0'
40
+ spec.add_development_dependency 'rubocop', '~> 0.52'
41
+ spec.add_development_dependency 'simplecov', '~> 0'
42
+ spec.add_development_dependency 'timecop', '~> 0.9'
43
+
44
+ spec.add_runtime_dependency 'apt-pkg', ['~> 0.4', '>= 0.2']
45
+ spec.add_runtime_dependency 'curb', '~> 0.9'
46
+ spec.add_runtime_dependency 'hashie', '~> 3.5'
47
+ spec.add_runtime_dependency 'oj', '~> 3'
48
+ spec.add_runtime_dependency 'parallel', '~> 1.12'
49
+ spec.add_runtime_dependency 'powerpack', '~> 0.1'
50
+ spec.add_runtime_dependency 'pry', '~> 0'
51
+ spec.add_runtime_dependency 'pry-byebug', '~> 3'
52
+ spec.add_runtime_dependency 'rainbow', '~> 3'
53
+ spec.add_runtime_dependency 'yard', '~> 0.9.16'
54
+
55
+ spec.requirements << 'libapt-pkg-dev > 1.0'
56
+ spec.requirements << 'bzr (when using VulnSource::Ubuntu)'
57
+ end
58
+ # rubocop:enable Metrics/BlockLength
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'curb'
4
+ require 'debian/apt_pkg'
5
+ require 'digest'
6
+ require 'hashie'
7
+ require 'oj'
8
+ require 'optparse'
9
+ require 'pry'
10
+ require 'psych'
11
+ require 'pp'
12
+ require 'rainbow'
13
+ require 'singleton'
14
+ require 'shellwords'
15
+
16
+ require 'powerpack/string/strip_indent'
17
+ require 'powerpack/string/blank'
18
+
19
+ require_relative 'dobby/version'
20
+
21
+ require_relative 'dobby/error'
22
+ require_relative 'dobby/update_response'
23
+
24
+ require_relative 'dobby/configuration'
25
+ require_relative 'dobby/database'
26
+ require_relative 'dobby/defect'
27
+ require_relative 'dobby/dpkg'
28
+ require_relative 'dobby/flag_manager'
29
+ require_relative 'dobby/package'
30
+ require_relative 'dobby/severity'
31
+ require_relative 'dobby/strategy'
32
+
33
+ require_relative 'dobby/package_source/abstract_package_source'
34
+ require_relative 'dobby/package_source/dpkg_status_file'
35
+
36
+ require_relative 'dobby/vuln_source/abstract_vuln_source'
37
+ require_relative 'dobby/vuln_source/debian'
38
+ require_relative 'dobby/vuln_source/ubuntu'
39
+
40
+ require_relative 'dobby/formatter/colorizable'
41
+ require_relative 'dobby/formatter/abstract_formatter'
42
+ require_relative 'dobby/formatter/simple_formatter'
43
+ require_relative 'dobby/formatter/json_formatter'
44
+ require_relative 'dobby/formatter/formatter_set'
45
+
46
+ require_relative 'dobby/scanner'
47
+
48
+ require_relative 'dobby/builtins'
49
+ require_relative 'dobby/options'
50
+ require_relative 'dobby/runner'
51
+ require_relative 'dobby/cli'