sqreen 1.18.2-java → 1.19.0-java

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 (184) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/LICENSE +3 -0
  4. data/lib/sqreen.rb +2 -0
  5. data/lib/sqreen/actions.rb +13 -337
  6. data/lib/sqreen/actions/actions_index.rb +16 -0
  7. data/lib/sqreen/actions/base.rb +104 -0
  8. data/lib/sqreen/actions/block_ip.rb +34 -0
  9. data/lib/sqreen/actions/block_user.rb +46 -0
  10. data/lib/sqreen/actions/ip_range_indexed_action_class.rb +16 -0
  11. data/lib/sqreen/actions/ip_ranges_index.rb +57 -0
  12. data/lib/sqreen/actions/redirect_ip.rb +42 -0
  13. data/lib/sqreen/actions/redirect_user.rb +47 -0
  14. data/lib/sqreen/actions/repository.rb +43 -0
  15. data/lib/sqreen/actions/unknown_action_type.rb +20 -0
  16. data/lib/sqreen/actions/user_action_class.rb +16 -0
  17. data/lib/sqreen/actions/users_index.rb +35 -0
  18. data/lib/sqreen/agent.rb +6 -2
  19. data/lib/sqreen/attack_blocked.rb +19 -0
  20. data/lib/sqreen/backport.rb +2 -0
  21. data/lib/sqreen/backport/clock_gettime.rb +74 -0
  22. data/lib/sqreen/backport/original_name.rb +2 -0
  23. data/lib/sqreen/binding_accessor.rb +11 -102
  24. data/lib/sqreen/binding_accessor/path_elem.rb +10 -0
  25. data/lib/sqreen/binding_accessor/transforms.rb +114 -0
  26. data/lib/sqreen/call_countable.rb +2 -0
  27. data/lib/sqreen/capped_queue.rb +4 -0
  28. data/lib/sqreen/{callbacks.rb → cb.rb} +3 -53
  29. data/lib/sqreen/{callback_tree.rb → cb_tree.rb} +4 -2
  30. data/lib/sqreen/condition_evaluator.rb +24 -5
  31. data/lib/sqreen/conditionable.rb +2 -0
  32. data/lib/sqreen/configuration.rb +19 -0
  33. data/lib/sqreen/context.rb +2 -0
  34. data/lib/sqreen/default_cb.rb +22 -0
  35. data/lib/sqreen/deferred_logger.rb +65 -0
  36. data/lib/sqreen/deliveries.rb +12 -0
  37. data/lib/sqreen/deliveries/batch.rb +9 -1
  38. data/lib/sqreen/deliveries/simple.rb +7 -0
  39. data/lib/sqreen/dependency.rb +3 -1
  40. data/lib/sqreen/dependency/detector.rb +22 -14
  41. data/lib/sqreen/dependency/libsqreen.rb +32 -0
  42. data/lib/sqreen/dependency/new_relic.rb +2 -0
  43. data/lib/sqreen/dependency/rack.rb +10 -5
  44. data/lib/sqreen/dependency/rails.rb +8 -0
  45. data/lib/sqreen/dependency/sentry.rb +2 -0
  46. data/lib/sqreen/dependency/sinatra.rb +58 -14
  47. data/lib/sqreen/encoding_sanitizer.rb +2 -0
  48. data/lib/sqreen/error_handling_middleware.rb +32 -0
  49. data/lib/sqreen/event.rb +4 -0
  50. data/lib/sqreen/events/attack.rb +4 -0
  51. data/lib/sqreen/events/remote_exception.rb +2 -0
  52. data/lib/sqreen/events/request_record.rb +13 -56
  53. data/lib/sqreen/exception.rb +11 -40
  54. data/lib/sqreen/formatter_with_tid.rb +47 -0
  55. data/lib/sqreen/framework_cb.rb +30 -0
  56. data/lib/sqreen/frameworks.rb +9 -0
  57. data/lib/sqreen/frameworks/generic.rb +22 -2
  58. data/lib/sqreen/frameworks/rails.rb +3 -0
  59. data/lib/sqreen/frameworks/rails3.rb +2 -0
  60. data/lib/sqreen/frameworks/request_recorder.rb +5 -0
  61. data/lib/sqreen/frameworks/sinatra.rb +4 -0
  62. data/lib/sqreen/frameworks/sqreen_test.rb +4 -0
  63. data/lib/sqreen/graft.rb +12 -0
  64. data/lib/sqreen/graft/call.rb +150 -0
  65. data/lib/sqreen/{dependency → graft}/callback.rb +12 -4
  66. data/lib/sqreen/graft/hook.rb +316 -0
  67. data/lib/sqreen/{dependency → graft}/hook_point.rb +152 -33
  68. data/lib/sqreen/graft/hook_point_error.rb +10 -0
  69. data/lib/sqreen/invalid_signature_exception.rb +10 -0
  70. data/lib/sqreen/js.rb +11 -0
  71. data/lib/sqreen/js/call_context.rb +12 -0
  72. data/lib/sqreen/js/context_pool.rb +62 -0
  73. data/lib/sqreen/js/exec_js_runnable.rb +22 -0
  74. data/lib/sqreen/js/execjs_adapter.rb +8 -47
  75. data/lib/sqreen/js/executable_js.rb +14 -0
  76. data/lib/sqreen/js/js_service.rb +4 -22
  77. data/lib/sqreen/js/js_service_adapter.rb +20 -0
  78. data/lib/sqreen/js/mini_racer_adapter.rb +8 -180
  79. data/lib/sqreen/js/mini_racer_executable_js.rb +144 -0
  80. data/lib/sqreen/js/thread_local_exec_js_runnable.rb +49 -0
  81. data/lib/{sqreen-alt.rb → sqreen/legacy.rb} +5 -1
  82. data/lib/sqreen/{instrumentation.rb → legacy/instrumentation.rb} +44 -15
  83. data/lib/sqreen/log.rb +10 -188
  84. data/lib/sqreen/log/loggable.rb +28 -0
  85. data/lib/sqreen/logger.rb +85 -0
  86. data/lib/sqreen/metrics.rb +2 -0
  87. data/lib/sqreen/metrics/average.rb +2 -0
  88. data/lib/sqreen/metrics/base.rb +2 -0
  89. data/lib/sqreen/metrics/binning.rb +2 -0
  90. data/lib/sqreen/metrics/collect.rb +2 -0
  91. data/lib/sqreen/metrics/sum.rb +2 -0
  92. data/lib/sqreen/metrics_store.rb +5 -11
  93. data/lib/sqreen/metrics_store/already_registered_metric.rb +13 -0
  94. data/lib/sqreen/metrics_store/unknown_metric.rb +13 -0
  95. data/lib/sqreen/metrics_store/unregistered_metric.rb +13 -0
  96. data/lib/sqreen/middleware.rb +2 -34
  97. data/lib/sqreen/mono_time.rb +4 -0
  98. data/lib/sqreen/node.rb +46 -0
  99. data/lib/sqreen/not_implemented_yet.rb +10 -0
  100. data/lib/sqreen/null_logger.rb +26 -0
  101. data/lib/sqreen/payload_creator.rb +4 -19
  102. data/lib/sqreen/payload_creator/header_section.rb +30 -0
  103. data/lib/sqreen/performance_notifications.rb +2 -0
  104. data/lib/sqreen/performance_notifications/binned_metrics.rb +2 -0
  105. data/lib/sqreen/performance_notifications/log.rb +2 -0
  106. data/lib/sqreen/performance_notifications/log_performance.rb +2 -0
  107. data/lib/sqreen/performance_notifications/metrics.rb +2 -0
  108. data/lib/sqreen/performance_notifications/newrelic.rb +2 -0
  109. data/lib/sqreen/prefix.rb +35 -0
  110. data/lib/sqreen/rails_middleware.rb +16 -0
  111. data/lib/sqreen/remote_command.rb +3 -8
  112. data/lib/sqreen/remote_command/failure_output.rb +16 -0
  113. data/lib/sqreen/rules.rb +34 -2
  114. data/lib/sqreen/{rule_attributes.rb → rules/attrs.rb} +2 -0
  115. data/lib/sqreen/{rules_callbacks/sdk_auth_track.rb → rules/auth_track_cb.rb} +4 -2
  116. data/lib/sqreen/{rules_callbacks/binding_accessor_matcher.rb → rules/binding_accessor_matcher_cb.rb} +6 -8
  117. data/lib/sqreen/{rules_callbacks → rules}/binding_accessor_metrics.rb +3 -1
  118. data/lib/sqreen/{rules_callbacks/blacklist_ips.rb → rules/blacklist_ips_cb.rb} +5 -2
  119. data/lib/sqreen/{rules_callbacks → rules}/count_http_codes.rb +4 -2
  120. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches.rb → rules/crawler_user_agent_matches_cb.rb} +3 -1
  121. data/lib/sqreen/{rules_callbacks/crawler_user_agent_matches_metrics.rb → rules/crawler_user_agent_matches_metrics_cb.rb} +3 -1
  122. data/lib/sqreen/{rules_callbacks/custom_error.rb → rules/custom_error_cb.rb} +3 -1
  123. data/lib/sqreen/{rules_callbacks/devise_auth_track.rb → rules/devise_auth_track_cb.rb} +4 -2
  124. data/lib/sqreen/{rules_callbacks/devise_signup_track.rb → rules/devise_signup_track_cb.rb} +4 -2
  125. data/lib/sqreen/{rules_callbacks/execjs.rb → rules/execjs_cb.rb} +51 -50
  126. data/lib/sqreen/{rules_callbacks/headers_insert.rb → rules/headers_insert_cb.rb} +8 -1
  127. data/lib/sqreen/{rules_callbacks → rules}/matcher_rule.rb +4 -2
  128. data/lib/sqreen/{rules_callbacks/not_found.rb → rules/not_found_cb.rb} +7 -2
  129. data/lib/sqreen/{rules_callbacks/rails_parameters.rb → rules/rails_parameters_cb.rb} +3 -1
  130. data/lib/sqreen/{rules_callbacks → rules}/record_request_context.rb +3 -1
  131. data/lib/sqreen/{rules_callbacks/regexp_rule.rb → rules/regexp_rule_cb.rb} +3 -1
  132. data/lib/sqreen/{rule_callback.rb → rules/rule_cb.rb} +4 -2
  133. data/lib/sqreen/{rules_callbacks → rules}/run_req_start_actions.rb +7 -3
  134. data/lib/sqreen/{rules_callbacks → rules}/run_user_actions.rb +4 -2
  135. data/lib/sqreen/{rules_callbacks/shell_env.rb → rules/shell_env_cb.rb} +3 -1
  136. data/lib/sqreen/{rules_callbacks/sdk_signup_track.rb → rules/signup_track_cb.rb} +4 -2
  137. data/lib/sqreen/rules/update_request_context.rb +22 -0
  138. data/lib/sqreen/{rules_callbacks/url_matches.rb → rules/url_matches_cb.rb} +3 -1
  139. data/lib/sqreen/{rules_callbacks/user_agent_matches.rb → rules/user_agent_matches_cb.rb} +3 -1
  140. data/lib/sqreen/{rules_callbacks/waf.rb → rules/waf_cb.rb} +41 -21
  141. data/lib/sqreen/{rules_callbacks/reflected_xss.rb → rules/xss_cb.rb} +12 -7
  142. data/lib/sqreen/run_when_called_cb.rb +23 -0
  143. data/lib/sqreen/runner.rb +25 -7
  144. data/lib/sqreen/runtime_infos.rb +4 -9
  145. data/lib/sqreen/safe_json.rb +2 -0
  146. data/lib/sqreen/sdk.rb +4 -0
  147. data/lib/sqreen/sensitive_data_redactor.rb +113 -0
  148. data/lib/sqreen/serializer.rb +2 -0
  149. data/lib/sqreen/session.rb +2 -0
  150. data/lib/sqreen/shared_storage.rb +2 -0
  151. data/lib/sqreen/shared_storage23.rb +2 -0
  152. data/lib/sqreen/shrink_wrap.rb +16 -0
  153. data/lib/sqreen/signature_verifier.rb +22 -0
  154. data/lib/sqreen/sinatra_middleware.rb +16 -0
  155. data/lib/sqreen/{rules_signature.rb → sqreen_signed_verifier.rb} +7 -17
  156. data/lib/sqreen/token_invalid_exception.rb +10 -0
  157. data/lib/sqreen/token_not_found_exception.rb +11 -0
  158. data/lib/sqreen/trie.rb +5 -64
  159. data/lib/sqreen/unauthorized.rb +10 -0
  160. data/lib/sqreen/util.rb +7 -0
  161. data/lib/sqreen/util/capped_array.rb +35 -0
  162. data/lib/sqreen/util/capped_hash.rb +41 -0
  163. data/lib/sqreen/util/capped_string.rb +26 -0
  164. data/lib/sqreen/util/capper.rb +67 -0
  165. data/lib/sqreen/version.rb +3 -1
  166. data/lib/sqreen/waf_error.rb +20 -0
  167. data/lib/sqreen/weave.rb +12 -0
  168. data/lib/sqreen/weave/hardcoded.rb +19 -0
  169. data/lib/sqreen/weave/instrumentor.rb +48 -0
  170. data/lib/sqreen/weave/legacy.rb +12 -0
  171. data/lib/sqreen/weave/legacy/instrumentation.rb +406 -0
  172. data/lib/sqreen/web_server.rb +2 -0
  173. data/lib/sqreen/web_server/generic.rb +2 -0
  174. data/lib/sqreen/web_server/passenger.rb +2 -0
  175. data/lib/sqreen/web_server/puma.rb +2 -0
  176. data/lib/sqreen/web_server/rainbows.rb +2 -0
  177. data/lib/sqreen/web_server/thin.rb +2 -0
  178. data/lib/sqreen/web_server/unicorn.rb +2 -0
  179. data/lib/sqreen/web_server/webrick.rb +2 -0
  180. data/lib/sqreen/worker.rb +2 -0
  181. metadata +105 -39
  182. data/lib/sqreen/dependency/hook.rb +0 -102
  183. data/lib/sqreen/rules_callbacks.rb +0 -35
  184. data/lib/sqreen/rules_callbacks/inspect_rule.rb +0 -25
