contrast-agent 7.5.0 → 7.6.1

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/ext/cs__common/cs__common.c +5 -5
  3. data/ext/cs__contrast_patch/cs__contrast_patch.c +2 -1
  4. data/ext/cs__scope/cs__scope.c +6 -5
  5. data/lib/contrast/agent/assess/events/event_data.rb +11 -2
  6. data/lib/contrast/agent/assess/finalizers/freeze.rb +1 -0
  7. data/lib/contrast/agent/assess/finalizers/hash.rb +7 -0
  8. data/lib/contrast/agent/assess/policy/patcher.rb +2 -0
  9. data/lib/contrast/agent/assess/policy/policy.rb +4 -0
  10. data/lib/contrast/agent/assess/policy/policy_node.rb +29 -7
  11. data/lib/contrast/agent/assess/policy/preshift.rb +34 -1
  12. data/lib/contrast/agent/assess/policy/propagation_method.rb +16 -1
  13. data/lib/contrast/agent/assess/policy/propagation_node.rb +40 -1
  14. data/lib/contrast/agent/assess/policy/propagator/append.rb +5 -0
  15. data/lib/contrast/agent/assess/policy/propagator/base.rb +10 -0
  16. data/lib/contrast/agent/assess/policy/propagator/buffer.rb +6 -0
  17. data/lib/contrast/agent/assess/policy/propagator/center.rb +14 -0
  18. data/lib/contrast/agent/assess/policy/propagator/custom.rb +6 -0
  19. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +14 -0
  20. data/lib/contrast/agent/assess/policy/propagator/insert.rb +6 -0
  21. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +38 -0
  22. data/lib/contrast/agent/assess/policy/propagator/next.rb +6 -0
  23. data/lib/contrast/agent/assess/policy/propagator/prepend.rb +5 -0
  24. data/lib/contrast/agent/assess/policy/propagator/remove.rb +4 -0
  25. data/lib/contrast/agent/assess/policy/propagator/replace.rb +5 -0
  26. data/lib/contrast/agent/assess/policy/propagator/reverse.rb +5 -0
  27. data/lib/contrast/agent/assess/policy/propagator/select.rb +30 -0
  28. data/lib/contrast/agent/assess/policy/propagator/splat.rb +10 -0
  29. data/lib/contrast/agent/assess/policy/source_node.rb +5 -1
  30. data/lib/contrast/agent/assess/policy/source_validation/cross_site_validator.rb +4 -0
  31. data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +16 -0
  32. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +19 -0
  33. data/lib/contrast/agent/assess/policy/trigger_method.rb +8 -1
  34. data/lib/contrast/agent/assess/policy/trigger_node.rb +11 -1
  35. data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +4 -0
  36. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +6 -0
  37. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +6 -0
  38. data/lib/contrast/agent/assess/rule/response/base_rule.rb +2 -1
  39. data/lib/contrast/agent/hooks/at_exit_hook.rb +1 -0
  40. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +1 -1
  41. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +35 -7
  42. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +8 -2
  43. data/lib/contrast/agent/reporting/reporting_utilities/reporting_storage.rb +1 -6
  44. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +4 -3
  45. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +22 -12
  46. data/lib/contrast/agent/request/request.rb +1 -1
  47. data/lib/contrast/agent/request/request_handler.rb +1 -0
  48. data/lib/contrast/agent/version.rb +1 -1
  49. data/lib/contrast/configuration.rb +1 -1
  50. data/lib/contrast/utils/hash_digest.rb +0 -14
  51. data/lib/contrast/utils/hash_digest_extend.rb +16 -5
  52. data/lib/contrast/utils/json.rb +1 -1
  53. data/lib/contrast/utils/middleware_utils.rb +9 -0
  54. data/lib/contrast/utils/routes_sent.rb +3 -2
  55. data/lib/contrast.rb +2 -2
  56. data/resources/assess/policy.json +50 -1
  57. data/ruby-agent.gemspec +13 -13
  58. metadata +24 -23
