dradis-veracode 4.13.0 → 4.14.0

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: e7a6bf17b3d57590b7d4714a464e144bb6663a8298b0716810df645b0ec6948e
4
- data.tar.gz: 90f4a540c99ef2c63f469f8ca91cd6c0417a0438049bf30783f629f521201b72
3
+ metadata.gz: 377e92adc3f11ee6e82f78c510986e3b39321d26810ae37f88630aa86f799684
4
+ data.tar.gz: 73d9d5ecac85b5b97b75525f6fc7f4e182e0f7742f917bd56444daecd0087284
5
5
  SHA512:
6
- metadata.gz: 59fc19179ea7543d2ee191edf88f72dbf83eaf3e0367bc9c64be26ba9f45b62706624dd68c7ac84aa1d7d4a73d412fb995726205464e28cfe6e42b48a799c65e
7
- data.tar.gz: 5ac98a895646eca1c074b1c0976963c4d5397ce5e67b802d1c71601b630044afdff0d3bc3066ad1d403b50fb823f489e2fcd2ee8f69bbf98f223bd89a4861dec
6
+ metadata.gz: 8a4e88b7881297ffddecfb2c9e349e1e88cdfa5a84b4fd755bab1ccdc9a03c2569e513aaae874fd27324f33afb711255ab483cea456d94f3117e9a333ac0848b
7
+ data.tar.gz: 4007fbf71e3e6d5586947f51e54088712c1776af832b3ab4ab49d8612733355bbc0400767f3917fde38e2d8f363237e870eb5637a6b1c343b0d1a68396aa9574
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ v4.14.0 (October 2024)
2
+ - Import data from the software composition analysis section
3
+
1
4
  v4.13.0 (July 2024)
2
5
  - Add `issueid`, `line`, `module`, `sourcefile`, & `sourcefilepath` as available issue fields
3
6
 
@@ -4,14 +4,15 @@ module Dradis
4
4
  class FieldProcessor < Dradis::Plugins::Upload::FieldProcessor
5
5
  def post_initialize(args = {})
6
6
  @record =
7
- if (data.is_a?(::Veracode::Flaw) || data.is_a?(::Veracode::Evidence))
7
+ if data.is_a?(::Veracode::Flaw) || data.is_a?(::Veracode::Evidence) || data.is_a?(::Veracode::Vulnerability)
8
8
  data
9
-
10
9
  # Note: The evidence and flaw samples are the same but they need to
11
10
  # be differentiated in the plugins manager preview. In that case,
12
11
  # we're adding a "dradis_type" attribute in the evidence.sample file
13
- elsif (data['dradis_type'] == 'evidence')
12
+ elsif data['dradis_type'] == 'evidence'
14
13
  ::Veracode::Evidence.new(data.at_xpath('./staticflaws/flaw'))
14
+ elsif data.name == 'component'
15
+ ::Veracode::Vulnerability.new(data.at_xpath('./vulnerabilities/vulnerability'))
15
16
  else
16
17
  ::Veracode::Flaw.new(data.at_xpath('./staticflaws/flaw'))
17
18
  end
@@ -0,0 +1,19 @@
1
+ module Dradis::Plugins::Veracode::Formats
2
+ module Flaw
3
+
4
+ private
5
+
6
+ def parse_flaw(xml_flaw)
7
+ cwe_id = xml_flaw[:cweid]
8
+ logger.info { "\t\t => Creating issue and evidence (flaw cweid: #{ cwe_id })" }
9
+
10
+ flaw = ::Veracode::Flaw.new(xml_flaw)
11
+ issue_text = mapping_service.apply_mapping(source: 'issue', data: flaw)
12
+ issue = content_service.create_issue(text: issue_text, id: cwe_id)
13
+
14
+ evidence = ::Veracode::Evidence.new(xml_flaw)
15
+ evidence_text = mapping_service.apply_mapping(source: 'evidence', data: evidence)
16
+ content_service.create_evidence(content: evidence_text, issue: issue, node: node)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module Dradis::Plugins::Veracode::Formats
2
+ module Vulnerability
3
+
4
+ private
5
+
6
+ def parse_vulnerability(xml_vuln)
7
+ cve_id = xml_vuln[:cve_id]
8
+ vuln = ::Veracode::Vulnerability.new(xml_vuln)
9
+ issue_text = mapping_service.apply_mapping(source: 'sca_issue', data: vuln)
10
+ issue = content_service.create_issue(text: issue_text, id: cve_id)
11
+
12
+ evidence = ::Veracode::Vulnerability.new(xml_vuln)
13
+ evidence_text = mapping_service.apply_mapping(source: 'sca_evidence', data: evidence)
14
+ content_service.create_evidence(content: evidence_text, issue: issue, node: node)
15
+ end
16
+ end
17
+ end
@@ -8,7 +8,7 @@ module Dradis
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 4
11
- MINOR = 13
11
+ MINOR = 14
12
12
  TINY = 0
