contrast-agent 4.4.1 → 4.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (314) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -1
  3. data/.gitmodules +1 -1
  4. data/.simplecov +2 -1
  5. data/Gemfile +1 -1
  6. data/LICENSE.txt +1 -1
  7. data/Rakefile +2 -3
  8. data/exe/contrast_service +1 -1
  9. data/ext/build_funchook.rb +4 -4
  10. data/ext/cs__assess_active_record_named/cs__active_record_named.c +1 -1
  11. data/ext/cs__assess_active_record_named/extconf.rb +1 -1
  12. data/ext/cs__assess_array/cs__assess_array.c +1 -1
  13. data/ext/cs__assess_array/extconf.rb +1 -1
  14. data/ext/cs__assess_basic_object/cs__assess_basic_object.c +1 -1
  15. data/ext/cs__assess_basic_object/extconf.rb +1 -1
  16. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +1 -1
  17. data/ext/cs__assess_fiber_track/extconf.rb +1 -1
  18. data/ext/cs__assess_hash/cs__assess_hash.c +4 -2
  19. data/ext/cs__assess_hash/extconf.rb +1 -1
  20. data/ext/cs__assess_kernel/cs__assess_kernel.c +1 -1
  21. data/ext/cs__assess_kernel/extconf.rb +1 -1
  22. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +1 -1
  23. data/ext/cs__assess_marshal_module/extconf.rb +1 -1
  24. data/ext/cs__assess_module/cs__assess_module.c +1 -1
  25. data/ext/cs__assess_module/extconf.rb +1 -1
  26. data/ext/cs__assess_regexp/cs__assess_regexp.c +1 -1
  27. data/ext/cs__assess_regexp/extconf.rb +1 -1
  28. data/ext/cs__assess_string/cs__assess_string.c +1 -1
  29. data/ext/cs__assess_string/extconf.rb +1 -1
  30. data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +1 -1
  31. data/ext/cs__assess_string_interpolation26/extconf.rb +1 -1
  32. data/ext/cs__assess_yield_track/cs__assess_yield_track.c +1 -1
  33. data/ext/cs__assess_yield_track/extconf.rb +1 -1
  34. data/ext/cs__common/cs__common.c +5 -5
  35. data/ext/cs__common/cs__common.h +4 -4
  36. data/ext/cs__common/extconf.rb +1 -1
  37. data/ext/cs__contrast_patch/cs__contrast_patch.c +22 -25
  38. data/ext/cs__contrast_patch/extconf.rb +1 -1
  39. data/ext/cs__protect_kernel/cs__protect_kernel.c +1 -1
  40. data/ext/cs__protect_kernel/extconf.rb +1 -1
  41. data/ext/extconf_common.rb +2 -6
  42. data/lib/contrast-agent.rb +1 -1
  43. data/lib/contrast.rb +44 -15
  44. data/lib/contrast/agent.rb +1 -3
  45. data/lib/contrast/agent/assess.rb +2 -2
  46. data/lib/contrast/agent/assess/contrast_event.rb +54 -72
  47. data/lib/contrast/agent/assess/contrast_object.rb +3 -3
  48. data/lib/contrast/agent/assess/events/event_factory.rb +3 -2
  49. data/lib/contrast/agent/assess/events/source_event.rb +7 -2
  50. data/lib/contrast/agent/assess/finalizers/freeze.rb +1 -1
  51. data/lib/contrast/agent/assess/finalizers/hash.rb +28 -38
  52. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +24 -20
  53. data/lib/contrast/agent/assess/policy/patcher.rb +17 -22
  54. data/lib/contrast/agent/assess/policy/policy.rb +2 -2
  55. data/lib/contrast/agent/assess/policy/policy_node.rb +26 -34
  56. data/lib/contrast/agent/assess/policy/policy_scanner.rb +4 -6
  57. data/lib/contrast/agent/assess/policy/preshift.rb +8 -6
  58. data/lib/contrast/agent/assess/policy/propagation_method.rb +12 -25
  59. data/lib/contrast/agent/assess/policy/propagation_node.rb +20 -9
  60. data/lib/contrast/agent/assess/policy/propagator.rb +2 -1
  61. data/lib/contrast/agent/assess/policy/propagator/append.rb +1 -1
  62. data/lib/contrast/agent/assess/policy/propagator/base.rb +1 -1
  63. data/lib/contrast/agent/assess/policy/propagator/center.rb +3 -2
  64. data/lib/contrast/agent/assess/policy/propagator/custom.rb +1 -1
  65. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +4 -7
  66. data/lib/contrast/agent/assess/policy/propagator/insert.rb +4 -2
  67. data/lib/contrast/agent/assess/policy/propagator/keep.rb +1 -1
  68. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +3 -2
  69. data/lib/contrast/agent/assess/policy/propagator/next.rb +1 -1
  70. data/lib/contrast/agent/assess/policy/propagator/prepend.rb +1 -1
  71. data/lib/contrast/agent/assess/policy/propagator/rack_protection.rb +73 -0
  72. data/lib/contrast/agent/assess/policy/propagator/remove.rb +23 -19
  73. data/lib/contrast/agent/assess/policy/propagator/replace.rb +1 -1
  74. data/lib/contrast/agent/assess/policy/propagator/reverse.rb +1 -1
  75. data/lib/contrast/agent/assess/policy/propagator/select.rb +3 -13
  76. data/lib/contrast/agent/assess/policy/propagator/splat.rb +1 -1
  77. data/lib/contrast/agent/assess/policy/propagator/split.rb +13 -14
  78. data/lib/contrast/agent/assess/policy/propagator/substitution.rb +4 -11
  79. data/lib/contrast/agent/assess/policy/propagator/trim.rb +64 -45
  80. data/lib/contrast/agent/assess/policy/rewriter_patch.rb +14 -11
  81. data/lib/contrast/agent/assess/policy/source_method.rb +97 -86
  82. data/lib/contrast/agent/assess/policy/source_node.rb +1 -1
  83. data/lib/contrast/agent/assess/policy/source_validation/cross_site_validator.rb +8 -6
  84. data/lib/contrast/agent/assess/policy/source_validation/source_validation.rb +2 -4
  85. data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +7 -3
  86. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +7 -11
  87. data/lib/contrast/agent/assess/policy/trigger_method.rb +104 -77
  88. data/lib/contrast/agent/assess/policy/trigger_node.rb +6 -5
  89. data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +5 -4
  90. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +2 -3
  91. data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +1 -1
  92. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +2 -9
  93. data/lib/contrast/agent/assess/properties.rb +1 -1
  94. data/lib/contrast/agent/assess/property/evented.rb +9 -6
  95. data/lib/contrast/agent/assess/property/tagged.rb +1 -1
  96. data/lib/contrast/agent/assess/property/updated.rb +1 -1
  97. data/lib/contrast/agent/assess/rule/provider.rb +1 -1
  98. data/lib/contrast/agent/assess/rule/provider/hardcoded_key.rb +12 -6
  99. data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +5 -2
  100. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +8 -10
  101. data/lib/contrast/agent/assess/tag.rb +1 -1
  102. data/lib/contrast/agent/assess/tracker.rb +1 -1
  103. data/lib/contrast/agent/at_exit_hook.rb +4 -4
  104. data/lib/contrast/agent/class_reopener.rb +10 -7
  105. data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +1 -1
  106. data/lib/contrast/agent/deadzone/policy/policy.rb +7 -3
  107. data/lib/contrast/agent/disable_reaction.rb +5 -8
  108. data/lib/contrast/agent/exclusion_matcher.rb +8 -15
  109. data/lib/contrast/agent/inventory.rb +1 -2
  110. data/lib/contrast/agent/inventory/dependencies.rb +3 -1
  111. data/lib/contrast/agent/inventory/dependency_analysis.rb +3 -7
  112. data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +38 -28
  113. data/lib/contrast/agent/inventory/policy/datastores.rb +4 -5
  114. data/lib/contrast/agent/inventory/policy/policy.rb +2 -2
  115. data/lib/contrast/agent/inventory/policy/trigger_node.rb +1 -1
  116. data/lib/contrast/agent/middleware.rb +52 -80
  117. data/lib/contrast/agent/module_data.rb +4 -4
  118. data/lib/contrast/agent/patching/policy/after_load_patch.rb +4 -4
  119. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +10 -10
  120. data/lib/contrast/agent/patching/policy/method_policy.rb +7 -3
  121. data/lib/contrast/agent/patching/policy/module_policy.rb +15 -8
  122. data/lib/contrast/agent/patching/policy/patch.rb +32 -38
  123. data/lib/contrast/agent/patching/policy/patch_status.rb +7 -8
  124. data/lib/contrast/agent/patching/policy/patcher.rb +29 -28
  125. data/lib/contrast/agent/patching/policy/policy.rb +16 -25
  126. data/lib/contrast/agent/patching/policy/policy_node.rb +17 -8
  127. data/lib/contrast/agent/patching/policy/trigger_node.rb +22 -9
  128. data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +2 -2
  129. data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +2 -2
  130. data/lib/contrast/agent/protect/policy/applies_no_sqli_rule.rb +2 -2
  131. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +3 -4
  132. data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +2 -2
  133. data/lib/contrast/agent/protect/policy/applies_xxe_rule.rb +6 -10
  134. data/lib/contrast/agent/protect/policy/policy.rb +2 -2
  135. data/lib/contrast/agent/protect/policy/rule_applicator.rb +8 -10
  136. data/lib/contrast/agent/protect/policy/trigger_node.rb +1 -1
  137. data/lib/contrast/agent/protect/rule.rb +1 -1
  138. data/lib/contrast/agent/protect/rule/base.rb +26 -40
  139. data/lib/contrast/agent/protect/rule/base_service.rb +10 -6
  140. data/lib/contrast/agent/protect/rule/cmd_injection.rb +19 -24
  141. data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
  142. data/lib/contrast/agent/protect/rule/deserialization.rb +7 -14
  143. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +4 -15
  144. data/lib/contrast/agent/protect/rule/no_sqli.rb +7 -3
  145. data/lib/contrast/agent/protect/rule/no_sqli/mongo_no_sql_scanner.rb +2 -4
  146. data/lib/contrast/agent/protect/rule/path_traversal.rb +7 -11
  147. data/lib/contrast/agent/protect/rule/sqli.rb +3 -3
  148. data/lib/contrast/agent/protect/rule/sqli/default_sql_scanner.rb +1 -1
  149. data/lib/contrast/agent/protect/rule/sqli/mysql_sql_scanner.rb +1 -1
  150. data/lib/contrast/agent/protect/rule/sqli/postgres_sql_scanner.rb +2 -2
  151. data/lib/contrast/agent/protect/rule/sqli/sqlite_sql_scanner.rb +1 -1
  152. data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +2 -2
  153. data/lib/contrast/agent/protect/rule/xss.rb +2 -2
  154. data/lib/contrast/agent/protect/rule/xxe.rb +6 -13
  155. data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +2 -3
  156. data/lib/contrast/agent/reaction_processor.rb +14 -14
  157. data/lib/contrast/agent/request.rb +29 -27
  158. data/lib/contrast/agent/request_context.rb +20 -30
  159. data/lib/contrast/agent/request_handler.rb +6 -4
  160. data/lib/contrast/agent/response.rb +3 -4
  161. data/lib/contrast/agent/rewriter.rb +10 -7
  162. data/lib/contrast/agent/rule_set.rb +6 -5
  163. data/lib/contrast/agent/scope.rb +1 -1
  164. data/lib/contrast/agent/service_heartbeat.rb +5 -7
  165. data/lib/contrast/agent/static_analysis.rb +7 -6
  166. data/lib/contrast/agent/thread.rb +3 -5
  167. data/lib/contrast/agent/thread_watcher.rb +4 -5
  168. data/lib/contrast/agent/tracepoint_hook.rb +6 -6
  169. data/lib/contrast/agent/version.rb +2 -2
  170. data/lib/contrast/agent/worker_thread.rb +1 -1
  171. data/lib/contrast/api.rb +1 -1
  172. data/lib/contrast/api/communication.rb +1 -1
  173. data/lib/contrast/api/communication/connection_status.rb +1 -1
  174. data/lib/contrast/api/communication/messaging_queue.rb +5 -6
  175. data/lib/contrast/api/communication/response_processor.rb +13 -15
  176. data/lib/contrast/api/communication/service_lifecycle.rb +10 -7
  177. data/lib/contrast/api/communication/socket.rb +1 -1
  178. data/lib/contrast/api/communication/socket_client.rb +23 -32
  179. data/lib/contrast/api/communication/speedracer.rb +10 -15
  180. data/lib/contrast/api/communication/tcp_socket.rb +1 -1
  181. data/lib/contrast/api/communication/unix_socket.rb +1 -1
  182. data/lib/contrast/api/decorators.rb +1 -1
  183. data/lib/contrast/api/decorators/address.rb +3 -4
  184. data/lib/contrast/api/decorators/agent_startup.rb +8 -10
  185. data/lib/contrast/api/decorators/application_settings.rb +1 -1
  186. data/lib/contrast/api/decorators/application_startup.rb +14 -10
  187. data/lib/contrast/api/decorators/application_update.rb +1 -5
  188. data/lib/contrast/api/decorators/http_request.rb +4 -8
  189. data/lib/contrast/api/decorators/input_analysis.rb +1 -1
  190. data/lib/contrast/api/decorators/instrumentation_mode.rb +35 -0
  191. data/lib/contrast/api/decorators/library.rb +9 -7
  192. data/lib/contrast/api/decorators/library_usage_update.rb +1 -1
  193. data/lib/contrast/api/decorators/message.rb +10 -10
  194. data/lib/contrast/api/decorators/rasp_rule_sample.rb +1 -1
  195. data/lib/contrast/api/decorators/route_coverage.rb +1 -1
  196. data/lib/contrast/api/decorators/server_features.rb +1 -1
  197. data/lib/contrast/api/decorators/trace_event.rb +4 -2
  198. data/lib/contrast/api/decorators/trace_event_object.rb +4 -7
  199. data/lib/contrast/api/decorators/trace_event_signature.rb +1 -1
  200. data/lib/contrast/api/decorators/trace_taint_range.rb +1 -1
  201. data/lib/contrast/api/decorators/trace_taint_range_tags.rb +2 -7
  202. data/lib/contrast/api/decorators/user_input.rb +1 -1
  203. data/lib/contrast/components/agent.rb +20 -26
  204. data/lib/contrast/components/app_context.rb +12 -16
  205. data/lib/contrast/components/assess.rb +20 -25
  206. data/lib/contrast/components/base.rb +40 -0
  207. data/lib/contrast/components/config.rb +3 -4
  208. data/lib/contrast/components/contrast_service.rb +13 -19
  209. data/lib/contrast/components/heap_dump.rb +6 -5
  210. data/lib/contrast/components/inventory.rb +3 -8
  211. data/lib/contrast/components/logger.rb +2 -3
  212. data/lib/contrast/components/protect.rb +14 -20
  213. data/lib/contrast/components/sampling.rb +14 -8
  214. data/lib/contrast/components/scope.rb +2 -5
  215. data/lib/contrast/components/settings.rb +28 -103
  216. data/lib/contrast/config.rb +1 -1
  217. data/lib/contrast/config/agent_configuration.rb +1 -1
  218. data/lib/contrast/config/application_configuration.rb +1 -1
  219. data/lib/contrast/config/assess_configuration.rb +1 -1
  220. data/lib/contrast/config/assess_rules_configuration.rb +2 -4
  221. data/lib/contrast/config/base_configuration.rb +5 -6
  222. data/lib/contrast/config/default_value.rb +1 -1
  223. data/lib/contrast/config/exception_configuration.rb +2 -6
  224. data/lib/contrast/config/heap_dump_configuration.rb +13 -7
  225. data/lib/contrast/config/inventory_configuration.rb +1 -1
  226. data/lib/contrast/config/logger_configuration.rb +2 -6
  227. data/lib/contrast/config/protect_configuration.rb +1 -1
  228. data/lib/contrast/config/protect_rule_configuration.rb +23 -1
  229. data/lib/contrast/config/protect_rules_configuration.rb +1 -1
  230. data/lib/contrast/config/root_configuration.rb +1 -1
  231. data/lib/contrast/config/ruby_configuration.rb +1 -1
  232. data/lib/contrast/config/sampling_configuration.rb +1 -1
  233. data/lib/contrast/config/server_configuration.rb +1 -1
  234. data/lib/contrast/config/service_configuration.rb +1 -1
  235. data/lib/contrast/configuration.rb +7 -19
  236. data/lib/contrast/extension/assess.rb +1 -1
  237. data/lib/contrast/extension/assess/array.rb +4 -11
  238. data/lib/contrast/extension/assess/erb.rb +2 -8
  239. data/lib/contrast/extension/assess/eval_trigger.rb +5 -14
  240. data/lib/contrast/extension/assess/exec_trigger.rb +4 -14
  241. data/lib/contrast/extension/assess/fiber.rb +9 -18
  242. data/lib/contrast/extension/assess/hash.rb +4 -4
  243. data/lib/contrast/extension/assess/kernel.rb +5 -14
  244. data/lib/contrast/extension/assess/marshal.rb +7 -15
  245. data/lib/contrast/extension/assess/regexp.rb +7 -11
  246. data/lib/contrast/extension/assess/string.rb +9 -7
  247. data/lib/contrast/extension/delegator.rb +1 -1
  248. data/lib/contrast/extension/inventory.rb +1 -1
  249. data/lib/contrast/extension/kernel.rb +3 -3
  250. data/lib/contrast/extension/module.rb +1 -1
  251. data/lib/contrast/extension/protect.rb +1 -1
  252. data/lib/contrast/extension/protect/kernel.rb +1 -6
  253. data/lib/contrast/extension/protect/psych.rb +1 -1
  254. data/lib/contrast/extension/thread.rb +1 -1
  255. data/lib/contrast/framework/base_support.rb +1 -1
  256. data/lib/contrast/framework/manager.rb +7 -12
  257. data/lib/contrast/framework/platform_version.rb +1 -1
  258. data/lib/contrast/framework/rack/patch/session_cookie.rb +12 -25
  259. data/lib/contrast/framework/rack/patch/support.rb +7 -5
  260. data/lib/contrast/framework/rack/support.rb +1 -1
  261. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -1
  262. data/lib/contrast/framework/rails/patch/assess_configuration.rb +13 -10
  263. data/lib/contrast/framework/rails/patch/rails_application_configuration.rb +4 -4
  264. data/lib/contrast/framework/rails/patch/support.rb +42 -36
  265. data/lib/contrast/framework/rails/railtie.rb +34 -0
  266. data/lib/contrast/framework/rails/rewrite/action_controller_railties_helper_inherited.rb +5 -2
  267. data/lib/contrast/framework/rails/rewrite/active_record_attribute_methods_read.rb +3 -1
  268. data/lib/contrast/framework/rails/rewrite/active_record_named.rb +6 -5
  269. data/lib/contrast/framework/rails/rewrite/active_record_time_zone_inherited.rb +3 -1
  270. data/lib/contrast/framework/rails/support.rb +3 -3
  271. data/lib/contrast/framework/sinatra/support.rb +4 -2
  272. data/lib/contrast/funchook/funchook.rb +6 -9
  273. data/lib/contrast/logger/application.rb +14 -16
  274. data/lib/contrast/logger/format.rb +3 -6
  275. data/lib/contrast/logger/log.rb +27 -10
  276. data/lib/contrast/logger/request.rb +2 -7
  277. data/lib/contrast/logger/time.rb +1 -1
  278. data/lib/contrast/security_exception.rb +2 -2
  279. data/lib/contrast/tasks/config.rb +1 -1
  280. data/lib/contrast/tasks/service.rb +7 -8
  281. data/lib/contrast/utils/assess/sampling_util.rb +3 -4
  282. data/lib/contrast/utils/assess/tracking_util.rb +4 -7
  283. data/lib/contrast/utils/class_util.rb +15 -11
  284. data/lib/contrast/utils/duck_utils.rb +1 -1
  285. data/lib/contrast/utils/env_configuration_item.rb +1 -1
  286. data/lib/contrast/utils/hash_digest.rb +16 -24
  287. data/lib/contrast/utils/heap_dump_util.rb +6 -4
  288. data/lib/contrast/utils/invalid_configuration_util.rb +5 -4
  289. data/lib/contrast/utils/inventory_util.rb +3 -4
  290. data/lib/contrast/utils/io_util.rb +4 -6
  291. data/lib/contrast/utils/job_servers_running.rb +14 -8
  292. data/lib/contrast/utils/object_share.rb +1 -1
  293. data/lib/contrast/utils/os.rb +5 -5
  294. data/lib/contrast/utils/preflight_util.rb +1 -1
  295. data/lib/contrast/utils/resource_loader.rb +1 -1
  296. data/lib/contrast/utils/ruby_ast_rewriter.rb +3 -2
  297. data/lib/contrast/utils/sha256_builder.rb +1 -1
  298. data/lib/contrast/utils/stack_trace_utils.rb +1 -1
  299. data/lib/contrast/utils/string_utils.rb +3 -4
  300. data/lib/contrast/utils/tag_util.rb +26 -20
  301. data/lib/contrast/utils/thread_tracker.rb +1 -1
  302. data/lib/contrast/utils/timer.rb +1 -1
  303. data/resources/assess/policy.json +60 -2
  304. data/resources/deadzone/policy.json +7 -17
  305. data/ruby-agent.gemspec +25 -21
  306. data/service_executables/VERSION +1 -1
  307. data/service_executables/linux/contrast-service +0 -0
  308. data/service_executables/mac/contrast-service +0 -0
  309. data/sonar-project.properties +9 -0
  310. metadata +108 -51
  311. data/lib/contrast/agent/inventory/gemfile_digest_cache.rb +0 -38
  312. data/lib/contrast/agent/railtie.rb +0 -31
  313. data/lib/contrast/common_agent_configuration.rb +0 -87
  314. data/lib/contrast/components/interface.rb +0 -195
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/utils/string_utils'
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/utils/string_utils'
@@ -106,7 +106,9 @@ module Contrast
106
106
  event_dtm.thread = Contrast::Utils::StringUtils.force_utf8(contrast_event.thread)