@@ -14,7 +14,6 @@ module Contrast
14
14
  include Contrast::Agent::Reporting::NgResponseExtractor
15
15
  include Contrast::Agent::Reporting::ResponseExtractor
16
16
 
17
- ANALYZE_WHEN = %w[200 204].cs__freeze
18
17
  ERROR_CODES = {
19
18
  message_not_sent: '400',
20
19
  access_forbidden: '401',
@@ -68,7 +67,7 @@ module Contrast
68
67
 
69
68
  # check if response code is valid before analyze it
70
69
  #
71
- # @param response [Net::HTTP::Response, nil]
70
+ # @param response [Net::HTTPResponse, nil]
72
71
  # @return [Boolean]
73
72
  def analyze_response? response
74
73
  # Code descriptions:
@@ -112,13 +111,12 @@ module Contrast
112
111
  # used for in observed routes message.
113
112
  return false unless response && (response_code = response&.code)
114
113
 
115
- # We still need to check the response code even if we are not analyzing it, since the 304 code does not
116
- # contain settings to be extracted but we still need to know for the diagnostics. Do not move this bellow
117
- # the ANALYZE_WHEN check.
118
114
  @_last_response_code = response_code
119
- return true if ANALYZE_WHEN.include?(response_code)
115
+ return true if response_code == '200'
116
+ return false if response_code == '204'
117
+ return false if response_code == '304'
120
118
 
121
- handle_error(response) if ERROR_CODES.value?(response_code)
119
+ handle_error(response) if ERROR_CODES.value?(response_code) && response&.body
122
120
  # There was error, so analyze the Error and nothing more.
123
121
  false
124
122
  end
@@ -126,7 +124,7 @@ module Contrast
126
124
  # Analyze the headers of the response code. They have information about the
127
125
  # retry timeout and some response bodies contains error messages.
128
126
  #
129
- # @param response [String] the response code from Net::HTTPResponse, which is obnoxiousy a String, not an
127
+ # @param response [Net::HTTPResponse]
130
128
  # Integer
131
129
  # @param message [String] Message to log.
132
130
  # @param mode [Symbol, nil]
@@ -142,6 +140,8 @@ module Contrast
142
140
  error_message: error_message || 'none',
143
141
  auth_error: auth_error || 'none')
144
142
  end
143
+ return unless rejected_by_ts?(response)
144
+
145
145
  suspend_reporting(message, ready_after, error_message) if mode == @_mode.resending
146
146
  return unless mode == @_mode.disabled
147
147
 
@@ -152,7 +152,7 @@ module Contrast
152
152
 
153
153
  # Extract what we've received.
154
154
  #
155
- # @param response [Net::HTTP::Response, nil]
155
+ # @param response [Net::HTTPResponse, nil]
156
156
  # @return [Array<String, Integer>] all collected error info.
157
157
  def extract_response_info response
158
158
  # Extract what we got from the response:
@@ -164,11 +164,21 @@ module Contrast
164
164
  [ready_after.to_i, error_message, auth_error]
165
165
  end
166
166
 
167
+ # We only want to shut down the agent if TeamServer actually told us to, not because of a network error
168
+ #
169
+ # @param [Net::HTTPResponse]
170
+ # @return Boolean
171
+ def rejected_by_ts? response
172
+ response_body = response&.body || Contrast::Utils::ObjectShare::EMPTY_STRING
173
+ response_data = Contrast::Utils::Json.parse(response_body, deep_symbolize: true)
174
+ response_data.key?(:success) && response_data[:success] == false
175
+ end
176
+
167
177
  # Extract Last-Modified header from ServerSettings response.
168
178
  # The new GET server settings endpoint have different payload.
169
179
  # Extract the last modify headers with last update form TS.
170
180
  #
171
- # @param response [Net::HTTP::Response, nil]
181
+ # @param response [Net::HTTPResponse, nil]
172
182
  # @param event [Contrast::Agent::Reporting::ServerSettings,
173
183
  # Contrast::Agent::Reporting::ApplicationSettings, nil]