13
13
  PRE = nil
14
14
 
@@ -1,7 +1,12 @@
1
1
  module Dradis::Plugins::Veracode
2
2
  class Importer < Dradis::Plugins::Upload::Importer
3
+ attr_accessor :node
4
+
5
+ include Dradis::Plugins::Veracode::Formats::Flaw
6
+ include Dradis::Plugins::Veracode::Formats::Vulnerability
7
+
3
8
  def self.templates
4
- { evidence: 'evidence', issue: 'issue' }
9
+ { evidence: ['evidence', 'sca_evidence'], issue: ['issue', 'sca_issue'] }
5
10
  end
6
11
 
7
12
  # The framework will call this function if the user selects this plugin from
@@ -25,15 +30,22 @@ module Dradis::Plugins::Veracode
25
30
  end
26
31
 
27
32
  # create app_name, and parse attributes
28
- node = parse_report_details(xml.root)
33
+ @node = parse_report_details(xml.root)
29
34
 
30
- # parse each severity > category > cwe > flaws
31
- xml.root.xpath('./xmlns:severity').each do |xml_severity|
35
+ # parse each severity > category > cwe > staticflaws > flaw
36
+ xml.root.xpath('xmlns:severity').each do |xml_severity|
32
37
  logger.info { "\t => Severity (level: #{ xml_severity[:level] })" }
33
- xml_severity.xpath('.//xmlns:flaw').each do |xml_flaw|
34
- parse_flaw(xml_flaw, node)
38
+ xml_severity.xpath('./xmlns:category/xmlns:cwe/xmlns:staticflaws/xmlns:flaw').each do |xml_flaw|
39
+ parse_flaw(xml_flaw)
35
40
  end
36
41
  end
42
+
43
+ # parse each software_composition_analysis > ... > vulnerability
44
+ xml.root.xpath(
45
+ 'xmlns:software_composition_analysis/xmlns:vulnerable_components//xmlns:vulnerability'
46
+ ).each do |xml_vuln|
47
+ parse_vulnerability(xml_vuln)
48
+ end
37
49
  end
38
50
 
39
51
  private
@@ -54,18 +66,5 @@ module Dradis::Plugins::Veracode
54
66
  app_node.save
55
67
  app_node
56
68
  end
57
-
58
- def parse_flaw(xml_flaw, node)
59
- cwe_id = xml_flaw[:cweid]
60
- logger.info { "\t\t => Creating issue and evidence (flaw cweid: #{ cwe_id })" }
61
-
62
- flaw = ::Veracode::Flaw.new(xml_flaw)
63
- issue_text = mapping_service.apply_mapping(source: 'issue', data: flaw)
64
- issue = content_service.create_issue(text: issue_text, id: cwe_id)
65
-
66
- veracode_evidence = ::Veracode::Evidence.new(xml_flaw)
67
- evidence_text = mapping_service.apply_mapping(source: 'evidence', data: veracode_evidence)
68
- evidence = content_service.create_evidence(content: evidence_text, issue: issue, node: node)
69
- end
70
69
  end
71
70
  end
@@ -18,6 +18,18 @@ module Dradis::Plugins::Veracode
18
18
  'Category' => '{{ veracode[issue.categoryname] }}',
