tcell_agent 1.1.12 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +5 -5
  2. data/bin/tcell_agent +26 -14
  3. data/lib/tcell_agent.rb +16 -10
  4. data/lib/tcell_agent/agent.rb +78 -97
  5. data/lib/tcell_agent/agent/route_manager.rb +0 -16
  6. data/lib/tcell_agent/agent/static_agent.rb +9 -30
  7. data/lib/tcell_agent/authlogic.rb +3 -6
  8. data/lib/tcell_agent/config/unknown_options.rb +4 -8
  9. data/lib/tcell_agent/configuration.rb +38 -119
  10. data/lib/tcell_agent/devise.rb +25 -27
  11. data/lib/tcell_agent/hooks/login_fraud.rb +30 -33
  12. data/lib/tcell_agent/instrument_servers.rb +25 -0
  13. data/lib/tcell_agent/instrumentation.rb +12 -10
  14. data/lib/tcell_agent/instrumentation/cmdi.rb +19 -15
  15. data/lib/tcell_agent/instrumentation/lfi.rb +73 -0
  16. data/lib/tcell_agent/instrumentation/monkey_patches/file.rb +25 -0
  17. data/lib/tcell_agent/instrumentation/monkey_patches/io.rb +123 -0
  18. data/lib/tcell_agent/instrumentation/monkey_patches/kernel.rb +159 -0
  19. data/lib/tcell_agent/logger.rb +50 -114
  20. data/lib/tcell_agent/patches.rb +6 -7
  21. data/lib/tcell_agent/policies/appfirewall_policy.rb +26 -0
  22. data/lib/tcell_agent/policies/command_injection_policy.rb +28 -0
  23. data/lib/tcell_agent/policies/dataloss_policy.rb +44 -44
  24. data/lib/tcell_agent/policies/headers_policy.rb +25 -0
  25. data/lib/tcell_agent/policies/http_redirect_policy.rb +13 -79
  26. data/lib/tcell_agent/policies/js_agent_policy.rb +27 -0
  27. data/lib/tcell_agent/policies/local_file_access.rb +28 -0
  28. data/lib/tcell_agent/policies/login_policy.rb +43 -0
  29. data/lib/tcell_agent/policies/patches_policy.rb +27 -0
  30. data/lib/tcell_agent/policies/policies_manager.rb +68 -0
  31. data/lib/tcell_agent/policies/policy_polling.rb +58 -0
  32. data/lib/tcell_agent/policies/policy_types.rb +14 -0
  33. data/lib/tcell_agent/policies/system_enablements.rb +27 -0
  34. data/lib/tcell_agent/rails/auth/authlogic.rb +43 -68
  35. data/lib/tcell_agent/rails/auth/devise.rb +20 -23
  36. data/lib/tcell_agent/rails/auth/doorkeeper.rb +63 -74
  37. data/lib/tcell_agent/rails/csrf_exception.rb +2 -2
  38. data/lib/tcell_agent/rails/dlp.rb +25 -15
  39. data/lib/tcell_agent/rails/dlp_handler.rb +1 -2
  40. data/lib/tcell_agent/rails/js_agent_insert.rb +12 -13
  41. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +4 -25
  42. data/lib/tcell_agent/rails/middleware/context_middleware.rb +2 -12
  43. data/lib/tcell_agent/rails/middleware/global_middleware.rb +0 -1
  44. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +14 -34
  45. data/lib/tcell_agent/rails/on_start.rb +32 -31
  46. data/lib/tcell_agent/rails/routes.rb +7 -6
  47. data/lib/tcell_agent/rails/routes/grape.rb +1 -3
  48. data/lib/tcell_agent/rails/routes/route_id.rb +3 -1
  49. data/lib/tcell_agent/rails/settings_reporter.rb +23 -36
  50. data/lib/tcell_agent/rails/start_agent_after_initializers.rb +12 -0
  51. data/lib/tcell_agent/rails/tcell_body_proxy.rb +6 -4
  52. data/lib/tcell_agent/rust/agent_config.rb +49 -0
  53. data/lib/tcell_agent/rust/{libtcellagent-alpine-1.3.2.so → libtcellagent-4.14.0.dylib} +0 -0
  54. data/lib/tcell_agent/rust/libtcellagent-4.14.0.so +0 -0
  55. data/lib/tcell_agent/rust/{libtcellagent-1.3.2.so → libtcellagent-alpine-4.14.0.so} +0 -0
  56. data/lib/tcell_agent/rust/models.rb +0 -55
  57. data/lib/tcell_agent/rust/native_agent.rb +531 -0
  58. data/lib/tcell_agent/rust/native_agent_response.rb +42 -0
  59. data/lib/tcell_agent/rust/native_library.rb +68 -0
  60. data/lib/tcell_agent/rust/tcellagent-4.14.0.dll +0 -0
  61. data/lib/tcell_agent/sensor_events/agent_setting_event.rb +12 -0
  62. data/lib/tcell_agent/sensor_events/{app_config.rb → app_config_setting_event.rb} +0 -6
  63. data/lib/tcell_agent/sensor_events/dlp.rb +2 -6
  64. data/lib/tcell_agent/sensor_events/sensor.rb +0 -62
  65. data/lib/tcell_agent/sensor_events/server_agent.rb +13 -18
  66. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +0 -108
  67. data/lib/tcell_agent/sensor_events/util/utils.rb +0 -2
  68. data/lib/tcell_agent/servers/passenger.rb +1 -28
  69. data/lib/tcell_agent/servers/puma.rb +3 -21
  70. data/lib/tcell_agent/servers/rails_server.rb +1 -1
  71. data/lib/tcell_agent/servers/thin.rb +2 -2
  72. data/lib/tcell_agent/servers/unicorn.rb +19 -80
  73. data/lib/tcell_agent/servers/webrick.rb +1 -1
  74. data/lib/tcell_agent/settings_reporter.rb +24 -24
  75. data/lib/tcell_agent/sinatra.rb +14 -16
  76. data/lib/tcell_agent/tcell_context.rb +40 -14
  77. data/lib/tcell_agent/utils/headers.rb +14 -0
  78. data/lib/tcell_agent/version.rb +1 -1
  79. data/spec/lib/tcell_agent/cmdi_spec.rb +0 -585
  80. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +0 -18
  81. data/spec/lib/tcell_agent/configuration_spec.rb +4 -140
  82. data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +46 -173
  83. data/spec/lib/tcell_agent/instrumentation/cmdi/io_cmdi_spec.rb +504 -0
  84. data/spec/lib/tcell_agent/instrumentation/cmdi/kernel_cmdi_spec.rb +435 -0
  85. data/spec/lib/tcell_agent/instrumentation/lfi/file_lfi_spec.rb +326 -0
  86. data/spec/lib/tcell_agent/instrumentation/lfi/io_lfi_spec.rb +556 -0
  87. data/spec/lib/tcell_agent/instrumentation/lfi/kernel_lfi_spec.rb +249 -0
  88. data/spec/lib/tcell_agent/instrumentation/lfi_spec.rb +105 -0
  89. data/spec/lib/tcell_agent/patches_spec.rb +25 -43
  90. data/spec/lib/tcell_agent/policies/appfirewall_policy_spec.rb +183 -0
  91. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +57 -0
  92. data/spec/lib/tcell_agent/policies/command_injection_policy_spec.rb +84 -773
  93. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +161 -0
  94. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +9 -9
  95. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +243 -198
  96. data/spec/lib/tcell_agent/policies/js_agent_policy_spec.rb +75 -0
  97. data/spec/lib/tcell_agent/policies/login_policy_spec.rb +165 -33
  98. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +84 -277
  99. data/spec/lib/tcell_agent/policies/policies_manager_spec.rb +104 -0
  100. data/spec/lib/tcell_agent/policies/policy_polling_spec.rb +6 -0
  101. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +56 -0
  102. data/spec/lib/tcell_agent/rails/csrf_exception_spec.rb +9 -18
  103. data/spec/lib/tcell_agent/rails/js_agent_insert_spec.rb +13 -30
  104. data/spec/lib/tcell_agent/rails/logger_spec.rb +27 -7
  105. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +17 -12
  106. data/spec/lib/tcell_agent/rails/routes/routes_spec.rb +14 -14
  107. data/spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb +0 -35
  108. data/spec/lib/tcell_agent/settings_reporter_spec.rb +127 -153
  109. data/spec/spec_helper.rb +1 -1
  110. data/spec/support/builders.rb +104 -0
  111. data/spec/support/force_logger_mocking.rb +38 -0
  112. data/spec/support/resources/lfi_sample_file.txt +2 -0
  113. data/spec/support/static_agent_overrides.rb +0 -15
  114. metadata +63 -74
  115. data/lib/tcell_agent/agent/event_processor.rb +0 -326
  116. data/lib/tcell_agent/agent/fork_pipe_manager.rb +0 -113
  117. data/lib/tcell_agent/agent/policy_manager.rb +0 -219
  118. data/lib/tcell_agent/agent/policy_types.rb +0 -30
  119. data/lib/tcell_agent/api.rb +0 -91
  120. data/lib/tcell_agent/appsensor/injections_reporter.rb +0 -24
  121. data/lib/tcell_agent/config/child_process_events.rb +0 -8
  122. data/lib/tcell_agent/instrumentation/cmdi/backtick.rb +0 -10
  123. data/lib/tcell_agent/instrumentation/cmdi/exec.rb +0 -14
  124. data/lib/tcell_agent/instrumentation/cmdi/popen.rb +0 -28
  125. data/lib/tcell_agent/instrumentation/cmdi/spawn.rb +0 -11
  126. data/lib/tcell_agent/instrumentation/cmdi/system.rb +0 -11
  127. data/lib/tcell_agent/policies/http_tx_policy.rb +0 -60
  128. data/lib/tcell_agent/policies/login_fraud_policy.rb +0 -45
  129. data/lib/tcell_agent/policies/rust_policies.rb +0 -110
  130. data/lib/tcell_agent/rails.rb +0 -40
  131. data/lib/tcell_agent/rust/libtcellagent-1.3.2.dylib +0 -0
  132. data/lib/tcell_agent/rust/tcellagent-1.3.2.dll +0 -0
  133. data/lib/tcell_agent/rust/whisperer.rb +0 -308
  134. data/lib/tcell_agent/sensor_events/appsensor_event.rb +0 -52
  135. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +0 -45
  136. data/lib/tcell_agent/sensor_events/command_injection.rb +0 -75
  137. data/lib/tcell_agent/sensor_events/honeytokens.rb +0 -16
  138. data/lib/tcell_agent/sensor_events/login_fraud.rb +0 -60
  139. data/lib/tcell_agent/sensor_events/metrics.rb +0 -123
  140. data/lib/tcell_agent/sensor_events/patches.rb +0 -21
  141. data/lib/tcell_agent/start_background_thread.rb +0 -55
  142. data/lib/tcell_agent/system_info.rb +0 -11
  143. data/lib/tcell_agent/utils/io.rb +0 -38
  144. data/lib/tcell_agent/utils/passwords.rb +0 -28
  145. data/lib/tcell_agent/utils/queue_with_timeout.rb +0 -142
  146. data/spec/lib/tcell_agent/agent/fork_pipe_manager_spec.rb +0 -100
  147. data/spec/lib/tcell_agent/agent/policy_manager_spec.rb +0 -535
  148. data/spec/lib/tcell_agent/agent/static_agent_spec.rb +0 -133
  149. data/spec/lib/tcell_agent/api/api_spec.rb +0 -39
  150. data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +0 -187
  151. data/spec/lib/tcell_agent/instrumentation_spec.rb +0 -225
  152. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +0 -517
  153. data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +0 -22
  154. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +0 -293
  155. data/spec/lib/tcell_agent/rails/middleware/dlp_middleware_spec.rb +0 -198
  156. data/spec/lib/tcell_agent/rails/middleware/global_middleware_spec.rb +0 -180
  157. data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +0 -116
  158. data/spec/lib/tcell_agent/rust/models_spec.rb +0 -120
  159. data/spec/lib/tcell_agent/rust/whisperer_spec.rb +0 -704
  160. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +0 -45
  161. data/spec/lib/tcell_agent/sensor_events/sessions_metric_spec.rb +0 -272
  162. data/spec/lib/tcell_agent/utils/bounded_queue_spec.rb +0 -52
  163. data/spec/lib/tcell_agent/utils/passwords_spec.rb +0 -143