107
107
  event_dtm.build_parent_ids!(contrast_event)
108
108
  event_dtm.object_id = contrast_event.event_id.to_i
109
- event_dtm.signature = Contrast::Api::Dtm::TraceEventSignature.build(contrast_event.ret, contrast_event.policy_node, contrast_event.args)
109
+ event_dtm.signature = Contrast::Api::Dtm::TraceEventSignature.build(contrast_event.ret,
110
+ contrast_event.policy_node,
111
+ contrast_event.args)
110
112
  event_dtm
111
113
  end
112
114
  end
@@ -1,10 +1,10 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/utils/string_utils'
5
5
  require 'contrast/utils/assess/tracking_util'
6
6
  require 'base64'
7
- require 'contrast/components/interface'
7
+ require 'contrast/components/scope'
8
8
 
9
9
  module Contrast
10
10
  module Api
@@ -18,8 +18,7 @@ module Contrast
18
18
 
19
19
  # Class methods for TraceEventObject
20
20
  module ClassMethods
21
- include Contrast::Components::Interface
22
- access_component :scope
21
+ include Contrast::Components::Scope::InstanceMethods
23
22
  # Build the event object. We were originally going to include taint on
24
23
  # each one, but TS doesn't accept / use that, so it is a waste of time.
25
24
  #