19
19
  'CWE' => '{{ veracode[issue.cweid] }}',
20
20
  'RemediationStatus' => '{{ veracode[issue.remediation_status] }}'
21
+ },
22
+ sca_evidence: {
23
+ 'File' => "{{ veracode[sca_evidence.file_name] }}\n{{ veracode[sca_evidence.file_path_value] }}",
24
+ 'Library' => "{{ veracode[sca_evidence.library] }}\n{{ veracode[sca_evidence.library_id] }}",
25
+ 'Mitigation' => "{{ veracode[sca_evidence.mitigation] }}"
26
+ },
27
+ sca_issue: {
28
+ 'Title' => '{{ veracode[sca_issue.cve_id] }}',
29
+ 'Description' => '{{ veracode[sca_issue.cve_summary] }}',
30
+ 'Severity' => '{{ veracode[sca_issue.severity_desc] }}',
31
+ 'Notes' => "CWE: {{ veracode[sca_issue.cwe_id] }}\nCVSS: {{ veracode[sca_issue.cvss_score] }}\nAffects policy compliance: {{ veracode[sca_issue.vulnerability_affects_policy_compliance] }}",
32
+ 'Mitigation' => "{{ veracode[sca_issue.mitigation] }}"
21
33
  }
22
34
  }.freeze
23
35
 
@@ -53,6 +65,23 @@ module Dradis::Plugins::Veracode
53
65
  'issue.severity',
54
66
  'issue.sourcefile',
55
67
  'issue.sourcefilepath'
68
+ ],
69
+ sca_evidence: [
70
+ 'sca_evidence.file_name',
71
+ 'sca_evidence.file_path_value',
72
+ 'sca_evidence.library',
73
+ 'sca_evidence.library_id',
74
+ 'sca_evidence.mitigation',
75
+ ],
76
+ sca_issue: [
77
+ 'sca_issue.cve_id',
78
+ 'sca_issue.cve_summary',
79
+ 'sca_issue.cvss_score',
80
+ 'sca_issue.cwe_id',
81
+ 'sca_issue.mitigation',
82
+ 'sca_issue.severity',
83
+ 'sca_issue.severity_desc',
84
+ 'sca_issue.vulnerability_affects_policy_compliance'
56
85
  ]
57
86
  }.freeze
58
87
  end
@@ -7,6 +7,8 @@ end
7
7
 
8
8
  require 'dradis/plugins/veracode/engine'
9
9
  require 'dradis/plugins/veracode/field_processor'
10
+ require 'dradis/plugins/veracode/formats/vulnerability'
11
+ require 'dradis/plugins/veracode/formats/flaw'
10
12
  require 'dradis/plugins/veracode/mapping'
11
13
  require 'dradis/plugins/veracode/importer'
12
14
  require 'dradis/plugins/veracode/version'
@@ -7,3 +7,4 @@ require 'dradis/plugins/veracode'
7
7
  # Load supporting Veracode classes
8
8
  require 'veracode/evidence'
9
9
  require 'veracode/flaw'