@@ -1,6 +1,13 @@
1
+ # typed: ignore
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ require 'sqreen/shrink_wrap'
7
+ require 'sqreen/middleware'
8
+ require 'sqreen/error_handling_middleware'
9
+ require 'sqreen/rails_middleware'
10
+
4
11
  module Sqreen
5
12
  module Dependency
6
13
  module Rails
@@ -23,6 +30,7 @@ module Sqreen
23
30
  def insert_sqreen_middlewares
24
31
  Sqreen.log.debug { 'Inserting Sqreen middlewares for Rails' }
25
32
  app = ::Rails.application
33
+ app.middleware.insert(0, Sqreen::ShrinkWrap)
26
34
  app.middleware.insert_after(::Rack::Runtime, Sqreen::Middleware)
27
35
  app.middleware.insert_after(::ActionDispatch::DebugExceptions, Sqreen::RailsMiddleware)
28
36
  app.middleware.insert_after(::ActionDispatch::DebugExceptions, Sqreen::ErrorHandlingMiddleware)
@@ -1,3 +1,5 @@
1
+ # typed: ignore
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -1,6 +1,13 @@
1
+ # typed: ignore
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ require 'sqreen/shrink_wrap'
7
+ require 'sqreen/middleware'
8
+ require 'sqreen/error_handling_middleware'
9
+ require 'sqreen/sinatra_middleware'
10
+
4
11
  module Sqreen