@@ -52,9 +51,7 @@ module Contrast
52
51
  tmp = []
53
52
  tmp << obj_string[0, UNTRUNCATED_PORTION_LENGTH]
54
53
  tmp << ELLIPSIS
55
- tmp << obj_string[
56
- obj_string.length - UNTRUNCATED_PORTION_LENGTH,
57
- UNTRUNCATED_PORTION_LENGTH]
54
+ tmp << obj_string[obj_string.length - UNTRUNCATED_PORTION_LENGTH, UNTRUNCATED_PORTION_LENGTH]
58
55
  tmp.join
59
56
  end
60
57
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/utils/string_utils'
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/utils/object_share'
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Contrast
@@ -97,12 +97,7 @@ module Contrast
97
97
  DATABASE_WRITE
98
98
  ].cs__freeze
99
99
 
100
- VALID_SOURCE_TAGS = %w[
101
- NO_NEWLINES
102
- UNTRUSTED
103
- CROSS_SITE
104
- LIMITED_CHARS
105
- ].cs__freeze
100
+ VALID_SOURCE_TAGS = %w[NO_NEWLINES UNTRUSTED CROSS_SITE LIMITED_CHARS].cs__freeze
106
101
  end
107
102
  end
108
103
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'contrast/utils/string_utils'
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'rubygems/version'
@@ -12,12 +12,9 @@ module Contrast
12
12
  # Specifically, this allows for querying the state of the Agent.