174
184
  # @return last_modified[integer, nil] Time since last server update
@@ -250,12 +260,12 @@ module Contrast
250
260
  #
251
261
  # This method works to extract away these differences.
252
262
  #
253
- # @param response [Net::HTTP::Response, nil]
263
+ # @param response [Net::HTTPResponse, nil]
254
264
  # @param event [Contrast::Agent::Reporting::ReportingEvent] The event sent to TeamServer.
255
265
  # @return response [Contrast::Agent::Reporting::Response]
256
266
  def convert_response response, event
257
267
  response_body = response&.body
258
- return unless response_body
268
+ return unless response_body && !response_body.blank?
259
269
 
260
270
  response_data = Contrast::Utils::Json.parse(response_body, deep_symbolize: true)
261
271
  return unless response_data.cs__is_a?(Hash)
@@ -180,7 +180,7 @@ module Contrast
180
180
  end
181
181
  end
182
182
 
183
- # returns or fenerates the hash checksum for the request
183
+ # returns or generates the hash checksum for the request
184
184
  #
185
185
  # @return @_hash_id [String] Contrast::Utils::HashDigest generated string checksum
186
186
  def hash_id
@@ -26,6 +26,7 @@ module Contrast
26
26
  #
27
27
  def report_observed_route
28
28
  return unless (reporter = Contrast::Agent.reporter)
29
+ return if Contrast::Agent::REQUEST_TRACKER.current&.response&.response_code == 404
29
30
 
30
31
  reporter.send_event(context.observed_route) if Contrast::ROUTES_SENT.sendable?(context.observed_route)
31
32
  end
@@ -3,6 +3,6 @@
3
3
 
4
4
  module Contrast
5
5
  module Agent
6
- VERSION = '7.5.0'
6
+ VERSION = '7.6.1'
7
7
  end
8
8
  end
@@ -124,7 +124,7 @@ module Contrast
124
124
 
125
125
  # @return [Contrast::Components::Assess::Interface]
126
126
  def assess
127
- @assess ||= Contrast::Components::Assess::Interface.new # rubocop:disable Naming/MemoizedInstanceVariableName
127
+ @assess ||= Contrast::Components::Settings::Interface.new # rubocop:disable Naming/MemoizedInstanceVariableName
128
128
  end
129
129
 
130
130
  # @return [Contrast::Components::Inventory::Interface]
@@ -15,7 +15,6 @@ module Contrast
15
15
  class HashDigest < Digest::Class
16
16
  include Digest::Instance
17
17
  extend Contrast::Utils::HashDigestExtend
18
- CONTENT_LENGTH_HEADER = 'Content-Length'
19
18
  CHARS = %w[a b c d e f g].cs__freeze
20
19
  CRYPTO_RULES = %w[crypto-bad-ciphers crypto-bad-mac].cs__freeze
21
20
  CONFIG_PATH_KEY = 'path'
@@ -34,8 +33,6 @@ module Contrast
34
33
  #
35
34
  # @param finding [Contrast::Agent::Reporting::Finding] finding to be reported
36
35
  # @param request [Contrast::Agent::Request] our wrapper around the Rack::Request.
37
- # @return checksum [Integer, nil] returns nil if there is no request context or tracking
38
- # is disabled.
39
36
  def update_on_request finding, request
40
37
  context = Contrast::Agent::REQUEST_TRACKER.current
41
38
  return unless context || ::Contrast::ASSESS.non_request_tracking?
@@ -58,7 +55,6 @@ module Contrast
58
55
  # Update to CRC checksum the event source name and source type.
59
56
  #
60
57
  # @param events [Array<Contrast::Agent::Reporting::FindingEvent>]
61
- # @return checksum [Integer, nil] returns nil if there is no events
62
58
  def update_on_sources events
63
59
  events.each do |event|
64
60
  event.event_sources.each do |source|
@@ -68,22 +64,12 @@ module Contrast
68
64
  end
69
65
  end
70
66
 