5
12
  module Dependency
6
13
  module Sinatra
@@ -12,25 +19,62 @@ module Sqreen
12
19
 
13
20
  def insert_sqreen_middlewares(builder, *args, &block)
14
21
  Sqreen.log.debug { 'Inserting Sqreen middlewares for Sinatra' }
15
- middleware = Sqreen::ErrorHandlingMiddleware
16
- use = builder.instance_variable_get('@use')
17
22
 
18
- p = proc { |app| middleware.new(app, *args, &block) }
23
+ insert_middleware(builder, Sqreen::ErrorHandlingMiddleware, args, block) do |p, u|
24
+ if middlewares(builder).include?(::Sinatra::ShowExceptions)
25
+ Sqreen.log.warn('Sinatra :show_exceptions detected: Sinatra exception handling may prevent the Sqreen error page to display on attacks.')
26
+ end
27
+
28
+ if (i = middlewares(builder).index(::Rack::Head))
29
+ u.insert(i, p)
30
+ elsif (i = middlewares(builder).index(::Rack::MethodOverride))
31
+ u.insert(i + 1, p)
32
+ elsif (i = middlewares(builder).index(::Sinatra::ExtendedRack))
33
+ u.insert(i + 1, p)
34
+ else
35
+ u.insert(0, p)
36
+ end
37
+ end
19
38
 
