tcell_agent 0.2.12 → 0.2.13

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tcell_agent.rb +2 -2
  3. data/lib/tcell_agent/agent/policy_manager.rb +1 -1
  4. data/lib/tcell_agent/api.rb +2 -2
  5. data/lib/tcell_agent/appsensor/rules/appsensor_rule_manager.rb +46 -0
  6. data/lib/tcell_agent/appsensor/rules/appsensor_rule_set.rb +67 -0
  7. data/lib/tcell_agent/appsensor/rules/baserules.json +153 -0
  8. data/lib/tcell_agent/configuration.rb +7 -1
  9. data/lib/tcell_agent/instrumentation.rb +3 -0
  10. data/lib/tcell_agent/logger.rb +25 -3
  11. data/lib/tcell_agent/policies/appsensor/cmdi_sensor.rb +19 -0
  12. data/lib/tcell_agent/policies/appsensor/fpt_sensor.rb +19 -0
  13. data/lib/tcell_agent/policies/appsensor/injection_sensor.rb +136 -0
  14. data/lib/tcell_agent/policies/appsensor/login_sensor.rb +42 -0
  15. data/lib/tcell_agent/policies/appsensor/nullbyte_sensor.rb +22 -0
  16. data/lib/tcell_agent/policies/appsensor/request_size_sensor.rb +21 -0
  17. data/lib/tcell_agent/policies/appsensor/response_codes_sensor.rb +58 -0
  18. data/lib/tcell_agent/policies/appsensor/response_size_sensor.rb +21 -0
  19. data/lib/tcell_agent/policies/appsensor/retr_sensor.rb +18 -0
  20. data/lib/tcell_agent/policies/appsensor/sensor.rb +28 -0
  21. data/lib/tcell_agent/policies/appsensor/size_sensor.rb +43 -0
  22. data/lib/tcell_agent/policies/appsensor/sqli_sensor.rb +25 -0
  23. data/lib/tcell_agent/policies/appsensor/xss_sensor.rb +26 -0
  24. data/lib/tcell_agent/policies/appsensor_policy.rb +198 -67
  25. data/lib/tcell_agent/policies/clickjacking_policy.rb +1 -1
  26. data/lib/tcell_agent/policies/content_security_policy.rb +1 -1
  27. data/lib/tcell_agent/policies/dataloss_policy.rb +1 -1
  28. data/lib/tcell_agent/policies/honeytokens_policy.rb +1 -1
  29. data/lib/tcell_agent/policies/http_redirect_policy.rb +1 -1
  30. data/lib/tcell_agent/policies/http_tx_policy.rb +1 -1
  31. data/lib/tcell_agent/policies/login_fraud_policy.rb +1 -1
  32. data/lib/tcell_agent/policies/secure_headers_policy.rb +1 -1
  33. data/lib/tcell_agent/rails.rb +0 -1
  34. data/lib/tcell_agent/rails/auth/devise.rb +0 -1
  35. data/lib/tcell_agent/rails/dlp.rb +58 -13
  36. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +0 -1
  37. data/lib/tcell_agent/rails/middleware/context_middleware.rb +0 -1
  38. data/lib/tcell_agent/rails/middleware/global_middleware.rb +0 -1
  39. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +6 -34
  40. data/lib/tcell_agent/sensor_events/appsensor_event.rb +59 -0
  41. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +95 -0
  42. data/lib/tcell_agent/servers/rails_server.rb +18 -9
  43. data/lib/tcell_agent/utils/params.rb +40 -0
  44. data/lib/tcell_agent/version.rb +1 -1
  45. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_manager_spec.rb +39 -0
  46. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_set_spec.rb +152 -0
  47. data/spec/lib/tcell_agent/instrumentation_spec.rb +4 -4
  48. data/spec/lib/tcell_agent/policies/appsensor/cmdi_sensor_spec.rb +128 -0
  49. data/spec/lib/tcell_agent/policies/appsensor/fpt_sensor_spec.rb +128 -0
  50. data/spec/lib/tcell_agent/policies/appsensor/login_sensor_spec.rb +104 -0
  51. data/spec/lib/tcell_agent/policies/appsensor/nullbyte_sensor_spec.rb +132 -0
  52. data/spec/lib/tcell_agent/policies/appsensor/request_size_sensor_spec.rb +164 -0
  53. data/spec/lib/tcell_agent/policies/appsensor/response_codes_sensor_spec.rb +194 -0
  54. data/spec/lib/tcell_agent/policies/appsensor/response_size_sensor_spec.rb +157 -0
  55. data/spec/lib/tcell_agent/policies/appsensor/retr_sensor_spec.rb +128 -0
  56. data/spec/lib/tcell_agent/policies/appsensor/sqli_sensor_spec.rb +151 -0
  57. data/spec/lib/tcell_agent/policies/appsensor/xss_sensor_spec.rb +652 -0
  58. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +461 -28
  59. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +4 -4
  60. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +6 -6
  61. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +10 -10
  62. data/spec/lib/tcell_agent/policies/honeytokens_policy_spec.rb +1 -1
  63. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +1 -1
  64. data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +1 -1
  65. data/spec/lib/tcell_agent/policies/login_policy_spec.rb +2 -2
  66. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +4 -4
  67. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +67 -7
  68. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +80 -0
  69. data/spec/lib/tcell_agent/utils/params_spec.rb +119 -0
  70. data/spec/support/resources/baserules.json +155 -0
  71. metadata +51 -12
  72. data/lib/tcell_agent/appsensor.rb +0 -42
  73. data/lib/tcell_agent/appsensor/cmdi.rb +0 -32
  74. data/lib/tcell_agent/appsensor/path_traversal.rb +0 -33
  75. data/lib/tcell_agent/appsensor/sqli.rb +0 -55
  76. data/lib/tcell_agent/appsensor/xss.rb +0 -40
  77. data/lib/tcell_agent/sensor_events/app_sensor.rb +0 -302
  78. data/spec/lib/tcell_agent/appsensor_spec.rb +0 -65
  79. data/spec/lib/tcell_agent/sensor_events/tcell_app_sensor_event_processor_spec.rb +0 -289