71
- # This method converts and integer value for length into a string value
72
- # that we can hash on, based on the logarithmic value of the length, and
73
- # updates the current hash with that value.
74
- # @param chr [Numeric] the length to translate
75
- def update_on_content_length chr
76
- update(CHARS[Math.log10(chr.to_s.length).to_i] || CHARS[-1])
77
- end
78
-
79
67
  # Converts given string to CRC checksum. CRC32 checksum ensures that If error
80
68
  # of a single bit occurs, the CRC checksum will fail, regardless of any other
81
69
  # property of the transmitted data, including its length. Called several times
82
70
  # with previous CRC to recalculate the new output.
83
71
  #
84
72
  # @param str [String]
85
- # @return @crc32 [Integer, nil] updated value of crc 32 bit integer checksum or
86
- # nil if passed string is nil or empty
87
73
  def update str
88
74
  return unless str
89
75
 
@@ -17,7 +17,7 @@ module Contrast
17
17
  # param names and content length to CRC checksum and returns string representation
18
18
  #
19
19
  # @param request [Contrast::Agent::Request] our wrapper around the Rack::Request.
20
- # @return checksum [String] String representation of CRC32 checksum
20
+ # @return [String] String representation of CRC32 checksum
21
21
  def generate_request_hash request
22
22
  hash = new
23
23
  hash.update(request.request_method)
@@ -25,8 +25,6 @@ module Contrast
25
25
  request.parameters.each_key do |name|
26
26
  hash.update(name)
27
27
  end
28
- cl = request.headers[Contrast::Utils::HashDigest::CONTENT_LENGTH_HEADER]
29
- hash.update_on_content_length(cl) if cl
30
28
  hash.finish
31
29
  end
32
30
 
@@ -37,7 +35,7 @@ module Contrast
37
35
  # @param finding [Contrast::Agent::Reporting::Finding] to be reported
38
36
  # @param source [Object] the source of the Trigger Event
39
37
  # @param request [Contrast::Agent::Request] our wrapper around the Rack::Request.
40
- # @return checksum [String] String representation of CRC32 checksum
38
+ # @return [String] String representation of CRC32 checksum
41
39
  def generate_event_hash finding, source, request
42
40
  return generate_dataflow_hash(finding, request) if finding.events.length.to_i > 1
43
41
 
@@ -51,7 +49,7 @@ module Contrast
51
49
  # to CRC32 checksum and returns string representation to be appended to Contrast::Api::Dtm::Finding
52
50
  #
53
51
  # @param finding [Contrast::Agent::Reporting::Finding] to be reported
54
- # @return checksum [String] String representation of CRC32 checksum.
52
+ # @return [String] String representation of CRC32 checksum.
55
53
  def generate_config_hash finding
56
54
  hash = new
57
55
  hash.update(finding.rule_id)
@@ -80,6 +78,19 @@ module Contrast
80
78
  hash.finish
81
79
  end
82
80
 
81
+ # Generates the hash checksum for response scanning. Converts the rule_id and request to CRC32 checksum and
82
+ # returns string representation.
83
+ #
84
+ # @param finding [Contrast::Agent::Reporting::Finding] to be reported
85
+ # # @param request [Contrast::Agent::Request]
86
+ # @return [String] String representation of CRC32 checksum.
87
+ def generate_response_hash finding, request
88
+ hash = new
89
+ hash.update(finding.rule_id)
90
+ hash.update_on_request(finding, request)
91
+ hash.finish
92
+ end
93
+
83
94
  private
84
95
 
85
96
  # Generates the hash checksum for crypto(crypto-bad-ciphers, crypto-bad-mac) rules.
@@ -14,7 +14,7 @@ module Contrast
14
14
 
15
15
  # Add any known cases where parsing error might arise from older json parser:
16
16
  # @return [Array<String>]
17
- SPECIAL_CASES = ["\"\"", "\"0\""].cs__freeze # rubocop:disable Style/StringLiterals
17
+ SPECIAL_CASES = [nil, "", "\"\"", "\"0\""].cs__freeze # rubocop:disable Style/StringLiterals
18
18
 