10
+ require 'veracode/vulnerability'
@@ -0,0 +1,58 @@
1
+ module Veracode
2
+ class Vulnerability
3
+ attr_reader :xml_vulnerability
4
+
5
+ def initialize(xml_vulnerability)
6
+ @xml = xml_vulnerability
7
+ end
8
+
9
+ # List of supported tags. They can be attributes, simple descendans or
10
+ # collections (e.g. <references/>, <tags/>)
11
+ def supported_tags
12
+ [
13
+ :cve_id, :cve_summary, :cvss_score, :cwe_id, :file_name, :file_path,
14
+ :library, :library_id, :mitigation, :severity, :severity_desc,
15
+ :vulnerability_affects_policy_compliance
16
+ ]
17
+ end
18
+
19
+ # This allows external callers (and specs) to check for implemented
20
+ # properties
21
+ def respond_to?(method, include_private = false)
22
+ return true if supported_tags.include?(method.to_sym)
23
+ super
24
+ end
25
+
26
+ # This method is invoked by Ruby when a method that is not defined in this
27
+ # instance is called.
28
+ #
29
+ # In our case we inspect the @method@ parameter and try to find the
30
+ # attribute, simple descendent or collection that it maps to in the XML
31
+ # tree.
32
+ def method_missing(method, *args)
33
+ # We could remove this check and return nil for any non-recognized tag.
34
+ # The problem would be that it would make tricky to debug problems with
35
+ # typos. For instance: <>.potr would return nil instead of raising an
36
+ # exception
37
+ unless supported_tags.include?(method)
38
+ super
39
+ return
40
+ end
41
+
42
+ method_name = method.to_s
43
+
44
+ if method_name == 'mitigation'
45
+ return @xml.xpath('.//*:mitigation').map do |mitigation|
46
+ "#{mitigation.attr('action')}\n#{mitigation.attr('description')}\n#{mitigation.attr('date')}"
47
+ end.join("\n\n")
48
+ end
49
+
50
+ # First we try the attributes
51
+ return @xml.attributes[method_name].value if @xml.attributes.key?(method_name)
52
+
53
+ # Next we try the parent <component> attributes
54
+ component = @xml.parent.parent
55
+ return component.attributes[method_name].value if component.attributes.key?(method_name)
56
+ end
57
+ end
58
+ end
@@ -2,12 +2,13 @@ require 'spec_helper'
2
2
  require 'ostruct'
3
3
 
4
4
  describe Dradis::Plugins::Veracode::Importer do
5
-
6
5
  before(:each) do
7
6
  # Stub template service
8
7
  templates_dir = File.expand_path('../../../../../templates', __FILE__)
9
- expect_any_instance_of(Dradis::Plugins::TemplateService)
10
- .to receive(:default_templates_dir).and_return(templates_dir)
8
+
9
+ mapping_service = double('Dradis::Plugins::MappingService')
10
+ allow(mapping_service).to receive(:apply_mapping).and_return('')
11
+ allow(Dradis::Plugins::MappingService).to receive(:new).and_return(mapping_service)
11
12
 
12
13
  # Init services
13
14
  plugin = Dradis::Plugins::Veracode
@@ -36,13 +37,11 @@ describe Dradis::Plugins::Veracode::Importer do
36
37
  it 'creates nodes, issues, and, evidence' do
37
38
  expect(@content_service).to receive(:create_node).with(hash_including label: 'Cybersecurity-Pilot').once
38
39
 
39
- %w{ 117 382 }.each do |cweid|
40
+ %w{ 117 382 CVE-2022-41404 CVE-2022-36033 SRCCLR-SID-22742 CVE-2022-42889 }.each do |cweid|
40
41
  expect(@content_service).to receive(:create_issue).with(hash_including id: cweid).at_least(:once)
41
42
  end
42
43
 