20
- return if middlewares(builder).include?(middleware)
39
+ insert_middleware(builder, Sqreen::ShrinkWrap, args, block) do |p, u|
40
+ if (i = middlewares(builder).index(::Sinatra::ExtendedRack))
41
+ u.insert(i, p)
42
+ else
43
+ u.insert(0, p)
44
+ end
45
+ end
21
46
 
22
- if middlewares(builder).include?(::Sinatra::ShowExceptions)
23
- Sqreen.log.warn('Sinatra :show_exceptions detected: Sinatra exception handling may prevent the Sqreen error page to display on attacks.')
47
+ insert_middleware(builder, Sqreen::Middleware, args, block) do |p, u|
48
+ if (i = middlewares(builder).index(::Sinatra::ExtendedRack))
49
+ u.insert(i, p)
50
+ else
51
+ u.insert(1, p)
52
+ end
24
53
  end
25
54
 
26
- if (i = middlewares(builder).index(::Rack::Head))
27
- use.insert(i, p)
28
- elsif (i = middlewares(builder).index(::Rack::MethodOverride))
29
- use.insert(i + 1, p)
30
- elsif (i = middlewares(builder).index(::Sinatra::ExtendedRack))
31
- use.insert(i + 1, p)
32
- else
33
- use.insert(0, p)
55
+ insert_middleware(builder, Sqreen::SinatraMiddleware, args, block) do |p, u|
56
+ if ::Sqreen::Dependency.const_exist?('Rack::PostBodyContentTypeParser') && (i = middlewares(builder).index(::Rack::PostBodyContentTypeParser))
57
+ u.insert(i + 1, p)
58
+ elsif (i = middlewares(builder).index(::Rack::Protection))
59
+ u.insert(i + 1, p)
60
+ else
61
+ u.append(p)
62
+ end
63
+ end
64
+ end
65
+
66
+ def wrap_middleware(middleware, *args, &block)
67
+ proc { |app| middleware.new(app, *args, &block) }
68
+ end
69
+
70
+ def insert_middleware(builder, middleware, args, block)
71
+ use = builder.instance_variable_get('@use')
72
+ wrapped = wrap_middleware(middleware, *args, &block)
73
+
74
+ catch(:skip) do
75
+ throw(:skip) if middlewares(builder).include?(middleware)
76
+
77
+ yield(wrapped, use)
34
78
  end