19
19
  # Parses a string using JSON.parser. This method is used instead of standard JSON.parse to
20
20
  # support older versions of json gem => not supporting key-value second parameter, which is
@@ -91,6 +91,15 @@ module Contrast
91
91
  rescue Contrast::SecurityException => e
92
92
  logger.trace('Security Exception raised during application lifecycle to prevent an attack', e)
93
93
  raise(e)
94
+ rescue StandardError => e
95
+ # If there is a routing error of this type, then we cannot find a method explicitly mapped to this route.
96
+ # In this case, we should report nothing.
97
+ if Contrast::Utils::ClassUtil.truly_defined?('ActionController::RoutingError') &&
98
+ e.is_a?(ActionController::RoutingError)
99
+
100
+ Contrast::Agent::REQUEST_TRACKER.current&.observed_route = nil
101
+ end
102
+ raise(e)
94
103
  end
95
104
  end
96
105
  end
@@ -25,8 +25,9 @@ module Contrast
25
25
  # @param route [Contrast::Agent::Reporting::ObservedRoute] the route
26
26
  # @return [boolean]
27
27
  def sendable? route
28
- return false if Contrast::Utils::DuckUtils.empty_duck?(route.signature)
29
- return false if Contrast::Utils::DuckUtils.empty_duck?(route.url)
28
+ return false unless route
29
+ return false unless route.signature && !route.signature.blank?
30
+ return false unless route.url && !route.url.blank?
30
31
 
31
32
  route_hash = route.hash_id
32
33
 
data/lib/contrast.rb CHANGED
@@ -95,15 +95,15 @@ end
95
95
 
96
96
  # This needs to be required very early, after component interfaces, and before instrumentation attempts
97
97
  require 'contrast/funchook/funchook'
98
-
99
98
  require 'contrast/agent/version'
100
99
 
101
100
  # shared utils
102
101
  require 'contrast/utils/timer'
103
-
104
102
  require 'contrast/utils/assess/sampling_util'
105
103
  require 'contrast/agent'
106
104
 
105
+ # Prepend fix for Ruby 3.0
106
+ # TODO: RUBY-99999 remove once obsolete.
107
107
  if RUBY_VERSION >= '3.0.0' && RUBY_VERSION < '3.1.0'
108
108
  # Put prepend back as it was.
109
109
  Class.alias_method(:prepend, :cs__orig_prepend)
@@ -304,7 +304,15 @@
304
304
  "class_name":"String",
305
305
  "instance_method": true,
306
306
  "method_visibility": "public",
307
- "method_name":"capitalize!",
307
+ "method_name":"capitalize",
308
+ "source":"O",
309
+ "target":"R",
310
+ "action":"KEEP"
311
+ }, {
312
+ "class_name":"String",
313
+ "instance_method": true,
314
+ "method_visibility": "public",
315
+ "method_name":"html_safe",
308
316
  "source":"O",
309
317
  "target":"R",
310
318
  "action":"KEEP"
@@ -908,6 +916,36 @@
908
916
  "action":"SPLAT",
909
917
  "tags":["HTML_ENCODED"],
910
918
  "untags":["HTML_DECODED"]
919
+ }, {
920
+ "class_name": "ActiveSupport::CoreExt::ERBUtil",
921
+ "method_name": "html_escape",
922
+ "method_visibility": "public",
923
+ "instance_method": true,
924
+ "source": "P0",
925
+ "target": "R",
926
+ "action": "SPLAT",
927
+ "tags":["HTML_ENCODED"],
928
+ "untags":["HTML_DECODED"]
929
+ }, {
930
+ "class_name": "ActiveSupport::CoreExt::ERBUtil",
931
+ "method_name": "h",
932
+ "method_visibility": "public",
933
+ "instance_method": true,
934
+ "source": "P0",
935
+ "target": "R",
936
+ "action": "SPLAT",
937
+ "tags":["HTML_ENCODED"],
938
+ "untags":["HTML_DECODED"]
939
+ }, {
940
+ "class_name": "ActiveSupport::CoreExt::ERBUtil",
941
+ "method_name": "unwrapped_html_escape",
942
+ "method_visibility": "public",
943
+ "instance_method": true,
944
+ "source": "P0",
945
+ "target": "R",
946
+ "action": "SPLAT",
947
+ "tags":["HTML_ENCODED"],
948
+ "untags":["HTML_DECODED"]
911
949
  }, {
912
950
  "class_name":"ERB::Util",
913
951
  "method_name":"h",
@@ -1028,6 +1066,17 @@
1028
1066
  "target": "R",
1029
1067
  "action": "SPLAT"
1030
1068
  },
