tcell_agent 0.4.0 → 1.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 (199) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +9 -22
  3. data/bin/tcell_agent +127 -132
  4. data/lib/tcell_agent/agent/event_processor.rb +23 -22
  5. data/lib/tcell_agent/agent/fork_pipe_manager.rb +7 -7
  6. data/lib/tcell_agent/agent/policy_manager.rb +20 -15
  7. data/lib/tcell_agent/agent/policy_types.rb +5 -11
  8. data/lib/tcell_agent/agent/static_agent.rb +5 -1
  9. data/lib/tcell_agent/agent.rb +6 -4
  10. data/lib/tcell_agent/api.rb +7 -9
  11. data/lib/tcell_agent/appsensor/meta_data.rb +11 -4
  12. data/lib/tcell_agent/authlogic.rb +3 -3
  13. data/lib/tcell_agent/cmdi.rb +6 -4
  14. data/lib/tcell_agent/config/unknown_options.rb +3 -1
  15. data/lib/tcell_agent/configuration.rb +47 -49
  16. data/lib/tcell_agent/devise.rb +2 -2
  17. data/lib/tcell_agent/hooks/login_fraud.rb +58 -29
  18. data/lib/tcell_agent/instrumentation.rb +11 -10
  19. data/lib/tcell_agent/logger.rb +2 -2
  20. data/lib/tcell_agent/patches/meta_data.rb +9 -13
  21. data/lib/tcell_agent/patches.rb +7 -10
  22. data/lib/tcell_agent/policies/clickjacking_policy.rb +4 -5
  23. data/lib/tcell_agent/policies/content_security_policy.rb +6 -12
  24. data/lib/tcell_agent/policies/dataloss_policy.rb +2 -2
  25. data/lib/tcell_agent/policies/http_redirect_policy.rb +2 -2
  26. data/lib/tcell_agent/policies/policy.rb +0 -2
  27. data/lib/tcell_agent/policies/rust_policies.rb +90 -0
  28. data/lib/tcell_agent/policies/secure_headers_policy.rb +2 -2
  29. data/lib/tcell_agent/rails/auth/authlogic.rb +42 -24
  30. data/lib/tcell_agent/rails/auth/devise.rb +44 -23
  31. data/lib/tcell_agent/rails/auth/doorkeeper.rb +33 -15
  32. data/lib/tcell_agent/rails/better_ip.rb +1 -1
  33. data/lib/tcell_agent/rails/csrf_exception.rb +2 -2
  34. data/lib/tcell_agent/rails/dlp/process_request.rb +1 -1
  35. data/lib/tcell_agent/rails/dlp.rb +6 -6
  36. data/lib/tcell_agent/rails/dlp_handler.rb +1 -1
  37. data/lib/tcell_agent/rails/js_agent_insert.rb +1 -1
  38. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +1 -1
  39. data/lib/tcell_agent/rails/middleware/context_middleware.rb +3 -2
  40. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +10 -9
  41. data/lib/tcell_agent/rails/routes/grape.rb +6 -6
  42. data/lib/tcell_agent/rails/routes.rb +8 -11
  43. data/lib/tcell_agent/rust/libtcellagent-0.11.1.dylib +0 -0
  44. data/lib/tcell_agent/rust/{libtcellagent-0.6.1.so → libtcellagent-0.11.1.so} +0 -0
  45. data/lib/tcell_agent/rust/models.rb +16 -0
  46. data/lib/tcell_agent/rust/tcellagent-0.11.1.dll +0 -0
  47. data/lib/tcell_agent/rust/whisperer.rb +119 -48
  48. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +17 -20
  49. data/lib/tcell_agent/sensor_events/command_injection.rb +50 -5
  50. data/lib/tcell_agent/sensor_events/login_fraud.rb +34 -18
  51. data/lib/tcell_agent/sensor_events/patches.rb +21 -0
  52. data/lib/tcell_agent/sensor_events/server_agent.rb +3 -3
  53. data/lib/tcell_agent/sensor_events/util/utils.rb +4 -3
  54. data/lib/tcell_agent/servers/puma.rb +2 -2
  55. data/lib/tcell_agent/servers/unicorn.rb +1 -1
  56. data/lib/tcell_agent/utils/passwords.rb +28 -0
  57. data/lib/tcell_agent/version.rb +1 -1
  58. data/lib/tcell_agent.rb +1 -5
  59. data/spec/apps/rails-3.2/config/tcell_agent.config +15 -0
  60. data/spec/apps/rails-3.2/log/development.log +0 -0
  61. data/spec/apps/rails-3.2/log/test.log +12 -0
  62. data/spec/apps/rails-4.1/log/test.log +0 -0
  63. data/spec/lib/tcell_agent/agent/fork_pipe_manager_spec.rb +46 -45
  64. data/spec/lib/tcell_agent/agent/policy_manager_spec.rb +276 -164
  65. data/spec/lib/tcell_agent/agent/static_agent_spec.rb +44 -47
  66. data/spec/lib/tcell_agent/api/api_spec.rb +16 -16
  67. data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +131 -116
  68. data/spec/lib/tcell_agent/appsensor/meta_data_spec.rb +55 -51
  69. data/spec/lib/tcell_agent/cmdi_spec.rb +413 -436
  70. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +145 -128
  71. data/spec/lib/tcell_agent/configuration_spec.rb +165 -169
  72. data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +144 -153
  73. data/spec/lib/tcell_agent/instrumentation_spec.rb +84 -85
  74. data/spec/lib/tcell_agent/patches_spec.rb +70 -111
  75. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +313 -244
  76. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +28 -28
  77. data/spec/lib/tcell_agent/policies/command_injection_policy_spec.rb +643 -513
  78. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +55 -102
  79. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +111 -134
  80. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +141 -146
  81. data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +8 -8
  82. data/spec/lib/tcell_agent/policies/login_policy_spec.rb +15 -17
  83. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +231 -559
  84. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +27 -27
  85. data/spec/lib/tcell_agent/rails/better_ip_spec.rb +30 -34
  86. data/spec/lib/tcell_agent/rails/logger_spec.rb +50 -49
  87. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +182 -199
  88. data/spec/lib/tcell_agent/rails/middleware/dlp_middleware_spec.rb +110 -84
  89. data/spec/lib/tcell_agent/rails/middleware/global_middleware_spec.rb +107 -85
  90. data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +68 -40
  91. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +81 -67
  92. data/spec/lib/tcell_agent/rails/responses_spec.rb +33 -37
  93. data/spec/lib/tcell_agent/rails/routes/grape_spec.rb +116 -121
  94. data/spec/lib/tcell_agent/rails/routes/route_id_spec.rb +25 -28
  95. data/spec/lib/tcell_agent/rails/routes/routes_spec.rb +87 -85
  96. data/spec/lib/tcell_agent/rails_spec.rb +1 -6
  97. data/spec/lib/tcell_agent/rust/models_spec.rb +112 -0
  98. data/spec/lib/tcell_agent/rust/whisperer_spec.rb +502 -179
  99. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +44 -33
  100. data/spec/lib/tcell_agent/sensor_events/dlp_spec.rb +4 -4
  101. data/spec/lib/tcell_agent/sensor_events/sessions_metric_spec.rb +183 -169
  102. data/spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb +25 -25
  103. data/spec/lib/tcell_agent/utils/bounded_queue_spec.rb +17 -20
  104. data/spec/lib/tcell_agent/utils/params_spec.rb +28 -28
  105. data/spec/lib/tcell_agent/utils/passwords_spec.rb +143 -0
  106. data/spec/lib/tcell_agent/utils/strings_spec.rb +35 -35
  107. data/spec/lib/tcell_agent_spec.rb +8 -8
  108. data/spec/spec_helper.rb +4 -4
  109. data/spec/support/middleware_helper.rb +10 -10
  110. data/spec/support/static_agent_overrides.rb +16 -12
  111. data/tcell_agent.gemspec +17 -33
  112. metadata +43 -198
  113. data/LICENSE_libinjection +0 -32
  114. data/Readme.txt +0 -7
  115. data/ext/libinjection/extconf.rb +0 -3
  116. data/ext/libinjection/libinjection.h +0 -65
  117. data/ext/libinjection/libinjection_html5.c +0 -847
  118. data/ext/libinjection/libinjection_html5.h +0 -54
  119. data/ext/libinjection/libinjection_sqli.c +0 -2317
  120. data/ext/libinjection/libinjection_sqli.h +0 -295
  121. data/ext/libinjection/libinjection_sqli_data.h +0 -9004
  122. data/ext/libinjection/libinjection_wrap.c +0 -3525
  123. data/ext/libinjection/libinjection_xss.c +0 -531
  124. data/ext/libinjection/libinjection_xss.h +0 -21
  125. data/lib/tcell_agent/appsensor/injections_matcher.rb +0 -155
  126. data/lib/tcell_agent/appsensor/rules/appsensor_rule_manager.rb +0 -49
  127. data/lib/tcell_agent/appsensor/rules/appsensor_rule_set.rb +0 -67
  128. data/lib/tcell_agent/appsensor/rules/baserules.json +0 -467
  129. data/lib/tcell_agent/patches/block_rule.rb +0 -93
  130. data/lib/tcell_agent/patches/sensors_matcher.rb +0 -31
  131. data/lib/tcell_agent/policies/appsensor/cmdi_sensor.rb +0 -23
  132. data/lib/tcell_agent/policies/appsensor/fpt_sensor.rb +0 -23
  133. data/lib/tcell_agent/policies/appsensor/injection_sensor.rb +0 -117
  134. data/lib/tcell_agent/policies/appsensor/nullbyte_sensor.rb +0 -26
  135. data/lib/tcell_agent/policies/appsensor/retr_sensor.rb +0 -22
  136. data/lib/tcell_agent/policies/appsensor/sqli_sensor.rb +0 -34
  137. data/lib/tcell_agent/policies/appsensor/xss_sensor.rb +0 -34
  138. data/lib/tcell_agent/policies/appsensor_policy.rb +0 -49
  139. data/lib/tcell_agent/policies/command_injection_policy.rb +0 -196
  140. data/lib/tcell_agent/policies/honeytokens_policy.rb +0 -69
  141. data/lib/tcell_agent/policies/patches_policy.rb +0 -84
  142. data/lib/tcell_agent/rust/libtcellagent-0.6.1.dylib +0 -0
  143. data/lib/tcell_agent/rust/tcellagent-0.6.1.dll +0 -0
  144. data/spec/apps/rails-3.2/Gemfile +0 -25
  145. data/spec/apps/rails-3.2/Gemfile.lock +0 -126
  146. data/spec/apps/rails-3.2/Rakefile +0 -7
  147. data/spec/apps/rails-3.2/app/assets/images/rails.png +0 -0
  148. data/spec/apps/rails-3.2/app/assets/javascripts/application.js +0 -15
  149. data/spec/apps/rails-3.2/app/assets/stylesheets/application.css +0 -13
  150. data/spec/apps/rails-3.2/app/controllers/application_controller.rb +0 -3
  151. data/spec/apps/rails-3.2/app/controllers/t_cell_app_controller.rb +0 -5
  152. data/spec/apps/rails-3.2/app/helpers/application_helper.rb +0 -2
  153. data/spec/apps/rails-3.2/app/views/layouts/application.html.erb +0 -14
  154. data/spec/apps/rails-3.2/app/views/t_cell_app/index.html.erb +0 -1
  155. data/spec/apps/rails-3.2/config/application.rb +0 -63
  156. data/spec/apps/rails-3.2/config/boot.rb +0 -6
  157. data/spec/apps/rails-3.2/config/environment.rb +0 -5
  158. data/spec/apps/rails-3.2/config/environments/test.rb +0 -37
  159. data/spec/apps/rails-3.2/config/routes.rb +0 -11
  160. data/spec/apps/rails-3.2/config.ru +0 -4
  161. data/spec/apps/rails-4.1/Gemfile +0 -7
  162. data/spec/apps/rails-4.1/Gemfile.lock +0 -114
  163. data/spec/apps/rails-4.1/Rakefile +0 -6
  164. data/spec/apps/rails-4.1/app/assets/javascripts/application.js +0 -16
  165. data/spec/apps/rails-4.1/app/assets/stylesheets/application.css +0 -15
  166. data/spec/apps/rails-4.1/app/controllers/application_controller.rb +0 -5
  167. data/spec/apps/rails-4.1/app/controllers/t_cell_app_controller.rb +0 -5
  168. data/spec/apps/rails-4.1/app/helpers/application_helper.rb +0 -2
  169. data/spec/apps/rails-4.1/app/views/layouts/application.html.erb +0 -14
  170. data/spec/apps/rails-4.1/app/views/t_cell_app/index.html.erb +0 -1
  171. data/spec/apps/rails-4.1/config/application.rb +0 -24
  172. data/spec/apps/rails-4.1/config/boot.rb +0 -4
  173. data/spec/apps/rails-4.1/config/environment.rb +0 -5
  174. data/spec/apps/rails-4.1/config/environments/test.rb +0 -41
  175. data/spec/apps/rails-4.1/config/initializers/assets.rb +0 -8
  176. data/spec/apps/rails-4.1/config/initializers/backtrace_silencers.rb +0 -7
  177. data/spec/apps/rails-4.1/config/initializers/cookies_serializer.rb +0 -3
  178. data/spec/apps/rails-4.1/config/initializers/filter_parameter_logging.rb +0 -4
  179. data/spec/apps/rails-4.1/config/initializers/inflections.rb +0 -16
  180. data/spec/apps/rails-4.1/config/initializers/mime_types.rb +0 -4
  181. data/spec/apps/rails-4.1/config/initializers/session_store.rb +0 -3
  182. data/spec/apps/rails-4.1/config/initializers/wrap_parameters.rb +0 -14
  183. data/spec/apps/rails-4.1/config/locales/en.yml +0 -23
  184. data/spec/apps/rails-4.1/config/routes.rb +0 -12
  185. data/spec/apps/rails-4.1/config/secrets.yml +0 -22
  186. data/spec/apps/rails-4.1/config.ru +0 -4
  187. data/spec/controllers/application_controller.rb +0 -12
  188. data/spec/lib/tcell_agent/appsensor/injections_matcher_spec.rb +0 -522
  189. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_manager_spec.rb +0 -23
  190. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_set_spec.rb +0 -159
  191. data/spec/lib/tcell_agent/patches/block_rule_spec.rb +0 -458
  192. data/spec/lib/tcell_agent/patches/sensors_matcher_spec.rb +0 -35
  193. data/spec/lib/tcell_agent/policies/appsensor/cmdi_sensor_spec.rb +0 -139
  194. data/spec/lib/tcell_agent/policies/appsensor/fpt_sensor_spec.rb +0 -139
  195. data/spec/lib/tcell_agent/policies/appsensor/nullbyte_sensor_spec.rb +0 -167
  196. data/spec/lib/tcell_agent/policies/appsensor/retr_sensor_spec.rb +0 -139
  197. data/spec/lib/tcell_agent/policies/appsensor/sqli_sensor_spec.rb +0 -246
  198. data/spec/lib/tcell_agent/policies/appsensor/xss_sensor_spec.rb +0 -882
  199. data/spec/lib/tcell_agent/policies/honeytokens_policy_spec.rb +0 -22
