heimdall_tools 1.3.34 → 1.3.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d54d4b22df45a476f595fcb5e915848a0ab4afdedab5bc01aed87a4aeb98daba
4
- data.tar.gz: 9f0b90c76302fe9eea2508d04b9b6df33907ed7a1d775ffc7ac0cc1150573f09
3
+ metadata.gz: 30a8aa48d76c322433d3b7233585d2f7265c5d9906147f904a56d7c37468943d
4
+ data.tar.gz: de9c85b3ec842451ba8ccd52ef66b516390677c1d9971e602c434cc21725d619
5
5
  SHA512:
6
- metadata.gz: c2d99103ccb593b133e51cf5df81d9fa6d31426b24ba4b311840bdcbbf8aaa611c16db127eae2a10a6994113ce182e1d80f0716b341838e7bd1fa1120eced474
7
- data.tar.gz: 8368dd53348c22851413faef53ee02515b64a8ef69a5ca02b81174d491b7db3129d158c02ce96733157e21d48bfa2e2922f5c0ab899465761256f4bf58027489
6
+ metadata.gz: 735203a3dedc20625a366530d50c5f0e11a5a654a13f1264b53dd239b6902a851b35ea49ae1b783714399d6c2215ebf137a2c54e4edb6a2c7e40e3a17ef1d8db
7
+ data.tar.gz: 19b63fc27d52ede491025d7880771e31ffeaf090707b73885970b9455e4c81bda1c15b428621436e8086f9e6d5521d6810fd1000df4f2900fe8b57911fc44488
data/README.md CHANGED
@@ -12,6 +12,7 @@ HeimdallTools supplies several methods to convert output from various tools to "
12
12
  - **nessus_mapper** - commercial vulnerability scanner
13
13
  - **snyk_mapper** - commercial package vulnerability scanner
14
14
  - **nikto_mapper** - open-source web server scanner
15
+ - **jfrog_xray_mapper** - package vulnerability scanner
15
16
 
16
17
  Ruby 2.4 or higher (check using "ruby -v")
17
18
 
@@ -181,6 +182,21 @@ FLAGS:
181
182
  example: heimdall_tools nikto_mapper -j nikto_results.json -o nikto_results.json