1069
+ {
1070
+ "class_name": "ActiveSupport::Multibyte::Unicode",
1071
+ "instance_method": true,
1072
+ "method_visibility": "public",
1073
+ "method_name":"tidy_bytes",
1074
+ "source":"P0",
1075
+ "target":"R",
1076
+ "action": "KEEP",
1077
+ "tags":["HTML_ENCODED"],
1078
+ "untags":["HTML_DECODED"]
1079
+ },
1031
1080
  {
1032
1081
  "class_name": "JSON",
1033
1082
  "method_name": "generate",
data/ruby-agent.gemspec CHANGED
@@ -9,14 +9,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
9
9
 
10
10
  # Add the team as authors of the Agent
11
11
  def self.add_authors spec
12
- spec.authors = %w[
13
- galen.palmer@contrastsecurity.com
14
- harold.mcginnis@contrastsecurity.com
15
- donald.propst@contrastsecurity.com
16
- alex.macdonald@contrastsecurity.com
17
- mark.petersen@contrastsecurity.com
18
- joshua.reed@contrastsecurity.com
19
- ]
12
+ spec.authors = %w[ruby@contrastsecurity.com]
20
13
  end
21
14
 
22
15
  # Add those dependencies required to develop or test the Agent
@@ -44,7 +37,6 @@ end
44
37
  def self.add_debuggers spec
45
38
  spec.add_development_dependency 'pry'
46
39
  spec.add_development_dependency 'pry-byebug', '>= 3.9'
47
- spec.add_development_dependency 'ruby-debug-ide'
48
40
  end
49
41
 
50
42
  # Dependencies used for framework testing.
@@ -52,7 +44,7 @@ def self.add_frameworks spec
52
44
  spec.add_development_dependency 'grape', '~> 1.5', '>= 1.5.2'
53
45
  spec.add_development_dependency 'rack-protection', '>= 2'
54
46
  spec.add_development_dependency 'rails', '>= 6', '~> 7'
55
- spec.add_development_dependency 'sinatra', '>= 2'
47
+ spec.add_development_dependency 'sinatra', '>= 2', '<4.0.0'
56
48
  end
57
49
 
58
50
  # Dependencies used for linting prior to commit.
@@ -105,9 +97,14 @@ def self.add_tested_gems spec
105
97
  spec.add_development_dependency 'async'
106
98
  spec.add_development_dependency 'execjs'
107
99
  spec.add_development_dependency 'rhino'
108
- spec.add_development_dependency 'sqlite3'
100
+ if ENV.fetch('CONTRAST__PIPELINE__RUN', nil) == 'true'
101
+ spec.add_development_dependency 'sqlite3', '1.6.6'
102
+ else
103
+ spec.add_development_dependency 'sqlite3'
104
+ end
109
105
  spec.add_development_dependency 'tilt'
110
106
  spec.add_development_dependency 'xpath'
107
+ spec.add_development_dependency 'ruby'
111
108
  end
112
109
 
113
110
  # Add those dependencies required to run the Agent in customer applications.
@@ -116,8 +113,11 @@ end
116
113
  # dependencies.csv in this directory to indicate that and create a
117
114
  # corresponding update to the fake gem server data in TeamServer.
118
115
  def self.add_dependencies spec
119
- # TODO: RUBY-99999 investigate init_with_options segmentation fault
120
- spec.add_dependency 'ffi'
116
+ if ENV.fetch('CONTRAST__PIPELINE__RUN', nil) == 'true'
117
+ spec.add_dependency 'ffi', '1.15.5'
118
+ else
119
+ spec.add_dependency 'ffi'
120
+ end
121
121
  spec.add_dependency 'ougai', '>= 1.8', '< 3.0.0'
122
122
  spec.add_dependency 'rack', '>= 2.0', '< 4.0.0'
123
123
 
metadata CHANGED
@@ -1,19 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contrast-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.5.0
4
+ version: 7.6.1
5
5
  platform: ruby
6
6
  authors:
7
- - galen.palmer@contrastsecurity.com
8
- - harold.mcginnis@contrastsecurity.com
9
- - donald.propst@contrastsecurity.com
10
- - alex.macdonald@contrastsecurity.com
11
- - mark.petersen@contrastsecurity.com
12
- - joshua.reed@contrastsecurity.com
7
+ - ruby@contrastsecurity.com
13
8
  autorequire:
14
9
  bindir: exe
15
10
  cert_chain: []
16
- date: 2023-10-06 00:00:00.000000000 Z
11
+ date: 2024-05-30 00:00:00.000000000 Z
17
12
  dependencies:
18
13
  - !ruby/object:Gem::Dependency
19
14
  name: bundler
@@ -85,20 +80,6 @@ dependencies:
85
80
  - - ">="
86
81
  - !ruby/object:Gem::Version
87
82
  version: '3.9'
88
- - !ruby/object:Gem::Dependency
89
- name: ruby-debug-ide
90
- requirement: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: '0'
95
- type: :development
96
- prerelease: false
97
- version_requirements: !ruby/object:Gem::Requirement
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
83
  - !ruby/object:Gem::Dependency
103
84
  name: debride
104
85
  requirement: !ruby/object:Gem::Requirement
@@ -300,6 +281,9 @@ dependencies:
300
281
  - - ">="
301
282
  - !ruby/object:Gem::Version
302
283
  version: '2'
284
+ - - "<"
285
+ - !ruby/object:Gem::Version
286
+ version: 4.0.0
303
287
  type: :development
304
288
  prerelease: false
305
289
  version_requirements: !ruby/object:Gem::Requirement
@@ -307,6 +291,9 @@ dependencies:
307
291
  - - ">="
308
292
  - !ruby/object:Gem::Version
309
293
  version: '2'
294
+ - - "<"
295
+ - !ruby/object:Gem::Version
296
+ version: 4.0.0
310
297
  - !ruby/object:Gem::Dependency
311
298
  name: async
312
299
  requirement: !ruby/object:Gem::Requirement
@@ -391,6 +378,20 @@ dependencies:
391
378
  - - ">="
392
379
  - !ruby/object:Gem::Version
393
380
  version: '0'
381
+ - !ruby/object:Gem::Dependency
382
+ name: ruby
383
+ requirement: !ruby/object:Gem::Requirement
384
+ requirements:
385
+ - - ">="
386
+ - !ruby/object:Gem::Version
387
+ version: '0'
388
+ type: :development
389
+ prerelease: false
390
+ version_requirements: !ruby/object:Gem::Requirement
391
+ requirements:
392
+ - - ">="
393
+ - !ruby/object:Gem::Version
394
+ version: '0'
394
395
  - !ruby/object:Gem::Dependency
395
396
  name: benchmark-ips
396
397
  requirement: !ruby/object:Gem::Requirement
@@ -1394,7 +1395,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1394
1395
  - !ruby/object:Gem::Version
1395
1396
  version: '0'
1396
1397
  requirements: []
1397
- rubygems_version: 3.3.26
1398
+ rubygems_version: 3.3.27
1398
1399
  signing_key:
1399
1400
  specification_version: 4
1400
1401
  summary: Contrast Security's agent for rack-based applications.