13
13
  class Interface
14
14
  include Contrast::Components::ComponentBase
15
- include Contrast::Components::Interface
16
-
17
- access_component :analysis, :config, :settings
18
15
 
19
16
  def enabled?
20
- @_enabled = !false?(CONFIG.root.enable) if @_enabled.nil?
17
+ @_enabled = !false?(::Contrast::CONFIG.root.enable) if @_enabled.nil?
21
18
  @_enabled
22
19
  end
23
20
 
@@ -36,7 +33,7 @@ module Contrast
36
33
  end
37
34
 
38
35
  def ruleset
39
- @_ruleset ||= Contrast::Agent::RuleSet.new(retrieve_ruleset&.values)
36
+ @_ruleset ||= Contrast::Agent::RuleSet.new(retrieve_protect_ruleset&.values)
40
37
  end
41
38
 
42
39
  def reset_ruleset
@@ -52,36 +49,39 @@ module Contrast
52
49
  end
53
50
 
54
51
  def patch_yield?
55
- @_patch_yield = !false?(CONFIG.root.agent.ruby.propagate_yield) if @_patch_yield.nil?
52
+ @_patch_yield = !false?(::Contrast::CONFIG.root.agent.ruby.propagate_yield) if @_patch_yield.nil?
56
53
  @_patch_yield