@@ -1,882 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module TCellAgent
6
- module Policies
7
-
8
- describe XssSensor do
9
- describe "#initialize" do
10
- context "default sensor" do
11
- it "should have properties set to defaults" do
12
- sensor = XssSensor.new
13
- expect(sensor.enabled).to eq(false)
14
- expect(sensor.libinjection).to eq(false)
15
- expect(sensor.detection_point).to eq("xss")
16
- expect(sensor.exclude_headers).to eq(false)
17
- expect(sensor.exclude_forms).to eq(false)
18
- expect(sensor.exclude_cookies).to eq(false)
19
- expect(sensor.exclusions).to eq({})
20
- expect(sensor.active_pattern_ids).to eq(Set.new)
21
- expect(sensor.v1_compatability_enabled).to eq(false)
22
- end
23
- end
24
-
25
- context "setting enabled on sensor" do
26
- it "should be enabled" do
27
- sensor = XssSensor.new({"enabled" => true})
28
- expect(sensor.enabled).to eq(true)
29
- expect(sensor.libinjection).to eq(false)
30
- expect(sensor.detection_point).to eq("xss")
31
- expect(sensor.exclude_headers).to eq(false)
32
- expect(sensor.exclude_forms).to eq(false)
33
- expect(sensor.exclude_cookies).to eq(false)
34
- expect(sensor.exclusions).to eq({})
35
- expect(sensor.active_pattern_ids).to eq(Set.new)
36
- expect(sensor.v1_compatability_enabled).to eq(false)
37
- end
38
- end
39
-
40
- context "setting libinjection on sensor" do
41
- it "should have libinjection" do
42
- sensor = XssSensor.new({"libinjection" => true})
43
- expect(sensor.enabled).to eq(false)
44
- expect(sensor.libinjection).to eq(true)
45
- expect(sensor.detection_point).to eq("xss")
46
- expect(sensor.exclude_headers).to eq(false)
47
- expect(sensor.exclude_forms).to eq(false)
48
- expect(sensor.exclude_cookies).to eq(false)
49
- expect(sensor.exclusions).to eq({})
50
- expect(sensor.active_pattern_ids).to eq(Set.new)
51
- expect(sensor.v1_compatability_enabled).to eq(false)
52
- end
53
- end
54
-
55
- context "setting exclude_headers on sensor" do
56
- it "should have exclude_headers" do
57
- sensor = XssSensor.new({"exclude_headers" => true})
58
- expect(sensor.enabled).to eq(false)
59
- expect(sensor.libinjection).to eq(false)
60
- expect(sensor.detection_point).to eq("xss")
61
- expect(sensor.exclude_headers).to eq(true)
62
- expect(sensor.exclude_forms).to eq(false)
63
- expect(sensor.exclude_cookies).to eq(false)
64
- expect(sensor.exclusions).to eq({})
65
- expect(sensor.active_pattern_ids).to eq(Set.new)
66
- expect(sensor.v1_compatability_enabled).to eq(false)
67
- end
68
- end
69
-
70
- context "setting exclude_forms on sensor" do
71
- it "should have exclude_forms" do
72
- sensor = XssSensor.new({"exclude_forms" => true})
73
- expect(sensor.enabled).to eq(false)
74
- expect(sensor.libinjection).to eq(false)
75
- expect(sensor.detection_point).to eq("xss")
76
- expect(sensor.exclude_headers).to eq(false)
77
- expect(sensor.exclude_forms).to eq(true)
78
- expect(sensor.exclude_cookies).to eq(false)
79
- expect(sensor.exclusions).to eq({})
80
- expect(sensor.active_pattern_ids).to eq(Set.new)
81
- expect(sensor.v1_compatability_enabled).to eq(false)
82
- end
83
- end
84
-
85
- context "setting exclude_cookies on sensor" do
86
- it "should have exclude_cookies" do
87
- sensor = XssSensor.new({"exclude_cookies" => true})
88
- expect(sensor.enabled).to eq(false)
89
- expect(sensor.libinjection).to eq(false)
90
- expect(sensor.detection_point).to eq("xss")
91
- expect(sensor.exclude_headers).to eq(false)
92
- expect(sensor.exclude_forms).to eq(false)
93
- expect(sensor.exclude_cookies).to eq(true)
94
- expect(sensor.exclusions).to eq({})
95
- expect(sensor.active_pattern_ids).to eq(Set.new)
96
- expect(sensor.v1_compatability_enabled).to eq(false)
97
- end
98
- end
99
-
100
- context "setting exclusions on sensor" do
101
- it "should have exclude_cookies" do
102
- sensor = XssSensor.new({"exclusions" => {"word" => ["form", "header"]}})
103
- expect(sensor.enabled).to eq(false)
104
- expect(sensor.libinjection).to eq(false)
105
- expect(sensor.detection_point).to eq("xss")
106
- expect(sensor.exclude_headers).to eq(false)
107
- expect(sensor.exclude_forms).to eq(false)
108
- expect(sensor.exclude_cookies).to eq(false)
109
- expect(sensor.exclusions).to eq(
110
- {"word"=>Set.new(["form", "header"])}
111
- )
112
- expect(sensor.active_pattern_ids).to eq(Set.new)
113
- expect(sensor.v1_compatability_enabled).to eq(false)
114
- end
115
- end
116
-
117
- context "setting active_pattern_ids on sensor" do
118
- it "should have active_pattern_ids" do
119
- sensor = XssSensor.new({"patterns" => ["1", "2", "3"]})
120
- expect(sensor.enabled).to eq(false)
121
- expect(sensor.libinjection).to eq(false)
122
- expect(sensor.detection_point).to eq("xss")
123
- expect(sensor.exclude_headers).to eq(false)
124
- expect(sensor.exclude_forms).to eq(false)
125
- expect(sensor.exclude_cookies).to eq(false)
126
- expect(sensor.exclusions).to eq({})
127
- expect(sensor.active_pattern_ids).to eq(
128
- Set.new(["1", "2", "3"])
129
- )
130
- expect(sensor.v1_compatability_enabled).to eq(false)
131
- end
132
- end
133
-
134
- context "setting v1_compatability_enabled on sensor" do
135
- it "should have v1_compatability_enabled" do
136
- sensor = XssSensor.new({"v1_compatability_enabled" => true})
137
- expect(sensor.enabled).to eq(false)
138
- expect(sensor.libinjection).to eq(false)
139
- expect(sensor.detection_point).to eq("xss")
140
- expect(sensor.exclude_headers).to eq(false)
141
- expect(sensor.exclude_forms).to eq(false)
142
- expect(sensor.exclude_cookies).to eq(false)
143
- expect(sensor.exclusions).to eq({})
144
- expect(sensor.active_pattern_ids).to eq(Set.new)
145
- expect(sensor.v1_compatability_enabled).to eq(true)
146
- end
147
- end
148
-
149
- context "setting excluded_route_ids on sensor" do
150
- it "should have excluded_route_ids" do
151
- sensor = XssSensor.new({"exclude_routes" => ["excluded_route_id"]})
152
- expect(sensor.enabled).to eq(false)
153
- expect(sensor.libinjection).to eq(false)
154
- expect(sensor.detection_point).to eq("xss")
155
- expect(sensor.exclude_headers).to eq(false)
156
- expect(sensor.exclude_forms).to eq(false)
157
- expect(sensor.exclude_cookies).to eq(false)
158
- expect(sensor.exclusions).to eq({})
159
- expect(sensor.active_pattern_ids).to eq(Set.new)
160
- expect(sensor.v1_compatability_enabled).to eq(false)
161
- expect(sensor.excluded_route_ids).to eq(Set.new(["excluded_route_id"]))
162
- end
163
- end
164
- end
165
-
166
- describe "#find_vulnerability" do
167
- before(:each) do
168
- @sensor = XssSensor.new({"enabled" => true})
169
- end
170
-
171
- context "with libinjection enabled" do
172
- context "with param value that doesn't match any vulnerabilities" do
173
- it "should return nil" do
174
- @sensor.libinjection = true
175
-
176
- ruleset = double("ruleset")
177
- expect(@sensor).to receive(:get_ruleset).and_return(ruleset)
178
- expect(ruleset).to receive(:check_violation).with(
179
- "param", "value", Set.new, false
180
- ).and_return(nil)
181
-
182
- expect(@sensor.find_vulnerability("param", "value")).to eq(nil)
183
- end
184
-
185
- context "and it has utf-8 chars" do
186
- it "should return nil but not fail miserably" do
187
- @sensor.libinjection = true
188
-
189
- ruleset = double("ruleset")
190
- expect(@sensor).to receive(:get_ruleset).and_return(ruleset)
191
- expect(ruleset).to receive(:check_violation).with(
192
- "param", "Müller", Set.new, false
193
- ).and_return(nil)
194
-
195
- expect(@sensor.find_vulnerability("param", "Müller")).to eq(nil)
196
- end
197
- end
198
- end
199
-
200
- context "with param value that matches a vulnerability" do
201
- it "should return the param and it's value" do
202
- @sensor.libinjection = true
203
-
204
- expect(@sensor).to_not receive(:get_ruleset)
205
-
206
- expect(@sensor.find_vulnerability("param_name", "<script>")).to eq(
207
- {"param"=>"param_name", "value"=>"<script>", "pattern"=>"li"}
208
- )
209
- end
210
- end
211
- end
212
-
213
- context "with no ruleset" do
214
- it "should return nil" do
215
- expect(@sensor).to receive(:get_ruleset).and_return(nil)
216
-
217
- expect(@sensor.find_vulnerability("param", "value")).to eq(nil)
218
- end
219
- end
220
-
221
- context "with ruletset" do
222
- context "with param value that doesn't match any vulnerabilities" do
223
- it "should return nil" do
224
- ruleset = double("ruleset")
225
- expect(@sensor).to receive(:get_ruleset).and_return(ruleset)
226
- expect(ruleset).to receive(:check_violation).with(
227
- "param", "value", Set.new, false
228
- ).and_return(nil)
229
-
230
- expect(@sensor.find_vulnerability("param", "value")).to eq(nil)
231
- end
232
- end
233
-
234
- context "with param value that matches a vulnerability" do
235
- it "should return the param and it's value" do
236
- ruleset = double("ruleset")
237
- expect(@sensor).to receive(:get_ruleset).and_return(ruleset)
238
- expect(ruleset).to receive(:check_violation).with(
239
- "param", "value", Set.new, false
240
- ).and_return(true)
241
-
242
- expect(@sensor.find_vulnerability("param", "value")).to eq(true)
243
- end
244
- end
245
- end
246
- end
247
-
248
- describe "#get_injection_attempt" do
249
- before(:each) do
250
- @appsensor_meta = TCellAgent::SensorEvents::AppSensorMetaEvent.new(
251
- "get",
252
- "remote_address",
253
- "route_id",
254
- "session_id",
255
- "user_id",
256
- "transaction_id")
257
- end
258
-
259
- context "enabled sensor" do
260
- context "param has NO vulnerability" do
261
- it "should return false" do
262
- sensor = XssSensor.new({"enabled" => true})
263
- result = sensor.get_injection_attempt(
264
- XssSensor::GET_PARAM,
265
- @appsensor_meta,
266
- "param_name",
267
- "param_value"
268
- )
269
-
270
- expect(result).to eq(false)
271
- end
272
-
273
- context "no excluded routes" do
274
- it "should return false" do
275
- sensor = XssSensor.new({"enabled" => true, "exclude_routes" => []})
276
- result = sensor.get_injection_attempt(
277
- XssSensor::GET_PARAM,
278
- @appsensor_meta,
279
- "param_name",
280
- "param_value"
281
- )
282
-
283
- expect(result).to eq(false)
284
- end
285
- end
286
-
287
- context "has excluded routes" do
288
- context "route id matches" do
289
- it "should return false" do
290
- sensor = XssSensor.new({"enabled" => true, "exclude_routes" => ["route_id"]})
291
- result = sensor.get_injection_attempt(
292
- XssSensor::GET_PARAM,
293
- @appsensor_meta,
294
- "param_name",
295
- "param_value"
296
- )
297
-
298
- expect(result).to eq(false)
299
- end
300
- end
301
- context "route id does not match" do
302
- it "should return false" do
303
- sensor = XssSensor.new({"enabled" => true, "exclude_routes" => ["unmatching_route_id"]})
304
- result = sensor.get_injection_attempt(
305
- XssSensor::GET_PARAM,
306
- @appsensor_meta,
307
- "param_name",
308
- "param_value"
309
- )
310
-
311
- expect(result).to eq(false)
312
- end
313
- end
314
- end
315
- end
316
-
317
- context "param has a vulnerability" do
318
- context "param is a URI param" do
319
- context "exclude forms sensor" do
320
- it "should return false" do
321
- sensor = XssSensor.new({"enabled" => true, "exclude_forms" => true})
322
-
323
- expect(sensor).to_not receive(:find_vulnerability)
324
-
325
- result = sensor.get_injection_attempt(
326
- XssSensor::URI_PARAM,
327
- @appsensor_meta,
328
- "param_name",
329
- "param_value"
330
- )
331
-
332
- expect(result).to eq(false)
333
- end
334
- end
335
-
336
- context "exclude cookies sensor" do
337
- it "should return the injection attempt" do
338
- sensor = XssSensor.new({"enabled" => true, "exclude_cookies" => true})
339
-
340
- expect(sensor).to receive(:find_vulnerability).and_return(
341
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
342
- )
343
-
344
- result = sensor.get_injection_attempt(
345
- XssSensor::URI_PARAM,
346
- @appsensor_meta,
347
- "param_name",
348
- "param_value"
349
- )
350
-
351
- expect(result.type_of_param).to eq(XssSensor::URI_PARAM)
352
- expect(result.detection_point).to eq(sensor.detection_point)
353
- expect(result.param_name).to eq("vuln_param")
354
- expect(result.param_value).to eq("vuln_value")
355
- expect(result.pattern).to eq("1")
356
- end
357
- end
358
- end
359
-
360
- context "param is a GET param" do
361
- context "exclude forms sensor" do
362
- it "should return false" do
363
- sensor = XssSensor.new({"enabled" => true, "exclude_forms" => true})
364
-
365
- expect(sensor).to_not receive(:find_vulnerability)
366
-
367
- result = sensor.get_injection_attempt(
368
- XssSensor::GET_PARAM,
369
- @appsensor_meta,
370
- "param_name",
371
- "param_value"
372
- )
373
-
374
- expect(result).to eq(false)
375
- end
376
-
377
- context "no excluded routes" do
378
- it "should return false" do
379
- sensor = XssSensor.new({"enabled" => true, "exclude_forms" => true, "exclude_routes" => []})
380
-
381
- expect(sensor).to_not receive(:find_vulnerability)
382
-
383
- result = sensor.get_injection_attempt(
384
- XssSensor::GET_PARAM,
385
- @appsensor_meta,
386
- "param_name",
387
- "param_value"
388
- )
389
-
390
- expect(result).to eq(false)
391
- end
392
- end
393
-
394
- context "has excluded routes" do
395
- context "route id matches" do
396
- it "should return false" do
397
- sensor = XssSensor.new({
398
- "enabled" => true,
399
- "exclude_forms" => true,
400
- "exclude_routes" => ["route_id"]
401
- })
402
-
403
- expect(sensor).to_not receive(:find_vulnerability)
404
-
405
- result = sensor.get_injection_attempt(
406
- XssSensor::GET_PARAM,
407
- @appsensor_meta,
408
- "param_name",
409
- "param_value"
410
- )
411
-
412
- expect(result).to eq(false)
413
- end
414
- end
415
-
416
- context "route id does not match" do
417
- it "should return false" do
418
- sensor = XssSensor.new({
419
- "enabled" => true,
420
- "exclude_forms" => true,
421
- "exclude_routes" => ["unmatching_route_id"]
422
- })
423
-
424
- expect(sensor).to_not receive(:find_vulnerability)
425
-
426
- result = sensor.get_injection_attempt(
427
- XssSensor::GET_PARAM,
428
- @appsensor_meta,
429
- "param_name",
430
- "param_value"
431
- )
432
-
433
- expect(result).to eq(false)
434
- end
435
- end
436
- end
437
- end
438
-
439
- context "exclude cookies sensor" do
440
- it "should return true" do
441
- sensor = XssSensor.new({
442
- "enabled" => true,
443
- "exclude_cookies" => true,
444
- })
445
-
446
- expect(sensor).to receive(:find_vulnerability).and_return(
447
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
448
- )
449
-
450
- result = sensor.get_injection_attempt(
451
- XssSensor::GET_PARAM,
452
- @appsensor_meta,
453
- "param_name",
454
- "param_value",
455
- )
456
-
457
- expect(result.type_of_param).to eq(XssSensor::GET_PARAM)
458
- expect(result.detection_point).to eq(sensor.detection_point)
459
- expect(result.param_name).to eq("vuln_param")
460
- expect(result.param_value).to eq("vuln_value")
461
- expect(result.pattern).to eq("1")
462
- end
463
-
464
- context "no excluded routes" do
465
- it "should return true" do
466
- sensor = XssSensor.new({
467
- "enabled" => true,
468
- "exclude_cookies" => true,
469
- "exclude_routes" => []
470
- })
471
-
472
- expect(sensor).to receive(:find_vulnerability).and_return(
473
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
474
- )
475
-
476
- result = sensor.get_injection_attempt(
477
- XssSensor::GET_PARAM,
478
- @appsensor_meta,
479
- "param_name",
480
- "param_value"
481
- )
482
-
483
- expect(result.type_of_param).to eq(XssSensor::GET_PARAM)
484
- expect(result.detection_point).to eq(sensor.detection_point)
485
- expect(result.param_name).to eq("vuln_param")
486
- expect(result.param_value).to eq("vuln_value")
487
- expect(result.pattern).to eq("1")
488
- end
489
- end
490
-
491
- context "has excluded routes" do
492
- context "route id matches" do
493
- it "should return false" do
494
- sensor = XssSensor.new({
495
- "enabled" => true,
496
- "exclude_cookies" => true,
497
- "exclude_routes" => ["route_id"]
498
- })
499
-
500
- expect(sensor).to_not receive(:find_vulnerability)
501
-
502
- result = sensor.get_injection_attempt(
503
- XssSensor::GET_PARAM,
504
- @appsensor_meta,
505
- "param_name",
506
- "param_value"
507
- )
508
-
509
- expect(result).to eq(false)
510
- end
511
- end
512
-
513
- context "route id does not match" do
514
- it "should return true" do
515
- sensor = XssSensor.new({
516
- "enabled" => true,
517
- "exclude_cookies" => true,
518
- "exclude_routes" => ["unmatching_route_id"]
519
- })
520
-
521
- expect(sensor).to receive(:find_vulnerability).and_return(
522
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
523
- )
524
-
525
- result = sensor.get_injection_attempt(
526
- XssSensor::GET_PARAM,
527
- @appsensor_meta,
528
- "param_name",
529
- "param_value"
530
- )
531
-
532
- expect(result.type_of_param).to eq(XssSensor::GET_PARAM)
533
- expect(result.detection_point).to eq(sensor.detection_point)
534
- expect(result.param_name).to eq("vuln_param")
535
- expect(result.param_value).to eq("vuln_value")
536
- expect(result.pattern).to eq("1")
537
- end
538
- end
539
- end
540
- end
541
-
542
- context "exclude headers sensor" do
543
- it "should return true" do
544
- sensor = XssSensor.new({
545
- "enabled" => true,
546
- "exclude_headers" => true,
547
- })
548
-
549
- expect(sensor).to receive(:find_vulnerability).and_return(
550
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
551
- )
552
-
553
- result = sensor.get_injection_attempt(
554
- XssSensor::GET_PARAM,
555
- @appsensor_meta,
556
- "param_name",
557
- "param_value",
558
- )
559
-
560
- expect(result.type_of_param).to eq(XssSensor::GET_PARAM)
561
- expect(result.detection_point).to eq(sensor.detection_point)
562
- expect(result.param_name).to eq("vuln_param")
563
- expect(result.param_value).to eq("vuln_value")
564
- expect(result.pattern).to eq("1")
565
- end
566
- end
567
- end
568
-
569
- context "param is a POST param" do
570
- context "exclude forms sensor" do
571
- it "should return false" do
572
- sensor = XssSensor.new({
573
- "enabled" => true,
574
- "exclude_forms" => true
575
- })
576
-
577
- expect(sensor).to_not receive(:find_vulnerability)
578
-
579
- result = sensor.get_injection_attempt(
580
- XssSensor::POST_PARAM,
581
- @appsensor_meta,
582
- "param_name",
583
- "param_value",
584
- )
585
-
586
- expect(result).to eq(false)
587
- end
588
- end
589
-
590
- context "exclude cookies sensor" do
591
- it "should return true" do
592
- sensor = XssSensor.new({
593
- "enabled" => true,
594
- "exclude_cookies" => true
595
- })
596
-
597
- expect(sensor).to receive(:find_vulnerability).and_return(
598
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
599
- )
600
-
601
- result = sensor.get_injection_attempt(
602
- XssSensor::POST_PARAM,
603
- @appsensor_meta,
604
- "param_name",
605
- "param_value",
606
- )
607
-
608
- expect(result.type_of_param).to eq(XssSensor::POST_PARAM)
609
- expect(result.detection_point).to eq(sensor.detection_point)
610
- expect(result.param_name).to eq("vuln_param")
611
- expect(result.param_value).to eq("vuln_value")
612
- expect(result.pattern).to eq("1")
613
- end
614
- end
615
-
616
- context "exclude headers sensor" do
617
- it "should return true" do
618
- sensor = XssSensor.new({
619
- "enabled" => true,
620
- "exclude_headers" => true,
621
- })
622
-
623
- expect(sensor).to receive(:find_vulnerability).and_return(
624
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
625
- )
626
-
627
- result = sensor.get_injection_attempt(
628
- XssSensor::POST_PARAM,
629
- @appsensor_meta,
630
- "param_name",
631
- "param_value",
632
- )
633
-
634
- expect(result.type_of_param).to eq(XssSensor::POST_PARAM)
635
- expect(result.detection_point).to eq(sensor.detection_point)
636
- expect(result.param_name).to eq("vuln_param")
637
- expect(result.param_value).to eq("vuln_value")
638
- expect(result.pattern).to eq("1")
639
- end
640
- end
641
- end
642
-
643
- context "param is a JSON param" do
644
- context "exclude forms sensor" do
645
- it "should return false" do
646
- sensor = XssSensor.new({
647
- "enabled" => true,
648
- "exclude_forms" => true
649
- })
650
-
651
- expect(sensor).to_not receive(:find_vulnerability)
652
-
653
- result = sensor.get_injection_attempt(
654
- XssSensor::JSON_PARAM,
655
- @appsensor_meta,
656
- "param_name",
657
- "param_value",
658
- )
659
-
660
- expect(result).to eq(false)
661
- end
662
- end
663
-
664
- context "exclude cookies sensor" do
665
- it "should return true" do
666
- sensor = XssSensor.new({
667
- "enabled" => true,
668
- "exclude_cookies" => true
669
- })
670
-
671
- expect(sensor).to receive(:find_vulnerability).and_return(
672
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
673
- )
674
-
675
- result = sensor.get_injection_attempt(
676
- XssSensor::JSON_PARAM,
677
- @appsensor_meta,
678
- "param_name",
679
- "param_value",
680
- )
681
-
682
- expect(result.type_of_param).to eq(XssSensor::JSON_PARAM)
683
- expect(result.detection_point).to eq(sensor.detection_point)
684
- expect(result.param_name).to eq("vuln_param")
685
- expect(result.param_value).to eq("vuln_value")
686
- expect(result.pattern).to eq("1")
687
- end
688
- end
689
-
690
- context "exclude headers sensor" do
691
- it "should return true" do
692
- sensor = XssSensor.new({
693
- "enabled" => true,
694
- "exclude_headers" => true,
695
- })
696
-
697
- expect(sensor).to receive(:find_vulnerability).and_return(
698
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
699
- )
700
-
701
- result = sensor.get_injection_attempt(
702
- XssSensor::JSON_PARAM,
703
- @appsensor_meta,
704
- "param_name",
705
- "param_value",
706
- )
707
-
708
- expect(result.type_of_param).to eq(XssSensor::JSON_PARAM)
709
- expect(result.detection_point).to eq(sensor.detection_point)
710
- expect(result.param_name).to eq("vuln_param")
711
- expect(result.param_value).to eq("vuln_value")
712
- expect(result.pattern).to eq("1")
713
- end
714
- end
715
- end
716
-
717
- context "param is a COOKIE param" do
718
- context "exclude forms sensor" do
719
- it "should return true" do
720
- sensor = XssSensor.new({
721
- "enabled" => true,
722
- "exclude_forms" => true
723
- })
724
-
725
- expect(sensor).to receive(:find_vulnerability).and_return(
726
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
727
- )
728
-
729
- result = sensor.get_injection_attempt(
730
- XssSensor::COOKIE_PARAM,
731
- @appsensor_meta,
732
- "param_name",
733
- "param_value",
734
- )
735
-
736
- expect(result.type_of_param).to eq(XssSensor::COOKIE_PARAM)
737
- expect(result.detection_point).to eq(sensor.detection_point)
738
- expect(result.param_name).to eq("vuln_param")
739
- expect(result.param_value).to eq("vuln_value")
740
- expect(result.pattern).to eq("1")
741
- end
742
- end
743
-
744
- context "exclude cookies sensor" do
745
- it "should return false" do
746
- sensor = XssSensor.new({
747
- "enabled" => true,
748
- "exclude_cookies" => true
749
- })
750
-
751
- expect(sensor).to_not receive(:find_vulnerability)
752
-
753
- result = sensor.get_injection_attempt(
754
- XssSensor::COOKIE_PARAM,
755
- @appsensor_meta,
756
- "param_name",
757
- "param_value",
758
- )
759
-
760
- expect(result).to eq(false)
761
- end
762
- end
763
-
764
- context "exclude headers sensor" do
765
- it "should return true" do
766
- sensor = XssSensor.new({
767
- "enabled" => true,
768
- "exclude_headers" => true,
769
- })
770
-
771
- expect(sensor).to receive(:find_vulnerability).and_return(
772
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
773
- )
774
-
775
- result = sensor.get_injection_attempt(
776
- XssSensor::COOKIE_PARAM,
777
- @appsensor_meta,
778
- "param_name",
779
- "param_value",
780
- )
781
-
782
- expect(result.type_of_param).to eq(XssSensor::COOKIE_PARAM)
783
- expect(result.detection_point).to eq(sensor.detection_point)
784
- expect(result.param_name).to eq("vuln_param")
785
- expect(result.param_value).to eq("vuln_value")
786
- expect(result.pattern).to eq("1")
787
- end
788
- end
789
- end
790
-
791
- context "param is a HEADER param" do
792
- context "exclude forms sensor" do
793
- it "should return true" do
794
- sensor = XssSensor.new({
795
- "enabled" => true,
796
- "exclude_forms" => true
797
- })
798
-
799
- expect(sensor).to receive(:find_vulnerability).and_return(
800
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
801
- )
802
-
803
- result = sensor.get_injection_attempt(
804
- XssSensor::HEADER_PARAM,
805
- @appsensor_meta,
806
- "param_name",
807
- "param_value",
808
- )
809
-
810
- expect(result.type_of_param).to eq(XssSensor::HEADER_PARAM)
811
- expect(result.detection_point).to eq(sensor.detection_point)
812
- expect(result.param_name).to eq("vuln_param")
813
- expect(result.param_value).to eq("vuln_value")
814
- expect(result.pattern).to eq("1")
815
- end
816
- end
817
-
818
- context "exclude cookies sensor" do
819
- it "should return true" do
820
- sensor = XssSensor.new({
821
- "enabled" => true,
822
- "exclude_cookies" => true
823
- })
824
-
825
- expect(sensor).to receive(:find_vulnerability).and_return(
826
- {"param" => "vuln_param", "value" => "vuln_value", "pattern" => "1"}
827
- )
828
-
829
- result = sensor.get_injection_attempt(
830
- XssSensor::HEADER_PARAM,
831
- @appsensor_meta,
832
- "param_name",
833
- "param_value",
834
- )
835
-
836
- expect(result.type_of_param).to eq(XssSensor::HEADER_PARAM)
837
- expect(result.detection_point).to eq(sensor.detection_point)
838
- expect(result.param_name).to eq("vuln_param")
839
- expect(result.param_value).to eq("vuln_value")
840
- expect(result.pattern).to eq("1")
841
- end
842
- end
843
-
844
- context "exclude headers sensor" do
845
- it "should return true" do
846
- sensor = XssSensor.new({
847
- "enabled" => true,
848
- "exclude_headers" => true,
849
- })
850
-
851
- expect(sensor).to_not receive(:find_vulnerability)
852
-
853
- result = sensor.get_injection_attempt(
854
- XssSensor::HEADER_PARAM,
855
- @appsensor_meta,
856
- "param_name",
857
- "param_value",
858
- )
859
-
860
- expect(result).to eq(false)
861
- end
862
- end
863
- end
864
- end
865
- end
866
-
867
- end
868
-
869
- describe "#applicable_for_param_type?" do
870
- it "should be applicable for all param types" do
871
- sensor = XssSensor.new
872
- expect(sensor.applicable_for_param_type?(InjectionSensor::GET_PARAM)).to eq(true)
873
- expect(sensor.applicable_for_param_type?(InjectionSensor::POST_PARAM)).to eq(true)
874
- expect(sensor.applicable_for_param_type?(InjectionSensor::JSON_PARAM)).to eq(true)
875
- expect(sensor.applicable_for_param_type?(InjectionSensor::COOKIE_PARAM)).to eq(true)
876
- expect(sensor.applicable_for_param_type?(InjectionSensor::URI_PARAM)).to eq(true)
877
- end
878
- end
879
- end
880
-
881
- end
882
- end