contrast-agent 6.6.4 → 6.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (340) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -2
  3. data/.gitmodules +0 -3
  4. data/.simplecov +0 -1
  5. data/Rakefile +0 -1
  6. data/ext/cs__assess_array/cs__assess_array.c +41 -10
  7. data/ext/cs__assess_array/cs__assess_array.h +4 -1
  8. data/ext/cs__scope/cs__scope.c +1 -1
  9. data/lib/contrast/agent/assess/contrast_event.rb +2 -24
  10. data/lib/contrast/agent/assess/events/source_event.rb +7 -61
  11. data/lib/contrast/agent/assess/finalizers/hash.rb +11 -0
  12. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +0 -55
  13. data/lib/contrast/agent/assess/policy/policy_node.rb +3 -3
  14. data/lib/contrast/agent/assess/policy/policy_node_utils.rb +0 -1
  15. data/lib/contrast/agent/assess/policy/propagation_node.rb +4 -4
  16. data/lib/contrast/agent/assess/policy/source_method.rb +24 -1
  17. data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +7 -5
  18. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +6 -1
  19. data/lib/contrast/agent/assess/policy/trigger_method.rb +40 -121
  20. data/lib/contrast/agent/assess/policy/trigger_node.rb +3 -3
  21. data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +1 -1
  22. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +1 -1
  23. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +1 -1
  24. data/lib/contrast/agent/assess/property/evented.rb +2 -12
  25. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +42 -82
  26. data/lib/contrast/agent/assess/rule/response/base_rule.rb +11 -27
  27. data/lib/contrast/agent/assess/rule/response/body_rule.rb +1 -3
  28. data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +77 -62
  29. data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +1 -1
  30. data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +6 -1
  31. data/lib/contrast/agent/assess/rule/response/header_rule.rb +5 -5
  32. data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +1 -1
  33. data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +1 -1
  34. data/lib/contrast/agent/assess/tracker.rb +1 -7
  35. data/lib/contrast/agent/at_exit_hook.rb +1 -7
  36. data/lib/contrast/agent/excluder.rb +224 -0
  37. data/lib/contrast/agent/exclusion_matcher.rb +25 -7
  38. data/lib/contrast/agent/inventory/database_config.rb +18 -23
  39. data/lib/contrast/agent/middleware.rb +4 -5
  40. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +6 -0
  41. data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +146 -127
  42. data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +4 -0
  43. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +20 -0
  44. data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +1 -0
  45. data/lib/contrast/agent/protect/policy/rule_applicator.rb +1 -1
  46. data/lib/contrast/agent/protect/rule/base.rb +98 -66
  47. data/lib/contrast/agent/protect/rule/base_service.rb +49 -24
  48. data/lib/contrast/agent/protect/rule/bot_blocker/bot_blocker_input_classification.rb +98 -0
  49. data/lib/contrast/agent/protect/rule/bot_blocker.rb +81 -0
  50. data/lib/contrast/agent/protect/rule/cmd_injection.rb +30 -99
  51. data/lib/contrast/agent/protect/rule/cmdi/cmdi_backdoors.rb +132 -0
  52. data/lib/contrast/agent/protect/rule/cmdi/cmdi_base_rule.rb +169 -0
  53. data/lib/contrast/agent/protect/rule/cmdi/cmdi_chained_command.rb +69 -0
  54. data/lib/contrast/agent/protect/rule/cmdi/cmdi_dangerous_path.rb +68 -0
  55. data/lib/contrast/agent/protect/rule/cmdi/cmdi_input_classification.rb +2 -58
  56. data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
  57. data/lib/contrast/agent/protect/rule/deserialization.rb +10 -19
  58. data/lib/contrast/agent/protect/rule/http_method_tampering/http_method_tampering_input_classification.rb +2 -2
  59. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +0 -11
  60. data/lib/contrast/agent/protect/rule/no_sqli/no_sqli_input_classification.rb +29 -34
  61. data/lib/contrast/agent/protect/rule/no_sqli.rb +25 -18
  62. data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_input_classification.rb +61 -0
  63. data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_semantic_security_bypass.rb +114 -0
  64. data/lib/contrast/agent/protect/rule/path_traversal.rb +46 -18
  65. data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +49 -29
  66. data/lib/contrast/agent/protect/rule/sqli/sqli_base_rule.rb +37 -0
  67. data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +2 -62
  68. data/lib/contrast/agent/protect/rule/sqli/sqli_semantic/sqli_dangerous_functions.rb +67 -0
  69. data/lib/contrast/agent/protect/rule/sqli.rb +67 -22
  70. data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_input_classification.rb +39 -63
  71. data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +6 -33
  72. data/lib/contrast/agent/protect/rule/xss/reflected_xss_input_classification.rb +58 -0
  73. data/lib/contrast/agent/protect/rule/xss.rb +14 -20
  74. data/lib/contrast/agent/protect/rule/xxe.rb +15 -30
  75. data/lib/contrast/agent/protect/rule.rb +3 -1
  76. data/lib/contrast/agent/reporting/attack_result/attack_result.rb +8 -0
  77. data/lib/contrast/agent/reporting/attack_result/rasp_rule_sample.rb +70 -36
  78. data/lib/contrast/agent/reporting/attack_result/response_type.rb +9 -9
  79. data/lib/contrast/agent/reporting/attack_result/user_input.rb +11 -0
  80. data/lib/contrast/agent/reporting/details/bot_blocker_details.rb +29 -0
  81. data/lib/contrast/agent/reporting/details/cmd_injection_details.rb +30 -0
  82. data/lib/contrast/agent/reporting/details/details.rb +18 -0
  83. data/lib/contrast/agent/reporting/details/http_method_tempering_details.rb +27 -0
  84. data/lib/contrast/agent/reporting/details/ip_denylist_details.rb +35 -0
  85. data/lib/contrast/agent/reporting/details/no_sqli_details.rb +36 -0
  86. data/lib/contrast/agent/reporting/details/path_traversal_details.rb +24 -0
  87. data/lib/contrast/agent/reporting/details/path_traversal_semantic_analysis_details.rb +32 -0
  88. data/lib/contrast/agent/reporting/details/protect_rule_details.rb +17 -0
  89. data/lib/contrast/agent/reporting/details/sqli_dangerous_functions.rb +22 -0
  90. data/lib/contrast/agent/reporting/details/sqli_details.rb +36 -0
  91. data/lib/contrast/agent/reporting/details/untrusted_deserialization_details.rb +27 -0
  92. data/lib/contrast/agent/reporting/details/virtual_patch_details.rb +30 -0
  93. data/lib/contrast/agent/reporting/details/xss_details.rb +33 -0
  94. data/lib/contrast/agent/reporting/details/xss_match.rb +30 -0
  95. data/lib/contrast/agent/reporting/details/xxe_details.rb +36 -0
  96. data/lib/contrast/agent/reporting/details/xxe_match.rb +25 -0
  97. data/lib/contrast/agent/reporting/details/xxe_wrapper.rb +25 -0
  98. data/lib/contrast/agent/reporting/input_analysis/details/bot_blocker_details.rb +27 -0
  99. data/lib/contrast/agent/reporting/input_analysis/details/protect_rule_details.rb +15 -0
  100. data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +1 -2
  101. data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +17 -3
  102. data/lib/contrast/agent/reporting/masker/masker.rb +80 -65
  103. data/lib/contrast/agent/reporting/masker/masker_utils.rb +1 -30
  104. data/lib/contrast/agent/reporting/reporter.rb +1 -15
  105. data/lib/contrast/agent/reporting/reporting_events/agent_startup.rb +2 -2
  106. data/lib/contrast/agent/reporting/reporting_events/application_activity.rb +84 -15
  107. data/lib/contrast/agent/reporting/reporting_events/application_defend_activity.rb +13 -25
  108. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_activity.rb +19 -24
  109. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample.rb +46 -126
  110. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample_activity.rb +5 -16
  111. data/lib/contrast/agent/reporting/reporting_events/application_defend_attacker_activity.rb +10 -18
  112. data/lib/contrast/agent/reporting/reporting_events/application_inventory_activity.rb +6 -14
  113. data/lib/contrast/agent/reporting/reporting_events/application_startup.rb +1 -1
  114. data/lib/contrast/agent/reporting/reporting_events/application_update.rb +0 -2
  115. data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +7 -22
  116. data/lib/contrast/agent/reporting/reporting_events/finding.rb +23 -53
  117. data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +12 -9
  118. data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +1 -1
  119. data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +23 -21
  120. data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +5 -18
  121. data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +1 -0
  122. data/lib/contrast/{api/decorators/trace_taint_range_tags.rb → agent/reporting/reporting_events/finding_event_taint_range_tags.rb} +7 -6
  123. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +40 -10
  124. data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +0 -1
  125. data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +1 -1
  126. data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +2 -2
  127. data/lib/contrast/agent/reporting/reporting_events/poll.rb +1 -11
  128. data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +10 -14
  129. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +11 -0
  130. data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +3 -1
  131. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +12 -25
  132. data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +8 -27
  133. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +3 -3
  134. data/lib/contrast/agent/reporting/reporting_utilities/build_preflight.rb +4 -7
  135. data/lib/contrast/agent/reporting/reporting_utilities/headers.rb +1 -1
  136. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +2 -1
  137. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +3 -3
  138. data/lib/contrast/agent/reporting/reporting_utilities/response.rb +1 -1
  139. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +0 -3
  140. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +1 -0
  141. data/lib/contrast/agent/reporting/settings/code_exclusion.rb +6 -1
  142. data/lib/contrast/agent/reporting/settings/exclusion_base.rb +18 -0
  143. data/lib/contrast/agent/reporting/settings/exclusions.rb +2 -1
  144. data/lib/contrast/agent/reporting/settings/input_exclusion.rb +9 -3
  145. data/lib/contrast/agent/reporting/settings/protect.rb +15 -15
  146. data/lib/contrast/agent/request.rb +4 -14
  147. data/lib/contrast/agent/request_context.rb +18 -24
  148. data/lib/contrast/agent/request_context_extend.rb +23 -164
  149. data/lib/contrast/agent/request_handler.rb +1 -11
  150. data/lib/contrast/agent/response.rb +0 -18
  151. data/lib/contrast/agent/telemetry/events/event.rb +1 -1
  152. data/lib/contrast/agent/telemetry/events/metric_event.rb +1 -1
  153. data/lib/contrast/agent/telemetry/events/startup_metrics_event.rb +3 -3
  154. data/lib/contrast/agent/thread_watcher.rb +3 -18
  155. data/lib/contrast/agent/version.rb +1 -1
  156. data/lib/contrast/agent.rb +0 -11
  157. data/lib/contrast/agent_lib/api/command_injection.rb +46 -0
  158. data/lib/contrast/agent_lib/api/init.rb +101 -0
  159. data/lib/contrast/agent_lib/api/input_tracing.rb +267 -0
  160. data/lib/contrast/agent_lib/api/method_tempering.rb +29 -0
  161. data/lib/contrast/agent_lib/api/panic.rb +87 -0
  162. data/lib/contrast/agent_lib/api/path_semantic_file_security_bypass.rb +40 -0
  163. data/lib/contrast/agent_lib/interface.rb +260 -0
  164. data/lib/contrast/agent_lib/interface_base.rb +118 -0
  165. data/lib/contrast/agent_lib/return_types/eval_result.rb +44 -0
  166. data/lib/contrast/agent_lib/test.rb +29 -0
  167. data/lib/contrast/api/communication/connection_status.rb +5 -5
  168. data/lib/contrast/components/agent.rb +13 -23
  169. data/lib/contrast/components/api.rb +10 -10
  170. data/lib/contrast/components/app_context.rb +9 -11
  171. data/lib/contrast/components/app_context_extend.rb +1 -26
  172. data/lib/contrast/components/assess.rb +92 -38
  173. data/lib/contrast/components/assess_rules.rb +36 -0
  174. data/lib/contrast/components/config.rb +49 -24
  175. data/lib/contrast/components/heap_dump.rb +1 -1
  176. data/lib/contrast/components/protect.rb +9 -6
  177. data/lib/contrast/components/ruby_component.rb +81 -0
  178. data/lib/contrast/components/sampling.rb +1 -1
  179. data/lib/contrast/components/security_logger.rb +23 -0
  180. data/lib/contrast/components/settings.rb +41 -85
  181. data/lib/contrast/config/base_configuration.rb +1 -1
  182. data/lib/contrast/config/protect_rule_configuration.rb +7 -7
  183. data/lib/contrast/config/protect_rules_configuration.rb +24 -48
  184. data/lib/contrast/config/server_configuration.rb +1 -1
  185. data/lib/contrast/config.rb +0 -6
  186. data/lib/contrast/configuration.rb +73 -18
  187. data/lib/contrast/extension/assess/array.rb +9 -0
  188. data/lib/contrast/extension/assess/exec_trigger.rb +3 -1
  189. data/lib/contrast/extension/assess/marshal.rb +3 -2
  190. data/lib/contrast/extension/assess/string.rb +0 -1
  191. data/lib/contrast/extension/delegator.rb +2 -0
  192. data/lib/contrast/extension/extension.rb +1 -1
  193. data/lib/contrast/framework/base_support.rb +0 -5
  194. data/lib/contrast/framework/grape/support.rb +1 -23
  195. data/lib/contrast/framework/manager.rb +3 -11
  196. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -6
  197. data/lib/contrast/framework/rails/railtie.rb +0 -1
  198. data/lib/contrast/framework/rails/support.rb +5 -59
  199. data/lib/contrast/framework/sinatra/support.rb +2 -21
  200. data/lib/contrast/logger/cef_log.rb +21 -3
  201. data/lib/contrast/logger/log.rb +1 -11
  202. data/lib/contrast/tasks/config.rb +5 -10
  203. data/lib/contrast/utils/assess/event_limit_utils.rb +28 -12
  204. data/lib/contrast/utils/assess/trigger_method_utils.rb +10 -18
  205. data/lib/contrast/utils/duck_utils.rb +1 -0
  206. data/lib/contrast/utils/findings.rb +6 -5
  207. data/lib/contrast/utils/hash_digest.rb +9 -24
  208. data/lib/contrast/utils/hash_digest_extend.rb +6 -6
  209. data/lib/contrast/utils/input_classification_base.rb +156 -0
  210. data/lib/contrast/utils/invalid_configuration_util.rb +21 -58
  211. data/lib/contrast/utils/log_utils.rb +47 -17
  212. data/lib/contrast/utils/net_http_base.rb +2 -2
  213. data/lib/contrast/utils/os.rb +0 -20
  214. data/lib/contrast/utils/patching/policy/patch_utils.rb +3 -2
  215. data/lib/contrast/utils/response_utils.rb +0 -16
  216. data/lib/contrast/utils/stack_trace_utils.rb +3 -40
  217. data/lib/contrast/utils/string_utils.rb +19 -7
  218. data/lib/contrast/utils/telemetry_client.rb +13 -7
  219. data/lib/contrast.rb +7 -13
  220. data/resources/protect/policy.json +1 -2
  221. data/ruby-agent.gemspec +2 -5
  222. metadata +78 -137
  223. data/exe/contrast_service +0 -23
  224. data/lib/contrast/agent/protect/rule/cmdi/cmdi_worth_watching.rb +0 -64
  225. data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +0 -118
  226. data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_matcher.rb +0 -45
  227. data/lib/contrast/agent/reaction_processor.rb +0 -47
  228. data/lib/contrast/agent/reporting/reporting_events/trace_event_source.rb +0 -30
  229. data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -43
  230. data/lib/contrast/agent/service_heartbeat.rb +0 -35
  231. data/lib/contrast/api/communication/messaging_queue.rb +0 -129
  232. data/lib/contrast/api/communication/response_processor.rb +0 -90
  233. data/lib/contrast/api/communication/service_lifecycle.rb +0 -77
  234. data/lib/contrast/api/communication/socket.rb +0 -44
  235. data/lib/contrast/api/communication/socket_client.rb +0 -130
  236. data/lib/contrast/api/communication/speedracer.rb +0 -142
  237. data/lib/contrast/api/communication/tcp_socket.rb +0 -32
  238. data/lib/contrast/api/communication/unix_socket.rb +0 -28
  239. data/lib/contrast/api/communication.rb +0 -20
  240. data/lib/contrast/api/decorators/activity.rb +0 -33
  241. data/lib/contrast/api/decorators/address.rb +0 -59
  242. data/lib/contrast/api/decorators/agent_startup.rb +0 -57
  243. data/lib/contrast/api/decorators/application_settings.rb +0 -42
  244. data/lib/contrast/api/decorators/application_startup.rb +0 -56
  245. data/lib/contrast/api/decorators/architecture_component.rb +0 -36
  246. data/lib/contrast/api/decorators/bot_blocker.rb +0 -37
  247. data/lib/contrast/api/decorators/finding.rb +0 -29
  248. data/lib/contrast/api/decorators/http_request.rb +0 -137
  249. data/lib/contrast/api/decorators/input_analysis.rb +0 -18
  250. data/lib/contrast/api/decorators/instrumentation_mode.rb +0 -35
  251. data/lib/contrast/api/decorators/ip_denylist.rb +0 -37
  252. data/lib/contrast/api/decorators/message.rb +0 -71
  253. data/lib/contrast/api/decorators/rasp_rule_sample.rb +0 -58
  254. data/lib/contrast/api/decorators/response_type.rb +0 -17
  255. data/lib/contrast/api/decorators/route_coverage.rb +0 -91
  256. data/lib/contrast/api/decorators/server_features.rb +0 -25
  257. data/lib/contrast/api/decorators/trace_event.rb +0 -120
  258. data/lib/contrast/api/decorators/trace_event_object.rb +0 -63
  259. data/lib/contrast/api/decorators/trace_event_signature.rb +0 -69
  260. data/lib/contrast/api/decorators/trace_taint_range.rb +0 -52
  261. data/lib/contrast/api/decorators/user_input.rb +0 -51
  262. data/lib/contrast/api/decorators/virtual_patch.rb +0 -34
  263. data/lib/contrast/api/decorators.rb +0 -28
  264. data/lib/contrast/api/dtm.pb.rb +0 -852
  265. data/lib/contrast/api/settings.pb.rb +0 -500
  266. data/lib/contrast/api.rb +0 -16
  267. data/lib/contrast/components/contrast_service.rb +0 -88
  268. data/lib/contrast/config/assess_configuration.rb +0 -93
  269. data/lib/contrast/config/assess_rules_configuration.rb +0 -32
  270. data/lib/contrast/config/root_configuration.rb +0 -90
  271. data/lib/contrast/config/ruby_configuration.rb +0 -81
  272. data/lib/contrast/config/service_configuration.rb +0 -49
  273. data/lib/contrast/tasks/service.rb +0 -84
  274. data/lib/contrast/utils/input_classification.rb +0 -73
  275. data/lib/contrast/utils/preflight_util.rb +0 -13
  276. data/lib/protobuf/code_generator.rb +0 -129
  277. data/lib/protobuf/decoder.rb +0 -28
  278. data/lib/protobuf/deprecation.rb +0 -117
  279. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +0 -79
  280. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +0 -360
  281. data/lib/protobuf/descriptors.rb +0 -3
  282. data/lib/protobuf/encoder.rb +0 -11
  283. data/lib/protobuf/enum.rb +0 -365
  284. data/lib/protobuf/exceptions.rb +0 -9
  285. data/lib/protobuf/field/base_field.rb +0 -380
  286. data/lib/protobuf/field/base_field_object_definitions.rb +0 -504
  287. data/lib/protobuf/field/bool_field.rb +0 -64
  288. data/lib/protobuf/field/bytes_field.rb +0 -67
  289. data/lib/protobuf/field/double_field.rb +0 -25
  290. data/lib/protobuf/field/enum_field.rb +0 -56
  291. data/lib/protobuf/field/field_array.rb +0 -102
  292. data/lib/protobuf/field/field_hash.rb +0 -122
  293. data/lib/protobuf/field/fixed32_field.rb +0 -25
  294. data/lib/protobuf/field/fixed64_field.rb +0 -28
  295. data/lib/protobuf/field/float_field.rb +0 -43
  296. data/lib/protobuf/field/int32_field.rb +0 -21
  297. data/lib/protobuf/field/int64_field.rb +0 -34
  298. data/lib/protobuf/field/integer_field.rb +0 -23
  299. data/lib/protobuf/field/message_field.rb +0 -51
  300. data/lib/protobuf/field/sfixed32_field.rb +0 -27
  301. data/lib/protobuf/field/sfixed64_field.rb +0 -28
  302. data/lib/protobuf/field/signed_integer_field.rb +0 -29
  303. data/lib/protobuf/field/sint32_field.rb +0 -21
  304. data/lib/protobuf/field/sint64_field.rb +0 -21
  305. data/lib/protobuf/field/string_field.rb +0 -51
  306. data/lib/protobuf/field/uint32_field.rb +0 -21
  307. data/lib/protobuf/field/uint64_field.rb +0 -21
  308. data/lib/protobuf/field/varint_field.rb +0 -77
  309. data/lib/protobuf/field.rb +0 -74
  310. data/lib/protobuf/generators/base.rb +0 -85
  311. data/lib/protobuf/generators/enum_generator.rb +0 -39
  312. data/lib/protobuf/generators/extension_generator.rb +0 -27
  313. data/lib/protobuf/generators/field_generator.rb +0 -193
  314. data/lib/protobuf/generators/file_generator.rb +0 -262
  315. data/lib/protobuf/generators/group_generator.rb +0 -122
  316. data/lib/protobuf/generators/message_generator.rb +0 -104
  317. data/lib/protobuf/generators/option_generator.rb +0 -17
  318. data/lib/protobuf/generators/printable.rb +0 -160
  319. data/lib/protobuf/generators/service_generator.rb +0 -50
  320. data/lib/protobuf/lifecycle.rb +0 -33
  321. data/lib/protobuf/logging.rb +0 -39
  322. data/lib/protobuf/message/fields.rb +0 -233
  323. data/lib/protobuf/message/serialization.rb +0 -85
  324. data/lib/protobuf/message.rb +0 -241
  325. data/lib/protobuf/optionable.rb +0 -72
  326. data/lib/protobuf/tasks/compile.rake +0 -80
  327. data/lib/protobuf/tasks.rb +0 -1
  328. data/lib/protobuf/varint.rb +0 -20
  329. data/lib/protobuf/varint_pure.rb +0 -31
  330. data/lib/protobuf/version.rb +0 -3
  331. data/lib/protobuf/wire_type.rb +0 -10
  332. data/lib/protobuf.rb +0 -91
  333. data/proto/dynamic_discovery.proto +0 -46
  334. data/proto/google/protobuf/compiler/plugin.proto +0 -183
  335. data/proto/google/protobuf/descriptor.proto +0 -911
  336. data/proto/rpc.proto +0 -71
  337. data/service_executables/.gitkeep +0 -0
  338. data/service_executables/VERSION +0 -1
  339. data/service_executables/linux/contrast-service +0 -0
  340. data/service_executables/mac/contrast-service +0 -0