182
183
  ```
183
184
 
185
+ ## jfrog_xray_mapper
186
+
187
+ jfrog_xray_mapper translates an JFrog Xray results JSON file into HDF format JSON to be viewable in Heimdall
188
+
189
+ ```
190
+ USAGE: heimdall_tools jfrog_xray_mapper [OPTIONS] -j <xray-results-json> -o <hdf-scan-results.json>
191
+
192
+ FLAGS:
193
+ -j <xray_results_json> : path to xray results JSON file.
194
+ -o --output <scan-results> : path to output scan-results json.
195
+ -V --verbose : verbose run [optional].
196
+
197
+ example: heimdall_tools jfrog_xray_mapper -j xray_results.json -o xray_results_hdf.json
198
+ ```
199
+
184
200
  ## version
185
201
 
186
202
  Prints out the gem version
@@ -64,10 +64,13 @@
64
64
  251, Often Misused: String Management,,4,
65
65
  252, Unchecked Return Value,,4,
66
66
  256, Plaintext Storage of a Password,SC-28,4,Protection of Information at Rest
67
+ 257, Storing Passwords in a Recoverable Format,IA-5,4,Authenticator Management
67
68
  258, Empty Password in Configuration File,SC-28,4,Protection of Information at Rest
68
69
  259, Use of Hard-coded Password,,4,
69
70
  260, Password in Configuration File,SC-28,4,Protection of Information at Rest
70
71
  261, Weak Cryptography for Passwords,SC-13,4,Cryptographic Protection
72
+ 262, Not Using Password Aging,IA-5,4,Authenticator Management
73
+ 263, Password Aging with Long Expiration,IA-5,4,Authenticator Management
71
74
  265, Privilege / Sandbox Issues,AC-6,4,Least Privilege
72
75
  269, Improper Privilege Management,AC-4,4,Information Flow Enforcement
73
76
  272, Least Privilege Violation,AC-6,4,Least Privilege: Privilege Levels for Code Execution -8
@@ -175,8 +178,9 @@
175
178
  662, Improper Synchonization,,4,
176
179
  667, Improper Locking,,4,
177
180
  676, Use of Potentially Dangerous Function,,4,
178
- 690,: Unchecked Return Value to NULL Pointer Dereference,,4,
181
+ 690, Unchecked Return Value to NULL Pointer Dereference,,4,
179
182
  691, Insufficient Control Flow Management,SI-11,4,Error Handling
183
+ 693, Protection Mechanism Failure,IA-5,4,Authenticator Management
180
184
  694, Use of Multiple Resources with Duplicate Identifier,,4,
181
185
  732, Incorrect Permission Assignment for Critical Resource,AC-3,4,Access Enforcement
182
186
  733, Compiler Optimization Removal or Modification of Security-critical Code,,4,
@@ -12,4 +12,5 @@ module HeimdallTools
12
12
  autoload :NessusMapper, 'heimdall_tools/nessus_mapper'
13
13
  autoload :SnykMapper, 'heimdall_tools/snyk_mapper'
14
14
  autoload :NiktoMapper, 'heimdall_tools/nikto_mapper'
15
+ autoload :JfrogXrayMapper, 'heimdall_tools/jfrog_xray_mapper'
15
16
  end
@@ -87,6 +87,18 @@ module HeimdallTools
87
87
  puts "#{options[:output]}"
88
88
  end
89
89
 
90
+ desc 'jfrog_xray_mapper', 'jfrog_xray_mapper translates Jfrog Xray results Json to HDF format Json be viewed on Heimdall'
91
+ long_desc Help.text(:jfrog_xray_mapper)
92
+ option :json, required: true, aliases: '-j'
93
+ option :output, required: true, aliases: '-o'
94
+ option :verbose, type: :boolean, aliases: '-V'
95
+ def jfrog_xray_mapper
96
+ hdf = HeimdallTools::JfrogXrayMapper.new(File.read(options[:json])).to_hdf
97
+ File.write(options[:output], hdf)
98
+ puts "\r\HDF Generated:\n"
99
+ puts "#{options[:output]}"
100
+ end
101
+
90
102
  desc 'version', 'prints version'
91
103
  def version
92
104
  puts VERSION
@@ -3,6 +3,7 @@ require 'heimdall_tools/hdf'
3
3
  require 'utilities/xml_to_hash'
4
4
 
5
5
  NIST_REFERENCE_NAME = 'Standards Mapping - NIST Special Publication 800-53 Revision 4'.freeze
6
+ DEFAULT_NIST_TAG = ["SA-11", "RA-5"].freeze
6
7
 
7
8
  module HeimdallTools
8
9
  class FortifyMapper
@@ -68,7 +69,7 @@ module HeimdallTools
68
69
  references = rule['References']['Reference']
69
70
  references = [references] unless references.is_a?(Array)
70
71
  tag = references.detect { |x| x['Author'].eql?(NIST_REFERENCE_NAME) }
71
- tag.nil? ? 'unmapped' : tag['Title'].match(/[a-zA-Z][a-zA-Z]-\d{1,2}/)
72
+ tag.nil? ? DEFAULT_NIST_TAG : tag['Title'].match(/[a-zA-Z][a-zA-Z]-\d{1,2}/)
72
73
  end
73
74
 
74
75
  def impact(classid)
@@ -0,0 +1,5 @@
1
+ jfrog_xray_mapper translates an JFrog Xray results JSON file into HDF format JSON to be viewable in Heimdall
2
+
3
+ Examples:
4
+
5
+ heimdall_tools jfrog_xray_mapper -j xray_results.json -o output-file-name.json
@@ -0,0 +1,142 @@
1
+ require 'json'
2
+ require 'csv'
3
+ require 'heimdall_tools/hdf'
4
+ require 'utilities/xml_to_hash'
5
+
6
+ RESOURCE_DIR = Pathname.new(__FILE__).join('../../data')
7
+
8
+ CWE_NIST_MAPPING_FILE = File.join(RESOURCE_DIR, 'cwe-nist-mapping.csv')
9
+
10
+ IMPACT_MAPPING = {
11
+ high: 0.7,
12
+ medium: 0.5,
13
+ low: 0.3,
14
+ }.freeze
15
+
16
+ DEFAULT_NIST_TAG = ["SA-11", "RA-5"].freeze
17
+
18
+ # Loading spinner sign
19
+ $spinner = Enumerator.new do |e|
20
+ loop do
21
+ e.yield '|'
22
+ e.yield '/'
23
+ e.yield '-'
24
+ e.yield '\\'
25
+ end
26
+ end
27
+
28
+ module HeimdallTools
29
+ class JfrogXrayMapper
30
+ def initialize(xray_json, name=nil, verbose = false)
31
+ @xray_json = xray_json
32
+ @verbose = verbose
33
+
34
+ begin
35
+ @cwe_nist_mapping = parse_mapper
36
+ @project = JSON.parse(xray_json)
37
+
38
+ rescue StandardError => e
39
+ raise "Invalid JFrog Xray JSON file provided Exception: #{e}"
40
+ end
41
+ end
42
+
43
+ def finding(vulnerability)
44
+ finding = {}
45
+ finding['status'] = 'failed'
46
+ finding['code_desc'] = []
47
+ finding['code_desc'] << "source_comp_id : #{vulnerability['source_comp_id'].to_s }"
48
+ finding['code_desc'] << "vulnerable_versions : #{vulnerability['component_versions']['vulnerable_versions'].to_s }"
49
+ finding['code_desc'] << "fixed_versions : #{vulnerability['component_versions']['fixed_versions'].to_s }"
50
+ finding['code_desc'] << "issue_type : #{vulnerability['issue_type'].to_s }"
51
+ finding['code_desc'] << "provider : #{vulnerability['provider'].to_s }"
52
+ finding['code_desc'] = finding['code_desc'].join("\n")
53
+ finding['run_time'] = NA_FLOAT
54
+
55
+ # Xray results does not profile scan timestamp; using current time to satisfy HDF format
56
+ finding['start_time'] = NA_STRING
57
+ [finding]
58
+ end
59
+
60
+ def nist_tag(cweid)
61
+ entries = @cwe_nist_mapping.select { |x| cweid.include? x[:cweid].to_s }
62
+ tags = entries.map { |x| x[:nistid] }
63
+ tags.empty? ? DEFAULT_NIST_TAG : tags.flatten.uniq
64
+ end
65
+
66
+ def parse_identifiers(vulnerability, ref)
67
+ # Extracting id number from reference style CWE-297
68
+ vulnerability['component_versions']['more_details']['cves'][0][ref.downcase].map { |e| e.split("#{ref}-")[1] }
69
+ rescue
70
+ return []
71
+ end
72
+
73
+ def impact(severity)
74
+ IMPACT_MAPPING[severity.downcase.to_sym]
75
+ end
76
+
77
+ def parse_mapper
78
+ csv_data = CSV.read(CWE_NIST_MAPPING_FILE, **{ encoding: 'UTF-8',
79
+ headers: true,
80
+ header_converters: :symbol,
81
+ converters: :all })
82
+ csv_data.map(&:to_hash)
83
+ end
84
+
85
+ def desc_tags(data, label)
86
+ { "data": data || NA_STRING, "label": label || NA_STRING }
87
+ end
88
+
89
+ # Xray report could have multiple vulnerability entries for multiple findings of same issue type.
90
+ # The meta data is identical across entries
91
+ # method collapse_duplicates return unique controls with applicable findings collapsed into it.
92
+ def collapse_duplicates(controls)
93
+ unique_controls = []
94
+
95
+ controls.map { |x| x['id'] }.uniq.each do |id|
96
+ collapsed_results = controls.select { |x| x['id'].eql?(id) }.map {|x| x['results']}
97
+ unique_control = controls.find { |x| x['id'].eql?(id) }
98
+ unique_control['results'] = collapsed_results.flatten
99
+ unique_controls << unique_control
100
+ end
101
+ unique_controls
102
+ end
103
+
104
+ def to_hdf
105
+ controls = []
106
+ vulnerability_count = 0
107
+ @project['data'].uniq.each do | vulnerability |
108
+ printf("\rProcessing: %s", $spinner.next)
109
+
110
+ vulnerability_count +=1
111
+ item = {}
112
+ item['tags'] = {}
113
+ item['descriptions'] = []
114
+ item['refs'] = NA_ARRAY
115
+ item['source_location'] = NA_HASH
116
+ item['descriptions'] = NA_ARRAY
117
+
118
+ # Xray JSONs might note have `id` fields populated.
119
+ # If thats a case MD5 hash is used to collapse vulnerability findings of the same type.
120
+ item['id'] = vulnerability['id'].empty? ? OpenSSL::Digest::MD5.digest(vulnerability['summary'].to_s).unpack("H*")[0].to_s : vulnerability['id']
121
+ item['title'] = vulnerability['summary'].to_s
122
+ item['desc'] = vulnerability['component_versions']['more_details']['description'].to_s
123
+ item['impact'] = impact(vulnerability['severity'].to_s)
124
+ item['code'] = NA_STRING
125
+ item['results'] = finding(vulnerability)
126
+
127
+ item['tags']['nist'] = nist_tag( parse_identifiers( vulnerability, 'CWE') )
128
+ item['tags']['cweid'] = parse_identifiers( vulnerability, 'CWE')
129
+
130
+ controls << item
131
+ end
132
+
133
+ controls = collapse_duplicates(controls)
134
+ results = HeimdallDataFormat.new(profile_name: "JFrog Xray Scan",
135
+ version: NA_STRING,
136
+ title: "JFrog Xray Scan",
137
+ summary: "Continuous Security and Universal Artifact Analysis",
138
+ controls: controls)
139
+ results.to_hdf
140
+ end
141
+ end
142
+ end
@@ -5,6 +5,8 @@ require 'heimdall_tools/hdf'
5
5
 
6
6
  RESOURCE_DIR = Pathname.new(__FILE__).join('../../data')
7
7
 
8
+ DEFAULT_NIST_TAG = ["SA-11", "RA-5"].freeze
9
+
8
10
  MAPPING_FILES = {
9
11
  cwe: File.join(RESOURCE_DIR, 'cwe-nist-mapping.csv'),
10
12
  owasp: File.join(RESOURCE_DIR, 'owasp-nist-mapping.csv')
@@ -237,7 +239,7 @@ class Control
237
239
  return [@mappings[tag_type][parsed_tag]].flatten.uniq
238
240
  end
239
241
 
240
- ['unmapped'] # HDF expects this to be a list, but not an empty list even if there aren't results
242
+ DEFAULT_NIST_TAG # Entries with unmapped NIST tags are defaulted to NIST tags ‘SA-11, RA-5 Rev_4’
241
243
  end
242
244
 
243
245
  def hdf
@@ -7,6 +7,7 @@ require 'heimdall_tools/hdf'
7
7
  RESOURCE_DIR = Pathname.new(__FILE__).join('../../data')
8
8
 
9
9
  CWE_NIST_MAPPING_FILE = File.join(RESOURCE_DIR, 'cwe-nist-mapping.csv')
10
+ DEFAULT_NIST_TAG = ["SA-11", "RA-5"].freeze
10
11
 
11
12
  # rubocop:disable Metrics/AbcSize
12
13
 
@@ -66,7 +67,7 @@ module HeimdallTools
66
67
  def nist_tag(cweid)
67
68
  entries = @cwe_nist_mapping.select { |x| x[:cweid].to_s.eql?(cweid.to_s) }
68
69
  tags = entries.map { |x| [x[:nistid], "Rev_#{x[:rev]}"] }
69
- tags.empty? ? ['unmapped'] : tags.flatten.uniq
70
+ tags.empty? ? DEFAULT_NIST_TAG : tags.flatten.uniq
70
71
  end
71
72
 
72
73
  def impact(riskcode)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heimdall_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.34
4
+ version: 1.3.35
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Thew
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-08-19 00:00:00.000000000 Z
13
+ date: 2021-02-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -96,20 +96,6 @@ dependencies:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
98
  version: '2.1'
99
- - !ruby/object:Gem::Dependency
100
- name: nori
101
- requirement: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - "~>"
104
- - !ruby/object:Gem::Version
105
- version: '2.6'
106
- type: :runtime
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: '2.6'
113
99
  - !ruby/object:Gem::Dependency
114
100
  name: git-lite-version-bump
115
101
  requirement: !ruby/object:Gem::Requirement
@@ -166,20 +152,6 @@ dependencies:
166
152
  - - ">="
167
153
  - !ruby/object:Gem::Version
168
154
  version: '0'
169
- - !ruby/object:Gem::Dependency
170
- name: codeclimate-test-reporter
171
- requirement: !ruby/object:Gem::Requirement
172
- requirements:
173
- - - ">="
174
- - !ruby/object:Gem::Version
175
- version: '0'
176
- type: :development
177
- prerelease: false
178
- version_requirements: !ruby/object:Gem::Requirement
179
- requirements:
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- version: '0'
183
155
  - !ruby/object:Gem::Dependency
184
156
  name: rake
185
157
  requirement: !ruby/object:Gem::Requirement
@@ -222,11 +194,13 @@ files:
222
194
  - lib/heimdall_tools/help.rb
223
195
  - lib/heimdall_tools/help/burpsuite_mapper.md
224
196
  - lib/heimdall_tools/help/fortify_mapper.md
197
+ - lib/heimdall_tools/help/jfrog_xray_mapper.md
225
198
  - lib/heimdall_tools/help/nessus_mapper.md
226
199
  - lib/heimdall_tools/help/nikto_mapper.md
227
200
  - lib/heimdall_tools/help/snyk_mapper.md
228
201
  - lib/heimdall_tools/help/sonarqube_mapper.md
229
202
  - lib/heimdall_tools/help/zap_mapper.md
203
+ - lib/heimdall_tools/jfrog_xray_mapper.rb
230
204
  - lib/heimdall_tools/nessus_mapper.rb
231
205
  - lib/heimdall_tools/nikto_mapper.rb
232
206
  - lib/heimdall_tools/snyk_mapper.rb
@@ -253,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
227
  - !ruby/object:Gem::Version
254
228
  version: '0'
255
229
  requirements: []
256
- rubygems_version: 3.1.2
230
+ rubygems_version: 3.2.3
257
231
  signing_key:
258
232
  specification_version: 4
259
233
  summary: Convert Forify, Openzap and Sonarqube results to HDF