57
54
  end
58
55
 
59
56
  def interpolation_enabled?
60
- @_interpolation_enabled = !false?(CONFIG.root.agent.ruby.interpolate) if @_interpolation_enabled.nil?
57
+ @_interpolation_enabled = !false?(::Contrast::CONFIG.root.agent.ruby.interpolate) if @_interpolation_enabled.nil?
61
58
  @_interpolation_enabled
62
59
  end
63
60
 
64
61
  def omit_body?
65
- @_omit_body = true?(CONFIG.root.agent.omit_body) if @_omit_body.nil?
62
+ @_omit_body = true?(::Contrast::CONFIG.root.agent.omit_body) if @_omit_body.nil?
66
63
  @_omit_body
67
64
  end
68
65
 
69
66
  def exception_control
70
67
  @_exception_control ||= {
71
- enable: true?(CONFIG.root.agent.ruby.exceptions.capture),
72
- status: CONFIG.root.agent.ruby.exceptions.override_status || 403,
73
- message: CONFIG.root.agent.ruby.exceptions.override_message || Contrast::Utils::ObjectShare::OVERRIDE_MESSAGE
68
+ enable: true?(::Contrast::CONFIG.root.agent.ruby.exceptions.capture),
69
+ status:
70
+ ::Contrast::CONFIG.root.agent.ruby.exceptions.override_status || 403,
71
+ message:
72
+ ::Contrast::CONFIG.root.agent.ruby.exceptions.override_message || Contrast::Utils::ObjectShare::OVERRIDE_MESSAGE
74
73
  }