@@ -0,0 +1,17 @@
1
+ # Copyright (c) 2022 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 Agent
6
+ module Reporting
7
+ module Details
8
+ # This class is holding additional info which is rule specific and this is
9
+ # the base class for type check made easy.
10
+ class ProtectRuleDetails
11
+ # Extend per each rule.
12
+ def to_controlled_hash; end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ module Details
10
+ # SqliDangerousFunctions IA result details info.
11
+ class SqliDangerousFunctions < ProtectRuleDetails
12
+ # @return [String]
13
+ attr_accessor :query
14
+
15
+ def to_controlled_hash
16
+ { query: query }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ module Details
10
+ # SqliDetails IA result details info.
11
+ class SqliDetails < ProtectRuleDetails
12
+ # @return [Integer]
13
+ attr_accessor :start_idx
14
+ # @return [Integer]
15
+ attr_accessor :end_idx
16
+ # @return [Integer]
17
+ attr_accessor :boundary_overrun_idx
18
+ # @return [Integer]
19
+ attr_accessor :input_boundary_idx
20
+ # @return [String]
21
+ attr_accessor :query
22
+
23
+ def to_controlled_hash
24
+ {
25
+ start: start_idx,
26
+ end: end_idx,
27
+ boundaryOverrunIndex: boundary_overrun_idx,
28
+ inputBoundaryIndex: input_boundary_idx,
29
+ query: query
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ module Details
10
+ # Untrusted Deserialization IA result details info.
11
+ class UntrustedDeserializationDetails < ProtectRuleDetails
12
+ # @return [String]
13
+ attr_accessor :cmd
14
+ # @return [String]
15
+ attr_accessor :deserializer
16
+
17
+ def to_controlled_hash
18
+ {
19
+ command: cmd,
20
+ deserializer: deserializer
21
+ }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ module Details
10
+ # Virtual Patch IA result details info.
11
+ class VirtualPatchDetails < ProtectRuleDetails
12
+ # @return [String]
13
+ attr_reader :uuid
14
+
15
+ # @param uuid [String] the UUID to identify the block rule in TeamServer
16
+ def initialize uuid
17
+ @uuid = uuid
18
+ super()
19
+ end
20
+
21
+ def to_controlled_hash
22
+ {
23
+ uuid: uuid
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+ require 'contrast/agent/reporting/details/xss_match'
6
+
7
+ module Contrast
8
+ module Agent
9
+ module Reporting
10
+ module Details
11
+ # XssDetails IA result details info.
12
+ class XssDetails < ProtectRuleDetails
13
+ # @return [String]
14
+ attr_accessor :input
15
+ # @return [<Array<Contrast::Agent::Reporting::XssMatch>]
16
+ attr_accessor :matches
17
+
18
+ def initialize
19
+ @matches = []
20
+ super
21
+ end
22
+
23
+ def to_controlled_hash
24
+ {
25
+ input: input,
26
+ matches: matches&.map(&:to_controlled_hash)
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ module Details
10
+ # Matcher data for XSS rule.
11
+ class XssMatch
12
+ # @return [Integer] in ms
13
+ attr_accessor :evidence_start
14
+ # @return [String]
15
+ attr_accessor :evidence
16
+ # @return [Integer]
17
+ attr_accessor :offset
18
+
19
+ def to_controlled_hash
20
+ {
21
+ evidenceStart: evidence_start,
22
+ evidence: evidence,
23
+ offset: offset
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ module Details
10
+ # XssDetails IA result details info.
11
+ class XxeDetails < ProtectRuleDetails
12
+ # @return [String]
13
+ attr_accessor :xml
14
+ # @return [<Array<Contrast::Agent::Reporting::Details::XxeMatch>]
15
+ attr_accessor :declared_entities
16
+ # @return [<Array<Contrast::Agent::Reporting::Details::XxeWrapper>]
17
+ attr_accessor :entities_resolved
18
+
19
+ def initialize
20
+ @declared_entities = []
21
+ @entities_resolved = []
22
+ super
23
+ end
24
+
25
+ def to_controlled_hash
26
+ {
27
+ xml: xml,
28
+ declaredEntities: declared_entities&.map(&:to_controlled_hash),
29
+ entitiesResolved: entities_resolved&.map(&:to_controlled_hash)
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2022 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 Agent
6
+ module Reporting
7
+ module Details
8
+ # Matcher data for XXE rule.
9
+ class XxeMatch
10
+ # @return [Integer]
11
+ attr_accessor :start_idx
12
+ # @return [Integer]
13
+ attr_accessor :end_idx
14
+
15
+ def to_controlled_hash
16
+ {
17
+ start: start_idx,
18
+ end: end_idx
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2022 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 Agent
6
+ module Reporting
7
+ module Details
8
+ # Wrapper data for XXE rule.
9
+ class XxeWrapper
10
+ # @return [String]
11
+ attr_accessor :system_id
12
+ # @return [String]
13
+ attr_accessor :public_id
14
+
15
+ def to_controlled_hash
16
+ {
17
+ systemId: system_id,
18
+ publicId: public_id
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
+ # frozen_string_literal: true
3
+
4
+ require 'contrast/agent/reporting/input_analysis/details/protect_rule_details'
5
+
6
+ module Contrast
7
+ module Agent
8
+ module Reporting
9
+ # Bot blocker IA result details info.
10
+ class BotBlockerDetails < ProtectRuleDetails
11
+ # @return [String]
12
+ attr_accessor :bot
13
+ # User agent header value
14
+ #
15
+ # @return [String]
16
+ attr_accessor :user_agent
17
+
18
+ def to_controlled_hash
19
+ {
20
+ bot: bot,
21
+ userAgent: user_agent
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # Copyright (c) 2022 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 Agent
6
+ module Reporting
7
+ # This class is holding additional info which is rule specific and this is
8
+ # the base class for type check made easy.
9
+ class ProtectRuleDetails
10
+ # Extend per each rule.
11
+ def to_controlled_hash; end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -7,8 +7,7 @@ require 'contrast/agent/reporting/input_analysis/input_analysis_result'
7
7
  module Contrast
8
8
  module Agent
9
9
  module Reporting
10
- # This class will do ia analysis for our protect rules instead of
11
- # using the service.
10
+ # This class will do ia analysis for our protect rules
12
11
  class InputAnalysis
13
12
  # result from input analysis
14
13
  #
@@ -4,12 +4,12 @@
4
4
  require 'contrast/utils/object_share'
5
5
  require 'contrast/agent/reporting/input_analysis/input_type'
6
6
  require 'contrast/agent/reporting/input_analysis/score_level'
7
+ require 'contrast/agent/reporting/input_analysis/details/protect_rule_details'
7
8
 
8
9
  module Contrast
9
10
  module Agent
10
11
  module Reporting
11
- # This class will do ia analysis for our protect rules instead of
12
- # using the service.
12
+ # This class will do ia analysis for our protect rules
13
13
  class InputAnalysisResult
14
14
  INPUT_TYPE = Contrast::Agent::Reporting::InputType
15
15
  SCORE_LEVEL = Contrast::Agent::Reporting::ScoreLevel
@@ -28,7 +28,7 @@ module Contrast
28
28
  # @return @_input_type [
29
29
  # Symbol<Contrast::Agent::Reporting::Settings::InputAnalysis::InputAnalysisResult::InputType>]
30
30
  def input_type
31
- @_input_type ||= INPUT_TYPE::UNDEFINED_TYPE
31
+ @_input_type ||= INPUT_TYPE::UNKNOWN
32
32
  end
33
33
 
34
34
  # @param input_type [
@@ -109,6 +109,20 @@ module Contrast
109
109
  def score_level= score_level
110
110
  @_score_level = score_level if SCORE_LEVEL.to_a.include?(score_level)
111
111
  end
112
+
113
+ # Additional per rule details containing more specific info.
114
+ #
115
+ # @param protect_rule_details [Contrast::Agent::Reporting::ProtectRuleDetails]
116
+ def details= protect_rule_details
117
+ @_details = protect_rule_details if protect_rule_details.is_a?(Contrast::Agent::Reporting::ProtectRuleDetails)
118
+ end
119
+
120
+ # Additional per rule details containing more specific info.
121
+ #
122
+ # @return [Contrast::Agent::Reporting::ProtectRuleDetails, nil]
123
+ def details
124
+ @_details
125
+ end
112
126
  end
113
127
  end
114
128
  end
@@ -30,21 +30,20 @@ module Contrast
30
30
 
31
31
  # Mask sensitive data according to the contrast sensitive data rules.
32
32
  #
33
- # @param [Contrast::Api::Dtm::Activity]
33
+ # @param [Contrast::Agent::Reporting::ApplicationActivity]
34
34
  def mask activity
35
- return unless Contrast::Agent::Reporter.enabled?
36
35
  return unless activity
37
36
 
38
- logger.debug('Searching for sensitive data',
39
- activity: activity.__id__,
40
- request: activity.http_request&.uuid)
37
+ logger.debug('Masker: masking sensitive data', activity: activity.__id__, request: activity.request&.__id__)
38
+ return if activity.request.nil?
39
+
41
40
  mask_body(activity)
42
41
  mask_query_string(activity)
43
42
  mask_request_params(activity)
44
43
  mask_request_cookies(activity)
45
44
  mask_request_headers(activity)
46
45
  rescue StandardError => _e
47
- logger.debug('Could not mask activity!', activity: activity.__id__, request: activity.http_request&.uuid)
46
+ logger.debug('Could not mask activity!', activity: activity.__id__, request: activity.request&.__id__)
48
47
  end
49
48
 
50
49
  private
@@ -64,68 +63,67 @@ module Contrast
64
63
 
65
64
  # Mask request body:
66
65
  #
67
- # @param activity [Contrast::Api::Dtm::Activity]
66
+ # @param activity [Contrast::Agent::Reporting::ApplicationActivity]
68
67
  # @return masked_body [String, nil]
69
68
  def mask_body activity
70
69
  return unless mask_body?
71
70
 
72
- body = activity.http_request.request_body
71
+ body = activity.request.body
73
72
  return if body.nil? || body.empty?
74
73
 
75
- activity.http_request.request_body = BODY_MASK
76
- activity.http_request.request_body_binary = BODY_BINARY_MASK
74
+ activity.request.body = BODY_MASK
75
+ activity.request.body_binary = BODY_BINARY_MASK
77
76
  end
78
77
 
79
78
  # Mask request params.
80
79
  #
81
- # @param activity [Contrast::Api::Dtm::Activity]
80
+ # @param activity [Contrast::Agent::Reporting::ApplicationActivity]
82
81
  # @return masked_body [String, nil]
83
82
  def mask_request_params activity
84
- params = activity.http_request.normalized_request_params
83
+ params = activity.request.parameters
85
84
  return unless params
86
85
 
87
- mask_with_dictionary(activity.results, params)
86
+ mask_with_dictionary(activity.attack_results, params)
88
87
  end
89
88
 
90
89
  def mask_request_headers activity
91
- if activity.http_request.parsed_request_headers
92
- # Used normalized request_headers
93
- mask_with_dictionary(activity.results, activity.http_request.normalized_request_headers)
94
- else
95
- headers = activity.http_request.request_headers
96
- mask_field_hash(headers, activity.results)
97
- end
90
+ headers = activity.request.headers
91
+ return if headers&.empty?
92
+
93
+ # Used normalized request_headers
94
+ mask = mask_with_dictionary(activity.attack_results, headers)
95
+ activity.request.headers = mask if mask
98
96
  end
99
97
 
100
98
  # Mask Cookies.
101
99
  #
102
- # @param activity [Contrast::Api::Dtm::Activity] Activity to mask
100
+ # @param activity [Contrast::Agent::Reporting::ApplicationActivity] Activity to mask
103
101
  # @return masked_values [Hash, nil]
104
102
  def mask_request_cookies activity
105
- cookies = activity.http_request.normalized_cookies
106
- return unless cookies
103
+ cookies = activity.request.cookies
104
+ return if cookies&.empty?
107
105
 
108
- mask_with_dictionary(activity.results, cookies)
106
+ mask_with_dictionary(activity.attack_results, cookies)
109
107
  end
110
108
 
111
109
  # Mask request query string:
112
110
  # exp: password => sensitive to password => contrast-redacted-password
113
111
  #
114
- # @param activity [Contrast::Api::Dtm::Activity]
112
+ # @param activity [Contrast::Agent::Reporting::ApplicationActivity]
115
113
  # @return masked_query [String]
116
114
  def mask_query_string activity
117
- qs = activity.http_request.query_string
115
+ qs = activity.request.query_string
118
116
  return if qs.nil? || qs.empty?
119
117
 
120
- mask_field_hash(qs, activity.results) unless qs.cs__is_a?(String)
121
- mask_raw_query(qs, activity.results)
118
+ mask = mask_raw_query(qs, activity.attack_results)
119
+ activity.request.query_string = mask if mask
122
120
  end
123
121
 
124
122
  # Mask if the value in the passed hash are matched against dictionary
125
123
  # keyword. If the mask_attack_vector flag is set, this will also mask
126
124
  # any attack.
127
125
  #
128
- # @param results [Array<Contrast::Api::Dtm::AttackResults>]
126
+ # @param results [Array<Contrast::Agent::Reporting::ApplicationDefendAttackActivity>]
129
127
  # results to match against.
130
128
  # @param hash [Hash] Normalized hash representing the key/val pair from
131
129
  # the activity's http request parameters.
@@ -134,81 +132,98 @@ module Contrast
134
132
  return if hash.nil? || hash.empty?
135
133
 
136
134
  hash.each do |key, val|
137
- match = dictionary_matcher(key)
138
- next unless match
139
-
140
- # The normalized values are paired.
141
- # key => Contrast::Api::Dtm::Pair (key, val<Values>).
142
- # try one level down
143
- if val.cs__respond_to?(:values)
144
- mask_values(key, val, results)
135
+ next unless dictionary_match(key)
136
+
137
+ if val.cs__is_a?(Array)
138
+ mask_values(key, val, hash, results)
145
139
  else
146
140
  # Just assign keys.
147
141
  mask_hash(key, val, hash, results)
148
142
  end
149
143
  end
150
- hash
151
144
  end
152
145
 
153
- # Mask the values of DTM pair with attack vector condition check.
154
- # if the attack vector flag is set then mask the attack value.
146
+ # Mask the values of key value pair with array of string as input.
147
+ # If the mask_attack_vector? flag is set then the attack vector won't be
148
+ # masked.
155
149
  #
156
- # @param key [String] current iterable key from Protobuf::Field::FieldHash
157
- # pointing to Contrast::Api::Dtm::Pair<key, val>(holding the value to mask)
158
- # @param results [Array<Contrast::Api::Dtm::AttackResults>]
150
+ # @param key [String]
151
+ # @param hash [Hash] Normalized hash representing the key/val pair.
152
+ # @param results [Array<Contrast::Agent::Reporting::ApplicationDefendAttackActivity>]
159
153
  # results to match against.
160
- # @param val [Contrast::Api::Dtm::Pair<Value>]
161
- def mask_values key, val, results
162
- val.values.each.with_index do |v, idx|
154
+ # @param val [String, Array<String>]
155
+ def mask_values key, val, hash, results
156
+ val.each.with_index do |v, idx|
163
157
  # Mask the attack vector only if the flag is set.
164
- val.values[idx] = MASK + key.downcase if attack_vector?(results, v) && mask_attack_vector?
158
+ hash[key][idx] = MASK + key.downcase if attack_vector?(results, v) && mask_attack_vector?
165
159
  # It is not attack vector and we mask it as normal.
166
- val.values[idx] = MASK + key.downcase unless attack_vector?(results, v)
160
+ hash[key][idx] = MASK + key.downcase unless attack_vector?(results, v)
167
161
  end
168
- val
162
+ hash
169
163
  end
170
164
 
171
- # Handles the masking of Field hash with string values.
172
- # this case is used when called from #mask_field_hash
173
- # and #mask_raw_query helper methods. Since they dont
174
- # return values containing sub-values (key, val<Values>).
165
+ # Handles the masking of hash
175
166
  #
176
167
  # @param key [String] current iterable key from Protobuf::Field::FieldHash
177
168
  # @param val [String] normalized value to be matched against the results
178
169
  # and masked.
179
170
  # @param hash [Hash] Normalized hash representing the key/val pair.
180
- # @param results [Array<Contrast::Api::Dtm::AttackResults>]
171
+ # @param results [Array<Contrast::Agent::Reporting::ApplicationDefendAttackActivity>]
181
172
  # results to match against.
173
+ # @return [Hash]
182
174
  def mask_hash key, val, hash, results
175
+ # Mask the attack vector only if the flag is set.
183
176
  hash[key] = MASK + key.downcase if attack_vector?(results, val) && mask_attack_vector?
177
+ # It is not attack vector we mask it.
184
178
  hash[key] = MASK + key.downcase unless attack_vector?(results, val)
179
+ hash
185
180
  end
186
181
 
187
182
  # Match to see if values matches input from AttackResults array.
188
183
  # If match is found and the attack result's response is any of
189
184
  # [BAP(Block At Perimeter), BLOCKED, PROBED] the return is true.
190
185
  #
191
- # @param results [Array<Contrast::Api::Dtm::AttackResults>]
186
+ # @param results [Array<Contrast::Agent::Reporting::ApplicationDefendAttackActivity>]
192
187
  # results to match against.
193
188
  # @param value [String] Input to match.
194
- # @return true | false
189
+ # @return [Boolean]
195
190
  def attack_vector? results, value
196
191
  return false unless value && results
197
192
 
198
- results.each do |result|
199
- # Check samples Contrast::Api::Dtm::RaspRuleSample
200
- # is the value in sample and the response is valid?
201
- result.samples.any? do |sample|
202
- # Check user input Contrast::Api::Dtm::UserInput.
203
- match = sample.user_input.value == value.to_s &&
204
- result.response&.name != Contrast::Agent::Reporting::ResponseType::NO_ACTION
193
+ results.each do |attacker|
194
+ attacker.each do |activity|
195
+ blocked = iterate_attack_samples(activity.blocked, value)
196
+ return blocked if blocked
205
197
 
206
- return match if match
198
+ exploited = iterate_attack_samples(activity.exploited, value)
199
+ return exploited if exploited
200
+
201
+ ineffective = iterate_attack_samples(activity.ineffective, value)
202
+ return ineffective if ineffective
203
+
204
+ suspicious = iterate_attack_samples(activity.suspicious, value)
205
+ return suspicious if suspicious
207
206
  end
208
207
  end
209
208
  false
210
209
  end
211
210
 
211
+ # Go through activity samples and search for a matching input.
212
+ #
213
+ # @param activity [Contrast::Agent::Reporting::ApplicationDefendAttackActivity]
214
+ # @param value [String] Input to match.
215
+ # @return [Boolean]
216
+ def iterate_attack_samples activity, value
217
+ return false unless activity
218
+
219
+ activity.samples.any? do |sample|
220
+ match = sample.user_input.value == value.to_s
221
+
222
+ return true if match
223
+ end
224
+ false
225
+ end
226
+
212
227
  # Consult with our current settings state.
213
228
  #
214
229
  # @return true | false
@@ -227,7 +242,7 @@ module Contrast
227
242
  #
228
243
  # @param value [String] Value to check.
229
244
  # @return match [String, nil] from the Dictionary, or nil.
230
- def dictionary_matcher value
245
+ def dictionary_match value
231
246
  return unless @_dictionary
232
247
 
233
248
  @_dictionary.each do |rule|