35
79
  end
36
80
 
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -0,0 +1,32 @@
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
+ require 'sqreen/attack_blocked'
7
+
8
+ module Sqreen
9
+ class ErrorHandlingMiddleware
10
+ def initialize(app)
11
+ @app = app
12
+ end
13
+
14
+ def call(env)
15
+ @app.call(env)
16
+ rescue StandardError => e
17
+ sqreen_attack = nil
18
+ if e.is_a?(Sqreen::AttackBlocked)
19
+ sqreen_attack = e
20
+ elsif e.respond_to?(:original_exception) &&
21
+ e.original_exception.is_a?(Sqreen::AttackBlocked)
22
+ sqreen_attack = e.original_exception
23
+ end
24
+
25
+ if sqreen_attack && sqreen_attack.redirect_url
26
+ return [303, { 'Location' => sqreen_attack.redirect_url }, ['']]
27
+ end
28
+
29
+ raise
30
+ end
31
+ end
32
+ end
@@ -1,6 +1,10 @@
1
+ # typed: true
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ # TODO: see sqreen/events
7
+
4
8
  module Sqreen
5
9
  # Master interface for point in time events (e.g. Attack, RemoteException)
6
10
  class Event
@@ -1,6 +1,10 @@
1
+ # typed: true
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ # TODO: sqreen/events
7
+
4
8
  require 'sqreen/event'