75
74
  end
76
75
 
77
76
  def skip_instrumentation? loaded_module_name
78
77
  return true unless loaded_module_name
79
78
 
80
- loaded_module_name.start_with?(*CONFIG.root.agent.ruby.uninstrument_namespace)
79
+ loaded_module_name.start_with?(*::Contrast::CONFIG.root.agent.ruby.uninstrument_namespace)
81
80
  end
82
81
 
82
+ # Insert ourselves into the application, keeping our middleware at the outermost layer of the onion
83
83
  def insert_middleware app
84
- app.middleware.insert_before 0, Contrast::Agent::Middleware # Keep our middleware at the outermost layer of the onion
84
+ app.middleware.insert_before 0, Contrast::Agent::Middleware
85
85
  end
86
86
 
87
87
  def enable_tracepoint
@@ -94,24 +94,18 @@ module Contrast
94
94
  # Ruby exposed the C method for interpolation in version 2.6.0, meaning
95
95
  # we can attempt to patch using Funchook for that version and later.
96
96
  def interpolation_patch_possible?
97
- @_interpolation_patch_possible = Gem::Version.new(RUBY_VERSION) >= INTERPOLATION_HOOKABLE_VERSION if @_interpolation_patch_possible.nil?
97
+ if @_interpolation_patch_possible.nil?
98
+ @_interpolation_patch_possible = Gem::Version.new(RUBY_VERSION) >= INTERPOLATION_HOOKABLE_VERSION
99
+ end
98
100
  @_interpolation_patch_possible
99
101
  end
100
102
 
101
- def retrieve_ruleset
102
- return {} unless enabled?
103
+ def retrieve_protect_ruleset
104
+ return {} unless enabled? && ::Contrast::PROTECT.enabled?
103
105
 
104
- if ASSESS.enabled? && PROTECT.enabled?
105
- ASSESS.rules.merge(PROTECT.rules)
106
- elsif ASSESS.enabled?
107
- ASSESS.rules
108
- else
109
- PROTECT.rules
110
- end
106
+ ::Contrast::PROTECT.rules
111
107
  end
112
108
  end
113
-
114
- COMPONENT_INTERFACE = Interface.new
115
109
  end
116
110
  end
117
111
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'rubygems/version'
@@ -16,9 +16,7 @@ module Contrast
16
16
  # including the Client, Process, and Server information.
17
17
  class Interface
18
18
  include Contrast::Components::ComponentBase
19
- include Contrast::Components::Interface
20
-
21
- access_component :agent, :analysis, :config, :logging
19
+ include Contrast::Components::Logger::InstanceMethods
22
20
 
23
21
  DEFAULT_APP_NAME = 'rails'
24
22
  DEFAULT_APP_PATH = '/'
@@ -31,15 +29,15 @@ module Contrast
31
29
 
