sqreen 1.19.0 → 1.20.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/lib/sqreen/agent_message.rb +20 -0
  4. data/lib/sqreen/aggregated_metric.rb +25 -0
  5. data/lib/sqreen/ca.crt +24 -0
  6. data/lib/sqreen/configuration.rb +10 -4
  7. data/lib/sqreen/deliveries/batch.rb +4 -1
  8. data/lib/sqreen/deliveries/simple.rb +4 -0
  9. data/lib/sqreen/endpoint_testing.rb +184 -0
  10. data/lib/sqreen/event.rb +7 -5
  11. data/lib/sqreen/events/attack.rb +23 -18
  12. data/lib/sqreen/events/remote_exception.rb +0 -22
  13. data/lib/sqreen/events/request_record.rb +15 -70
  14. data/lib/sqreen/frameworks/request_recorder.rb +13 -2
  15. data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
  16. data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
  17. data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
  18. data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
  19. data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
  20. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
  21. data/lib/sqreen/legacy/old_event_submission_strategy.rb +221 -0
  22. data/lib/sqreen/legacy/waf_redactions.rb +49 -0
  23. data/lib/sqreen/log/loggable.rb +1 -1
  24. data/lib/sqreen/metrics/base.rb +3 -0
  25. data/lib/sqreen/metrics_store.rb +22 -12
  26. data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
  27. data/lib/sqreen/rules.rb +4 -2
  28. data/lib/sqreen/rules/not_found_cb.rb +2 -0
  29. data/lib/sqreen/rules/rule_cb.rb +2 -0
  30. data/lib/sqreen/rules/waf_cb.rb +13 -10
  31. data/lib/sqreen/runner.rb +75 -8
  32. data/lib/sqreen/sensitive_data_redactor.rb +19 -31
  33. data/lib/sqreen/session.rb +51 -43
  34. data/lib/sqreen/signals/conversions.rb +283 -0
  35. data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
  36. data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
  37. data/lib/sqreen/version.rb +1 -1
  38. data/lib/sqreen/weave/legacy/instrumentation.rb +7 -7
  39. metadata +50 -6
  40. data/lib/sqreen/backport.rb +0 -9
  41. data/lib/sqreen/backport/clock_gettime.rb +0 -74
  42. data/lib/sqreen/backport/original_name.rb +0 -88
@@ -4,5 +4,5 @@
4
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
5
 
6
6
  module Sqreen
7
- VERSION = '1.19.0'.freeze
7
+ VERSION = '1.20.1'.freeze
8
8
  end
@@ -269,7 +269,7 @@ class Sqreen::Weave::Legacy::Instrumentation
269
269
  hook.add do
270
270
  if callback.pre?
271
271
  before(rule, rank: priority, mandatory: !callback.overtimeable, flow: block, ignore: ignore) do |call, b|
272
- return unless Thread.current[:sqreen_http_request]
272
+ next unless Thread.current[:sqreen_http_request]
273
273
 
274
274
  i = call.instance
275
275
  a = call.args
@@ -296,13 +296,13 @@ class Sqreen::Weave::Legacy::Instrumentation
296
296
  when :raise, 'raise'
297
297
  throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
298
298
  throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
299
- end unless ret.nil?
299
+ end unless ret.nil? || !ret.is_a?(Hash)
300
300
  end
301
301
  end
302
302
 
303
303
  if callback.post?
304
304
  after(rule, rank: -priority, mandatory: !callback.overtimeable, flow: block, ignore: ignore) do |call, b|
305
- return unless Thread.current[:sqreen_http_request]
305
+ next unless Thread.current[:sqreen_http_request]
306
306
 
307
307
  i = call.instance
308
308
  v = call.returned
@@ -328,13 +328,13 @@ class Sqreen::Weave::Legacy::Instrumentation
328
328
  when :raise, 'raise'
329
329
  throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
330
330
  throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
331
- end unless ret.nil?
331
+ end unless ret.nil? || !ret.is_a?(Hash)
332
332
  end
333
333
  end
334
334
 
335
335
  if callback.failing?
336
336
  raised(rule, rank: priority, mandatory: !callback.overtimeable, flow: block, ignore: ignore) do |call, b|
337
- return unless Thread.current[:sqreen_http_request]
337
+ next unless Thread.current[:sqreen_http_request]
338
338
 
339
339
  i = call.instance
340
340
  e = call.raised
@@ -354,7 +354,7 @@ class Sqreen::Weave::Legacy::Instrumentation
354
354
  end
355
355
  Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i} => return=#{ret.inspect}" }
356
356
 
357
- raise e if ret.nil?
357
+ throw(b, b.raise(e)) if ret.nil? || !ret.is_a?(Hash)
358
358
 
359
359
  case ret[:status]
360
360
  when :override, 'override'
@@ -368,7 +368,7 @@ class Sqreen::Weave::Legacy::Instrumentation
368
368
  throw(b, b.raise(e))