@@ -0,0 +1,249 @@
1
+ # rubocop:disable Security/Open
2
+ # rubocop:disable Lint/UselessAssignment
3
+ require 'spec_helper'
4
+ require 'securerandom'
5
+
6
+ describe 'Kernel' do
7
+ before do
8
+ native_agent = double('native_agent')
9
+ @local_files_policy = TCellAgent::Policies::LocalFileInclusion.new(
10
+ native_agent, {}
11
+ )
12
+ @filename = get_test_resource_path('lfi_sample_file.txt')
13
+ @file_contents = "This is line one.\nThis is line two.\n"
14
+ end
15
+
16
+ before(:all) do
17
+ @new_file_name = '/tmp/' + SecureRandom.uuid
18
+ end
19
+ describe '#open and ::open' do
20
+ context 'empty path' do
21
+ it 'should raise an error' do
22
+ expect do
23
+ Kernel.open
24
+ end.to raise_error(ArgumentError)
25
+ expect do
26
+ Kernel.open(nil)
27
+ end.to raise_error(TypeError)
28
+ expect do
29
+ Kernel.open('')
30
+ end.to raise_error(Errno::ENOENT)
31
+ expect do
32
+ open
33
+ end.to raise_error(ArgumentError)
34
+ expect do
35
+ open(nil)
36
+ end.to raise_error(TypeError)
37
+ expect do
38
+ open('')
39
+ end.to raise_error(Errno::ENOENT)
40
+ end
41
+ end
42
+ context 'with a filename not blocked for read/write' do
43
+ before do |test|
44
+ unless test.metadata[:skip_before]
45
+ expect(TCellAgent).to receive(:policy).with(
46
+ TCellAgent::PolicyTypes::LFI
47
+ ).and_return(@local_files_policy, @local_files_policy)
48
+ expect(@local_files_policy).to receive(:block_file_access?).and_return(false, false)
49
+ end
50
+ end
51
+
52
+ it 'should still be able to execute OS commands', :skip_before do
53
+ result = Kernel.open('|echo test').read
54
+ expect(result).to eq "test\n"
55
+
56
+ result = open('|echo test').read
57
+ expect(result).to eq "test\n"
58
+ end
59
+ context 'with a nonexistent filename with mode w' do
60
+ it 'should create the file' do
61
+ Kernel.open(@new_file_name, 'w')
62
+ expect(File.exist?(@new_file_name)).to be_truthy
63
+ File.delete(@new_file_name)
64
+
65
+ open(@new_file_name, 'w')
66
+ expect(File.exist?(@new_file_name)).to be_truthy
67
+ File.delete(@new_file_name)
68
+ end
69
+ end
70
+ context 'with a filename and mode w and file permissions 644' do
71
+ it 'should create the file with the correct permissions' do
72
+ Kernel.open(@new_file_name, 'w', 0o644)
73
+ expect(File.stat(@new_file_name).mode.to_s(8)[3..5]).to eq('644')
74
+ File.delete(@new_file_name)
75
+
76
+ open(@new_file_name, 'w', 0o644)
77
+ expect(File.stat(@new_file_name).mode.to_s(8)[3..5]).to eq('644')
78
+ File.delete(@new_file_name)
79
+ end
80
+ end
81
+ context 'with a filename and mode w and file permissions 777' do
82
+ it 'should create the file with the correct permissions 755' do
83
+ Kernel.open(@new_file_name, 'w', 0o777)
84
+ expect(File.stat(@new_file_name).mode.to_s(8)[3..5]).to eq('755')
85
+ File.delete(@new_file_name)
86
+
87
+ open(@new_file_name, 'w', 0o777)
88
+ expect(File.stat(@new_file_name).mode.to_s(8)[3..5]).to eq('755')
89
+ File.delete(@new_file_name)
90
+ end
91
+ end
92
+ end
93
+ context 'with a filename blocked for read/write' do
94
+ before do |test|
95
+ unless test.metadata[:skip_before]
96
+ expect(TCellAgent).to receive(:policy).with(
97
+ TCellAgent::PolicyTypes::LFI
98
+ ).and_return(@local_files_policy, @local_files_policy)
99
+ expect(@local_files_policy).to receive(:block_file_access?).and_return(true, true)
100
+ end
101
+ end
102
+
103
+ it 'should still be able to execute OS commands', :skip_before do
104
+ result = Kernel.open('|echo test').read
105
+ expect(result).to eq "test\n"
106
+
107
+ result = open('|echo test').read
108
+ expect(result).to eq "test\n"
109
+ end
110
+ context 'with a nonexistent filename with mode w' do
111
+ it 'should raise an error' do
112
+ expect do
113
+ Kernel.open(@new_file_name, 'w')
114
+ end.to raise_error(IOError)
115
+
116
+ expect do
117
+ open(@new_file_name, 'w')
118
+ end.to raise_error(IOError)
119
+ end
120
+ end
121
+ context 'with a filename and mode w' do
122
+ it 'should raise an error' do
123
+ expect do
124
+ Kernel.open(@new_file_name, 'w')
125
+ end.to raise_error(IOError)
126
+
127
+ expect do
128
+ open(@new_file_name, 'w')
129
+ end.to raise_error(IOError)
130
+ end
131
+ end
132
+ context 'with a filename and mode a' do
133
+ it 'should raise an error' do
134
+ expect do
135
+ Kernel.open(@new_file_name, 'a')
136
+ end.to raise_error(IOError)
137
+
138
+ expect do
139
+ open(@new_file_name, 'a')
140
+ end.to raise_error(IOError)
141
+ end
142
+ end
143
+ end
144
+ end
145
+
146
+ describe '::gets and #gets' do
147
+ context 'with a filename not blocked for read/write' do
148
+ it 'should still be able to read the file' do
149
+ expect(TCellAgent).to receive(:policy).with(
150
+ TCellAgent::PolicyTypes::LFI
151
+ ).and_return(@local_files_policy, @local_files_policy, @local_files_policy, @local_files_policy)
152
+ expect(@local_files_policy).to receive(:block_file_access?).and_return(false, false, false, false)
153
+
154
+ copy = Array.new(ARGV)
155
+ ARGV.clear
156
+ ARGV << @filename
157
+ result = gets
158
+ result << gets
159
+ ARGV.replace(copy)
160
+ expect(result).to eq @file_contents
161
+
162
+ copy = Array.new(ARGV)
163
+ ARGV.clear
164
+ ARGV << @filename
165
+ result = Kernel.gets
166
+ result << Kernel.gets
167
+ ARGV.replace(copy)
168
+ expect(result).to eq @file_contents
169
+ end
170
+ end
171
+ context 'with a filename blocked for read/write' do
172
+ it 'should not be able to read the file' do
173
+ expect(TCellAgent).to receive(:policy).with(
174
+ TCellAgent::PolicyTypes::LFI
175
+ ).and_return(@local_files_policy, @local_files_policy)
176
+ expect(@local_files_policy).to receive(:block_file_access?).and_return(true, true)
177
+
178
+ copy = Array.new(ARGV)
179
+ ARGV.clear
180
+ ARGV << @filename
181
+ expect do
182
+ result = gets
183
+ end.to raise_error(IOError)
184
+ ARGV.replace(copy)
185
+
186
+ copy = Array.new(ARGV)
187
+ ARGV.clear
188
+ ARGV << @filename
189
+ expect do
190
+ result = Kernel.gets
191
+ end.to raise_error(IOError)
192
+ ARGV.replace(copy)
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '::readline and #readline' do
198
+ context 'with a filename not blocked for read/write' do
199
+ it 'should be able to read the file' do
200
+ expect(TCellAgent).to receive(:policy).with(
201
+ TCellAgent::PolicyTypes::LFI
202
+ ).and_return(@local_files_policy, @local_files_policy, @local_files_policy, @local_files_policy)
203
+ expect(@local_files_policy).to receive(:block_file_access?).and_return(false, false, false, false)
204
+
205
+ copy = Array.new(ARGV)
206
+ ARGV.clear
207
+ ARGV << @filename
208
+ result = readline
209
+ result << readline
210
+ ARGV.replace(copy)
211
+ expect(result).to eq @file_contents
212
+
213
+ result = ''
214
+ copy = Array.new(ARGV)
215
+ ARGV.clear
216
+ ARGV << @filename
217
+ result = Kernel.readline
218
+ result << Kernel.readline
219
+ ARGV.replace(copy)
220
+ expect(result).to eq @file_contents
221
+ end
222
+ end
223
+ context 'with a filename blocked for read' do
224
+ it 'should not be able to read the file' do
225
+ expect(TCellAgent).to receive(:policy).with(
226
+ TCellAgent::PolicyTypes::LFI
227
+ ).and_return(@local_files_policy, @local_files_policy)
228
+ expect(@local_files_policy).to receive(:block_file_access?).and_return(true, true)
229
+
230
+ expect do
231
+ copy = Array.new(ARGV)
232
+ ARGV.clear
233
+ ARGV << @filename
234
+ Kernel.readline
235
+ ARGV.replace(copy)
236
+ end.to raise_error(IOError)
237
+ expect do
238
+ copy = Array.new(ARGV)
239
+ ARGV.clear
240
+ ARGV << @filename
241
+ Kernel.readline
242
+ ARGV.replace(copy)
243
+ end.to raise_error(IOError)
244
+ end
245
+ end
246
+ end
247
+ end
248
+ # rubocop:enable Security/Open
249
+ # rubocop:enable Lint/UselessAssignment
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ module TCellAgent
4
+ module Instrumentation
5
+ module Lfi
6
+ describe 'extract path and mode' do
7
+ context 'with path' do
8
+ it 'should extract the path correctly' do
9
+ args = '/path-to-file'
10
+ path, _mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(args)
11
+ expect(path).to eq(File.expand_path('/path-to-file'))
12
+ end
13
+ it 'should default to read mode' do
14
+ args = '/path-to-file'
15
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(args)
16
+ expect(mode).to eq('Read')
17
+ end
18
+ it 'should not expand paths starting with |' do
19
+ args = '|cat /etc/passwd'
20
+ path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(args)
21
+ expect(path).to eq('')
22
+ expect(mode).to eq('')
23
+ end
24
+ it 'should not expand paths starting with |-' do
25
+ args = '|-'
26
+ path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(args)
27
+ expect(path).to eq('')
28
+ expect(mode).to eq('')
29
+ end
30
+ end
31
+ context 'with path and mode' do
32
+ context 'with a valid mode' do
33
+ it 'should return Read for mode r' do
34
+ args = '/path-to-file', 'r'
35
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
36
+ expect(mode).to eq('Read')
37
+ end
38
+ it 'should return Write for mode w' do
39
+ args = '/path-to-file', 'w'
40
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
41
+ expect(mode).to eq('Write')
42
+ end
43
+ it 'should return Write for mode a' do
44
+ args = '/path-to-file', 'a'
45
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
46
+ expect(mode).to eq('Write')
47
+ end
48
+ it 'should return ReadWrite for mode r+' do
49
+ args = '/path-to-file', 'r+'
50
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
51
+ expect(mode).to eq('ReadWrite')
52
+ end
53
+ it 'should return ReadWrite for mode w+' do
54
+ args = '/path-to-file', 'w+'
55
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
56
+ expect(mode).to eq('ReadWrite')
57
+ end
58
+ it 'should return ReadWrite for mode a+' do
59
+ args = '/path-to-file', 'a+'
60
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
61
+ expect(mode).to eq('ReadWrite')
62
+ end
63
+ it 'should return Read for mode ::File::RDONLY (0)' do
64
+ args = '/path-to-file', ::File::RDONLY
65
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
66
+ expect(mode).to eq('Read')
67
+ end
68
+ it 'should return Write for mode ::File::WRONLY (1)' do
69
+ args = '/path-to-file', ::File::WRONLY
70
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
71
+ expect(mode).to eq('Write')
72
+ end
73
+ it 'should return ReadWrite for mode ::File::RDWR (2)' do
74
+ args = '/path-to-file', ::File::RDWR
75
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
76
+ expect(mode).to eq('ReadWrite')
77
+ end
78
+ it 'should return Write for mode ::File::CREAT | ::File::EXCL | ::File::WRONLY (2561)' do
79
+ args = '/path-to-file', ::File::CREAT | ::File::EXCL | ::File::WRONLY
80
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
81
+ expect(mode).to eq('Write')
82
+ end
83
+ end
84
+ context 'with an invalid mode' do
85
+ it 'should return Read when mode is a random string' do
86
+ args = '/path-to-file', 'mode'
87
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
88
+ expect(mode).to eq('Read')
89
+ end
90
+ it 'should return Read when mode is a hash' do
91
+ args = '/path-to-file', {}
92
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
93
+ expect(mode).to eq('Read')
94
+ end
95
+ it 'should return Read when mode is an array' do
96
+ args = '/path-to-file', []
97
+ _path, mode = TCellAgent::Instrumentation::Lfi.extract_path_mode(*args)
98
+ expect(mode).to eq('Read')
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -4,19 +4,11 @@ module TCellAgent
4
4
  module Instrumentation