5
9
 
6
10
  module Sqreen
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
@@ -1,9 +1,15 @@
1
+ # typed: false
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ # TODO: sqreen/events
7
+
4
8
  require 'json'
9
+ require 'sqreen/log'
5
10
  require 'sqreen/event'
6
11
  require 'sqreen/encoding_sanitizer'
12
+ require 'sqreen/sensitive_data_redactor'
7
13
 
8
14
  module Sqreen
9
15
  # When a request is deeemed worthy of being sent to the backend
@@ -70,7 +76,13 @@ module Sqreen
70
76
  res = Sqreen::EncodingSanitizer.sanitize(res)
71
77
 
72
78
  if @redactor
73
- res[:request] = @redactor.redact(res[:request])
79
+ res[:request], redacted = @redactor.redact(res[:request])
80
+ if redacted.any? && res[:observed] && res[:observed][:attacks]
81
+ res[:observed][:attacks] = @redactor.redact_attacks!(res[:observed][:attacks], redacted)
82
+ end
83
+ if redacted.any? && res[:observed] && res[:observed][:sqreen_exceptions]
84
+ res[:observed][:sqreen_exceptions] = @redactor.redact_exceptions!(res[:observed][:sqreen_exceptions], redacted)
85
+ end
74
86
  end
75
87
 
76
88
  res
@@ -115,59 +127,4 @@ module Sqreen
115
127
  nil
116
128
  end
117
129
  end
118
-
119
- # For redacting sensitive data and avoid having it sent to our servers
120
- class SensitiveDataRedactor
121
- DEFAULT_SENSITIVE_KEYS = Set.new(%w[password secret passwd authorization api_key apikey access_token]).freeze
122
- DEFAULT_REGEX = /\A(?:\d[ -]*?){13,16}\z/
123
- MASK = '<Redacted by Sqreen>'.freeze
124
-
125
- def self.from_config
126
- keys = Sqreen.config_get(:strip_sensitive_keys)
127
- if keys && keys.is_a?(String)
128
- keys = keys.split(',')
129
- else
130
- keys = nil
131
- end
132
-
133
- regex = Sqreen.config_get(:strip_sensitive_regex)
134
- if regex && regex.is_a?(String)
135
- begin
136
- regex = Regexp.compile(regex)
137
- rescue RegexpError
138
- Sqreen.log.warn("Invalid regular expression given in strip_sensitive_regex: #{regex}")
139
- regex = nil
140
- end
141
- else
142
- regex = nil
143
- end
144
-
145
- new(keys: keys, regex: regex)
146
- end
147
-
148
- def initialize(params = {})
149
- @regex = params[:regex] || DEFAULT_REGEX
150
- @keys = (params[:keys] || DEFAULT_SENSITIVE_KEYS).map(&:downcase)
151
- end
152
-
153
- def redact(obj)
154
- case obj
155
- when String
156
- return MASK if obj =~ @regex
157
-
158
- when Array
159
- return obj.map(&method(:redact))
160
-
161
- when Hash
162
- return Hash[
163
- obj.map do |k, v|
164
- ck = k.is_a?(String) ? k.downcase : k
165
- [k, @keys.include?(ck) ? MASK : redact(v)]
166
- end
167
- ]
168
- end
169
-
170
- obj
171
- end
172
- end
173
130
  end
