Top Level Namespace

Defined Under Namespace

Modules: HeimdallTools Classes: Control, Finding, SonarQubeApi, Thor

Constant Summary collapse

NA_STRING =
''.freeze
NA_TAG =
nil
NA_ARRAY =
[].freeze
NA_HASH =
{}.freeze
NA_FLOAT =
0.0
PLATFORM_NAME =
'Heimdall Tools'.freeze
RESOURCE_DIR =
Pathname.new(__FILE__).join('../../data')
CWE_NIST_MAPPING_FILE =
File.join(RESOURCE_DIR, 'cwe-nist-mapping.csv')
DEFAULT_NIST_TAG =
%w{SA-11 RA-5 Rev_4}.freeze
IMPACT_MAPPING =
{
  critical: 0.9,
  high: 0.7,
  medium: 0.5,
  low: 0.3,
  na: 0.0
}.freeze
SNYK_VERSION_REGEX =
'v(\d+.)(\d+.)(\d+)'.freeze
NIKTO_NIST_MAPPING_FILE =
File.join(RESOURCE_DIR, 'nikto-nist-mapping.csv')
NESSUS_PLUGINS_NIST_MAPPING_FILE =
File.join(RESOURCE_DIR, 'nessus-plugins-nist-mapping.csv')
U_CCI_LIST =

XCCDF mapping for converting SCAP client (SCC or OpenSCAP) outputs to HDF SCC output from the RHEL7 Lockdown image was used for testing

File.join(RESOURCE_DIR, 'U_CCI_List.xml')
DEFAULT_NIST_REV =

Nessus results file 800-53 refs does not contain Nist rev version. Using this default version in that case

'Rev_4'.freeze
NA_PLUGIN_OUTPUT =
'This Nessus Plugin does not provide output message.'.freeze
NIST_REFERENCE_NAME =
'Standards Mapping - NIST Special Publication 800-53 Revision 4'.freeze
CWE_REGEX =

severity maps to high, medium, low with weights all being 10.0 from the xml it doesn’t really look like SCAP or SCC cares about that value, just if its high, med, or low

'CWE-(\d*):'.freeze
MAPPING_FILES =
{
  cwe: '../data/cwe-nist-mapping.csv'.freeze,
    owasp: '../data/owasp-nist-mapping.csv'.freeze
}.freeze
AWS_CONFIG_MAPPING_FILE =
File.join(RESOURCE_DIR, 'aws-config-mapping.csv')
NOT_APPLICABLE_MSG =
'No AWS resources found to evaluate complaince for this rule'.freeze
INSUFFICIENT_DATA_MSG =
'Not enough data has been collected to determine compliance yet.'.freeze
OWASP_NIST_MAPPING_FILE =
File.join(RESOURCE_DIR, 'owasp-nist-mapping.csv')
SCOUTSUITE_NIST_MAPPING_FILE =
File.join(RESOURCE_DIR, 'scoutsuite-nist-mapping.csv')
INSPEC_INPUTS_MAPPING =
{
  string: 'String',
  numeric: 'Numeric',
  regexp: 'Regexp',
  array: 'Array',
  hash: 'Hash',
  boolean: 'Boolean',
  any: 'Any'
}.freeze
CCI_REGEX =
'CCI-(\d*)'.freeze

Instance Method Summary collapse

Instance Method Details

#check_response(response) ⇒ Object



23
24
25
# File 'lib/heimdall_tools/sonarqube_mapper.rb', line 23

def check_response(response)
  raise "API Error: #{response.response}\n#{response.body}" unless response.ok?
end

#xml_node_to_hash(node) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/utilities/xml_to_hash.rb', line 3

def xml_node_to_hash(node)
  # If we are at the root of the document, start the hash
  if node.element?
    result_hash = {}
    if node.attributes != {}
      attributes = {}
      node.attributes.each_key do |key|
        attributes[node.attributes[key].name] = node.attributes[key].value
      end
    end
    if node.children.empty?
      attributes
    else
      node.children.each do |child|
        result = xml_node_to_hash(child)

        if child.name == 'text'
          unless child.next_sibling || child.previous_sibling
            return result unless attributes

            result_hash[child.name] = result
          end
        elsif result_hash[child.name]

          if result_hash[child.name].is_a?(Object::Array)
            result_hash[child.name] << result
          else
            result_hash[child.name] = [result_hash[child.name]] << result
          end
        else
          result_hash[child.name] = result
        end
      end
      if attributes
        # add code to remove non-data attributes e.g. xml schema, namespace here
        # if there is a collision then node content supersets attributes
        result_hash = attributes.merge(result_hash)
      end
      result_hash
    end
  else
    node.content.to_s
  end
end

#xml_to_hash(xml) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/utilities/xml_to_hash.rb', line 48

def xml_to_hash(xml)
  begin
    data = Nokogiri::XML(xml, &:strict)
  rescue Nokogiri::XML::SyntaxError => e
    puts "XML Parsing caught exception: #{e}"
  end
  { data.root.name => xml_node_to_hash(data.root) }
end