falconz 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7a44850612a4491a8bc2ccb46218be8f36f80510
4
- data.tar.gz: 2b8f3f8708774e65bd77169bdcbd7652786d0a99
2
+ SHA256:
3
+ metadata.gz: a0e967b3178e27809a9bb0c71c48fef2e6ff1e450f560b43a76ba3fc4caebef0
4
+ data.tar.gz: 05a4e019d926775d4c305bac4fc714156e5b1eaf68ca14a3edb83b7155256895
5
5
  SHA512:
6
- metadata.gz: 7bc77c69372fdfae991f229a5e26b7e54c8f7e221764b9d2320f164491e824a3c9538ac4ad59d4a2281afc1b7235a9eaa6d4aedbf9849f51b7fe637d9eaed8d1
7
- data.tar.gz: e6dd9024bedfc6496a166ca35bcd7f2569da29be41b407e9b1cb029b023a0d5ed330dcffda9364afdbc4811c7bb9fd390d5c5003c59aedf86b9d3dc3fd81f9a2
6
+ metadata.gz: 2df07a457057f0a29d43e16d6fe3399014652862bf976d6fab3de337c010a634b571c44e27f4bafa282159ee7e4a98ee7d16143eb20522a1bb8a97114eb2c98a
7
+ data.tar.gz: e1f11b5808000e438b3cc1e403e12bee9fba06c122ce4cd66d22969a15c72cb1bc640d8d8937256c0fb477a0638224dcbed9638536a5e8f49f796ba37fed42c4
data/Gemfile.lock CHANGED
@@ -1,16 +1,21 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- falconz (1.0.0)
4
+ falconz (1.0.1)
5
5
  httparty (~> 0.16.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ coderay (1.1.2)
10
11
  diff-lcs (1.3)
11
12
  httparty (0.16.2)
12
13
  multi_xml (>= 0.5.2)
14
+ method_source (0.9.0)
13
15
  multi_xml (0.6.0)
16
+ pry (0.11.3)
17
+ coderay (~> 1.1.0)
18
+ method_source (~> 0.9.0)
14
19
  rake (10.5.0)
15
20
  rspec (3.7.0)
16
21
  rspec-core (~> 3.7.0)
@@ -32,8 +37,9 @@ PLATFORMS
32
37
  DEPENDENCIES
33
38
  bundler (~> 1.16)
34
39
  falconz!
40
+ pry
35
41
  rake (~> 10.0)
36
42
  rspec (~> 3.0)
37
43
 
38
44
  BUNDLED WITH
39
- 1.16.0
45
+ 1.16.1
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <img alt="i like birds" src="falcon.jpg"/>
6
6
  <p>
7
7
 
8
- Falcon Sandbox has a powerful and simple API that can be used to submit files/URLs for analysis, pull report data, but also perform advanced search queries. The API is open and free to the entire IT-security community.
8
+ [Falcon Sandbox](https://www.hybrid-analysis.com/docs/api/v2) has a powerful and simple API that can be used to submit files/URLs for analysis, pull report data, but also perform advanced search queries. The API is open and free to the entire IT-security community.
9
9
 
10
10
  ## Installation
11
11
 
@@ -13,7 +13,7 @@ Falcon Sandbox has a powerful and simple API that can be used to submit files/UR
13
13
 
14
14
  ## Usage
15
15
 
16
- Currently requires the `HYBRID_ANALYSIS_API_KEY` enviroment variable set to communicate with the API.
16
+ Currently requires the `HYBRID_ANALYSIS_API_KEY` environment variable set to communicate with the API.
17
17
 
18
18
  ```ruby
19
19
  require "falconz"
@@ -21,6 +21,16 @@ require "falconz"
21
21
  client = Falconz.client.new
22
22
  ```
23
23
 
24
+ Get the current file hashes that are being processed along with their environment IDs.
25
+ ```ruby
26
+ client.in_progress
27
+ # => [{:hash=>"b8560ce1bacb5515fdaef7cb3615a8172663da749b038687ab4a439cbf64f23b", :environment=>"100"},
28
+ # {:hash=>"4f456ae8d592a73be8e898384a6b78cf1406965bcb2cea38ffa976c1084acb74", :environment=>"120"},
29
+ # {:hash=>"6e206c74d4b9796264e5e2cb351e563806320e8d6d794fba38d3be93aa4b1bb5", :environment=>"100"},
30
+ # {:hash=>"8d5bd56a19d06d46c8e92552f0bf81fa38cbf3365ab022e97075810be18000d9", :environment=>"120"},
31
+ # {:hash=>"497f631d332b6b242528409778ecb7a778b1b50d6964139b549fdd71410381bc", :environment=>"120"}]
32
+ ```
33
+
24
34
  Upload a local file to the sandbox.
25
35
  ```ruby
26
36
  client.submit_file(file: "malware.exe", environment_id: 100)
@@ -47,6 +57,12 @@ client.number_of_environments
47
57
  # => 5
48
58
  ```
49
59
 
60
+ Get the available environments ID numbers.
61
+ ```ruby
62
+ client.environment_ids
63
+ # => [100, 110, 120, 300, 200]
64
+ ```
65
+
50
66
  Get information about current API key being used.
51
67
  ```ruby
52
68
  client.current_key
data/bin/console CHANGED
@@ -7,8 +7,8 @@ require "falconz"
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
9
  # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
10
+ require "pry"
11
+ Pry.start
12
12
 
13
- require "irb"
14
- IRB.start(__FILE__)
13
+ #require "irb"
14
+ #IRB.start(__FILE__)
data/examples/debug.rb CHANGED
@@ -4,5 +4,4 @@ require 'pry'
4
4
 
5
5
  client = Falconz::Client.new
6
6
 
7
-
8
7
  binding.pry
data/falconz.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency "httparty", "~> 0.16.2"
25
25
 
26
+ spec.add_development_dependency "pry"
26
27
  spec.add_development_dependency "bundler", "~> 1.16"
27
28
  spec.add_development_dependency "rake", "~> 10.0"
28
29
  spec.add_development_dependency "rspec", "~> 3.0"
@@ -1,9 +1,49 @@
1
1
  module Falconz
2
2
  module APIs
3
+ # A module consisting of the method associted with the
4
+ # Feed section of the API.
5
+ #
6
+ # @author Kent 'picat' Gruber
3
7
  module Feed
4
8
  # access a feed of last 250 reports over 24h
5
- def latest_feed(**options)
6
- get_request("/feed/latest", options)
9
+ #
10
+ # == Example
11
+ # client = Falconz.client.new
12
+ #
13
+ # client.latest_feed do |data|
14
+ # # do something with the data
15
+ # puts data.to_json
16
+ # end
17
+ #
18
+ # https://www.hybrid-analysis.com/docs/api/v2#/Feed/get_feed_latest
19
+ def latest_feed
20
+ # return response unless block was given ( like the in-line example )
21
+ return get_request('/feed/latest') unless block_given?
22
+ # capture response
23
+ response = get_request('/feed/latest')
24
+ # raise error (built out of the response) unless everything is ok
25
+ raise "response not ok: #{response}" unless Falconz.response_is_ok?(response)
26
+ # raise error unless there is any data
27
+ raise "no data to iterate through in response #{response}" unless response['data'] or !response['data'].zero?
28
+ response['data'].each do |data|
29
+ yield data
30
+ end
31
+ end
32
+
33
+ # A little wrapper method to #latest_feed that returns the count
34
+ # of the ammount of data found in the feed.
35
+ #
36
+ # @return [void]
37
+ # @see #latest_feed
38
+ def latest_feed_count
39
+ # capture response
40
+ response = latest_feed
41
+ # raise error (built out of the response) unless everything is ok
42
+ raise response unless Falconz.response_is_ok?(response)
43
+ # raise error unless there is any count in the response
44
+ raise "no count found in response #{response}" unless response['count']
45
+ # return the count
46
+ response["count"]
7
47
  end
8
48
  end
9
49
  end
@@ -2,8 +2,9 @@ module Falconz
2
2
  module APIs
3
3
  module Key
4
4
  # return information about the used API key
5
- def current_key(**options)
6
- get_request("/key/current", options)
5
+ # https://www.hybrid-analysis.com/docs/api/v2#/Key/get_key_current
6
+ def current_key
7
+ get_request("/key/current")
7
8
  end
8
9
  end
9
10
  end
@@ -1,30 +1,96 @@
1
1
  module Falconz
2
2
  module APIs
3
3
  module Report
4
- def report_state(id, **options)
5
- raise "ID in one of format: ‘jobId’ or ‘sha256:environmentId’" if id.nil?
6
- get_request("/report/#{id}/hash", options)
4
+ # return state of a submission
5
+ # https://www.hybrid-analysis.com/docs/api/v2#/Report/get_report__id__state
6
+ def report_state(id)
7
+ raise_if_id_is_not_valid(id)
8
+ get_request("/report/#{id}/hash")
7
9
  end
8
10
 
9
- def report_summary(id, **options)
10
- raise "ID in one of format: ‘jobId’ or ‘sha256:environmentId’" if id.nil?
11
- get_request("/report/#{id}/hash", options)
11
+ # return summary of a submission
12
+ # https://www.hybrid-analysis.com/docs/api/v2#/Report/get_report__id__summary
13
+ def report_summary(id)
14
+ raise_if_id_is_not_valid(id)
15
+ get_request("/report/#{id}/hash")
12
16
  end
13
17
 
14
- def report_file(id, type, **options)
15
- raise "ID in one of format: ‘jobId’ or ‘sha256:environmentId’" if id.nil?
16
- raise "Type requirest https://www.reverse.it/docs/api/v2#/Report/get_report__id__file__type_" if type.nil?
17
- get_request("/report/#{id}/file/#{type}", options)
18
+ # return summary of multiple submissions (bulk query)
19
+ # https://www.hybrid-analysis.com/docs/api/v2#/Report/post_report_summary
20
+ def report_summary(**options)
21
+ post_request("/report/summary", options)
18
22
  end
19
23
 
20
- def report_sreenshots(id, **options)
21
- raise "ID in one of format: ‘jobId’ or ‘sha256:environmentId’" if id.nil?
22
- get_request("/report/#{id}/screenshots", options)
24
+ # downloading report data (e.g. JSON, XML, PCAP)
25
+ # https://www.hybrid-analysis.com/docs/api/v2#/Report/get_report__id__file__type_
26
+ def report_file(id, type)
27
+ raise_if_id_is_not_valid(id)
28
+ raise_if_report_file_type_is_not_valid(type)
29
+ get_request("/report/#{id}/file/#{type}")
23
30
  end
24
31
 
25
- def report_droppedfiles(id, **options)
26
- raise "ID in one of format: ‘jobId’ or ‘sha256:environmentId’" if id.nil?
27
- get_request("/report/#{id}/dropped-files", options)
32
+ # retrieve an array of screenshots from a report in the Base64 format
33
+ # https://www.hybrid-analysis.com/docs/api/v2#/Report/get_report__id__screenshots
34
+ def report_sreenshots(id)
35
+ raise_if_id_is_not_valid(id)
36
+ get_request("/report/#{id}/screenshots")
37
+ end
38
+
39
+ # retrieve all extracted/dropped binaries files for a report, as zip
40
+ # https://www.hybrid-analysis.com/docs/api/v2#/Report/get_report__id__dropped_files
41
+ def report_droppedfiles(id)
42
+ raise_if_id_is_not_valid(id)
43
+ get_request("/report/#{id}/dropped-files")
44
+ end
45
+
46
+ private
47
+
48
+ # raise an error if the given ID isn't (probably) valid
49
+ def raise_if_id_is_not_valid(id)
50
+ unless id_is_in_probably_valid_format?(id)
51
+ raise "need if in format: ‘jobId’ or ‘sha256:environmentId’"
52
+ end
53
+ end
54
+
55
+ # check if a given ID is probably valid or not
56
+ # @see #report_file
57
+ def id_is_in_probably_valid_format?(id)
58
+ return false if id.nil?
59
+ return false unless id.is_a? String
60
+ return true
61
+ end
62
+
63
+ # valid report file types for #report_file
64
+ # @see #report_file
65
+ VALID_REPORT_FILE_TYPES = {
66
+ "xml": "The XML report as application/xml content and *.gz compressed.",
67
+ "json": "The JSON report as application/json content",
68
+ "html": "The HTML report as text/html content and *.gz compressed",
69
+ "pdf": "The PDF report as application/pdf content",
70
+ "maec": "The MAEC (4.1) report as application/xml content",
71
+ "stix": "The STIX report as application/xml content",
72
+ "misp": "The MISP XML report as application/xml content",
73
+ "misp-json": "The MISP JSON report as application/json content",
74
+ "openioc": "The OpenIOC (1.1) report as application/xml content",
75
+ "bin": "The binary sample as application/octet-stream and *.gz compressed. Note: if the file was uploaded with ‘no_share_vt’ (i.e. not shared), this might fail.",
76
+ "crt": "The binary sample certificate file (is available) as application/octet-stream content",
77
+ "memory": "The process memory dump files as application/octet-stream and zip compressed.",
78
+ "pcap": "The PCAP network traffic capture file as application/octet-stream and *.gz compressed."
79
+ }
80
+
81
+ # check if a report file type argument is valid
82
+ # @see #report_file
83
+ def report_file_type_is_valid?(type)
84
+ return true if VALID_REPORT_FILE_TYPES.keys.include? type.to_s.downcase
85
+ false
86
+ end
87
+
88
+ # raise an error if the report file type argument isn't valid
89
+ # @see #report_file
90
+ def raise_if_report_file_type_is_not_valid(type)
91
+ unless report_file_type_is_valid?(id)
92
+ raise "Type requires https://www.reverse.it/docs/api/v2#/Report/get_report__id__file__type:\n#{VALID_REPORT_FILE_TYPES}"
93
+ end
28
94
  end
29
95
  end
30
96
  end
@@ -2,6 +2,7 @@ module Falconz
2
2
  module APIs
3
3
  module Submission
4
4
  # submit a local file for analysis
5
+ # https://www.hybrid-analysis.com/docs/api/v2#/Submission/post_submit_file
5
6
  def submit_file(**options)
6
7
  options[:file] = File.open(options[:file], "r")
7
8
  response = post_request("/submit/file", options)
@@ -10,27 +11,29 @@ module Falconz
10
11
  end
11
12
 
12
13
  # submit a file by url for analysis
14
+ # https://www.hybrid-analysis.com/docs/api/v2#/Submission/post_submit_url_to_file
13
15
  def submit_file_by_url(**options)
14
16
  post_request("/submit/url-to-file", options)
15
17
  end
16
18
 
17
- # submit a url for analysis
19
+ # submit a url for analysis
20
+ # https://www.hybrid-analysis.com/docs/api/v2#/Submission/post_submit_url_for_analysis
18
21
  def submit_url(**options)
19
22
  post_request("/submit/url-for-analysis", options)
20
23
  end
24
+
25
+ # determine a SHA256 that an online file or URL submission will
26
+ # have when being processed by the system. Note: this is useful when looking up URL analysis
27
+ # https://www.hybrid-analysis.com/docs/api/v2#/Submission/post_submit_hash_for_url
28
+ def hash_for_url(url)
29
+ post_request("/submit/hash-for-url", url: url)
30
+ end
21
31
 
22
- # submit dropped file for analysis
32
+ # submit dropped file for analysis
33
+ # https://www.hybrid-analysis.com/docs/api/v2#/Submission/post_submit_dropped_file
23
34
  def submit_dropped_file(**options)
24
35
  post_request("/submit/dropped-file", options)
25
36
  end
26
-
27
- # determine a SHA256 that an online file or URL
28
- # submission will have when being processed by
29
- # the system. Note: this is useful when looking
30
- # up URL analysis
31
- def hash_from_url(**options)
32
- post_request("/submit/hash-for-url", options)
33
- end
34
37
  end
35
38
  end
36
39
  end
@@ -1,45 +1,83 @@
1
1
  module Falconz
2
2
  module APIs
3
3
  module System
4
- def system_heartbeat(wait = 15, **options)
5
- return get_request("/system/heartbeat", options) unless block_given?
4
+ # return heartbeat
5
+ #
6
+ # == Example
7
+ # client = Falconz.client.new
8
+ #
9
+ # client.system_heartbeat do |response|
10
+ # # do something with the response
11
+ # puts response.to_json
12
+ # end
13
+ #
14
+ # == Example without Block Syntax
15
+ # client = Falconz.client.new
16
+ #
17
+ # response = client.system_heartbeat
18
+ #
19
+ # https://www.hybrid-analysis.com/docs/api/v2#/System/get_system_heartbeat
20
+ def system_heartbeat(wait = 15)
21
+ return get_request("/system/heartbeat") unless block_given?
6
22
  while true
7
- yield get_request("/system/heartbeat", options)
23
+ yield get_request("/system/heartbeat")
8
24
  sleep wait
9
25
  end
10
26
  end
11
27
 
28
+ # check the number of seconds since last update
29
+ # @see #system_heartbeat
12
30
  def number_of_seconds_since_last_update
13
31
  system_heartbeat["number_of_seconds_since_last_update"]
14
32
  end
15
33
 
16
- def total_submissions_in_system(**options)
17
- get_request("/system/total-submissions", options)["value"]
18
- end
19
-
20
- def in_progress(**options)
21
- return get_request("/system/in-progress", options)["values"] unless block_given?
22
- get_request("/system/in-progress", options)["values"].each do |value|
23
- hash, env = value.split(":")
24
- yield hash, env
34
+ # check the total submissions in the system
35
+ # https://www.hybrid-analysis.com/docs/api/v2#/System/get_system_total_submissions
36
+ def total_submissions_in_system
37
+ get_request("/system/total-submissions")["value"]
38
+ end
39
+
40
+ # get the in progress jobs
41
+ # https://www.hybrid-analysis.com/docs/api/v2#/System/get_system_in_progress
42
+ def in_progress
43
+ jobs = get_request("/system/in-progress")["values"].map do |job|
44
+ kv = {}
45
+ kv[:hash], kv[:environment] = job.split(":")
46
+ kv
47
+ end
48
+ return jobs unless block_given?
49
+ jobs.each do |job|
50
+ yield job
25
51
  end
26
52
  end
27
-
28
- def backend(**options)
29
- get_request("/system/backend", options)
53
+
54
+ # number of jobs currently being processed
55
+ # @see #in_progress
56
+ def in_progress_count
57
+ get_request("/system/in-progress")["values"].count
58
+ end
59
+
60
+ # return information about configured backend nodes
61
+ # https://www.hybrid-analysis.com/docs/api/v2#/System/get_system_backend
62
+ def backend
63
+ get_request("/system/backend")
30
64
  end
31
-
32
- def environments(**options)
33
- return get_request("/system/environments", options) unless block_given?
34
- get_request("/system/environments", options).each do |enviroment|
35
- yield enviroment
65
+
66
+ # return information about available execution environments
67
+ # https://www.hybrid-analysis.com/docs/api/v2#/System/get_system_environments
68
+ def environments
69
+ return get_request("/system/environments") unless block_given?
70
+ get_request("/system/environments").each do |environment|
71
+ yield environment
36
72
  end
37
73
  end
38
74
 
75
+ # return the number of environments in the system
39
76
  def number_of_environments
40
77
  environments.count
41
78
  end
42
79
 
80
+ # find an environment by an ID
43
81
  def find_environment_by_id(id)
44
82
  id = id.to_i
45
83
  environments do |env|
@@ -47,7 +85,17 @@ module Falconz
47
85
  end
48
86
  end
49
87
 
50
- def enviroments_busy_percentages
88
+ # list available environment IDs
89
+ def environment_ids(refresh: false)
90
+ if refresh or @environment_ids.nil?
91
+ @environment_ids = environments.map { |env| env["id"] }
92
+ end
93
+ return @environment_ids unless block_given?
94
+ @environment_ids.each { |env| yield id }
95
+ end
96
+
97
+ # return environments
98
+ def environments_busy_percentages
51
99
  envs = {}
52
100
  environments do |env|
53
101
  if env["busy_virtual_machines"] == 0 || env["total_virtual_machines"] == 0
@@ -62,13 +110,15 @@ module Falconz
62
110
  end
63
111
  end
64
112
 
113
+ # check if a given environment ID is a windows system
65
114
  def environment_windows?(id)
66
115
  env = find_environment_by_id(id)
67
116
  return nil if env.nil?
68
117
  return true if env["architecture"] == "WINDOWS"
69
118
  false
70
119
  end
71
-
120
+
121
+ # check if a given environment ID is a linux system
72
122
  def environment_linux?(id)
73
123
  env = find_environment_by_id(id)
74
124
  return nil if env.nil?
@@ -76,16 +126,23 @@ module Falconz
76
126
  false
77
127
  end
78
128
 
79
- def system_state(**options)
80
- get_request("/system/state", options)
129
+ # a full system state query, including all available
130
+ # action scripts, environments, files in progress, etc.
131
+ # https://www.reverse.it/docs/api/v2#/System/get_system_state
132
+ def system_state
133
+ get_request("/system/state")
81
134
  end
82
135
 
83
- def system_version(**options)
84
- get_request("/system/version", options)
136
+ # return information about the instance version
137
+ # https://www.reverse.it/docs/api/v2#/System/get_system_version
138
+ def system_version
139
+ get_request("/system/version")
85
140
  end
86
-
87
- def queue_size(**options)
88
- get_request("/system/queue-size", options)["value"]
141
+
142
+ # return information about queue size
143
+ # https://www.reverse.it/docs/api/v2#/System/get_system_queue_size
144
+ def queue_size
145
+ get_request("/system/queue-size")["value"]
89
146
  end
90
147
  end
91
148
  end
@@ -5,6 +5,7 @@ require_relative "apis/key.rb"
5
5
  require_relative "apis/system.rb"
6
6
  require_relative "apis/submission.rb"
7
7
  require_relative "apis/feed.rb"
8
+ require_relative "apis/report.rb"
8
9
 
9
10
  module Falconz
10
11
  class Client
@@ -15,6 +16,7 @@ module Falconz
15
16
  include APIs::System
16
17
  include APIs::Submission
17
18
  include APIs::Feed
19
+ include APIs::Report
18
20
 
19
21
  def initialize
20
22
  @url = "https://www.hybrid-analysis.com/api/v2"
@@ -1,15 +1,14 @@
1
1
  module Falconz
2
2
  module REST
3
+ # HTTP 1.1 GET request method to make on the API endpoint.
4
+ #
5
+ # This is a module that is used in pretty much all the API
6
+ # modules in order to talk to the API endpoint.
3
7
  module GET
4
- def get_request(path, json: false, **options)
8
+ def get_request(path)
5
9
  response = HTTParty.get(url + path, headers: header)
6
- if response.success?
7
- return response.body if json
8
- return response
9
- else
10
- binding.pry
11
- raise response.to_h
12
- end
10
+ return response if response.success?
11
+ raise response
13
12
  end
14
13
  end
15
14
  end
@@ -1,3 +1,3 @@
1
1
  module Falconz
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/lib/falconz.rb CHANGED
@@ -11,4 +11,11 @@ module Falconz
11
11
  def self.client
12
12
  Client
13
13
  end
14
+
15
+ def self.response_is_ok?(resp)
16
+ return false unless resp.respond_to?(:has_key?)
17
+ return false unless resp.has_key? "status"
18
+ return true if resp["status"].match?("ok")
19
+ return false
20
+ end
14
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: falconz
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent 'picat' Gruber
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-10 00:00:00.000000000 Z
11
+ date: 2018-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.16.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -119,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
133
  version: '0'
120
134
  requirements: []
121
135
  rubyforge_project:
122
- rubygems_version: 2.6.12
136
+ rubygems_version: 2.7.6
123
137
  signing_key:
124
138
  specification_version: 4
125
139
  summary: Falcon Malware Sandbox APIv2 Connector