@@ -2,36 +2,469 @@ require 'spec_helper'
2
2
 
3
3
  module TCellAgent
4
4
  module Policies
5
+
5
6
  describe AppSensorPolicy do
6
- policy_json_empty = {
7
- "policy_id"=>"01a1",
8
- "data"=>{
9
- "options"=>{}
10
- }
11
- }
12
-
13
- policy_json_one = {
14
- "policy_id"=>"01a1",
15
- "data"=>{
16
- "options"=>{
17
- "xss"=>true
18
- }
19
- }
20
- }
21
-
22
- empty_policy = AppSensorPolicy.fromJson(policy_json_empty)
23
- context "test empty agent" do
24
- it "enabled is false" do
25
- expect(empty_policy.policy_id).to eq("01a1")
26
- expect(empty_policy.enabled).to eq(false)
7
+
8
+ describe "#from_json" do
9
+
10
+ context "with v1 policy" do
11
+ context "that is missing a policy id" do
12
+ it "should raise an error" do
13
+ expect{
14
+ AppSensorPolicy.from_json({
15
+ "data" => { "options" => {} }
16
+ })
17
+ }.to raise_error(RuntimeError)
18
+ end
19
+ end
20
+
21
+ context "that is empty" do
22
+ it "should have all sensors disabled" do
23
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
24
+
25
+ policy_json_empty = {
26
+ "policy_id" => "01a1",
27
+ "data" => {
28
+ "options"=> {}
29
+ }
30
+ }
31
+
32
+ empty_policy = AppSensorPolicy.from_json(policy_json_empty)
33
+
34
+ expect(empty_policy.policy_id).to eq("01a1")
35
+ expect(empty_policy.options["req_size"]).to_not be_nil
36
+ expect(empty_policy.options["resp_size"]).to_not be_nil
37
+ expect(empty_policy.options["resp_codes"]).to_not be_nil
38
+ expect(empty_policy.options["xss"]).to_not be_nil
39
+ expect(empty_policy.options["sqli"]).to_not be_nil
40
+ expect(empty_policy.options["cmdi"]).to_not be_nil
41
+ expect(empty_policy.options["fpt"]).to_not be_nil
42
+ expect(empty_policy.options["nullbyte"]).to_not be_nil
43
+ expect(empty_policy.options["retr"]).to_not be_nil
44
+ expect(empty_policy.options["login"]).to_not be_nil
45
+
46
+ expect(empty_policy.options["req_size"].enabled).to eq(false)
47
+ expect(empty_policy.options["resp_size"].enabled).to eq(false)
48
+ expect(empty_policy.options["resp_codes"].enabled).to eq(false)
49
+ expect(empty_policy.options["xss"].enabled).to eq(false)
50
+ expect(empty_policy.options["sqli"].enabled).to eq(false)
51
+ expect(empty_policy.options["cmdi"].enabled).to eq(false)
52
+ expect(empty_policy.options["fpt"].enabled).to eq(false)
53
+ expect(empty_policy.options["nullbyte"].enabled).to eq(false)
54
+ expect(empty_policy.options["retr"].enabled).to eq(false)
55
+ expect(empty_policy.options["login"].enabled).to eq(false)
56
+
57
+ expect(empty_policy.options["xss"].v1_compatability_enabled).to eq(true)
58
+ expect(empty_policy.options["sqli"].v1_compatability_enabled).to eq(true)
59
+ expect(empty_policy.options["cmdi"].v1_compatability_enabled).to eq(true)
60
+ expect(empty_policy.options["fpt"].v1_compatability_enabled).to eq(true)
61
+ expect(empty_policy.options["nullbyte"].v1_compatability_enabled).to eq(true)
62
+ expect(empty_policy.options["retr"].v1_compatability_enabled).to eq(true)
63
+ end
64
+ end
65
+
66
+ context "that only has null enabled" do
67
+ it "should only have null enabled" do
68
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
69
+
70
+ policy_json = {
71
+ "policy_id" => "01a1",
72
+ "data" => {
73
+ "options"=> {"null"=>true}
74
+ }
75
+ }
76
+
77
+ policy = AppSensorPolicy.from_json(policy_json)
78
+
79
+ expect(policy.policy_id).to eq("01a1")
80
+ expect(policy.options["req_size"]).to_not be_nil
81
+ expect(policy.options["resp_size"]).to_not be_nil
82
+ expect(policy.options["resp_codes"]).to_not be_nil
83
+ expect(policy.options["xss"]).to_not be_nil
84
+ expect(policy.options["sqli"]).to_not be_nil
85
+ expect(policy.options["cmdi"]).to_not be_nil
86
+ expect(policy.options["fpt"]).to_not be_nil
87
+ expect(policy.options["nullbyte"]).to_not be_nil
88
+ expect(policy.options["retr"]).to_not be_nil
89
+ expect(policy.options["login"]).to_not be_nil
90
+
91
+ expect(policy.options["req_size"].enabled).to eq(false)
92
+ expect(policy.options["resp_size"].enabled).to eq(false)
93
+ expect(policy.options["resp_codes"].enabled).to eq(false)
94
+ expect(policy.options["xss"].enabled).to eq(false)
95
+ expect(policy.options["sqli"].enabled).to eq(false)
96
+ expect(policy.options["cmdi"].enabled).to eq(false)
97
+ expect(policy.options["fpt"].enabled).to eq(false)
98
+ expect(policy.options["nullbyte"].enabled).to eq(true)
99
+ expect(policy.options["retr"].enabled).to eq(false)
100
+ expect(policy.options["login"].enabled).to eq(false)
101
+
102
+ expect(policy.options["xss"].v1_compatability_enabled).to eq(true)
103
+ expect(policy.options["sqli"].v1_compatability_enabled).to eq(true)
104
+ expect(policy.options["cmdi"].v1_compatability_enabled).to eq(true)
105
+ expect(policy.options["fpt"].v1_compatability_enabled).to eq(true)
106
+ expect(policy.options["nullbyte"].v1_compatability_enabled).to eq(true)
107
+ expect(policy.options["retr"].v1_compatability_enabled).to eq(true)
108
+ end
109
+ end
110
+
111
+ context "that only has xss enabled" do
112
+ it "should only have xss enabled" do
113
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
114
+
115
+ policy_json = {
116
+ "policy_id" => "01a1",
117
+ "data" => {
118
+ "options"=> {"xss"=>true}
119
+ }
120
+ }
121
+
122
+ empty_policy = AppSensorPolicy.from_json(policy_json)
123
+
124
+ expect(empty_policy.policy_id).to eq("01a1")
125
+ expect(empty_policy.options["req_size"]).to_not be_nil
126
+ expect(empty_policy.options["resp_size"]).to_not be_nil
127
+ expect(empty_policy.options["resp_codes"]).to_not be_nil
128
+ expect(empty_policy.options["xss"]).to_not be_nil
129
+ expect(empty_policy.options["sqli"]).to_not be_nil
130
+ expect(empty_policy.options["cmdi"]).to_not be_nil
131
+ expect(empty_policy.options["fpt"]).to_not be_nil
132
+ expect(empty_policy.options["nullbyte"]).to_not be_nil
133
+ expect(empty_policy.options["retr"]).to_not be_nil
134
+ expect(empty_policy.options["login"]).to_not be_nil
135
+
136
+ expect(empty_policy.options["req_size"].enabled).to eq(false)
137
+ expect(empty_policy.options["resp_size"].enabled).to eq(false)
138
+ expect(empty_policy.options["resp_codes"].enabled).to eq(false)
139
+ expect(empty_policy.options["xss"].enabled).to eq(true)
140
+ expect(empty_policy.options["sqli"].enabled).to eq(false)
141
+ expect(empty_policy.options["cmdi"].enabled).to eq(false)
142
+ expect(empty_policy.options["fpt"].enabled).to eq(false)
143
+ expect(empty_policy.options["nullbyte"].enabled).to eq(false)
144
+ expect(empty_policy.options["retr"].enabled).to eq(false)
145
+ expect(empty_policy.options["login"].enabled).to eq(false)
146
+
147
+ expect(empty_policy.options["xss"].v1_compatability_enabled).to eq(true)
148
+ expect(empty_policy.options["sqli"].v1_compatability_enabled).to eq(true)
149
+ expect(empty_policy.options["cmdi"].v1_compatability_enabled).to eq(true)
150
+ expect(empty_policy.options["fpt"].v1_compatability_enabled).to eq(true)
151
+ expect(empty_policy.options["nullbyte"].v1_compatability_enabled).to eq(true)
152
+ expect(empty_policy.options["retr"].v1_compatability_enabled).to eq(true)
153
+ end
154
+ end
155
+
156
+ context "that has everything enabled" do
157
+ it "should have all sensors enabled" do
158
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
159
+
160
+ policy_json = {
161
+ "policy_id" => "01a1",
162
+ "data" => {
163
+ "options"=> {
164
+ "req_res_size"=>true,
165
+ "resp_codes"=>true,
166
+ "xss"=>true,
167
+ "sqli"=>true,
168
+ "cmdi"=>true,
169
+ "fpt"=>true,
170
+ "null"=>true,
171
+ "retr"=>true,
172
+ "login_failure"=>true
173
+ }
174
+ }
175
+ }
176
+
177
+ policy = AppSensorPolicy.from_json(policy_json)
178
+
179
+ expect(policy.policy_id).to eq("01a1")
180
+ expect(policy.options["req_size"]).to_not be_nil
181
+ expect(policy.options["resp_size"]).to_not be_nil
182
+ expect(policy.options["resp_codes"]).to_not be_nil
183
+ expect(policy.options["xss"]).to_not be_nil
184
+ expect(policy.options["sqli"]).to_not be_nil
185
+ expect(policy.options["cmdi"]).to_not be_nil
186
+ expect(policy.options["fpt"]).to_not be_nil
187
+ expect(policy.options["nullbyte"]).to_not be_nil
188
+ expect(policy.options["retr"]).to_not be_nil
189
+ expect(policy.options["login"]).to_not be_nil
190
+
191
+ expect(policy.options["req_size"].enabled).to eq(true)
192
+ expect(policy.options["resp_size"].enabled).to eq(true)
193
+ expect(policy.options["resp_codes"].enabled).to eq(true)
194
+ expect(policy.options["xss"].enabled).to eq(true)
195
+ expect(policy.options["sqli"].enabled).to eq(true)
196
+ expect(policy.options["cmdi"].enabled).to eq(true)
197
+ expect(policy.options["fpt"].enabled).to eq(true)
198
+ expect(policy.options["nullbyte"].enabled).to eq(true)
199
+ expect(policy.options["retr"].enabled).to eq(true)
200
+ expect(policy.options["login"].enabled).to eq(true)
201
+
202
+ expect(policy.options["xss"].v1_compatability_enabled).to eq(true)
203
+ expect(policy.options["sqli"].v1_compatability_enabled).to eq(true)
204
+ expect(policy.options["cmdi"].v1_compatability_enabled).to eq(true)
205
+ expect(policy.options["fpt"].v1_compatability_enabled).to eq(true)
206
+ expect(policy.options["nullbyte"].v1_compatability_enabled).to eq(true)
207
+ expect(policy.options["retr"].v1_compatability_enabled).to eq(true)
208
+ end
209
+ end
27
210
  end
