module PWN::Plugins::BlackDuckBinaryAnalysis

def self.abort_product_scan(opts = {})

def self.abort_product_scan(opts = {})
n]
:product_id]
analysis_rest_call(
st,
uct/#{product_id}/abort"
e, symbolize_names: true)
 => e

def self.authors

def self.authors
st.pentest@0dayinc.com>

def self.bd_bin_analysis_rest_call(opts = {})

def self.bd_bin_analysis_rest_call(opts = {})
]
ts[:http_method].nil?
t
s[:http_method].to_s.scrub.to_sym
est_call].to_s.scrub
ms]
p_headers]
plication/json; charset=UTF-8',
earer #{token}"
ttp_body]
s_api_uri = 'https://protecode-sc.com/api'
Plugins::TransparentBrowser.open(browser_type: :rest)
er_obj[:browser]::Request
ner.new
s = 3
s ||= 1
= params
lient.execute(
thod,
_bin_analysis_api_uri}/#{rest_call}",
s,
se,
?(Hash)
y?(:raw)
ent_type] = nil
ttp_body[:file]
.key?(:multipart)
ent_type] = 'multipart/form-data'
ttp_body.to_json
lient.execute(
thod,
_bin_analysis_api_uri}/#{rest_call}",
s,
ody,
se,
ror("Unsupported HTTP Method #{http_method} for #{self} Plugin")
ceptionWithResponse => e
SE CODE: #{e.response.code}"
SE HEADERS:\n#{e.response.headers}"
SE BODY:\n#{e.response.body.inspect}\n\n\n"
or => e
est_attempts == max_request_attempts
ion Unavailable."
t_request_attempts} of #{max_request_attempts}) in 60s"
s += 1
=> e
st', '404 Resource Not Found'
e.response}"
 spinner.nil?

def self.create_group(opts = {})

def self.create_group(opts = {})
n]


parent_id]
ts[:delete_binary] ||= 'C'
 = opts[:binary_cleanup_age] ||= 2_592_000
e = opts[:product_cleanup_age] ||= 2_592_000
led = opts[:file_download_enabled] ||= false
 = opts[:low_risk_tolerance]
_vulns = opts[:include_historical_vulns]
pts[:cvss3_fallback]
sion_as_latest = opts[:assume_unknown_version_as_latest]
[:custom_data] ||= {}
ts[:scan_infoleak]
ts[:code_analysis]
ty = opts[:scan_code_similarity]
Bearer #{token}",
c,
d,
ter_scan: delete_binary,
ge: binary_cleanup_age,
age: product_cleanup_age,
abled: file_download_enabled,
ce: low_risk_tolerance,
al_vulnerabilities: include_historical_vulns,
cvss3_fallback,
ersion_as_latest: assume_unknown_version_as_latest,
tom_data,
can_infoleak,
ode_analysis,
rity: scan_code_similarity
analysis_rest_call(
st,
ps',
tp_headers
e, symbolize_names: true)
 => e

def self.delete_group(opts = {})

def self.delete_group(opts = {})
n]
roup_id]
analysis_rest_call(
lete,
ps/#{group_id}"
e, symbolize_names: true)
 => e

def self.generate_product_report(opts = {})

def self.generate_product_report(opts = {})
n]
:product_id]
[:output_path]
 ||= :csv_vulns
ncase.to_sym
duct/#{product_id}/csv-libs"
duct/#{product_id}/csv-vulns"
duct/#{product_id}/pdf-report"
valid report type #{type}"
analysis_rest_call(
call
path, response.body)
 => e

def self.get_apps(opts = {})

def self.get_apps(opts = {})
n]
analysis_rest_call(
'
e, symbolize_names: true)
 => e

def self.get_apps_by_group(opts = {})

def self.get_apps_by_group(opts = {})
n]
roup_id]
analysis_rest_call(
/#{group_id}"
e, symbolize_names: true)
 => e

def self.get_audit_trail(opts = {})

def self.get_audit_trail(opts = {})
n]
analysis_rest_call(
t-trail'
e, symbolize_names: true)
 => e

def self.get_component_licenses(opts = {})

def self.get_component_licenses(opts = {})
n]
analysis_rest_call(
onent-licenses'
e, symbolize_names: true)
 => e

def self.get_components(opts = {})

def self.get_components(opts = {})
n]
analysis_rest_call(
onents'
e, symbolize_names: true)
 => e

def self.get_group_details(opts = {})

def self.get_group_details(opts = {})
n]
roup_id]
analysis_rest_call(
ps/#{group_id}"
e, symbolize_names: true)
 => e

def self.get_group_statistics(opts = {})

def self.get_group_statistics(opts = {})
n]
roup_id]
analysis_rest_call(
ps/#{group_id}/statistics"
e, symbolize_names: true)
 => e

def self.get_groups(opts = {})

def self.get_groups(opts = {})
n]
analysis_rest_call(
ps'
e, symbolize_names: true)
 => e

def self.get_licenses(opts = {})