5
5
  describe '.block?' do
6
6
  before(:each) do
7
- configuration = double(
8
- 'configuration',
9
- {
10
- 'app_id' => 'app_id',
11
- 'api_key' => 'api_key',
12
- 'allow_payloads' => true,
13
- 'js_agent_api_base_url' => 'http://api.tcell.com/',
14
- 'js_agent_url' => 'https://jsagent.tcell.io/tcellagent.min.js',
15
- 'max_csp_header_bytes' => nil
16
- }
7
+ native_agent = double('native_agent')
8
+ @patches_policy = TCellAgent::Policies::PatchesPolicy.new(
9
+ native_agent,
10
+ {}
17
11
  )
18
- expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
19
- @rust_policies = TCellAgent::Policies::RustPolicies.new
20
12
  end
21
13
 
22
14
  context 'with an unexpected error' do
@@ -24,24 +16,14 @@ module TCellAgent
24
16
  logger = double('logger')
25
17
  request = double('request')
26
18
  expect(TCellAgent).to receive(:policy).with(
27
- TCellAgent::PolicyTypes::RUST
19
+ TCellAgent::PolicyTypes::PATCHES
28
20
  ).and_raise(StandardError.new('UNEXPECTED'))
29
- expect(TCellAgent::MetaData).to_not receive(:from_request)
30
- expect(TCellAgent).to receive(:logger).and_return(logger).twice
31
- expect(logger).to receive(:debug).with(
32
- 'Exception in safe_block Checking patches blocking: StandardError happened, message is UNEXPECTED'
21
+ expect(TCellAgent::MetaData).to_not receive(:for_patches)
22
+ expect(TCellAgent::Instrumentation).to receive(:get_safe_block_logger).and_return(logger)
23
+ expect(logger).to receive(:error).with(
24
+ 'Error Checking patches blocking (StandardError): UNEXPECTED'
33
25
  )
34
- expect(logger).to receive(:debug) # exception stack trace
35
-
36
- expect(Patches.block?(request)).to eq(false)
37
- end
38
- end
39
-
40
- context 'with an empty patches policy' do
41
- it 'should return false' do
42
- request = double('request')
43
- expect(TCellAgent).to receive(:policy).and_return(nil)
44
- expect(TCellAgent::MetaData).to_not receive(:from_request)
26
+ expect(logger).to receive(:exception) # exception stack trace
45
27
 
46
28
  expect(Patches.block?(request)).to eq(false)
47
29
  end
@@ -50,10 +32,10 @@ module TCellAgent
50
32
  context 'with a disabled patches policy' do
51
33
  it 'should return false' do
52
34
  request = double('request')
53
- expect(@rust_policies.patches_enabled).to eq(false)
35
+ expect(@patches_policy.enabled).to eq(false)
54
36
 
55
- expect(TCellAgent).to receive(:policy).and_return(@rust_policies)
56
- expect(TCellAgent::MetaData).to_not receive(:from_request)
37
+ expect(TCellAgent).to receive(:policy).and_return(@patches_policy)
38
+ expect(TCellAgent::MetaData).to_not receive(:for_patches)
57
39
 
58
40
  expect(Patches.block?(request)).to eq(false)
59
41
  end
@@ -65,15 +47,15 @@ module TCellAgent
65
47
  meta_data = double('meta_data')
66
48
  tcell_context = TCellAgent::Instrumentation::TCellData.new
67
49
 
68
- expect(TCellAgent).to receive(:policy).and_return(@rust_policies)
69
- expect(@rust_policies).to receive(:patches_enabled).and_return(true)
70
- expect(@rust_policies).to receive(:block_request?).and_return(false)
50
+ expect(TCellAgent).to receive(:policy).and_return(@patches_policy)
51
+ expect(@patches_policy).to receive(:enabled).and_return(true)
52
+ expect(@patches_policy).to receive(:block_request?).and_return(false)
71
53
  expect(request).to receive(:env).and_return(
72
54
  {
73
55
  TCellAgent::Instrumentation::TCELL_ID => tcell_context
74
56
  }
75
57
  )
76
- expect(TCellAgent::MetaData).to receive(:from_request).and_return(
58
+ expect(TCellAgent::MetaData).to receive(:for_patches).and_return(
77
59
  meta_data
78
60
  )
79
61
 
@@ -89,10 +71,10 @@ module TCellAgent
89
71
  tcell_context = TCellAgent::Instrumentation::TCellData.new
90
72
  expect(tcell_context.patches_blocking_triggered).to eq(false)
91
73
 
92
- expect(TCellAgent).to receive(:policy).and_return(@rust_policies)
93
- expect(@rust_policies).to receive(:patches_enabled).and_return(true)
94
- expect(@rust_policies).to receive(:block_request?).and_return(true)
95
- expect(TCellAgent::MetaData).to receive(:from_request).and_return(
74
+ expect(TCellAgent).to receive(:policy).and_return(@patches_policy)
75
+ expect(@patches_policy).to receive(:enabled).and_return(true)
76
+ expect(@patches_policy).to receive(:block_request?).and_return(true)
77
+ expect(TCellAgent::MetaData).to receive(:for_patches).and_return(
96
78
  meta_data
97
79
  )
98
80
  expect(request).to receive(:env).and_return({ TCellAgent::Instrumentation::TCELL_ID => tcell_context })
@@ -119,10 +101,10 @@ module TCellAgent
119
101
 
120
102
  expect(tcell_context.patches_blocking_triggered).to eq(false)
121
103
 
122
- expect(TCellAgent).to receive(:policy).and_return(@rust_policies)
123
- expect(@rust_policies).to receive(:patches_enabled).and_return(true)
124
- expect(@rust_policies).to receive(:block_request?).and_return(true)
125
- expect(TCellAgent::MetaData).to receive(:from_request).and_return(
104
+ expect(TCellAgent).to receive(:policy).and_return(@patches_policy)
105
+ expect(@patches_policy).to receive(:enabled).and_return(true)
106
+ expect(@patches_policy).to receive(:block_request?).and_return(true)
107
+ expect(TCellAgent::MetaData).to receive(:for_patches).and_return(
126
108
  meta_data
127
109
  )
128
110
  expect(request).to receive(:env).and_return({ TCellAgent::Instrumentation::TCELL_ID => tcell_context })