28
- end
29
- from_json = AppSensorPolicy.fromJson(policy_json_one)
30
- context "tests xss is true and enabled true" do
31
- it "returns true" do
32
- expect(from_json.policy_id).to eq("01a1")
33
- expect(from_json.enabled).to eq(true)
34
- expect(from_json.option_enabled?("xss")).to eq(true)
211
+
212
+ context "with v2 policy" do
213
+ context "that is missing a policy id" do
214
+ it "should raise an error" do
215
+ expect{
216
+ AppSensorPolicy.from_json({
217
+ "version" => 2,
218
+ "data" => { }
219
+ })
220
+ }.to raise_error(RuntimeError)
221
+ end
222
+ end
223
+
224
+ context "that is empty" do
225
+ it "should have all sensors disabled" do
226
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
227
+
228
+ policy_json_empty = {
229
+ "policy_id" => "01a1",
230
+ "version" => 2,
231
+ "data" => {
232
+ "sensors" => {}
233
+ }
234
+ }
235
+
236
+ empty_policy = AppSensorPolicy.from_json(policy_json_empty)
237
+
238
+ expect(empty_policy.policy_id).to eq("01a1")
239
+ expect(empty_policy.options["req_size"]).to_not be_nil
240
+ expect(empty_policy.options["resp_size"]).to_not be_nil
241
+ expect(empty_policy.options["resp_codes"]).to_not be_nil
242
+ expect(empty_policy.options["xss"]).to_not be_nil
243
+ expect(empty_policy.options["sqli"]).to_not be_nil
244
+ expect(empty_policy.options["cmdi"]).to_not be_nil
245
+ expect(empty_policy.options["fpt"]).to_not be_nil
246
+ expect(empty_policy.options["nullbyte"]).to_not be_nil
247
+ expect(empty_policy.options["retr"]).to_not be_nil
248
+ expect(empty_policy.options["login"]).to_not be_nil
249
+
250
+ expect(empty_policy.options["req_size"].enabled).to eq(false)
251
+ expect(empty_policy.options["resp_size"].enabled).to eq(false)
252
+ expect(empty_policy.options["resp_codes"].enabled).to eq(false)
253
+ expect(empty_policy.options["xss"].enabled).to eq(false)
254
+ expect(empty_policy.options["sqli"].enabled).to eq(false)
255
+ expect(empty_policy.options["cmdi"].enabled).to eq(false)
256
+ expect(empty_policy.options["fpt"].enabled).to eq(false)
257
+ expect(empty_policy.options["nullbyte"].enabled).to eq(false)
258
+ expect(empty_policy.options["retr"].enabled).to eq(false)
259
+ expect(empty_policy.options["login"].enabled).to eq(false)
260
+
261
+ expect(empty_policy.options["xss"].v1_compatability_enabled).to eq(false)
262
+ expect(empty_policy.options["sqli"].v1_compatability_enabled).to eq(false)
263
+ expect(empty_policy.options["cmdi"].v1_compatability_enabled).to eq(false)
264
+ expect(empty_policy.options["fpt"].v1_compatability_enabled).to eq(false)
265
+ expect(empty_policy.options["nullbyte"].v1_compatability_enabled).to eq(false)
266
+ expect(empty_policy.options["retr"].v1_compatability_enabled).to eq(false)
267
+ end
268
+ end
269
+
270
+ context "that only has null enabled" do
271
+ it "should only have null enabled" do
272
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
273
+
274
+ policy_json = {
275
+ "policy_id" => "01a1",
276
+ "version" => 2,
277
+ "data" => {
278
+ "sensors" => {
279
+ "nullbyte" => {
280
+ "patterns" => ["1","2"]
281
+ }
282
+ }
283
+ }
284
+ }
285
+
286
+ policy = AppSensorPolicy.from_json(policy_json)
287
+
288
+ expect(policy.policy_id).to eq("01a1")
289
+ expect(policy.options["req_size"]).to_not be_nil
290
+ expect(policy.options["resp_size"]).to_not be_nil
291
+ expect(policy.options["resp_codes"]).to_not be_nil
292
+ expect(policy.options["xss"]).to_not be_nil
293
+ expect(policy.options["sqli"]).to_not be_nil
294
+ expect(policy.options["cmdi"]).to_not be_nil
295
+ expect(policy.options["fpt"]).to_not be_nil
296
+ expect(policy.options["nullbyte"]).to_not be_nil
297
+ expect(policy.options["retr"]).to_not be_nil
298
+ expect(policy.options["login"]).to_not be_nil
299
+
300
+ expect(policy.options["req_size"].enabled).to eq(false)
301
+ expect(policy.options["resp_size"].enabled).to eq(false)
302
+ expect(policy.options["resp_codes"].enabled).to eq(false)
303
+ expect(policy.options["xss"].enabled).to eq(false)
304
+ expect(policy.options["sqli"].enabled).to eq(false)
305
+ expect(policy.options["cmdi"].enabled).to eq(false)
306
+ expect(policy.options["fpt"].enabled).to eq(false)
307
+ expect(policy.options["nullbyte"].enabled).to eq(true)
308
+ expect(policy.options["retr"].enabled).to eq(false)
309
+ expect(policy.options["login"].enabled).to eq(false)
310
+
311
+ expect(policy.options["xss"].v1_compatability_enabled).to eq(false)
312
+ expect(policy.options["sqli"].v1_compatability_enabled).to eq(false)
313
+ expect(policy.options["cmdi"].v1_compatability_enabled).to eq(false)
314
+ expect(policy.options["fpt"].v1_compatability_enabled).to eq(false)
315
+ expect(policy.options["nullbyte"].v1_compatability_enabled).to eq(false)
316
+ expect(policy.options["retr"].v1_compatability_enabled).to eq(false)
317
+ end
318
+ end
319
+
320
+ context "that only has xss enabled" do
321
+ it "should only have xss enabled" do
322
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
323
+
324
+ policy_json = {
325
+ "policy_id" => "01a1",
326
+ "version" => 2,
327
+ "data" => {
328
+ "sensors" => {
329
+ "xss" => {
330
+ "libinjection" => true,
331
+ "patterns" => ["1","2","8"],
332
+ "exclusions" => {
333
+ "bob" => ["*"]
334
+ }
335
+ }
336
+ }
337
+ }
338
+ }
339
+
340
+ policy = AppSensorPolicy.from_json(policy_json)
341
+
342
+ expect(policy.policy_id).to eq("01a1")
343
+ expect(policy.options["req_size"]).to_not be_nil
344
+ expect(policy.options["resp_size"]).to_not be_nil
345
+ expect(policy.options["resp_codes"]).to_not be_nil
346
+ expect(policy.options["xss"]).to_not be_nil
347
+ expect(policy.options["sqli"]).to_not be_nil
348
+ expect(policy.options["cmdi"]).to_not be_nil
349
+ expect(policy.options["fpt"]).to_not be_nil
350
+ expect(policy.options["nullbyte"]).to_not be_nil
351
+ expect(policy.options["retr"]).to_not be_nil
352
+ expect(policy.options["login"]).to_not be_nil
353
+
354
+ expect(policy.options["req_size"].enabled).to eq(false)
355
+ expect(policy.options["resp_size"].enabled).to eq(false)
356
+ expect(policy.options["resp_codes"].enabled).to eq(false)
357
+ expect(policy.options["xss"].enabled).to eq(true)
358
+ expect(policy.options["sqli"].enabled).to eq(false)
359
+ expect(policy.options["cmdi"].enabled).to eq(false)
360
+ expect(policy.options["fpt"].enabled).to eq(false)
361
+ expect(policy.options["nullbyte"].enabled).to eq(false)
362
+ expect(policy.options["retr"].enabled).to eq(false)
363
+ expect(policy.options["login"].enabled).to eq(false)
364
+
365
+ expect(policy.options["xss"].v1_compatability_enabled).to eq(false)
366
+ expect(policy.options["sqli"].v1_compatability_enabled).to eq(false)
367
+ expect(policy.options["cmdi"].v1_compatability_enabled).to eq(false)
368
+ expect(policy.options["fpt"].v1_compatability_enabled).to eq(false)
369
+ expect(policy.options["nullbyte"].v1_compatability_enabled).to eq(false)
370
+ expect(policy.options["retr"].v1_compatability_enabled).to eq(false)
371
+ end
372
+ end
373
+
374
+ context "that has everything enabled" do
375
+ it "should have all sensors enabled" do
376
+ expect_any_instance_of(AppSensorRuleManager).to receive(:load_default_rules_file)
377
+
378
+ policy_json = {
379
+ "policy_id" => "01a1",
380
+ "version" => 2,
381
+ "data" => {
382
+ "sensors" => {
383
+ "req_size" => {
384
+ "limit" => 1024,
385
+ "exclude_routes" => ["2300"]
386
+ },
387
+ "resp_size" => {
388
+ "limit" => 2048,
389
+ "exclude_routes" => ["2323"]
390
+ },
391
+ "resp_codes" => {
392
+ "series_400_enabled" => true,
393
+ "series_500_enabled" => true
394
+ },
395
+ "xss" => {
396
+ "libinjection" => true,
397
+ "patterns" => ["1","2","8"],
398
+ "exclusions" => {
399
+ "bob" => ["*"]
400
+ }
401
+ },
402
+ "sqli" => {
403
+ "libinjection" => true,
404
+ "exclude_headers" => true,
405
+ "patterns" => ["1"]
406
+ },
407
+ "fpt" => {
408
+ "patterns" => ["1","2"],
409
+ "exclude_forms" => true,
410
+ "exclude_cookies" => true,
411
+ "exclusions" => {
412
+ "somethingcommon" => ["form"]
413
+ }
414
+ },
415
+ "cmdi" => {
416
+ "patterns" => ["1","2"]
417
+ },
418
+ "nullbyte" => {
419
+ "patterns" => ["1","2"]
420
+ },
421
+ "retr" => {
422
+ "patterns" => ["1","2"]
423
+ },
424
+ "login" => {
425
+ "lgnSccss_enabled" => true,
426
+ "lgnFlr_enabled" => true,
427
+ "psswdRstReq" => true,
428
+ "psswdRstAttmpt" => true,
429
+ "psswdRst" => true
430
+ }
431
+ }
432
+ }
433
+ }
434
+
435
+ policy = AppSensorPolicy.from_json(policy_json)
436
+
437
+ expect(policy.policy_id).to eq("01a1")
438
+ expect(policy.options["req_size"]).to_not be_nil
439
+ expect(policy.options["resp_size"]).to_not be_nil
440
+ expect(policy.options["resp_codes"]).to_not be_nil
441
+ expect(policy.options["xss"]).to_not be_nil
442
+ expect(policy.options["sqli"]).to_not be_nil
443
+ expect(policy.options["cmdi"]).to_not be_nil
444
+ expect(policy.options["fpt"]).to_not be_nil
445
+ expect(policy.options["nullbyte"]).to_not be_nil
446
+ expect(policy.options["retr"]).to_not be_nil
447
+ expect(policy.options["login"]).to_not be_nil
448
+
449
+ expect(policy.options["req_size"].enabled).to eq(true)
450
+ expect(policy.options["resp_size"].enabled).to eq(true)
451
+ expect(policy.options["resp_codes"].enabled).to eq(true)
452
+ expect(policy.options["xss"].enabled).to eq(true)
453
+ expect(policy.options["sqli"].enabled).to eq(true)
454
+ expect(policy.options["cmdi"].enabled).to eq(true)
455
+ expect(policy.options["fpt"].enabled).to eq(true)
456
+ expect(policy.options["nullbyte"].enabled).to eq(true)
457
+ expect(policy.options["retr"].enabled).to eq(true)
458
+ expect(policy.options["login"].enabled).to eq(true)
459
+
460
+ expect(policy.options["xss"].v1_compatability_enabled).to eq(false)
461
+ expect(policy.options["sqli"].v1_compatability_enabled).to eq(false)
462
+ expect(policy.options["cmdi"].v1_compatability_enabled).to eq(false)
463
+ expect(policy.options["fpt"].v1_compatability_enabled).to eq(false)
464
+ expect(policy.options["nullbyte"].v1_compatability_enabled).to eq(false)
465
+ expect(policy.options["retr"].v1_compatability_enabled).to eq(false)
466
+ end
467
+ end
35
468
  end
36
469
  end
37
470
  end