43
- %w{ 107 129 333 }.each do |line|
44
- expect(@content_service).to receive(:create_evidence).with(hash_including(content: a_string_matching(/#{line}/))).once
45
- end
44
+ expect(@content_service).to receive(:create_evidence).with(hash_including(content: '')).at_least(7).times
46
45
 
47
46
  # Run the import
48
47
  @importer.import(file: 'spec/fixtures/files/veracode.xml')
@@ -0,0 +1,19 @@
1
+ <component component_id="hash" file_name="filename.jar" sha1="" vulnerabilities="1" max_cvss_score="5.0" version="0.1.1" library="library" library_id="library_id" vendor="library.org" description="Sample description" added_date="2022-12-12 08&#x3a;19&#x3a;55 UTC" component_affects_policy_compliance="false">
2
+ <file_paths>
3
+ <file_path value="file_path"/>
4
+ </file_paths>
5
+ <licenses>
6
+ <license name="License" spdx_id="Apache-2.0" license_url="example.com" risk_rating="2" mitigation="false" license_affects_policy_compliance="false">
7
+ <mitigations/>
8
+ </license>
9
+ </licenses>
10
+ <vulnerabilities>
11
+ <vulnerability cve_id="CVE-2022-11111" cvss_score="5.0" severity="3" cwe_id="" first_found_date="2022-12-12 08&#x3a;19&#x3a;55 UTC" cve_summary="CVE Summary" severity_desc="Medium" mitigation="true" mitigation_type="Mitigate by Design" mitigated_date="2022-12-12 16&#x3a;00&#x3a;29 UTC" vulnerability_affects_policy_compliance="false">
12
+ <mitigations>
13
+ <mitigation action="Approve Mitigation" description="asda" user="sample_user" date="2022-12-12 16&#x3a;00&#x3a;55 UTC"/>
14
+ <mitigation action="Mitigate by Design" description="fdsa" user="sample_user" date="2022-12-12 15&#x3a;59&#x3a;55 UTC"/>
15
+ </mitigations>
16
+ </vulnerability>
17
+ </vulnerabilities>
18
+ <violated_policy_rules/>
19
+ </component>
@@ -0,0 +1,19 @@
1
+ <component component_id="hash" file_name="filename.jar" sha1="" vulnerabilities="1" max_cvss_score="5.0" version="0.1.1" library="library" library_id="library_id" vendor="library.org" description="Sample description" added_date="2022-12-12 08&#x3a;19&#x3a;55 UTC" component_affects_policy_compliance="false">
2
+ <file_paths>
3
+ <file_path value="file_path"/>
4
+ </file_paths>
5
+ <licenses>
6
+ <license name="License" spdx_id="Apache-2.0" license_url="example.com" risk_rating="2" mitigation="false" license_affects_policy_compliance="false">
7
+ <mitigations/>
8
+ </license>
9
+ </licenses>
10
+ <vulnerabilities>
11
+ <vulnerability cve_id="CVE-2022-11111" cvss_score="5.0" severity="3" cwe_id="" first_found_date="2022-12-12 08&#x3a;19&#x3a;55 UTC" cve_summary="CVE Summary" severity_desc="Medium" mitigation="true" mitigation_type="Mitigate by Design" mitigated_date="2022-12-12 16&#x3a;00&#x3a;29 UTC" vulnerability_affects_policy_compliance="false">
12
+ <mitigations>
13
+ <mitigation action="Approve Mitigation" description="asda" user="sample_user" date="2022-12-12 16&#x3a;00&#x3a;55 UTC"/>
14
+ <mitigation action="Mitigate by Design" description="fdsa" user="sample_user" date="2022-12-12 15&#x3a;59&#x3a;55 UTC"/>
15
+ </mitigations>
16
+ </vulnerability>
17
+ </vulnerabilities>
18
+ <violated_policy_rules/>
19
+ </component>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dradis-veracode
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.13.0
4
+ version: 4.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dradis Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-07 00:00:00.000000000 Z
11
+ date: 2024-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dradis-plugins
@@ -102,6 +102,8 @@ files:
102
102
  - lib/dradis/plugins/veracode.rb
103
103
  - lib/dradis/plugins/veracode/engine.rb
104
104
  - lib/dradis/plugins/veracode/field_processor.rb
105
+ - lib/dradis/plugins/veracode/formats/flaw.rb
106
+ - lib/dradis/plugins/veracode/formats/vulnerability.rb
105
107
  - lib/dradis/plugins/veracode/gem_version.rb
106
108
  - lib/dradis/plugins/veracode/importer.rb
107
109
  - lib/dradis/plugins/veracode/mapping.rb
@@ -109,11 +111,14 @@ files:
109
111
  - lib/tasks/thorfile.rb
110
112
  - lib/veracode/evidence.rb
111
113
  - lib/veracode/flaw.rb
114
+ - lib/veracode/vulnerability.rb
112
115
  - spec/dradis/plugins/veracode/importer_spec.rb
113
116
  - spec/fixtures/files/veracode.xml
114
117
  - spec/spec_helper.rb
115
118
  - templates/evidence.sample
116
119
  - templates/issue.sample
120
+ - templates/sca_evidence.sample
121
+ - templates/sca_issue.sample
117
122
  homepage: https://dradis.com/integrations/veracode.html
118
123
  licenses:
119
124
  - GPL-2