def self.get_licenses(opts = {})
n]
analysis_rest_call(
nses'
e, symbolize_names: true)
 => e

def self.get_product(opts = {})

def self.get_product(opts = {})
n]
:product_id]
analysis_rest_call(
uct/#{product_id}"
e, symbolize_names: true)
 => e

def self.get_service_info(opts = {})

def self.get_service_info(opts = {})
n]
analysis_rest_call(
ice/info'
e, symbolize_names: true)
 => e

def self.get_service_version(opts = {})

def self.get_service_version(opts = {})
n]
analysis_rest_call(
ice/version'
e, symbolize_names: true)
 => e

def self.get_status(opts = {})

def self.get_status(opts = {})
n]
analysis_rest_call(
us'
e, symbolize_names: true)
 => e

def self.get_tags(opts = {})

def self.get_tags(opts = {})
n]
analysis_rest_call(
'
e, symbolize_names: true)
 => e

def self.get_tasks(opts = {})

def self.get_tasks(opts = {})
n]
analysis_rest_call(
s'
e, symbolize_names: true)
 => e

def self.get_vendor_vulns(opts = {})

def self.get_vendor_vulns(opts = {})
n]
analysis_rest_call(
her/api/vulns'
e, symbolize_names: true)
 => e

def self.get_vulnerabilities(opts = {})

def self.get_vulnerabilities(opts = {})
n]
analysis_rest_call(
erabilities'
e, symbolize_names: true)
 => e

def self.help

def self.help
f}.get_apps(
ed - Bearer token'
Plugins::BlackDuckBinaryAnalysis.upload_file(
ed - Bearer token',
d - path of file to upload',
ional - group id',
 'optional - delete binary after upload (defaults to false)',
ptional - force scan (defaults to false)',
'optional - callback url',
 'optional - scan infoleak (defaults to true)',
 'optional - code analysis (defaults to true)',
liarity: 'optional - scan code familiarity (defaults to true)',
onal - version',
ptional - product id'
f}.get_product(
ed - Bearer token',
equired - product id'
f}.abort_product_scan(
ed - Bearer token',
equired - product id'
f}.generate_product_report(
ed - Bearer token',
equired - product id',
required - path to output file',
l - report type csv_libs||csv_vulns|pdf (Defaults to csv_vulns)'
f}.get_tasks(
ed - Bearer token'
f}.get_apps_by_group(
ed - Bearer token',
uired - group id'
f}.get_groups(
ed - Bearer token'
f}.create_group(
ed - Bearer token',
d - group name',
l - group description',
tional - parent_id group id',
 'optional - delete binary after analysis C|Y|N (Default: C== company default)',
_age: 'optional - after how long the binary will be deleted in seconds (Default: 2_592_000 / 30 days)',
p_age: 'optional - after how long the product will be deleted in seconds (Default: 2_592_000 / 30 days)',
enabled: 'optional - allow download of uploaded binaries from group (Default: false),
ance: 'optional - low risk tolerance nil|true|false (Default: nil == company default)',
ical_vulns: 'optional - include historical vulns nil|true|false (Default: nil == company default)',
: 'optional - cvss3 fallback nil|true|false (Default: nil == company default)',
_version_as_latest: 'optional - assume unknown version as latest nil|true|false (Default: nil == company default)',
optional - custom data hash (Default: {}, see group metadata for details)',
 'optional - scan infoleak nil|true|false (Default: nil == company default)',
 'optional - code analysis nil|true|false (Default: nil == company default)',
larity: 'optional - scan code similarity nil|true|false (Default: nil == company default)'
f}.get_group_details(
ed - Bearer token',
uired - group id'
f}.get_group_statistics(
ed - Bearer token',
uired - group id'
f}.delete_group(
ed - Bearer token',
uired - group id'
f}.get_licenses(
ed - Bearer token'
f}.get_component_licenses(
ed - Bearer token'
f}.get_tags(
ed - Bearer token'
f}.get_vulnerabilities(
ed - Bearer token'
f}.get_components(
ed - Bearer token'
f}.get_vendor_vulns(
ed - Bearer token'
f}.get_audit_trail(
ed - Bearer token'
f}.get_status(
ed - Bearer token'
f}.get_service_info(
ed - Bearer token'
f}.get_service_version(
ed - Bearer token'

def self.upload_file(opts = {})

def self.upload_file(opts = {})
n]

le} not found." unless File.exist?(file)
asename(file)
roup_id]
ue if opts[:delete_binary] ||= false
if opts[:force_scan] ||= false
s[:callback_url]
lse if opts[:scan_infoleak] ||= true
lse if opts[:code_analysis] ||= true
ity = false if opts[:scan_code_familiarity] ||= false
rsion]
:product_id]
Bearer #{token}",
elete_binary,
e_scan,

ck_url,
can_infoleak,
ode_analysis,
arity: scan_code_familiarity,
,
_id
e,
(file, 'rb')
ad(file)
analysis_rest_call(
t,
ad/#{CGI.escape_uri_component(file_name)}",
tp_headers,
body
e, symbolize_names: true)
 => e