tcell_agent 1.1.12 → 2.0.0

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 (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,14 @@
1
+
2
+ module TCellAgent
3
+ module Utils
4
+ module Headers
5
+ def self.clean_keys(request_env_or_header_keys)
6
+ if request_env_or_header_keys.is_a?(Hash)
7
+ request_env_or_header_keys.select { |k, _v| k.start_with? 'HTTP_' }.collect { |k, _v| k.sub(/^HTTP_/, '') }
8
+ else
9
+ request_env_or_header_keys.map { |k| k.sub(/^HTTP_/, '') }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
 
3
3
  module TCellAgent
4
- VERSION = '1.1.12'.freeze
4
+ VERSION = '2.0.0'.freeze
5
5
  end
@@ -148,589 +148,4 @@ module TCellAgent
148
148
  end
149
149
  end
150
150
  end
151
-
152
- describe IO do
153
- describe '.popen' do
154
- before(:each) do
155
- configuration = double(
156
- 'configuration',
157
- {
158
- 'app_id' => 'app_id',
159
- 'api_key' => 'api_key',
160
- 'allow_payloads' => true,
161
- 'js_agent_api_base_url' => 'http://api.tcell.com/',
162
- 'js_agent_url' => 'https://jsagent.tcell.io/tcellagent.min.js',
163
- 'max_csp_header_bytes' => nil,
164
- 'event_time_limit_seconds' => 15,
165
- 'event_batch_size_limit' => 50,
166
- 'preload_policy_filename' => nil,
167
- 'cache_filename_with_app_id' => '/tcellagent_src/tcell/cache/tcell_agent.cache',
168
- 'agent_home_owner' => nil
169
- }
170
- )
171
- expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
172
- @rust_policies = TCellAgent::Policies::RustPolicies.new
173
- end
174
-
175
- context 'empty command' do
176
- it 'should raise an error' do
177
- expect do
178
- IO.popen
179
- end.to raise_error(ArgumentError)
180
- expect do
181
- IO.popen(nil)
182
- end.to raise_error(TypeError)
183
- expect do
184
- IO.popen('')
185
- end.to raise_error(Errno::ENOENT)
186
- end
187
- end
188
-
189
- context 'non existent command' do
190
- it 'should return nil' do
191
- expect do
192
- IO.popen('foobar')
193
- end.to raise_error(Errno::ENOENT)
194
- end
195
- end
196
-
197
- context 'with a valid command' do
198
- it 'should execute command' do
199
- expect(IO.popen('echo test').read.chomp).to eq('test')
200
- end
201
- end
202
-
203
- context 'with a non blocked command present' do
204
- context 'with no command injection' do
205
- it 'should execute the command' do
206
- expect(TCellAgent).to receive(:policy).with(
207
- TCellAgent::PolicyTypes::RUST
208
- ).and_return(nil)
209
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:cmdi_enabled)
210
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:block_command?)
211
-
212
- IO.popen('echo test')
213
- end
214
- end
215
-
216
- context 'with command injection disabled' do
217
- it 'should execute the command' do
218
- expect(@rust_policies.cmdi_enabled).to eq(false)
219
-
220
- expect(TCellAgent).to receive(:policy).with(
221
- TCellAgent::PolicyTypes::RUST
222
- ).and_return(@rust_policies)
223
- expect(@rust_policies).to receive(:cmdi_enabled).and_call_original
224
- expect(@rust_policies).to_not receive(:block_command?)
225
-
226
- IO.popen('echo test')
227
- end
228
- end
229
-
230
- context 'with command injection enabled' do
231
- it 'should execute the command' do
232
- expect(TCellAgent).to receive(:policy).with(
233
- TCellAgent::PolicyTypes::RUST
234
- ).and_return(@rust_policies)
235
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
236
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(false)
237
-
238
- IO.popen('echo test')
239
- end
240
- end
241
- end
242
-
243
- context 'with a blocked command present' do
244
- context 'with command injection enabled' do
245
- it 'should raise a Errno::ENOENT' do
246
- expect(TCellAgent).to receive(:policy).with(
247
- TCellAgent::PolicyTypes::RUST
248
- ).and_return(@rust_policies)
249
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
250
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(true)
251
-
252
- expect do
253
- IO.popen('echo test')
254
- end.to raise_error(Errno::ENOENT)
255
- end
256
- end
257
- end
258
-
259
- context 'with env' do
260
- before(:each) do
261
- @env = { 'TCELL_VAR' => 'enabled' }
262
- end
263
-
264
- context 'with string command' do
265
- it 'should execute the command' do
266
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
267
- IO.popen(@env, 'echo', 'w+')
268
-
269
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
270
- IO.popen(@env, 'echo', 'w+', :unsetenv_others => true)
271
- end
272
- end
273
-
274
- context 'with string command and arguments' do
275
- it 'should parse the command' do
276
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
277
- IO.popen(@env, 'echo test')
278
-
279
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
280
- IO.popen(@env, 'echo test', 'w+')
281
-
282
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
283
- IO.popen(@env, 'echo test', :unsetenv_others => true)
284
-
285
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
286
- IO.popen(@env, 'echo test', 'w+', :unsetenv_others => true)
287
- end
288
- end
289
-
290
- context 'with array command' do
291
- it 'should parse the command properly' do
292
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
293
- IO.popen(@env, [%w[echo argv0]], 'w+')
294
-
295
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
296
- IO.popen(@env, [%w[echo argv0]], :unsetenv_others => true)
297
-
298
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
299
- IO.popen(@env, [%w[echo argv0]], 'w+', :unsetenv_others => true)
300
-
301
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
302
- IO.popen(@env, ['echo'], 'w+')
303
-
304
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
305
- IO.popen(@env, ['echo'], :unsetenv_others => true)
306
-
307
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo')
308
- IO.popen(@env, ['echo'], 'w+', :unsetenv_others => true)
309
- end
310
- end
311
-
312
- context 'with array command and arguments' do
313
- it 'should parse the command properly' do
314
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
315
- IO.popen(@env, [%w[echo argv0], 'test'])
316
-
317
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
318
- IO.popen(@env, [%w[echo argv0], 'test'], 'w+')
319
-
320
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
321
- IO.popen(@env, [%w[echo argv0], 'test'], :unsetenv_others => true)
322
-
323
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
324
- IO.popen(@env, [%w[echo argv0], 'test'], 'w+', :unsetenv_others => true)
325
-
326
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
327
- IO.popen(@env, %w[echo test])
328
-
329
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
330
- IO.popen(@env, %w[echo test], 'w+')
331
-
332
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
333
- IO.popen(@env, %w[echo test], :unsetenv_others => true)
334
-
335
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
336
- IO.popen(@env, %w[echo test], 'w+', :unsetenv_others => true)
337
-
338
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
339
- IO.popen([@env, 'echo', 'test', :unsetenv_others => true], 'w+')
340
-
341
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
342
- IO.popen(@env, [@env, 'echo', 'test', :unsetenv_others => true], 'w+', :err => %i[child out])
343
- end
344
- end
345
- end
346
-
347
- context 'without env' do
348
- context 'with array command and arguments' do
349
- it 'should parse the command properly' do
350
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
351
- IO.popen([%w[echo argv0], 'test'])
352
-
353
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
354
- IO.popen([%w[echo argv0], 'test'], 'w+')
355
-
356
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
357
- IO.popen([%w[echo argv0], 'test'], :unsetenv_others => true)
358
-
359
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
360
- IO.popen([%w[echo argv0], 'test'], 'w+', :unsetenv_others => true)
361
-
362
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
363
- IO.popen(%w[echo test])
364
-
365
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
366
- IO.popen(%w[echo test], 'w+')
367
-
368
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
369
- IO.popen(%w[echo test], :unsetenv_others => true)
370
-
371
- expect(TCellAgent::Cmdi).to receive(:block_command?).with('echo test')
372
- IO.popen(%w[echo test], 'w+', :unsetenv_others => true)
373
-
374
- expect(TCellAgent::Cmdi).to receive(:block_command?).with(
375
- "echo -size 320x85 canvas:none -font Bookman-DemiItalic -draw \"text 25,60 'Magick'\""
376
- )
377
- IO.popen(
378
- [%w[echo argv0],
379
- '-size',
380
- '320x85',
381
- 'canvas:none',
382
- '-font',
383
- 'Bookman-DemiItalic',
384
- '-draw',
385
- "\"text 25,60 \'Magick\'\""],
386
- :unsetenv_others => true
387
- )
388
- end
389
- end
390
- end
391
- end
392
- end
393
-
394
- describe Kernel do
395
- before(:each) do
396
- configuration = double(
397
- 'configuration',
398
- {
399
- 'app_id' => 'app_id',
400
- 'api_key' => 'api_key',
401
- 'allow_payloads' => true,
402
- 'js_agent_api_base_url' => 'http://api.tcell.com/',
403
- 'js_agent_url' => 'https://jsagent.tcell.io/tcellagent.min.js',
404
- 'max_csp_header_bytes' => nil,
405
- 'event_time_limit_seconds' => 15,
406
- 'event_batch_size_limit' => 50,
407
- 'preload_policy_filename' => nil,
408
- 'cache_filename_with_app_id' => '/tcellagent_src/tcell/cache/tcell_agent.cache',
409
- 'agent_home_owner' => nil
410
- }
411
- )
412
- expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
413
- @rust_policies = TCellAgent::Policies::RustPolicies.new
414
- end
415
-
416
- describe '.backtick' do
417
- context 'empty command' do
418
- it 'should raise Errno::ENOENT' do
419
- expect do
420
- ``
421
- end.to raise_error(Errno::ENOENT)
422
- end
423
- end
424
-
425
- context 'with a non blocked command present' do
426
- context 'with no command injection' do
427
- it 'should execute the command' do
428
- expect(TCellAgent).to receive(:policy).with(
429
- TCellAgent::PolicyTypes::RUST
430
- ).and_return(nil)
431
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:cmdi_enabled)
432
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:block_command?)
433
-
434
- `echo test`
435
- end
436
- end
437
-
438
- context 'with command injection disabled' do
439
- it 'should execute the command' do
440
- expect(TCellAgent).to receive(:policy).with(
441
- TCellAgent::PolicyTypes::RUST
442
- ).and_return(@rust_policies)
443
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(false)
444
- expect(@rust_policies).to_not receive(:block_command?)
445
-
446
- `echo test`
447
- end
448
- end
449
-
450
- context 'with command injection enabled' do
451
- it 'should execute the command' do
452
- expect(TCellAgent).to receive(:policy).with(
453
- TCellAgent::PolicyTypes::RUST
454
- ).and_return(@rust_policies)
455
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
456
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(false)
457
-
458
- `echo test`
459
- end
460
- end
461
- end
462
-
463
- context 'with a blocked command present' do
464
- context 'with command injection enabled' do
465
- it 'should raise a Errno::ENOENT' do
466
- expect(TCellAgent).to receive(:policy).with(
467
- TCellAgent::PolicyTypes::RUST
468
- ).and_return(@rust_policies)
469
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
470
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(true)
471
-
472
- expect do
473
- `echo test`
474
- end.to raise_error(Errno::ENOENT)
475
- end
476
- end
477
- end
478
- end
479
-
480
- describe '%x methods' do
481
- context 'empty command' do
482
- it 'should raise Errno::ENOENT' do
483
- expect do
484
- ``
485
- end.to raise_error(Errno::ENOENT)
486
- end
487
- end
488
-
489
- context 'with a non blocked command present' do
490
- context 'with no command injection' do
491
- it 'should execute the command' do
492
- expect(TCellAgent).to receive(:policy).with(
493
- TCellAgent::PolicyTypes::RUST
494
- ).and_return(nil)
495
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:cmdi_enabled)
496
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:block_command?)
497
-
498
- `echo test`
499
- end
500
- end
501
-
502
- context 'with command injection disabled' do
503
- it 'should execute the command' do
504
- expect(TCellAgent).to receive(:policy).with(
505
- TCellAgent::PolicyTypes::RUST
506
- ).and_return(@rust_policies)
507
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(false)
508
- expect(@rust_policies).to_not receive(:block_command?)
509
-
510
- `echo test`
511
- end
512
- end
513
-
514
- context 'with command injection enabled' do
515
- it 'should execute the command' do
516
- expect(TCellAgent).to receive(:policy).with(
517
- TCellAgent::PolicyTypes::RUST
518
- ).and_return(@rust_policies)
519
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
520
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(false)
521
-
522
- `echo test`
523
- end
524
- end
525
- end
526
-
527
- context 'with a blocked command present' do
528
- context 'with command injection enabled' do
529
- it 'should raise a Errno::ENOENT' do
530
- expect(TCellAgent).to receive(:policy).with(
531
- TCellAgent::PolicyTypes::RUST
532
- ).and_return(@rust_policies)
533
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
534
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(true)
535
-
536
- expect do
537
- `echo test`
538
- end.to raise_error(Errno::ENOENT)
539
- end
540
- end
541
- end
542
- end
543
-
544
- describe '.system' do
545
- context 'empty command' do
546
- it 'should raise an error' do
547
- expect do
548
- system
549
- end.to raise_error(ArgumentError)
550
- expect do
551
- system(nil)
552
- end.to raise_error(TypeError)
553
-
554
- expect(system('')).to be_nil
555
- end
556
- end
557
-
558
- context 'non existent command' do
559
- it 'should return nil' do
560
- expect(system('foobar')).to be_nil
561
- end
562
- end
563
-
564
- context 'with a valid command' do
565
- it 'should execute command' do
566
- pid = system('echo test > /dev/null 2>&1')
567
- expect(pid).to eq(true)
568
-
569
- pid = system(RbConfig.ruby, "-e'Hello World!'", '>', '/dev/null', '2>&1')
570
- expect(pid).to eq(true)
571
- end
572
- end
573
-
574
- context 'with a non blocked command present' do
575
- context 'with no command injection' do
576
- it 'should execute the command' do
577
- expect(TCellAgent).to receive(:policy).with(
578
- TCellAgent::PolicyTypes::RUST
579
- ).and_return(nil)
580
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:cmdi_enabled)
581
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:block_command?)
582
-
583
- system('echo test > /dev/null 2>&1')
584
- end
585
- end
586
-
587
- context 'with command injection disabled' do
588
- it 'should execute the command' do
589
- expect(TCellAgent).to receive(:policy).with(
590
- TCellAgent::PolicyTypes::RUST
591
- ).and_return(@rust_policies)
592
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(false)
593
- expect(@rust_policies).to_not receive(:block_command?)
594
-
595
- system('echo test > /dev/null 2>&1')
596
- end
597
- end
598
-
599
- context 'with command injection enabled' do
600
- it 'should execute the command' do
601
- expect(TCellAgent).to receive(:policy).with(
602
- TCellAgent::PolicyTypes::RUST
603
- ).and_return(@rust_policies)
604
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
605
- expect(@rust_policies).to receive(:block_command?).with('echo test > /dev/null 2>&1', nil).and_return(false)
606
-
607
- system('echo test > /dev/null 2>&1')
608
- end
609
- end
610
- end
611
-
612
- context 'with a blocked command present' do
613
- context 'with command injection enabled' do
614
- it 'should raise a Errno::ENOENT' do
615
- expect(TCellAgent).to receive(:policy).with(
616
- TCellAgent::PolicyTypes::RUST
617
- ).and_return(@rust_policies)
618
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
619
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(true)
620
-
621
- expect do
622
- system('echo test')
623
- end.to raise_error(Errno::ENOENT)
624
- end
625
- end
626
- end
627
- end
628
-
629
- describe '.spawn' do
630
- context 'empty command' do
631
- it 'should raise an error' do
632
- expect do
633
- spawn
634
- end.to raise_error(ArgumentError)
635
- expect do
636
- spawn(nil)
637
- end.to raise_error(TypeError)
638
- expect do
639
- spawn('')
640
- end.to raise_error(Errno::ENOENT)
641
- end
642
- end
643
-
644
- context 'non existent command' do
645
- it 'should raise error' do
646
- expect do
647
- spawn('foobar')
648
- end.to raise_error(Errno::ENOENT)
649
- end
650
- end
651
-
652
- context 'with a valid command' do
653
- it 'should execute command' do
654
- pid = spawn('echo test > /dev/null 2>&1')
655
- expect(pid).to_not be_nil
656
-
657
- pid = spawn(RbConfig.ruby, "-e'Hello World!'", '>', '/dev/null', '2>&1')
658
- expect(pid).to_not be_nil
659
- end
660
- end
661
-
662
- context 'with a non blocked command present' do
663
- context 'with no command injection' do
664
- it 'should execute the command' do
665
- expect(TCellAgent).to receive(:policy).with(
666
- TCellAgent::PolicyTypes::RUST
667
- ).and_return(nil)
668
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:cmdi_enabled)
669
- expect_any_instance_of(TCellAgent::Policies::RustPolicies).to_not receive(:block_command?)
670
-
671
- spawn('echo test > /dev/null 2>&1')
672
- end
673
- end
674
-
675
- context 'with command injection disabled' do
676
- it 'should execute the command' do
677
- expect(TCellAgent).to receive(:policy).with(
678
- TCellAgent::PolicyTypes::RUST
679
- ).and_return(@rust_policies)
680
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(false)
681
- expect(@rust_policies).to_not receive(:block_command?)
682
-
683
- spawn('echo test > /dev/null 2>&1')
684
- end
685
- end
686
-
687
- context 'with command injection enabled' do
688
- it 'should execute the command' do
689
- expect(TCellAgent).to receive(:policy).with(
690
- TCellAgent::PolicyTypes::RUST
691
- ).and_return(@rust_policies)
692
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
693
- expect(@rust_policies).to receive(:block_command?).with('echo test > /dev/null 2>&1', nil).and_return(false)
694
-
695
- spawn('echo test > /dev/null 2>&1')
696
- end
697
- end
698
- end
699
-
700
- context 'with a blocked command present' do
701
- context 'with command injection enabled' do
702
- it 'should raise a Errno::ENOENT' do
703
- expect(TCellAgent).to receive(:policy).with(
704
- TCellAgent::PolicyTypes::RUST
705
- ).and_return(@rust_policies)
706
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
707
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(true)
708
-
709
- expect do
710
- spawn('echo test')
711
- end.to raise_error(Errno::ENOENT)
712
- end
713
- end
714
- end
715
- end
716
-
717
- describe '.exec' do
718
- # can only test this case since exec replaces current process with new process
719
- context 'with a blocked command present' do
720
- context 'with command injection enabled' do
721
- it 'should raise a Errno::ENOENT' do
722
- expect(TCellAgent).to receive(:policy).with(
723
- TCellAgent::PolicyTypes::RUST
724
- ).and_return(@rust_policies)
725
- expect(@rust_policies).to receive(:cmdi_enabled).and_return(true)
726
- expect(@rust_policies).to receive(:block_command?).with('echo test', nil).and_return(true)
727
-
728
- expect do
729
- exec('echo test')
730
- end.to raise_error(Errno::ENOENT)
731
- end
732
- end
733
- end
734
- end
735
- end
736
151
  end