sqreen 1.17.0-java → 1.17.2.beta1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +418 -0
- data/README.md +5 -5
- data/lib/sqreen.rb +2 -72
- data/lib/sqreen/agent.rb +37 -0
- data/lib/sqreen/call_countable.rb +6 -6
- data/lib/sqreen/conditionable.rb +6 -6
- data/lib/sqreen/dependency.rb +18 -0
- data/lib/sqreen/dependency/callback.rb +34 -0
- data/lib/sqreen/dependency/detector.rb +97 -0
- data/lib/sqreen/dependency/hook.rb +102 -0
- data/lib/sqreen/dependency/hook_point.rb +219 -0
- data/lib/sqreen/dependency/new_relic.rb +17 -0
- data/lib/sqreen/dependency/rack.rb +36 -0
- data/lib/sqreen/dependency/rails.rb +30 -0
- data/lib/sqreen/dependency/sentry.rb +17 -0
- data/lib/sqreen/exception.rb +3 -0
- data/lib/sqreen/frameworks/generic.rb +2 -97
- data/lib/sqreen/frameworks/rails.rb +4 -13
- data/lib/sqreen/frameworks/sinatra.rb +0 -25
- data/lib/sqreen/instrumentation.rb +5 -4
- data/lib/sqreen/rules_callbacks/execjs.rb +3 -0
- data/lib/sqreen/rules_callbacks/record_request_context.rb +4 -1
- data/lib/sqreen/runner.rb +0 -3
- data/lib/sqreen/session.rb +40 -45
- data/lib/sqreen/version.rb +1 -1
- data/lib/sqreen/web_server.rb +54 -0
- data/lib/sqreen/web_server/generic.rb +24 -0
- data/lib/sqreen/web_server/passenger.rb +33 -0
- data/lib/sqreen/web_server/puma.rb +62 -0
- data/lib/sqreen/web_server/rainbows.rb +14 -0
- data/lib/sqreen/web_server/thin.rb +14 -0
- data/lib/sqreen/web_server/unicorn.rb +52 -0
- data/lib/sqreen/web_server/webrick.rb +14 -0
- data/lib/sqreen/worker.rb +68 -0
- metadata +28 -6
data/lib/sqreen/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
require 'sqreen/log'
|
5
|
+
require 'sqreen/web_server/generic'
|
6
|
+
require 'sqreen/web_server/unicorn'
|
7
|
+
require 'sqreen/web_server/rainbows'
|
8
|
+
require 'sqreen/web_server/puma'
|
9
|
+
require 'sqreen/web_server/passenger'
|
10
|
+
require 'sqreen/web_server/thin'
|
11
|
+
require 'sqreen/web_server/webrick'
|
12
|
+
|
13
|
+
module Sqreen
|
14
|
+
module WebServer
|
15
|
+
module_function
|
16
|
+
|
17
|
+
def attach
|
18
|
+
extend(detect)
|
19
|
+
|
20
|
+
Sqreen.log.debug "[#{Process.pid}] #{detect.inspect}"
|
21
|
+
|
22
|
+
if forking? && preload_app? && master?
|
23
|
+
Sqreen.log.debug "[#{Process.pid}] master process #{Process.pid} delegating Sqreen worker boot to forked web worker processes"
|
24
|
+
Sqreen.log.debug('Sqreen detected a forking web server with preloading')
|
25
|
+
Sqreen.log.debug("master process #{Process.pid} delegating Sqreen worker boot to forked web worker processes")
|
26
|
+
after_fork { yield }
|
27
|
+
elsif forking? && !master? && !preload_app?
|
28
|
+
Sqreen.log.debug "[#{Process.pid}] Booting Sqreen worker in process #{Process.pid}"
|
29
|
+
Sqreen.log.debug('Sqreen detected a forked web worker without preloading')
|
30
|
+
Sqreen.log.debug("Booting Sqreen worker in process #{Process.pid}")
|
31
|
+
yield
|
32
|
+
elsif !forking?
|
33
|
+
Sqreen.log.debug "[#{Process.pid}] Booting Sqreen worker in process #{Process.pid}"
|
34
|
+
Sqreen.log.debug('Sqreen detected a single-process web server')
|
35
|
+
Sqreen.log.debug("Booting Sqreen worker in process #{Process.pid}")
|
36
|
+
yield
|
37
|
+
else
|
38
|
+
Sqreen.log.debug "[#{Process.pid}] NOOP"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def detect
|
43
|
+
[
|
44
|
+
Sqreen::WebServer::Puma,
|
45
|
+
Sqreen::WebServer::Rainbows,
|
46
|
+
Sqreen::WebServer::Unicorn,
|
47
|
+
Sqreen::WebServer::Passenger,
|
48
|
+
Sqreen::WebServer::Thin,
|
49
|
+
Sqreen::WebServer::WEBrick,
|
50
|
+
Sqreen::WebServer::Generic,
|
51
|
+
].find(&:active?)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module Generic
|
7
|
+
def self.active?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def forking?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def preload_app?
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def before_fork(&block); end
|
20
|
+
|
21
|
+
def after_fork(&block); end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module Passenger
|
7
|
+
def self.active?
|
8
|
+
Sqreen::Dependency.const_exist?('PhusionPassenger::App')
|
9
|
+
end
|
10
|
+
|
11
|
+
def forking?
|
12
|
+
::PhusionPassenger::App.options['spawn_method'] == 'smart' # otherwise direct
|
13
|
+
end
|
14
|
+
|
15
|
+
def preload_app?
|
16
|
+
forking? # overarching spawn method behavior
|
17
|
+
end
|
18
|
+
|
19
|
+
def master?
|
20
|
+
preload_app? # overarching spawn method behavior
|
21
|
+
end
|
22
|
+
|
23
|
+
def before_fork(&block); end
|
24
|
+
|
25
|
+
def after_fork
|
26
|
+
after_fork = lambda do |forked|
|
27
|
+
yield if forked # forked == true in child
|
28
|
+
end
|
29
|
+
::PhusionPassenger.on_event(:starting_worker_process, &after_fork)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module Puma
|
7
|
+
def self.active?
|
8
|
+
Sqreen::Dependency.const_exist?('Puma::Runner') && ObjectSpace.each_object(::Puma::Runner).count > 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def forking?
|
12
|
+
!cluster.nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
def preload_app?
|
16
|
+
forking? && (cluster && cluster.preload? || false)
|
17
|
+
end
|
18
|
+
|
19
|
+
def master?
|
20
|
+
# HACK: expects outside calling timimg
|
21
|
+
# - with preloading, this is hit early in master and records its PID
|
22
|
+
# - without preloading but forking, the app will be loaded in the child, so recorded PID stays nil
|
23
|
+
# - without forking, master makes no sense, recorded PID stays nil
|
24
|
+
master! if preload_app?
|
25
|
+
|
26
|
+
Sqreen.log.debug "[#{Process.pid}] master? #{@master_pid == Process.pid}"
|
27
|
+
|
28
|
+
@master_pid == Process.pid
|
29
|
+
end
|
30
|
+
|
31
|
+
def before_fork
|
32
|
+
before_fork = lambda do |_ = nil| # 3.x sends an arg but <3.0 doesn't
|
33
|
+
yield
|
34
|
+
end
|
35
|
+
(configuration.options[:before_fork] || []) << before_fork
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_fork
|
39
|
+
after_fork = lambda do |_|
|
40
|
+
yield
|
41
|
+
end
|
42
|
+
(configuration.options[:before_worker_boot] ||= []) << after_fork
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def master!
|
48
|
+
@master_pid ||= Process.pid
|
49
|
+
end
|
50
|
+
|
51
|
+
def cluster
|
52
|
+
return unless ::Puma.const_defined?('Cluster')
|
53
|
+
|
54
|
+
ObjectSpace.each_object(::Puma::Cluster).first
|
55
|
+
end
|
56
|
+
|
57
|
+
def configuration
|
58
|
+
ObjectSpace.each_object(::Puma::Configuration).first
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module Rainbows
|
7
|
+
include Sqreen::WebServer::Unicorn
|
8
|
+
|
9
|
+
def self.active?
|
10
|
+
Sqreen::Dependency.const_exist?('Rainbows::HttpServer') && ObjectSpace.each_object(::Rainbows::HttpServer).count > 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module Thin
|
7
|
+
include Sqreen::WebServer::Generic
|
8
|
+
|
9
|
+
def self.active?
|
10
|
+
Sqreen::Dependency.const_exist?('Thin::Server') && ObjectSpace.each_object(::Thin::Server).count > 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module Unicorn
|
7
|
+
def self.active?
|
8
|
+
Sqreen::Dependency.const_exist?('Unicorn::SocketHelper') && ObjectSpace.each_object(::Unicorn::SocketHelper).count > 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def forking?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def master?
|
16
|
+
!master.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def preload_app?
|
20
|
+
ObjectSpace.each_object(::Unicorn::HttpServer).first.preload_app
|
21
|
+
end
|
22
|
+
|
23
|
+
def before_fork
|
24
|
+
before_fork = master.before_fork
|
25
|
+
before_fork_wrapper = lambda do |a, b|
|
26
|
+
before_fork.call(a, b).tap { yield }
|
27
|
+
end
|
28
|
+
master.before_fork = before_fork_wrapper
|
29
|
+
end
|
30
|
+
|
31
|
+
def after_fork
|
32
|
+
after_fork = master.after_fork
|
33
|
+
after_fork_wrapper = lambda do |a, b|
|
34
|
+
after_fork.call(a, b).tap { yield }
|
35
|
+
end
|
36
|
+
master.after_fork = after_fork_wrapper
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def master
|
42
|
+
ObjectSpace.each_object(::Unicorn::HttpServer).select do |s|
|
43
|
+
if s.is_a? Struct # unicorn <2.0
|
44
|
+
s.master_pid == Process.pid
|
45
|
+
else
|
46
|
+
s.instance_eval { @master_pid } == Process.pid
|
47
|
+
end
|
48
|
+
end.first
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
module Sqreen
|
5
|
+
module WebServer
|
6
|
+
module WEBrick
|
7
|
+
include Sqreen::WebServer::Generic
|
8
|
+
|
9
|
+
def self.active?
|
10
|
+
Sqreen::Dependency.const_exist?('WEBrick::HTTPServer') && ObjectSpace.each_object(::WEBrick::HTTPServer).count > 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
|
+
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
|
+
|
4
|
+
require 'thread'
|
5
|
+
|
6
|
+
module Sqreen
|
7
|
+
module Worker
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def start(framework)
|
11
|
+
Sqreen.log.debug('Starting Sqreen worker thread')
|
12
|
+
|
13
|
+
Thread.new do
|
14
|
+
begin
|
15
|
+
runner = nil
|
16
|
+
Sqreen.log.debug("Reading configuration")
|
17
|
+
configuration = Sqreen.config_init(framework)
|
18
|
+
framework.sqreen_configuration = configuration
|
19
|
+
Sqreen.log.debug("Initializing logs")
|
20
|
+
Sqreen.log_init
|
21
|
+
Sqreen.log.debug("Starting Sqreen #{Sqreen::VERSION}")
|
22
|
+
prevent_startup = Sqreen.framework.prevent_startup
|
23
|
+
if !prevent_startup
|
24
|
+
warn "[#{Process.pid}] Sqreen logging at level #{Sqreen.log.instance_eval { @logger }.level} to #{Sqreen.log.instance_eval { @logger }.instance_eval { @logdev.filename }}"
|
25
|
+
runner = Sqreen::Runner.new(configuration, framework)
|
26
|
+
runner.run_watcher
|
27
|
+
else
|
28
|
+
Sqreen.log.debug("#{prevent_startup} prevented Sqreen startup")
|
29
|
+
end
|
30
|
+
rescue Sqreen::TokenNotFoundException
|
31
|
+
Sqreen.log.error "Sorry but we couldn't find your Sqreen token.\nYour application is NOT currently protected by Sqreen.\n\nHave you filled your config/sqreen.yml?\n\n"
|
32
|
+
rescue Sqreen::TokenInvalidException
|
33
|
+
Sqreen.log.error "Sorry but your Sqreen token appears to be invalid.\nYour application is NOT currently protected by Sqreen.\n\nHave you correctly filled your config/sqreen.yml?\n\n"
|
34
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
35
|
+
Sqreen.log.debug("General exception caught: #{e.inspect}")
|
36
|
+
Sqreen.log.debug e.backtrace
|
37
|
+
if runner
|
38
|
+
unless e.is_a?(Sqreen::Unauthorized)
|
39
|
+
Sqreen.log.debug("Immediately posting exception for runner #{runner.inspect}")
|
40
|
+
runner.session.post_sqreen_exception(Sqreen::RemoteException.new(e))
|
41
|
+
end
|
42
|
+
begin
|
43
|
+
runner.remove_instrumentation
|
44
|
+
rescue StandardError => e
|
45
|
+
Sqreen.log.debug("Unexpected exception when removing instrumentation: #{e.inspect}")
|
46
|
+
Sqreen.log.debug e.backtrace
|
47
|
+
Sqreen.log.error("Terminating Sqreen thread")
|
48
|
+
return nil
|
49
|
+
end
|
50
|
+
begin
|
51
|
+
runner.logout(false)
|
52
|
+
rescue StandardError => e
|
53
|
+
Sqreen.log.debug("Unexpected exception when logging out: #{remove_exception.inspect}")
|
54
|
+
Sqreen.log.debug(e.backtrace)
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
# Wait a few seconds before retrying
|
59
|
+
delay = rand(120)
|
60
|
+
Sqreen.log.debug("Sleeping #{delay} seconds before restarting Sqreen thread")
|
61
|
+
sleep(delay)
|
62
|
+
retry
|
63
|
+
end
|
64
|
+
Sqreen.log.debug("Shutting down Sqreen #{Sqreen::VERSION}")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqreen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.17.
|
4
|
+
version: 1.17.2.beta1
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Sqreen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03
|
11
|
+
date: 2019-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,12 +45,14 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
+
- CHANGELOG.md
|
48
49
|
- CODE_OF_CONDUCT.md
|
49
50
|
- README.md
|
50
51
|
- Rakefile
|
51
52
|
- lib/sqreen-alt.rb
|
52
53
|
- lib/sqreen.rb
|
53
54
|
- lib/sqreen/actions.rb
|
55
|
+
- lib/sqreen/agent.rb
|
54
56
|
- lib/sqreen/attack_detected.html
|
55
57
|
- lib/sqreen/binding_accessor.rb
|
56
58
|
- lib/sqreen/ca.crt
|
@@ -64,6 +66,15 @@ files:
|
|
64
66
|
- lib/sqreen/context.rb
|
65
67
|
- lib/sqreen/deliveries/batch.rb
|
66
68
|
- lib/sqreen/deliveries/simple.rb
|
69
|
+
- lib/sqreen/dependency.rb
|
70
|
+
- lib/sqreen/dependency/callback.rb
|
71
|
+
- lib/sqreen/dependency/detector.rb
|
72
|
+
- lib/sqreen/dependency/hook.rb
|
73
|
+
- lib/sqreen/dependency/hook_point.rb
|
74
|
+
- lib/sqreen/dependency/new_relic.rb
|
75
|
+
- lib/sqreen/dependency/rack.rb
|
76
|
+
- lib/sqreen/dependency/rails.rb
|
77
|
+
- lib/sqreen/dependency/sentry.rb
|
67
78
|
- lib/sqreen/event.rb
|
68
79
|
- lib/sqreen/events/attack.rb
|
69
80
|
- lib/sqreen/events/remote_exception.rb
|
@@ -133,10 +144,21 @@ files:
|
|
133
144
|
- lib/sqreen/shared_storage23.rb
|
134
145
|
- lib/sqreen/trie.rb
|
135
146
|
- lib/sqreen/version.rb
|
147
|
+
- lib/sqreen/web_server.rb
|
148
|
+
- lib/sqreen/web_server/generic.rb
|
149
|
+
- lib/sqreen/web_server/passenger.rb
|
150
|
+
- lib/sqreen/web_server/puma.rb
|
151
|
+
- lib/sqreen/web_server/rainbows.rb
|
152
|
+
- lib/sqreen/web_server/thin.rb
|
153
|
+
- lib/sqreen/web_server/unicorn.rb
|
154
|
+
- lib/sqreen/web_server/webrick.rb
|
155
|
+
- lib/sqreen/worker.rb
|
136
156
|
homepage: https://www.sqreen.io/
|
137
157
|
licenses: []
|
138
158
|
metadata: {}
|
139
|
-
post_install_message:
|
159
|
+
post_install_message: |2
|
160
|
+
This is a Sqreen beta release and may not work in all situations.
|
161
|
+
Make sure to review CHANGELOG.md for important details.
|
140
162
|
rdoc_options: []
|
141
163
|
require_paths:
|
142
164
|
- lib
|
@@ -144,12 +166,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
166
|
requirements:
|
145
167
|
- - ">="
|
146
168
|
- !ruby/object:Gem::Version
|
147
|
-
version: '
|
169
|
+
version: '2.2'
|
148
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
171
|
requirements:
|
150
|
-
- - "
|
172
|
+
- - ">"
|
151
173
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
174
|
+
version: 1.3.1
|
153
175
|
requirements: []
|
154
176
|
rubyforge_project:
|
155
177
|
rubygems_version: 2.7.7
|