369
369
  else
370
370
  throw(b, b.raise(e))
371
- end unless ret.nil?
371
+ end unless ret.nil? || !ret.is_a?(Hash)
372
372
  end
373
373
  end
374
374
  end.install
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.0
4
+ version: 1.20.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sqreen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-29 00:00:00.000000000 Z
11
+ date: 2020-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sqreen-backport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqreen-kit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.1
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: sq_mini_racer
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -65,11 +93,10 @@ files:
65
93
  - lib/sqreen/actions/user_action_class.rb
66
94
  - lib/sqreen/actions/users_index.rb
67
95
  - lib/sqreen/agent.rb
96
+ - lib/sqreen/agent_message.rb
97
+ - lib/sqreen/aggregated_metric.rb
68
98
  - lib/sqreen/attack_blocked.rb
69
99
  - lib/sqreen/attack_detected.html
70
- - lib/sqreen/backport.rb
71
- - lib/sqreen/backport/clock_gettime.rb
72
- - lib/sqreen/backport/original_name.rb
73
100
  - lib/sqreen/binding_accessor.rb
74
101
  - lib/sqreen/binding_accessor/path_elem.rb
75
102
  - lib/sqreen/binding_accessor/transforms.rb
@@ -96,6 +123,7 @@ files:
96
123
  - lib/sqreen/dependency/sentry.rb
97
124
  - lib/sqreen/dependency/sinatra.rb
98
125
  - lib/sqreen/encoding_sanitizer.rb
126
+ - lib/sqreen/endpoint_testing.rb
99
127
  - lib/sqreen/error_handling_middleware.rb
100
128
  - lib/sqreen/event.rb
101
129
  - lib/sqreen/events/attack.rb
@@ -129,8 +157,16 @@ files:
129
157
  - lib/sqreen/js/mini_racer_adapter.rb
130
158
  - lib/sqreen/js/mini_racer_executable_js.rb
131
159
  - lib/sqreen/js/thread_local_exec_js_runnable.rb
160
+ - lib/sqreen/kit/signals/specialized/aggregated_metric.rb
161
+ - lib/sqreen/kit/signals/specialized/attack.rb
162
+ - lib/sqreen/kit/signals/specialized/binning_metric.rb
163
+ - lib/sqreen/kit/signals/specialized/http_trace.rb
164
+ - lib/sqreen/kit/signals/specialized/sdk_track_call.rb
165
+ - lib/sqreen/kit/signals/specialized/sqreen_exception.rb
132
166
  - lib/sqreen/legacy.rb
133
167
  - lib/sqreen/legacy/instrumentation.rb
168
+ - lib/sqreen/legacy/old_event_submission_strategy.rb
169
+ - lib/sqreen/legacy/waf_redactions.rb
134
170
  - lib/sqreen/log.rb
135
171
  - lib/sqreen/log/loggable.rb
136
172
  - lib/sqreen/logger.rb
@@ -201,6 +237,9 @@ files:
201
237
  - lib/sqreen/shared_storage.rb
202
238
  - lib/sqreen/shared_storage23.rb
203
239
  - lib/sqreen/shrink_wrap.rb
240
+ - lib/sqreen/signals/conversions.rb
241
+ - lib/sqreen/signals/http_trace_redaction.rb
242
+ - lib/sqreen/signals/signals_submission_strategy.rb
204
243
  - lib/sqreen/signature_verifier.rb
205
244
  - lib/sqreen/sinatra_middleware.rb
206
245
  - lib/sqreen/sqreen_signed_verifier.rb
@@ -232,7 +271,12 @@ files:
232
271
  homepage: https://www.sqreen.com/
233
272
  licenses:
234
273
  - Sqreen
235
- metadata: {}
274
+ metadata:
275
+ homepage_uri: https://sqreen.com
276
+ documentation_uri: https://docs.sqreen.com/
277
+ changelog_uri: https://docs.sqreen.com/ruby/release-notes/
278
+ source_code_uri: https://github.com/sqreen/ruby-agent
279
+ bug_tracker_uri: https://github.com/sqreen/ruby-agent/issues
236
280
  post_install_message:
237
281
  rdoc_options: []
238
282
  require_paths:
@@ -1,9 +0,0 @@
1
- # typed: strong
2
-
3
- # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
- # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
-
6
- module Sqreen
7
- module Backport
8
- end
9
- end
@@ -1,74 +0,0 @@
1
- # typed: ignore
2
-
3
- # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
- # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
-
6
- require 'sqreen/backport'
7
-
8
- module Sqreen
9
- module Backport
10
- module ClockGettime
11
- class << self
12
- def supported?
13
- Process.respond_to?(:clock_gettime)
14
- end
15
- end
16
-
17
- unless supported?
18
- require 'ffi'
19
-
20
- class Timespec < FFI::Struct
21
- layout :tv_sec => :time_t, :tv_nsec => :long
22
- end
23
-
24
- module LibC
25
- extend FFI::Library
26
- ffi_lib FFI::Library::LIBC
27
-
28
- # TODO: FFI::NotFoundError
29
-
30
- if RUBY_PLATFORM =~ /darwin/
31
- attach_function :mach_absolute_time, [], :uint64
32
- end
33
-
34
- attach_function :clock_gettime, [:int, :pointer], :int
35
- end
36
-
37
- module Constants
38
- case RUBY_PLATFORM
39
- when /darwin/
40
- CLOCK_REALTIME = 0
41
- CLOCK_MONOTONIC = 6
42
- CLOCK_PROCESS_CPUTIME_ID = 12
43
- CLOCK_THERAD_CPUTIME_ID = 16
44
- when /linux/
45
- CLOCK_REALTIME = 0
46
- CLOCK_MONOTONIC = 1
47
- CLOCK_PROCESS_CPUTIME_ID = 2
48
- CLOCK_THREAD_CPUTIME_ID = 3
49
- end
50
- end
51
-
52
- def clock_gettime(clock_id, unit = :float_second)
53
- unless unit == :float_second
54
- raise "Process.clock_gettime: unsupported unit #{unit.inspect}"
55
- end
56
-
57
- t = Timespec.new
58
- ret = LibC.clock_gettime(clock_id, t.pointer)
59
-
60
- raise SystemCallError, "Errno #{FFI.errno}" if ret == -1
61
-
62
- t[:tv_sec].to_f + t[:tv_nsec].to_f / 1_000_000_000
63
- end
64
- end
65
- end
66
- end
67
- end
68
-
69
- unless Sqreen::Backport::ClockGettime.supported?
70
- Process.instance_eval do
71
- extend Sqreen::Backport::ClockGettime
72
- include Sqreen::Backport::ClockGettime::Constants
73
- end
74
- end
@@ -1,88 +0,0 @@
1
- # typed: false
2
-
3
- # Copyright (c) 2015 Sqreen. All Rights Reserved.
4
- # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
-
6
- module Sqreen
7
- module Backport
8
- module OriginalName
9
- HAS_UNBOUND_METHOD_ORIGINAL_NAME = ::UnboundMethod.instance_methods(false).include?(:original_name)
10
- HAS_METHOD_ORIGINAL_NAME = ::Method.instance_methods(false).include?(:original_name)
11
-
12
- def original_name
13
- self.class.get_original_name(owner, original_name_key) || self.original_name = name
14
- end
15
-
16
- private
17
-
18
- def original_name=(name)
19
- self.class.set_original_name(owner, original_name_key, name)
20
- end
21
-
22
- def original_name_key
23
- return hash if is_a?(::UnboundMethod)
24
-
25
- owner.instance_method(name).hash
26
- end
27
-
28
- class << self
29
- def supported?
30
- !::Kernel.const_defined?(:JRUBY_VERSION) && HAS_UNBOUND_METHOD_ORIGINAL_NAME && HAS_METHOD_ORIGINAL_NAME
31
- end
32
-
33
- def included(klass)
34
- klass.extend(ClassMethods)
35
- end
36
-
37
- def prepended(klass)
38
- klass.extend(ClassMethods)
39
- end
40
- end
41
-
42
- class Store < ::Hash; end
43
-
44
- module ClassMethods
45
- def original_names(owner)
46
- owner.instance_eval { @__sqreen_backport_original_names ||= Store.new }
47
- end
48
-
49
- def get_original_name(owner, key)
50
- original_names(owner)[key]
51
- end
52
-
53
- def set_original_name(owner, key, name)
54
- original_names(owner)[key] ||= name
55
- end
56
- end
57
- end
58
- end
59
- end
60
-
61
- class UnboundMethod
62
- if Sqreen::Backport::OriginalName::HAS_UNBOUND_METHOD_ORIGINAL_NAME
63
- prepend Sqreen::Backport::OriginalName
64
- else
65
- include Sqreen::Backport::OriginalName
66
- end
67
- end unless Sqreen::Backport::OriginalName.supported?
68
-
69
- class Method
70
- if Sqreen::Backport::OriginalName::HAS_METHOD_ORIGINAL_NAME
71
- prepend Sqreen::Backport::OriginalName
72
- else
73
- include Sqreen::Backport::OriginalName
74
- end
75
- end unless Sqreen::Backport::OriginalName.supported?
76
-
77
- class Module
78
- alias_method(:alias_method_without_original_name, :alias_method)
79
-
80
- def alias_method_with_original_name(newname, oldname)
81
- alias_method_without_original_name(newname, oldname).tap do
82
- instance_method(newname).send(:original_name=, :"#{oldname}")
83
- end
84
- end
85
-
86
- alias_method_with_original_name(:alias_method_without_original_name, :alias_method)
87
- alias_method_with_original_name(:alias_method, :alias_method_with_original_name)
88
- end unless Sqreen::Backport::OriginalName.supported?