32
30
  def server_type
33
31
  @_server_type ||= begin
34
- tmp = CONFIG.root.server.type
32
+ tmp = ::Contrast::CONFIG.root.server.type
35
33
  tmp = Contrast::Agent.framework_manager.server_type unless Contrast::Utils::StringUtils.present?(tmp)
36
34
  tmp
37
35
  end
38
36
  end
39
37
 
40
- def name
41
- @_name ||= begin
42
- tmp = CONFIG.root.application.name
38
+ def app_name
39
+ @_app_name ||= begin
40
+ tmp = ::Contrast::CONFIG.root.application.name # rubocop:disable Security/Module/Name
43
41
  tmp = Contrast::Agent.framework_manager.app_name unless Contrast::Utils::StringUtils.present?(tmp)
44
42
  tmp = File.basename(Dir.pwd) unless Contrast::Utils::StringUtils.present?(tmp)
45
43
  Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_APP_NAME)
@@ -50,7 +48,7 @@ module Contrast
50
48
 
51
49
  def path
52
50
  @_path ||= begin
53
- tmp = CONFIG.root.application.path
51
+ tmp = ::Contrast::CONFIG.root.application.path
54
52
  Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_APP_PATH)
55
53
  rescue StandardError
56
54
  DEFAULT_APP_PATH
@@ -59,7 +57,7 @@ module Contrast
59
57
 
60
58
  def server_name
61
59
  @_server_name ||= begin
62
- tmp = CONFIG.root.server.name
60
+ tmp = ::Contrast::CONFIG.root.server.name # rubocop:disable Security/Module/Name
63
61
  tmp = Socket.gethostname unless Contrast::Utils::StringUtils.present?(tmp)
64
62
  tmp = Contrast::Utils::StringUtils.force_utf8(tmp)
65
63
  Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_SERVER_NAME)
@@ -70,7 +68,7 @@ module Contrast
70
68
 
71
69
  def server_path
72
70
  @_server_path ||= begin
73
- tmp = CONFIG.root.server.path
71
+ tmp = ::Contrast::CONFIG.root.server.path
74
72
  tmp = Dir.pwd unless Contrast::Utils::StringUtils.present?(tmp)
75
73
  Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_SERVER_PATH)
76
74
  rescue StandardError
@@ -88,7 +86,7 @@ module Contrast
88
86
  server_name: msg.server_name,
89
87
  server_path: msg.server_path,
90
88
  server_type: msg.server_type,
91
- application_name: name,
89
+ application_name: app_name,
92
90
  application_path: path,
93
91
  application_language: Contrast::Utils::ObjectShare::RUBY)
94
92
 
@@ -108,7 +106,7 @@ module Contrast
108
106
  end
109
107
 
110
108
  def client_id
111
- @_client_id ||= [name, pgid].join('-')
109
+ @_client_id ||= [app_name, pgid].join('-')
112
110
  end
113
111
 
114
112
  def instrument_middleware_stack?
@@ -116,7 +114,7 @@ module Contrast
116
114
  end
117
115
 
118
116
  def disabled_agent_rake_tasks
119
- CONFIG.root.agent.ruby.disabled_agent_rake_tasks
117
+ ::Contrast::CONFIG.root.agent.ruby.disabled_agent_rake_tasks
120
118
  end
121
119
 
122
120
  # Determines if the Process we're currently in matches that of the
@@ -137,8 +135,6 @@ module Contrast
137
135
  @_original_pid ||= Process.pid
138
136
  end
139
137
  end
140
-
141
- COMPONENT_INTERFACE = Interface.new
142
138
  end
143
139
  end
144
140
  end
@@ -1,6 +1,11 @@
1
- # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'contrast/components/base'
5
+ require 'contrast/components/config'
6
+ require 'contrast/components/settings'
7
+
8
+
4
9
  module Contrast
5
10
  module Components
6
11
  module Assess
@@ -10,24 +15,21 @@ module Contrast
10
15
  # Specifically, this allows for querying the state of the Assess product.
11
16
  class Interface
12
17
  include Contrast::Components::ComponentBase
13
- include Contrast::Components::Interface
14
-
15
- access_component :config, :settings
16
18
 
17
19
  def enabled?
18
20
  # config overrides if forcibly set
19
21
  return false if forcibly_disabled?
20
22
  return true if forcibly_enabled?
21
23
 
22
- SETTINGS.assess_enabled?
24
+ ::Contrast::SETTINGS.assess_state.enabled == true
23
25
  end
24
26
 
25
27
  def tainted_columns
26
- SETTINGS.tainted_columns
28
+ ::Contrast::SETTINGS.tainted_columns
27
29
  end
28
30
 
29
31
  def forcibly_disabled?
30
- @_forcibly_disabled = false?(CONFIG.root.assess.enable) if @_forcibly_disabled.nil?
32
+ @_forcibly_disabled = false?(::Contrast::CONFIG.root.assess.enable) if @_forcibly_disabled.nil?
31
33
  @_forcibly_disabled
32
34
  end
33
35
 
@@ -39,9 +41,9 @@ module Contrast
39
41
  # faster comparisons when we use it. Anything not one of the known values of