@@ -1,9 +1,12 @@
1
+ # typed: false
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
4
6
  require 'sqreen/log'
5
7
 
6
8
  module Sqreen
9
+ # TODO: do we really want this to be StandardError?
7
10
  # Base exeception class for sqreen
8
11
  class Exception < ::StandardError
9
12
  def initialize(msg = nil, *args)
@@ -15,44 +18,12 @@ module Sqreen
15
18
  Sqreen.log.error(msg)
16
19
  end
17
20
  end
18
-
19
- # When the token is not found
20
- class TokenNotFoundException < Exception
21
- end
22
-
23
- # When the token is invalid
24
- class TokenInvalidException < Exception
25
- end
26
-
27
- # This exception name is particularly important since it is often seen by
28
- # Sqreen users when watching their logs. It should not raise any concern to
29
- # them.
30
- class AttackBlocked < Exception
31
- attr_accessor :redirect_url
32
-
33
- def log_message(msg)
34
- Sqreen.log.warn(msg)
35
- end
36
- end
37
-
38
- class NotImplementedYet < Exception
39
- end
40
-
41
- class InvalidSignatureException < Exception
42
- end
43
-
44
- class Unauthorized < Exception
45
- end
46
-
47
- class WAFError < Exception
48
- attr_reader :rule_name, :error, :data, :args
49
-
50
- def initialize(rule_name, error, data = nil, args = nil)
51
- super(error.to_s)
52
- @rule_name = rule_name
53
- @error = error
54
- @data = data
55
- @args = args
56
- end
57
- end
58
21
  end
22
+
23
+ require 'sqreen/token_not_found_exception'
24
+ require 'sqreen/token_invalid_exception'
25
+ require 'sqreen/attack_blocked'
26
+ require 'sqreen/not_implemented_yet'
27
+ require 'sqreen/invalid_signature_exception'
28
+ require 'sqreen/unauthorized'
29
+ require 'sqreen/waf_error'
@@ -0,0 +1,47 @@
1
+ # typed: true
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/log'
7
+
8
+ module Sqreen
9
+ # Ruby default formatter modified to display current thread_id
10
+ class FormatterWithTid
11
+ # TODO: constant name
12
+ Format = "%s, [%s#%d.%s] %5s -- %s: %s\n".freeze
13
+ DatetimeFormat = '%Y-%m-%dT%H:%M:%S.%6N '.freeze
14
+
15
+ attr_accessor :datetime_format
16
+
17
+ def initialize
18
+ @datetime_format = nil
19
+ end
20
+
21
+ def call(severity, time, progname, msg)
22
+ format(
23
+ Format,
24
+ severity[0..0], format_datetime(time), $$,
25
+ Thread.current.object_id.to_s(36),
26
+ severity, progname, msg2str(msg),
27
+ )
28
+ end
29
+
30
+ private
31
+
32
+ def format_datetime(time)
33
+ time.strftime(DatetimeFormat)
34
+ end
35
+
36
+ def msg2str(msg)
37
+ case msg
38
+ when ::String
39
+ msg
40
+ when ::Exception
41
+ "#{msg.message} (#{msg.class})\n" << (msg.backtrace || []).join("\n")
42
+ else
43
+ msg.inspect
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ # typed: true
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/cb'
7
+ require 'sqreen/shared_storage'
8
+
9
+ module Sqreen
10
+ # Framework-aware callback
11
+ class FrameworkCB < CB
12
+ attr_accessor :framework
13
+
14
+ def whitelisted?
15
+ whitelisted = SharedStorage.get(:whitelisted)
16
+ return whitelisted unless whitelisted.nil?
17
+ framework && !framework.whitelisted_match.nil?
18
+ end
19
+
20
+ # Record a metric observation
21
+ # @param category [String] Name of the metric observed
22
+ # @param key [String] aggregation key
23
+ # @param observation [Object] data observed
24
+ # @param at [Time] time when observation was made
25
+ def record_observation(category, key, observation, at = Time.now.utc)
26
+ return unless framework
27
+ framework.observe(:observations, [category, key, observation, at], [], false)
28
+ end
29
+ end
30
+ end
@@ -1,7 +1,16 @@
1
+ # typed: ignore
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ # TODO: @@framework global of hell, misscoped (move to Sqreen::Framework?)
7
+ # TODO: Sqreen::Frameworks => Sqreen::Framework
8
+
9
+ require 'sqreen/log'
10
+
4
11
  module Sqreen
