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.
- checksums.yaml +4 -4
- data/.gitignore +3 -2
- data/.gitmodules +0 -3
- data/.simplecov +0 -1
- data/Rakefile +0 -1
- data/ext/cs__assess_array/cs__assess_array.c +41 -10
- data/ext/cs__assess_array/cs__assess_array.h +4 -1
- data/ext/cs__scope/cs__scope.c +1 -1
- data/lib/contrast/agent/assess/contrast_event.rb +2 -24
- data/lib/contrast/agent/assess/events/source_event.rb +7 -61
- data/lib/contrast/agent/assess/finalizers/hash.rb +11 -0
- data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +0 -55
- data/lib/contrast/agent/assess/policy/policy_node.rb +3 -3
- data/lib/contrast/agent/assess/policy/policy_node_utils.rb +0 -1
- data/lib/contrast/agent/assess/policy/propagation_node.rb +4 -4
- data/lib/contrast/agent/assess/policy/source_method.rb +24 -1
- data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +7 -5
- data/lib/contrast/agent/assess/policy/trigger/xpath.rb +6 -1
- data/lib/contrast/agent/assess/policy/trigger_method.rb +40 -121
- data/lib/contrast/agent/assess/policy/trigger_node.rb +3 -3
- data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +1 -1
- data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +1 -1
- data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +1 -1
- data/lib/contrast/agent/assess/property/evented.rb +2 -12
- data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +42 -82
- data/lib/contrast/agent/assess/rule/response/base_rule.rb +11 -27
- data/lib/contrast/agent/assess/rule/response/body_rule.rb +1 -3
- data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +77 -62
- data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +1 -1
- data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +6 -1
- data/lib/contrast/agent/assess/rule/response/header_rule.rb +5 -5
- data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +1 -1
- data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +1 -1
- data/lib/contrast/agent/assess/tracker.rb +1 -7
- data/lib/contrast/agent/at_exit_hook.rb +1 -7
- data/lib/contrast/agent/excluder.rb +224 -0
- data/lib/contrast/agent/exclusion_matcher.rb +25 -7
- data/lib/contrast/agent/inventory/database_config.rb +18 -23
- data/lib/contrast/agent/middleware.rb +4 -5
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +6 -0
- data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +146 -127
- data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +4 -0
- data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +20 -0
- data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +1 -0
- data/lib/contrast/agent/protect/policy/rule_applicator.rb +1 -1
- data/lib/contrast/agent/protect/rule/base.rb +98 -66
- data/lib/contrast/agent/protect/rule/base_service.rb +49 -24
- data/lib/contrast/agent/protect/rule/bot_blocker/bot_blocker_input_classification.rb +98 -0
- data/lib/contrast/agent/protect/rule/bot_blocker.rb +81 -0
- data/lib/contrast/agent/protect/rule/cmd_injection.rb +30 -99
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_backdoors.rb +132 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_base_rule.rb +169 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_chained_command.rb +69 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_dangerous_path.rb +68 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_input_classification.rb +2 -58
- data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/deserialization.rb +10 -19
- data/lib/contrast/agent/protect/rule/http_method_tampering/http_method_tampering_input_classification.rb +2 -2
- data/lib/contrast/agent/protect/rule/http_method_tampering.rb +0 -11
- data/lib/contrast/agent/protect/rule/no_sqli/no_sqli_input_classification.rb +29 -34
- data/lib/contrast/agent/protect/rule/no_sqli.rb +25 -18
- data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_input_classification.rb +61 -0
- data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_semantic_security_bypass.rb +114 -0
- data/lib/contrast/agent/protect/rule/path_traversal.rb +46 -18
- data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +49 -29
- data/lib/contrast/agent/protect/rule/sqli/sqli_base_rule.rb +37 -0
- data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +2 -62
- data/lib/contrast/agent/protect/rule/sqli/sqli_semantic/sqli_dangerous_functions.rb +67 -0
- data/lib/contrast/agent/protect/rule/sqli.rb +67 -22
- data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_input_classification.rb +39 -63
- data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +6 -33
- data/lib/contrast/agent/protect/rule/xss/reflected_xss_input_classification.rb +58 -0
- data/lib/contrast/agent/protect/rule/xss.rb +14 -20
- data/lib/contrast/agent/protect/rule/xxe.rb +15 -30
- data/lib/contrast/agent/protect/rule.rb +3 -1
- data/lib/contrast/agent/reporting/attack_result/attack_result.rb +8 -0
- data/lib/contrast/agent/reporting/attack_result/rasp_rule_sample.rb +70 -36
- data/lib/contrast/agent/reporting/attack_result/response_type.rb +9 -9
- data/lib/contrast/agent/reporting/attack_result/user_input.rb +11 -0
- data/lib/contrast/agent/reporting/details/bot_blocker_details.rb +29 -0
- data/lib/contrast/agent/reporting/details/cmd_injection_details.rb +30 -0
- data/lib/contrast/agent/reporting/details/details.rb +18 -0
- data/lib/contrast/agent/reporting/details/http_method_tempering_details.rb +27 -0
- data/lib/contrast/agent/reporting/details/ip_denylist_details.rb +35 -0
- data/lib/contrast/agent/reporting/details/no_sqli_details.rb +36 -0
- data/lib/contrast/agent/reporting/details/path_traversal_details.rb +24 -0
- data/lib/contrast/agent/reporting/details/path_traversal_semantic_analysis_details.rb +32 -0
- data/lib/contrast/agent/reporting/details/protect_rule_details.rb +17 -0
- data/lib/contrast/agent/reporting/details/sqli_dangerous_functions.rb +22 -0
- data/lib/contrast/agent/reporting/details/sqli_details.rb +36 -0
- data/lib/contrast/agent/reporting/details/untrusted_deserialization_details.rb +27 -0
- data/lib/contrast/agent/reporting/details/virtual_patch_details.rb +30 -0
- data/lib/contrast/agent/reporting/details/xss_details.rb +33 -0
- data/lib/contrast/agent/reporting/details/xss_match.rb +30 -0
- data/lib/contrast/agent/reporting/details/xxe_details.rb +36 -0
- data/lib/contrast/agent/reporting/details/xxe_match.rb +25 -0
- data/lib/contrast/agent/reporting/details/xxe_wrapper.rb +25 -0
- data/lib/contrast/agent/reporting/input_analysis/details/bot_blocker_details.rb +27 -0
- data/lib/contrast/agent/reporting/input_analysis/details/protect_rule_details.rb +15 -0
- data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +1 -2
- data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +17 -3
- data/lib/contrast/agent/reporting/masker/masker.rb +80 -65
- data/lib/contrast/agent/reporting/masker/masker_utils.rb +1 -30
- data/lib/contrast/agent/reporting/reporter.rb +1 -15
- data/lib/contrast/agent/reporting/reporting_events/agent_startup.rb +2 -2
- data/lib/contrast/agent/reporting/reporting_events/application_activity.rb +84 -15
- data/lib/contrast/agent/reporting/reporting_events/application_defend_activity.rb +13 -25
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_activity.rb +19 -24
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample.rb +46 -126
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample_activity.rb +5 -16
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attacker_activity.rb +10 -18
- data/lib/contrast/agent/reporting/reporting_events/application_inventory_activity.rb +6 -14
- data/lib/contrast/agent/reporting/reporting_events/application_startup.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_events/application_update.rb +0 -2
- data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +7 -22
- data/lib/contrast/agent/reporting/reporting_events/finding.rb +23 -53
- data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +12 -9
- data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +23 -21
- data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +5 -18
- data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +1 -0
- data/lib/contrast/{api/decorators/trace_taint_range_tags.rb → agent/reporting/reporting_events/finding_event_taint_range_tags.rb} +7 -6
- data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +40 -10
- data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +0 -1
- data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +2 -2
- data/lib/contrast/agent/reporting/reporting_events/poll.rb +1 -11
- data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +10 -14
- data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +11 -0
- data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +3 -1
- data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +12 -25
- data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +8 -27
- data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +3 -3
- data/lib/contrast/agent/reporting/reporting_utilities/build_preflight.rb +4 -7
- data/lib/contrast/agent/reporting/reporting_utilities/headers.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +2 -1
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +3 -3
- data/lib/contrast/agent/reporting/reporting_utilities/response.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +0 -3
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +1 -0
- data/lib/contrast/agent/reporting/settings/code_exclusion.rb +6 -1
- data/lib/contrast/agent/reporting/settings/exclusion_base.rb +18 -0
- data/lib/contrast/agent/reporting/settings/exclusions.rb +2 -1
- data/lib/contrast/agent/reporting/settings/input_exclusion.rb +9 -3
- data/lib/contrast/agent/reporting/settings/protect.rb +15 -15
- data/lib/contrast/agent/request.rb +4 -14
- data/lib/contrast/agent/request_context.rb +18 -24
- data/lib/contrast/agent/request_context_extend.rb +23 -164
- data/lib/contrast/agent/request_handler.rb +1 -11
- data/lib/contrast/agent/response.rb +0 -18
- data/lib/contrast/agent/telemetry/events/event.rb +1 -1
- data/lib/contrast/agent/telemetry/events/metric_event.rb +1 -1
- data/lib/contrast/agent/telemetry/events/startup_metrics_event.rb +3 -3
- data/lib/contrast/agent/thread_watcher.rb +3 -18
- data/lib/contrast/agent/version.rb +1 -1
- data/lib/contrast/agent.rb +0 -11
- data/lib/contrast/agent_lib/api/command_injection.rb +46 -0
- data/lib/contrast/agent_lib/api/init.rb +101 -0
- data/lib/contrast/agent_lib/api/input_tracing.rb +267 -0
- data/lib/contrast/agent_lib/api/method_tempering.rb +29 -0
- data/lib/contrast/agent_lib/api/panic.rb +87 -0
- data/lib/contrast/agent_lib/api/path_semantic_file_security_bypass.rb +40 -0
- data/lib/contrast/agent_lib/interface.rb +260 -0
- data/lib/contrast/agent_lib/interface_base.rb +118 -0
- data/lib/contrast/agent_lib/return_types/eval_result.rb +44 -0
- data/lib/contrast/agent_lib/test.rb +29 -0
- data/lib/contrast/api/communication/connection_status.rb +5 -5
- data/lib/contrast/components/agent.rb +13 -23
- data/lib/contrast/components/api.rb +10 -10
- data/lib/contrast/components/app_context.rb +9 -11
- data/lib/contrast/components/app_context_extend.rb +1 -26
- data/lib/contrast/components/assess.rb +92 -38
- data/lib/contrast/components/assess_rules.rb +36 -0
- data/lib/contrast/components/config.rb +49 -24
- data/lib/contrast/components/heap_dump.rb +1 -1
- data/lib/contrast/components/protect.rb +9 -6
- data/lib/contrast/components/ruby_component.rb +81 -0
- data/lib/contrast/components/sampling.rb +1 -1
- data/lib/contrast/components/security_logger.rb +23 -0
- data/lib/contrast/components/settings.rb +41 -85
- data/lib/contrast/config/base_configuration.rb +1 -1
- data/lib/contrast/config/protect_rule_configuration.rb +7 -7
- data/lib/contrast/config/protect_rules_configuration.rb +24 -48
- data/lib/contrast/config/server_configuration.rb +1 -1
- data/lib/contrast/config.rb +0 -6
- data/lib/contrast/configuration.rb +73 -18
- data/lib/contrast/extension/assess/array.rb +9 -0
- data/lib/contrast/extension/assess/exec_trigger.rb +3 -1
- data/lib/contrast/extension/assess/marshal.rb +3 -2
- data/lib/contrast/extension/assess/string.rb +0 -1
- data/lib/contrast/extension/delegator.rb +2 -0
- data/lib/contrast/extension/extension.rb +1 -1
- data/lib/contrast/framework/base_support.rb +0 -5
- data/lib/contrast/framework/grape/support.rb +1 -23
- data/lib/contrast/framework/manager.rb +3 -11
- data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -6
- data/lib/contrast/framework/rails/railtie.rb +0 -1
- data/lib/contrast/framework/rails/support.rb +5 -59
- data/lib/contrast/framework/sinatra/support.rb +2 -21
- data/lib/contrast/logger/cef_log.rb +21 -3
- data/lib/contrast/logger/log.rb +1 -11
- data/lib/contrast/tasks/config.rb +5 -10
- data/lib/contrast/utils/assess/event_limit_utils.rb +28 -12
- data/lib/contrast/utils/assess/trigger_method_utils.rb +10 -18
- data/lib/contrast/utils/duck_utils.rb +1 -0
- data/lib/contrast/utils/findings.rb +6 -5
- data/lib/contrast/utils/hash_digest.rb +9 -24
- data/lib/contrast/utils/hash_digest_extend.rb +6 -6
- data/lib/contrast/utils/input_classification_base.rb +156 -0
- data/lib/contrast/utils/invalid_configuration_util.rb +21 -58
- data/lib/contrast/utils/log_utils.rb +47 -17
- data/lib/contrast/utils/net_http_base.rb +2 -2
- data/lib/contrast/utils/os.rb +0 -20
- data/lib/contrast/utils/patching/policy/patch_utils.rb +3 -2
- data/lib/contrast/utils/response_utils.rb +0 -16
- data/lib/contrast/utils/stack_trace_utils.rb +3 -40
- data/lib/contrast/utils/string_utils.rb +19 -7
- data/lib/contrast/utils/telemetry_client.rb +13 -7
- data/lib/contrast.rb +7 -13
- data/resources/protect/policy.json +1 -2
- data/ruby-agent.gemspec +2 -5
- metadata +78 -137
- data/exe/contrast_service +0 -23
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_worth_watching.rb +0 -64
- data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +0 -118
- data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_matcher.rb +0 -45
- data/lib/contrast/agent/reaction_processor.rb +0 -47
- data/lib/contrast/agent/reporting/reporting_events/trace_event_source.rb +0 -30
- data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -43
- data/lib/contrast/agent/service_heartbeat.rb +0 -35
- data/lib/contrast/api/communication/messaging_queue.rb +0 -129
- data/lib/contrast/api/communication/response_processor.rb +0 -90
- data/lib/contrast/api/communication/service_lifecycle.rb +0 -77
- data/lib/contrast/api/communication/socket.rb +0 -44
- data/lib/contrast/api/communication/socket_client.rb +0 -130
- data/lib/contrast/api/communication/speedracer.rb +0 -142
- data/lib/contrast/api/communication/tcp_socket.rb +0 -32
- data/lib/contrast/api/communication/unix_socket.rb +0 -28
- data/lib/contrast/api/communication.rb +0 -20
- data/lib/contrast/api/decorators/activity.rb +0 -33
- data/lib/contrast/api/decorators/address.rb +0 -59
- data/lib/contrast/api/decorators/agent_startup.rb +0 -57
- data/lib/contrast/api/decorators/application_settings.rb +0 -42
- data/lib/contrast/api/decorators/application_startup.rb +0 -56
- data/lib/contrast/api/decorators/architecture_component.rb +0 -36
- data/lib/contrast/api/decorators/bot_blocker.rb +0 -37
- data/lib/contrast/api/decorators/finding.rb +0 -29
- data/lib/contrast/api/decorators/http_request.rb +0 -137
- data/lib/contrast/api/decorators/input_analysis.rb +0 -18
- data/lib/contrast/api/decorators/instrumentation_mode.rb +0 -35
- data/lib/contrast/api/decorators/ip_denylist.rb +0 -37
- data/lib/contrast/api/decorators/message.rb +0 -71
- data/lib/contrast/api/decorators/rasp_rule_sample.rb +0 -58
- data/lib/contrast/api/decorators/response_type.rb +0 -17
- data/lib/contrast/api/decorators/route_coverage.rb +0 -91
- data/lib/contrast/api/decorators/server_features.rb +0 -25
- data/lib/contrast/api/decorators/trace_event.rb +0 -120
- data/lib/contrast/api/decorators/trace_event_object.rb +0 -63
- data/lib/contrast/api/decorators/trace_event_signature.rb +0 -69
- data/lib/contrast/api/decorators/trace_taint_range.rb +0 -52
- data/lib/contrast/api/decorators/user_input.rb +0 -51
- data/lib/contrast/api/decorators/virtual_patch.rb +0 -34
- data/lib/contrast/api/decorators.rb +0 -28
- data/lib/contrast/api/dtm.pb.rb +0 -852
- data/lib/contrast/api/settings.pb.rb +0 -500
- data/lib/contrast/api.rb +0 -16
- data/lib/contrast/components/contrast_service.rb +0 -88
- data/lib/contrast/config/assess_configuration.rb +0 -93
- data/lib/contrast/config/assess_rules_configuration.rb +0 -32
- data/lib/contrast/config/root_configuration.rb +0 -90
- data/lib/contrast/config/ruby_configuration.rb +0 -81
- data/lib/contrast/config/service_configuration.rb +0 -49
- data/lib/contrast/tasks/service.rb +0 -84
- data/lib/contrast/utils/input_classification.rb +0 -73
- data/lib/contrast/utils/preflight_util.rb +0 -13
- data/lib/protobuf/code_generator.rb +0 -129
- data/lib/protobuf/decoder.rb +0 -28
- data/lib/protobuf/deprecation.rb +0 -117
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +0 -79
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +0 -360
- data/lib/protobuf/descriptors.rb +0 -3
- data/lib/protobuf/encoder.rb +0 -11
- data/lib/protobuf/enum.rb +0 -365
- data/lib/protobuf/exceptions.rb +0 -9
- data/lib/protobuf/field/base_field.rb +0 -380
- data/lib/protobuf/field/base_field_object_definitions.rb +0 -504
- data/lib/protobuf/field/bool_field.rb +0 -64
- data/lib/protobuf/field/bytes_field.rb +0 -67
- data/lib/protobuf/field/double_field.rb +0 -25
- data/lib/protobuf/field/enum_field.rb +0 -56
- data/lib/protobuf/field/field_array.rb +0 -102
- data/lib/protobuf/field/field_hash.rb +0 -122
- data/lib/protobuf/field/fixed32_field.rb +0 -25
- data/lib/protobuf/field/fixed64_field.rb +0 -28
- data/lib/protobuf/field/float_field.rb +0 -43
- data/lib/protobuf/field/int32_field.rb +0 -21
- data/lib/protobuf/field/int64_field.rb +0 -34
- data/lib/protobuf/field/integer_field.rb +0 -23
- data/lib/protobuf/field/message_field.rb +0 -51
- data/lib/protobuf/field/sfixed32_field.rb +0 -27
- data/lib/protobuf/field/sfixed64_field.rb +0 -28
- data/lib/protobuf/field/signed_integer_field.rb +0 -29
- data/lib/protobuf/field/sint32_field.rb +0 -21
- data/lib/protobuf/field/sint64_field.rb +0 -21
- data/lib/protobuf/field/string_field.rb +0 -51
- data/lib/protobuf/field/uint32_field.rb +0 -21
- data/lib/protobuf/field/uint64_field.rb +0 -21
- data/lib/protobuf/field/varint_field.rb +0 -77
- data/lib/protobuf/field.rb +0 -74
- data/lib/protobuf/generators/base.rb +0 -85
- data/lib/protobuf/generators/enum_generator.rb +0 -39
- data/lib/protobuf/generators/extension_generator.rb +0 -27
- data/lib/protobuf/generators/field_generator.rb +0 -193
- data/lib/protobuf/generators/file_generator.rb +0 -262
- data/lib/protobuf/generators/group_generator.rb +0 -122
- data/lib/protobuf/generators/message_generator.rb +0 -104
- data/lib/protobuf/generators/option_generator.rb +0 -17
- data/lib/protobuf/generators/printable.rb +0 -160
- data/lib/protobuf/generators/service_generator.rb +0 -50
- data/lib/protobuf/lifecycle.rb +0 -33
- data/lib/protobuf/logging.rb +0 -39
- data/lib/protobuf/message/fields.rb +0 -233
- data/lib/protobuf/message/serialization.rb +0 -85
- data/lib/protobuf/message.rb +0 -241
- data/lib/protobuf/optionable.rb +0 -72
- data/lib/protobuf/tasks/compile.rake +0 -80
- data/lib/protobuf/tasks.rb +0 -1
- data/lib/protobuf/varint.rb +0 -20
- data/lib/protobuf/varint_pure.rb +0 -31
- data/lib/protobuf/version.rb +0 -3
- data/lib/protobuf/wire_type.rb +0 -10
- data/lib/protobuf.rb +0 -91
- data/proto/dynamic_discovery.proto +0 -46
- data/proto/google/protobuf/compiler/plugin.proto +0 -183
- data/proto/google/protobuf/descriptor.proto +0 -911
- data/proto/rpc.proto +0 -71
- data/service_executables/.gitkeep +0 -0
- data/service_executables/VERSION +0 -1
- data/service_executables/linux/contrast-service +0 -0
- 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
|
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
|
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::
|
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::
|
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('
|
39
|
-
|
40
|
-
|
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.
|
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::
|
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.
|
71
|
+
body = activity.request.body
|
73
72
|
return if body.nil? || body.empty?
|
74
73
|
|
75
|
-
activity.
|
76
|
-
activity.
|
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::
|
80
|
+
# @param activity [Contrast::Agent::Reporting::ApplicationActivity]
|
82
81
|
# @return masked_body [String, nil]
|
83
82
|
def mask_request_params activity
|
84
|
-
params = activity.
|
83
|
+
params = activity.request.parameters
|
85
84
|
return unless params
|
86
85
|
|
87
|
-
mask_with_dictionary(activity.
|
86
|
+
mask_with_dictionary(activity.attack_results, params)
|
88
87
|
end
|
89
88
|
|
90
89
|
def mask_request_headers activity
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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::
|
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.
|
106
|
-
return
|
103
|
+
cookies = activity.request.cookies
|
104
|
+
return if cookies&.empty?
|
107
105
|
|
108
|
-
mask_with_dictionary(activity.
|
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::
|
112
|
+
# @param activity [Contrast::Agent::Reporting::ApplicationActivity]
|
115
113
|
# @return masked_query [String]
|
116
114
|
def mask_query_string activity
|
117
|
-
qs = activity.
|
115
|
+
qs = activity.request.query_string
|
118
116
|
return if qs.nil? || qs.empty?
|
119
117
|
|
120
|
-
|
121
|
-
|
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::
|
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
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
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
|
154
|
-
#
|
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]
|
157
|
-
#
|
158
|
-
# @param results [Array<Contrast::
|
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 [
|
161
|
-
def mask_values key, val, results
|
162
|
-
val.
|
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
|
-
|
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
|
-
|
160
|
+
hash[key][idx] = MASK + key.downcase unless attack_vector?(results, v)
|
167
161
|
end
|
168
|
-
|
162
|
+
hash
|
169
163
|
end
|
170
164
|
|
171
|
-
# Handles the masking of
|
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::
|
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::
|
186
|
+
# @param results [Array<Contrast::Agent::Reporting::ApplicationDefendAttackActivity>]
|
192
187
|
# results to match against.
|
193
188
|
# @param value [String] Input to match.
|
194
|
-
# @return
|
189
|
+
# @return [Boolean]
|
195
190
|
def attack_vector? results, value
|
196
191
|
return false unless value && results
|
197
192
|
|
198
|
-
results.each do |
|
199
|
-
|
200
|
-
|
201
|
-
|
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
|
-
|
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
|
245
|
+
def dictionary_match value
|
231
246
|
return unless @_dictionary
|
232
247
|
|
233
248
|
@_dictionary.each do |rule|
|