40
42
  # 'NONE', 'SOME', or 'ALL' is treated as 'ALL'
41
43
  #
42
- # @return [Symbol] the normalized value of CONFIG.root.assess.stacktraces
44
+ # @return [Symbol] the normalized value of ::Contrast::CONFIG.root.assess.stacktraces
43
45
  def capture_stacktrace_value
44
- @_capture_stacktrace_value ||= case CONFIG.root.assess.stacktraces.upcase
46
+ @_capture_stacktrace_value ||= case ::Contrast::CONFIG.root.assess.stacktraces.upcase
45
47
  when 'NONE'
46
48
  :NONE
47
49
  when 'SOME'
@@ -58,10 +60,9 @@ module Contrast
58
60
  # node types (SourceNode, PolicyNode, TriggerNode, PropagationNode)
59
61
  #
60
62
  # @param policy_node [Contrast::Agent::Assess::Policy::PolicyNode] The node in question.
61
- # @param return [Boolean] to capture or not to capture, that is the question.
63
+ # @return [Boolean] to capture or not to capture, that is the question.
62
64
  def capture_stacktrace? policy_node
63
65
  return true if capture_stacktrace_value == :ALL
64
-
65
66
  return false if capture_stacktrace_value == :NONE
66
67
 
67
68
  # Below here capture_stacktrace_value must be :SOME.
@@ -72,42 +73,36 @@ module Contrast
72
73
  end
73
74
 
74
75
  def scan_response?
75
- @_scan_response = !false?(CONFIG.root.assess.enable_scan_response) if @_scan_response.nil?
76
+ @_scan_response = !false?(::Contrast::CONFIG.root.assess.enable_scan_response) if @_scan_response.nil?
76
77
  @_scan_response
77
78
  end
78
79
 
79
80
  def track_frozen_sources?
80
- @_track_frozen_sources = !false?(CONFIG.root.agent.ruby.track_frozen_sources) if @_track_frozen_sources.nil?
81
+ @_track_frozen_sources = !false?(::Contrast::CONFIG.root.agent.ruby.track_frozen_sources) if @_track_frozen_sources.nil?
81
82
  @_track_frozen_sources
82
83
  end
83
84
 
84
85
  def require_scan?
85
- @_require_scan = !false?(CONFIG.root.agent.ruby.require_scan) if @_require_scan.nil?
86
+ @_require_scan = !false?(::Contrast::CONFIG.root.agent.ruby.require_scan) if @_require_scan.nil?
86
87
  @_require_scan
87
88
  end
88
89
 
89
90
  def tags
90
- CONFIG.root.assess&.tags
91
+ ::Contrast::CONFIG.root.assess&.tags
91
92
  end
92
93
 
93
- def rules
94
- SETTINGS.assess_rules
94
+ def disabled_rules
95
+ # TODO: RUBY-903
96
+ ::Contrast::CONFIG.root.assess&.rules&.disabled_rules || ::Contrast::SETTINGS.assess_state.disabled_assess_rules || []
95
97
  end
96
98
 
97
99
  private
98
100
 
99
101
  def forcibly_enabled?
100
- @_forcibly_enabled = true?(CONFIG.root.assess.enable) if @_forcibly_enabled.nil?
102
+ @_forcibly_enabled = true?(::Contrast::CONFIG.root.assess.enable) if @_forcibly_enabled.nil?
101
103
  @_forcibly_enabled
102
104
  end
103
-
104
- def disabled_rules
105
- # TODO: RUBY-903
106
- CONFIG.root.assess&.rules&.disabled_rules || SETTINGS.disabled_assess_rules || []
107
- end
108
105
  end
109
-
110
- COMPONENT_INTERFACE = Interface.new
111
106
  end
112
107
  end
113
108
  end
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ module Contrast
5
+ module Components
6
+ # All components should inherit from this,
7
+ # whether Interfaces, InstanceMethods or ClassMethods.
8
+ module ComponentBase
9
+ # use this to determine if the configuration value is literally boolean
10
+ # false or some form of the word `false`, regardless of case. It should
11
+ # be used for those values which default to `true` as they should only
12
+ # treat a value explicitly set to `false` as such.
13
+ #
14
+ # @param config_param [Boolean,String] the value to check
15
+ # @return [Boolean] should the value be treated as `false`
16
+ def false? config_param
17
+ return false if config_param == true
18
+ return true if config_param == false
19
+ return false unless config_param.cs__is_a?(String)
20
+
21
+ Contrast::Utils::ObjectShare::FALSE.casecmp?(config_param)
22
+ end
23
+
24
+ # use this to determine if the configuration value is literally boolean
25
+ # true or some form of the word `true`, regardless of case. It should
26
+ # be used for those values which default to `false` as they should only
27
+ # treat a value explicitly set to `true` as such.
28
+ #
29
+ # @param config_param [Boolean,String] the value to check
30
+ # @return [Boolean] should the value be treated as `true`
31
+ def true? config_param
32
+ return false if config_param == false
33
+ return true if config_param == true
34
+ return false unless config_param.cs__is_a?(String)
35
+
36
+ Contrast::Utils::ObjectShare::TRUE.casecmp?(config_param)
37
+ end
38
+ end
39
+ end
40
+ end