12
+ module Frameworks; end
13
+
5
14
  @@framework = nil
6
15
 
7
16
  def self::set_framework(fwk)
@@ -1,13 +1,18 @@
1
+ # typed: ignore
2
+
1
3
  # Copyright (c) 2015 Sqreen. All Rights Reserved.
2
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
3
5
 
6
+ # TODO: Sqreen::NotImplementedYet => sqreen/exceptions
7
+
4
8
  require 'ipaddr'
5
9
  require 'set'
6
10
 
7
11
  require 'sqreen/events/remote_exception'
8
- require 'sqreen/callbacks'
12
+ require 'sqreen/shared_storage'
9
13
  require 'sqreen/exception'
10
14
  require 'sqreen/log'
15
+
11
16
  require 'sqreen/frameworks/request_recorder'
12
17
 
13
18
  module Sqreen
@@ -49,6 +54,7 @@ module Sqreen
49
54
  HTTP_X_CLUSTER_CLIENT_IP HTTP_FORWARDED_FOR
50
55
  HTTP_FORWARDED HTTP_VIA].freeze
51
56
 
57
+ # TODO: remove global config_get
52
58
  def preferred_ip_headers
53
59
  @preferred_ip_headers ||=
54
60
  begin
@@ -295,13 +301,14 @@ module Sqreen
295
301
  params
296
302
  end
297
303
 
298
- %w(form query cookies).each do |section|
304
+ %w(form query cookies rack).each do |section|
299
305
  define_method("#{section}_params") do
300
306
  self.class.send("#{section}_params", request)
301
307
  end
302
308
  end
303
309
 
304
310
  P_FORM = 'form'.freeze
311
+ P_RACK = 'rack'.freeze
305
312
  P_QUERY = 'query'.freeze
306
313
  P_COOKIE = 'cookies'.freeze
307
314
  P_GRAPE = 'grape_params'.freeze
@@ -317,6 +324,16 @@ module Sqreen
317
324
  end
318
325
  end
319
326
 
327
+ def self.rack_params(request)
328
+ return nil unless request
329
+ begin
330
+ request.params
331
+ rescue => e
332
+ Sqreen.log.debug("Rack Parameters are invalid #{e.inspect}")
333
+ nil
334
+ end
335
+ end
336
+
320
337
  def self.cookies_params(request)
321
338
  return nil unless request
322
339
  begin
@@ -345,6 +362,9 @@ module Sqreen
345
362
  P_QUERY => query_params(request),
346
363
  P_COOKIE => cookies_params(request),
347
364
  }
365
+ if (p = rack_params(request))
366
+ r[P_RACK] = p
367
+ end
348
368
  # Add grape parameters if seen
349
369
  p = request.env['grape.request.params']
350
370
  r[P_GRAPE] = p if p