contrast-agent 3.8.4 → 6.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +0 -1
- data/.flayignore +1 -0
- data/.gitignore +8 -5
- data/.gitmodules +0 -3
- data/.rspec +0 -1
- data/.rspec_parallel +6 -0
- data/.simplecov +6 -2
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/Rakefile +5 -2
- data/ext/build_funchook.rb +27 -11
- data/ext/cs__assess_array/cs__assess_array.c +45 -7
- data/ext/cs__assess_array/cs__assess_array.h +5 -1
- data/ext/cs__assess_array/extconf.rb +3 -0
- data/ext/cs__assess_basic_object/cs__assess_basic_object.c +39 -17
- data/ext/cs__assess_basic_object/cs__assess_basic_object.h +2 -1
- data/ext/cs__assess_basic_object/extconf.rb +3 -0
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +9 -13
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.h +3 -4
- data/ext/cs__assess_fiber_track/extconf.rb +3 -0
- data/ext/cs__assess_hash/cs__assess_hash.c +46 -21
- data/ext/cs__assess_hash/cs__assess_hash.h +5 -6
- data/ext/cs__assess_hash/extconf.rb +3 -0
- data/ext/cs__assess_kernel/cs__assess_kernel.c +29 -15
- data/ext/cs__assess_kernel/cs__assess_kernel.h +3 -0
- data/ext/cs__assess_kernel/extconf.rb +3 -0
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +55 -23
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +6 -3
- data/ext/cs__assess_marshal_module/extconf.rb +3 -0
- data/ext/cs__assess_module/cs__assess_module.c +82 -23
- data/ext/cs__assess_module/cs__assess_module.h +10 -0
- data/ext/cs__assess_module/extconf.rb +3 -0
- data/ext/cs__assess_regexp/cs__assess_regexp.c +28 -9
- data/ext/cs__assess_regexp/cs__assess_regexp.h +3 -0
- data/ext/cs__assess_regexp/extconf.rb +3 -0
- data/ext/cs__assess_string/cs__assess_string.c +53 -21
- data/ext/cs__assess_string/cs__assess_string.h +7 -1
- data/ext/cs__assess_string/extconf.rb +3 -0
- data/ext/cs__assess_string_interpolation/cs__assess_string_interpolation.c +39 -0
- data/ext/cs__assess_string_interpolation/cs__assess_string_interpolation.h +13 -0
- data/ext/cs__assess_string_interpolation/extconf.rb +5 -0
- data/ext/cs__assess_test/cs__assess_test.h +9 -0
- data/ext/cs__assess_test/cs__assess_tests.c +22 -0
- data/ext/cs__assess_test/extconf.rb +5 -0
- data/ext/cs__assess_yield_track/cs__assess_yield_track.c +30 -0
- data/ext/cs__assess_yield_track/cs__assess_yield_track.h +11 -0
- data/ext/cs__assess_yield_track/extconf.rb +5 -0
- data/ext/cs__common/cs__common.c +246 -10
- data/ext/cs__common/cs__common.h +71 -2
- data/ext/cs__common/extconf.rb +3 -16
- data/ext/cs__contrast_patch/cs__contrast_patch.c +255 -155
- data/ext/cs__contrast_patch/cs__contrast_patch.h +13 -14
- data/ext/cs__contrast_patch/extconf.rb +3 -0
- data/ext/cs__os_information/cs__os_information.c +34 -0
- data/ext/cs__os_information/cs__os_information.h +7 -0
- data/ext/cs__os_information/extconf.rb +5 -0
- data/ext/cs__scope/cs__scope.c +755 -55
- data/ext/cs__scope/cs__scope.h +75 -20
- data/ext/cs__scope/extconf.rb +3 -0
- data/ext/cs__tests/cs__tests.c +12 -0
- data/ext/cs__tests/cs__tests.h +3 -0
- data/ext/cs__tests/extconf.rb +5 -0
- data/ext/extconf_common.rb +4 -34
- data/lib/contrast/agent/assess/contrast_object.rb +54 -0
- data/lib/contrast/agent/assess/events/event_data.rb +30 -0
- data/lib/contrast/agent/assess/finalizers/freeze.rb +15 -0
- data/lib/contrast/agent/assess/finalizers/hash.rb +107 -0
- data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +58 -36
- data/lib/contrast/agent/assess/policy/patcher.rb +13 -48
- data/lib/contrast/agent/assess/policy/policy.rb +20 -37
- data/lib/contrast/agent/assess/policy/policy_node.rb +96 -200
- data/lib/contrast/agent/assess/policy/policy_node_utils.rb +50 -0
- data/lib/contrast/agent/assess/policy/policy_scanner.rb +15 -12
- data/lib/contrast/agent/assess/policy/preshift.rb +50 -19
- data/lib/contrast/agent/assess/policy/propagation_method.rb +200 -192
- data/lib/contrast/agent/assess/policy/propagation_node.rb +49 -41
- data/lib/contrast/agent/assess/policy/propagator/append.rb +32 -15
- data/lib/contrast/agent/assess/policy/propagator/base.rb +5 -3
- data/lib/contrast/agent/assess/policy/propagator/buffer.rb +119 -0
- data/lib/contrast/agent/assess/policy/propagator/center.rb +12 -8
- data/lib/contrast/agent/assess/policy/propagator/custom.rb +7 -3
- data/lib/contrast/agent/assess/policy/propagator/database_write.rb +34 -25
- data/lib/contrast/agent/assess/policy/propagator/insert.rb +15 -11
- data/lib/contrast/agent/assess/policy/propagator/keep.rb +23 -6
- data/lib/contrast/agent/assess/policy/propagator/match_data.rb +118 -0
- data/lib/contrast/agent/assess/policy/propagator/next.rb +7 -6
- data/lib/contrast/agent/assess/policy/propagator/prepend.rb +13 -6
- data/lib/contrast/agent/assess/policy/propagator/rack_protection.rb +73 -0
- data/lib/contrast/agent/assess/policy/propagator/remove.rb +53 -41
- data/lib/contrast/agent/assess/policy/propagator/replace.rb +5 -3
- data/lib/contrast/agent/assess/policy/propagator/reverse.rb +7 -6
- data/lib/contrast/agent/assess/policy/propagator/select.rb +45 -36
- data/lib/contrast/agent/assess/policy/propagator/splat.rb +44 -21
- data/lib/contrast/agent/assess/policy/propagator/split.rb +176 -22
- data/lib/contrast/agent/assess/policy/propagator/substitution.rb +7 -132
- data/lib/contrast/agent/assess/policy/propagator/substitution_utils.rb +190 -0
- data/lib/contrast/agent/assess/policy/propagator/trim.rb +74 -52
- data/lib/contrast/agent/assess/policy/propagator.rb +21 -18
- data/lib/contrast/agent/assess/policy/source_method.rb +176 -177
- data/lib/contrast/agent/assess/policy/source_node.rb +3 -17
- data/lib/contrast/agent/assess/policy/source_validation/cross_site_validator.rb +32 -0
- data/lib/contrast/agent/assess/policy/source_validation/source_validation.rb +34 -0
- data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +102 -0
- data/lib/contrast/agent/assess/policy/trigger/xpath.rb +57 -0
- data/lib/contrast/agent/assess/policy/trigger_method.rb +160 -173
- data/lib/contrast/agent/assess/policy/trigger_node.rb +162 -39
- data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +60 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +8 -38
- data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +22 -7
- data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +6 -15
- data/lib/contrast/agent/assess/properties.rb +15 -354
- data/lib/contrast/agent/assess/property/evented.rb +58 -0
- data/lib/contrast/agent/assess/property/tagged.rb +246 -0
- data/lib/contrast/agent/assess/property/updated.rb +131 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_key.rb +58 -19
- data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +22 -17
- data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +93 -81
- data/lib/contrast/agent/assess/rule/provider.rb +4 -4
- data/lib/contrast/agent/assess/rule/response/auto_complete_rule.rb +69 -0
- data/lib/contrast/agent/assess/rule/response/base_rule.rb +121 -0
- data/lib/contrast/agent/assess/rule/response/body_rule.rb +107 -0
- data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +195 -0
- data/lib/contrast/agent/assess/rule/response/click_jacking_header_rule.rb +26 -0
- data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +100 -0
- data/lib/contrast/agent/assess/rule/response/csp_header_missing_rule.rb +26 -0
- data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +34 -0
- data/lib/contrast/agent/assess/rule/response/header_rule.rb +70 -0
- data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +36 -0
- data/lib/contrast/agent/assess/rule/response/parameters_pollution_rule.rb +61 -0
- data/lib/contrast/agent/assess/rule/response/x_content_type_header_rule.rb +26 -0
- data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +34 -0
- data/lib/contrast/agent/assess/tag.rb +84 -41
- data/lib/contrast/agent/assess/tracker.rb +70 -0
- data/lib/contrast/agent/assess.rb +7 -29
- data/lib/contrast/agent/at_exit_hook.rb +28 -17
- data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +11 -6
- data/lib/contrast/agent/deadzone/policy/policy.rb +11 -7
- data/lib/contrast/agent/disable_reaction.rb +6 -10
- data/lib/contrast/agent/excluder.rb +224 -0
- data/lib/contrast/agent/exclusion_matcher.rb +40 -74
- data/lib/contrast/agent/inventory/database_config.rb +174 -0
- data/lib/contrast/agent/inventory/dependencies.rb +52 -0
- data/lib/contrast/agent/inventory/dependency_analysis.rb +34 -0
- data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +120 -0
- data/lib/contrast/agent/inventory/policy/datastores.rb +51 -0
- data/lib/contrast/agent/inventory/policy/policy.rb +5 -5
- data/lib/contrast/agent/inventory/policy/trigger_node.rb +2 -2
- data/lib/contrast/agent/inventory.rb +14 -0
- data/lib/contrast/agent/middleware.rb +146 -299
- data/lib/contrast/agent/module_data.rb +5 -4
- data/lib/contrast/agent/patching/policy/after_load_patch.rb +54 -7
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +103 -27
- data/lib/contrast/agent/patching/policy/method_policy.rb +53 -64
- data/lib/contrast/agent/patching/policy/method_policy_extend.rb +113 -0
- data/lib/contrast/agent/patching/policy/module_policy.rb +27 -47
- data/lib/contrast/agent/patching/policy/patch.rb +147 -241
- data/lib/contrast/agent/patching/policy/patch_status.rb +21 -45
- data/lib/contrast/agent/patching/policy/patcher.rb +126 -161
- data/lib/contrast/agent/patching/policy/policy.rb +66 -57
- data/lib/contrast/agent/patching/policy/policy_node.rb +63 -32
- data/lib/contrast/agent/patching/policy/trigger_node.rb +32 -15
- data/lib/contrast/agent/protect/exploitable_collection.rb +38 -0
- data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +170 -0
- data/lib/contrast/agent/protect/input_analyzer/worth_watching_analyzer.rb +116 -0
- data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +65 -0
- data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +97 -0
- data/lib/contrast/agent/protect/policy/applies_no_sqli_rule.rb +69 -0
- data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +138 -0
- data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +55 -0
- data/lib/contrast/agent/protect/policy/applies_xxe_rule.rb +125 -0
- data/lib/contrast/agent/protect/policy/policy.rb +10 -10
- data/lib/contrast/agent/protect/policy/rule_applicator.rb +102 -0
- data/lib/contrast/agent/protect/policy/trigger_node.rb +2 -2
- data/lib/contrast/agent/protect/rule/base.rb +205 -95
- data/lib/contrast/agent/protect/rule/base_service.rb +73 -14
- 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 +53 -123
- 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 +64 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_dangerous_path.rb +63 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_input_classification.rb +27 -0
- data/lib/contrast/agent/protect/rule/default_scanner.rb +69 -25
- data/lib/contrast/agent/protect/rule/deserialization.rb +32 -48
- data/lib/contrast/agent/protect/rule/http_method_tampering/http_method_tampering_input_classification.rb +96 -0
- data/lib/contrast/agent/protect/rule/http_method_tampering.rb +65 -62
- data/lib/contrast/agent/protect/rule/no_sqli/mongo_no_sql_scanner.rb +2 -3
- data/lib/contrast/agent/protect/rule/no_sqli/no_sqli_input_classification.rb +226 -0
- data/lib/contrast/agent/protect/rule/no_sqli.rb +47 -53
- 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 +57 -26
- data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +155 -0
- data/lib/contrast/agent/protect/rule/sqli/default_sql_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/sqli/mysql_sql_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/sqli/postgres_sql_scanner.rb +2 -2
- data/lib/contrast/agent/protect/rule/sqli/sqli_base_rule.rb +37 -0
- data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +28 -0
- data/lib/contrast/agent/protect/rule/sqli/sqli_semantic/sqli_dangerous_functions.rb +67 -0
- data/lib/contrast/agent/protect/rule/sqli/sqlite_sql_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/sqli.rb +78 -62
- data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_input_classification.rb +58 -0
- data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +19 -2
- data/lib/contrast/agent/protect/rule/xss/reflected_xss_input_classification.rb +58 -0
- data/lib/contrast/agent/protect/rule/xss.rb +20 -2
- data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +25 -21
- data/lib/contrast/agent/protect/rule/xxe.rb +69 -39
- data/lib/contrast/agent/protect/rule.rb +22 -25
- data/lib/contrast/agent/reporting/attack_result/attack_result.rb +71 -0
- data/lib/contrast/agent/reporting/attack_result/rasp_rule_sample.rb +86 -0
- data/lib/contrast/agent/reporting/attack_result/response_type.rb +29 -0
- data/lib/contrast/agent/reporting/attack_result/user_input.rb +98 -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 +43 -0
- data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +129 -0
- data/lib/contrast/agent/reporting/input_analysis/input_type.rb +44 -0
- data/lib/contrast/agent/reporting/input_analysis/score_level.rb +21 -0
- data/lib/contrast/agent/reporting/masker/masker.rb +258 -0
- data/lib/contrast/agent/reporting/masker/masker_utils.rb +33 -0
- data/lib/contrast/agent/reporting/report.rb +31 -0
- data/lib/contrast/agent/reporting/reporter.rb +165 -0
- data/lib/contrast/agent/reporting/reporter_heartbeat.rb +47 -0
- data/lib/contrast/agent/reporting/reporting_events/agent_startup.rb +34 -0
- data/lib/contrast/agent/reporting/reporting_events/application_activity.rb +120 -0
- data/lib/contrast/agent/reporting/reporting_events/application_defend_activity.rb +85 -0
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_activity.rb +65 -0
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample.rb +102 -0
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample_activity.rb +68 -0
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample_stack.rb +22 -0
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attacker_activity.rb +62 -0
- data/lib/contrast/agent/reporting/reporting_events/application_inventory.rb +42 -0
- data/lib/contrast/agent/reporting/reporting_events/application_inventory_activity.rb +57 -0
- data/lib/contrast/agent/reporting/reporting_events/application_reporting_event.rb +27 -0
- data/lib/contrast/agent/reporting/reporting_events/application_startup.rb +44 -0
- data/lib/contrast/agent/reporting/reporting_events/application_startup_instrumentation.rb +27 -0
- data/lib/contrast/agent/reporting/reporting_events/application_update.rb +56 -0
- data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +72 -0
- data/lib/contrast/agent/reporting/reporting_events/discovered_route.rb +126 -0
- data/lib/contrast/agent/reporting/reporting_events/finding.rb +210 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +449 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_object.rb +104 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_parent_object.rb +49 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_property.rb +51 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +106 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +74 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +68 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +71 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range_tags.rb +105 -0
- data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +134 -0
- data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +89 -0
- data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +48 -0
- data/lib/contrast/agent/reporting/reporting_events/observed_library_usage.rb +45 -0
- data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +89 -0
- data/lib/contrast/agent/reporting/reporting_events/poll.rb +23 -0
- data/lib/contrast/agent/reporting/reporting_events/preflight.rb +41 -0
- data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +74 -0
- data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +66 -0
- data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +89 -0
- data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +63 -0
- data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +53 -0
- data/lib/contrast/agent/reporting/reporting_events/server_reporting_event.rb +35 -0
- data/lib/contrast/agent/reporting/reporting_events/server_settings.rb +40 -0
- data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +130 -0
- data/lib/contrast/agent/reporting/reporting_utilities/build_preflight.rb +35 -0
- data/lib/contrast/agent/reporting/reporting_utilities/endpoints.rb +176 -0
- data/lib/contrast/agent/reporting/reporting_utilities/headers.rb +54 -0
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +143 -0
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +144 -0
- data/lib/contrast/agent/reporting/reporting_utilities/reporting_storage.rb +66 -0
- data/lib/contrast/agent/reporting/reporting_utilities/response.rb +98 -0
- data/lib/contrast/agent/reporting/reporting_utilities/response_extractor.rb +176 -0
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +117 -0
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler_mode.rb +63 -0
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +342 -0
- data/lib/contrast/agent/reporting/server_settings_worker.rb +44 -0
- data/lib/contrast/agent/reporting/settings/application_settings.rb +61 -0
- data/lib/contrast/agent/reporting/settings/assess.rb +45 -0
- data/lib/contrast/agent/reporting/settings/assess_server_feature.rb +114 -0
- data/lib/contrast/agent/reporting/settings/bot_blocker.rb +68 -0
- data/lib/contrast/agent/reporting/settings/code_exclusion.rb +32 -0
- data/lib/contrast/agent/reporting/settings/exclusion_base.rb +51 -0
- data/lib/contrast/agent/reporting/settings/exclusions.rb +106 -0
- data/lib/contrast/agent/reporting/settings/helpers.rb +63 -0
- data/lib/contrast/agent/reporting/settings/input_exclusion.rb +43 -0
- data/lib/contrast/agent/reporting/settings/ip_filter.rb +35 -0
- data/lib/contrast/agent/reporting/settings/keyword.rb +74 -0
- data/lib/contrast/agent/reporting/settings/log_enhancer.rb +65 -0
- data/lib/contrast/agent/reporting/settings/protect.rb +106 -0
- data/lib/contrast/agent/reporting/settings/protect_server_feature.rb +227 -0
- data/lib/contrast/agent/reporting/settings/reaction.rb +39 -0
- data/lib/contrast/agent/reporting/settings/rule_definition.rb +66 -0
- data/lib/contrast/agent/reporting/settings/sampling.rb +46 -0
- data/lib/contrast/agent/reporting/settings/sanitizer.rb +38 -0
- data/lib/contrast/agent/reporting/settings/security_logger.rb +77 -0
- data/lib/contrast/agent/reporting/settings/sensitive_data_masking.rb +118 -0
- data/lib/contrast/agent/reporting/settings/sensitive_data_masking_rule.rb +65 -0
- data/lib/contrast/agent/reporting/settings/server_features.rb +95 -0
- data/lib/contrast/agent/reporting/settings/syslog.rb +205 -0
- data/lib/contrast/agent/reporting/settings/url_exclusion.rb +42 -0
- data/lib/contrast/agent/reporting/settings/validator.rb +17 -0
- data/lib/contrast/agent/request.rb +107 -411
- data/lib/contrast/agent/request_context.rb +78 -162
- data/lib/contrast/agent/request_context_extend.rb +85 -0
- data/lib/contrast/agent/request_handler.rb +41 -0
- data/lib/contrast/agent/response.rb +37 -165
- data/lib/contrast/agent/rule_set.rb +52 -0
- data/lib/contrast/agent/scope.rb +142 -20
- data/lib/contrast/agent/static_analysis.rb +51 -0
- data/lib/contrast/agent/telemetry/base.rb +155 -0
- data/lib/contrast/agent/telemetry/events/event.rb +35 -0
- data/lib/contrast/agent/telemetry/events/exceptions/obfuscate.rb +119 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_base.rb +61 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_event.rb +46 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_message.rb +118 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_message_exception.rb +86 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_stack_frame.rb +67 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exceptions.rb +19 -0
- data/lib/contrast/agent/telemetry/events/metric_event.rb +28 -0
- data/lib/contrast/agent/telemetry/events/startup_metrics_event.rb +123 -0
- data/lib/contrast/agent/thread.rb +4 -6
- data/lib/contrast/agent/thread_watcher.rb +117 -0
- data/lib/contrast/agent/tracepoint_hook.rb +19 -13
- data/lib/contrast/agent/version.rb +2 -2
- data/lib/contrast/agent/worker_thread.rb +42 -0
- data/lib/contrast/agent.rb +83 -50
- 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 +59 -0
- data/lib/contrast/components/agent.rb +108 -36
- data/lib/contrast/components/api.rb +159 -0
- data/lib/contrast/components/app_context.rb +124 -134
- data/lib/contrast/components/app_context_extend.rb +53 -0
- data/lib/contrast/components/assess.rb +187 -24
- data/lib/contrast/components/assess_rules.rb +54 -0
- data/lib/contrast/components/base.rb +103 -0
- data/lib/contrast/components/config/sources.rb +95 -0
- data/lib/contrast/components/config.rb +182 -60
- data/lib/contrast/components/heap_dump.rb +77 -12
- data/lib/contrast/components/inventory.rb +37 -10
- data/lib/contrast/components/logger.rb +46 -76
- data/lib/contrast/components/polling.rb +36 -0
- data/lib/contrast/components/protect.rb +142 -16
- data/lib/contrast/components/ruby_component.rb +96 -0
- data/lib/contrast/components/sampling.rb +156 -15
- data/lib/contrast/components/scope.rb +116 -85
- data/lib/contrast/components/security_logger.rb +36 -0
- data/lib/contrast/components/settings.rb +197 -90
- data/lib/contrast/config/api_proxy_configuration.rb +27 -0
- data/lib/contrast/config/base_configuration.rb +20 -94
- data/lib/contrast/config/certification_configuration.rb +47 -0
- data/lib/contrast/config/config.rb +46 -0
- data/lib/contrast/config/diagnostics.rb +114 -0
- data/lib/contrast/config/diagnostics_tools.rb +98 -0
- data/lib/contrast/config/effective_config.rb +65 -0
- data/lib/contrast/config/effective_config_value.rb +32 -0
- data/lib/contrast/config/env_variables.rb +18 -0
- data/lib/contrast/config/exception_configuration.rb +34 -12
- data/lib/contrast/config/protect_rule_configuration.rb +45 -24
- data/lib/contrast/config/protect_rules_configuration.rb +97 -22
- data/lib/contrast/config/request_audit_configuration.rb +57 -0
- data/lib/contrast/config/server_configuration.rb +67 -15
- data/lib/contrast/config.rb +6 -22
- data/lib/contrast/configuration.rb +231 -108
- data/lib/contrast/extension/assess/array.rb +75 -0
- data/lib/contrast/extension/assess/erb.rb +61 -0
- data/lib/contrast/extension/assess/eval_trigger.rb +47 -0
- data/lib/contrast/{core_extensions → extension}/assess/exec_trigger.rb +9 -21
- data/lib/contrast/extension/assess/fiber.rb +95 -0
- data/lib/contrast/extension/assess/hash.rb +33 -0
- data/lib/contrast/extension/assess/kernel.rb +124 -0
- data/lib/contrast/extension/assess/marshal.rb +80 -0
- data/lib/contrast/extension/assess/regexp.rb +71 -0
- data/lib/contrast/extension/assess/string.rb +84 -0
- data/lib/contrast/extension/assess.rb +47 -0
- data/lib/contrast/{core_extensions → extension}/delegator.rb +3 -1
- data/lib/contrast/extension/extension.rb +59 -0
- data/lib/contrast/extension/inventory.rb +21 -0
- data/lib/contrast/extension/module.rb +16 -0
- data/lib/contrast/extension/object.rb +19 -0
- data/lib/contrast/extension/protect/psych.rb +7 -0
- data/lib/contrast/{core_extensions → extension}/protect.rb +6 -6
- data/lib/contrast/extension/thread.rb +50 -0
- data/lib/contrast/framework/base_support.rb +78 -0
- data/lib/contrast/framework/grape/support.rb +176 -0
- data/lib/contrast/framework/manager.rb +158 -0
- data/lib/contrast/framework/manager_extend.rb +50 -0
- data/lib/contrast/framework/rack/patch/session_cookie.rb +107 -0
- data/lib/contrast/framework/rack/patch/support.rb +26 -0
- data/lib/contrast/framework/rack/support.rb +23 -0
- data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +46 -0
- data/lib/contrast/framework/rails/patch/assess_configuration.rb +98 -0
- data/lib/contrast/framework/rails/patch/rails_application_configuration.rb +31 -0
- data/lib/contrast/framework/rails/patch/support.rb +46 -0
- data/lib/contrast/framework/rails/railtie.rb +33 -0
- data/lib/contrast/framework/rails/support.rb +187 -0
- data/lib/contrast/framework/sinatra/support.rb +165 -0
- data/lib/contrast/funchook/funchook.rb +45 -0
- data/lib/contrast/logger/aliased_logging.rb +101 -0
- data/lib/contrast/logger/application.rb +84 -0
- data/lib/contrast/logger/cef_log.rb +169 -0
- data/lib/contrast/logger/format.rb +61 -0
- data/lib/contrast/logger/log.rb +90 -0
- data/lib/contrast/logger/request.rb +25 -0
- data/lib/contrast/logger/time.rb +57 -0
- data/lib/contrast/security_exception.rb +2 -2
- data/lib/contrast/tasks/config.rb +144 -0
- data/lib/contrast/utils/assess/event_limit_utils.rb +134 -0
- data/lib/contrast/utils/assess/object_store.rb +36 -0
- data/lib/contrast/utils/assess/propagation_method_utils.rb +155 -0
- data/lib/contrast/utils/assess/property/tagged_utils.rb +165 -0
- data/lib/contrast/utils/assess/sampling_util.rb +11 -17
- data/lib/contrast/utils/assess/source_method_utils.rb +74 -0
- data/lib/contrast/utils/assess/split_utils.rb +23 -0
- data/lib/contrast/utils/assess/tracking_util.rb +95 -19
- data/lib/contrast/utils/assess/trigger_method_utils.rb +132 -0
- data/lib/contrast/utils/class_util.rb +125 -38
- data/lib/contrast/utils/duck_utils.rb +54 -43
- data/lib/contrast/utils/env_configuration_item.rb +4 -3
- data/lib/contrast/utils/findings.rb +66 -0
- data/lib/contrast/utils/hash_digest.rb +52 -100
- data/lib/contrast/utils/hash_digest_extend.rb +129 -0
- data/lib/contrast/utils/head_dump_utils_extend.rb +74 -0
- data/lib/contrast/utils/heap_dump_util.rb +44 -88
- data/lib/contrast/utils/input_classification_base.rb +155 -0
- data/lib/contrast/utils/invalid_configuration_util.rb +36 -50
- data/lib/contrast/utils/io_util.rb +47 -51
- data/lib/contrast/utils/job_servers_running.rb +47 -0
- data/lib/contrast/utils/log_utils.rb +254 -0
- data/lib/contrast/utils/lru_cache.rb +48 -0
- data/lib/contrast/utils/metrics_hash.rb +59 -0
- data/lib/contrast/utils/middleware_utils.rb +89 -0
- data/lib/contrast/utils/net_http_base.rb +167 -0
- data/lib/contrast/utils/object_share.rb +7 -48
- data/lib/contrast/utils/os.rb +14 -24
- data/lib/contrast/utils/patching/policy/patch_utils.rb +175 -0
- data/lib/contrast/utils/patching/policy/patcher_utils.rb +54 -0
- data/lib/contrast/utils/reporting/application_activity_batch_utils.rb +81 -0
- data/lib/contrast/utils/request_utils.rb +96 -0
- data/lib/contrast/utils/resource_loader.rb +2 -2
- data/lib/contrast/utils/response_utils.rb +79 -0
- data/lib/contrast/utils/routes_sent.rb +60 -0
- data/lib/contrast/utils/sha256_builder.rb +9 -21
- data/lib/contrast/utils/stack_trace_utils.rb +68 -184
- data/lib/contrast/utils/string_utils.rb +82 -52
- data/lib/contrast/utils/tag_util.rb +58 -44
- data/lib/contrast/utils/telemetry.rb +103 -0
- data/lib/contrast/utils/telemetry_client.rb +107 -0
- data/lib/contrast/utils/telemetry_hash.rb +65 -0
- data/lib/contrast/utils/telemetry_identifier.rb +153 -0
- data/lib/contrast/utils/thread_tracker.rb +27 -23
- data/lib/contrast/utils/timer.rb +20 -55
- data/lib/contrast-agent.rb +2 -2
- data/lib/contrast.rb +105 -43
- data/resources/assess/policy.json +523 -137
- data/resources/deadzone/policy.json +280 -10
- data/resources/inventory/policy.json +2 -2
- data/resources/protect/policy.json +30 -17
- data/ruby-agent.gemspec +114 -45
- data/sonar-project.properties +9 -0
- metadata +694 -287
- data/exe/contrast_service +0 -29
- data/ext/cs__assess_active_record_named/cs__active_record_named.c +0 -47
- data/ext/cs__assess_active_record_named/cs__active_record_named.h +0 -10
- data/ext/cs__assess_active_record_named/extconf.rb +0 -2
- data/ext/cs__assess_regexp_track/cs__assess_regexp_track.c +0 -63
- data/ext/cs__assess_regexp_track/cs__assess_regexp_track.h +0 -29
- data/ext/cs__assess_regexp_track/extconf.rb +0 -2
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +0 -31
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.h +0 -13
- data/ext/cs__assess_string_interpolation26/extconf.rb +0 -2
- data/ext/cs__protect_kernel/cs__protect_kernel.c +0 -37
- data/ext/cs__protect_kernel/cs__protect_kernel.h +0 -11
- data/ext/cs__protect_kernel/extconf.rb +0 -2
- data/funchook/Makefile +0 -29
- data/funchook/autom4te.cache/output.0 +0 -4976
- data/funchook/autom4te.cache/requests +0 -78
- data/funchook/autom4te.cache/traces.0 +0 -364
- data/funchook/config.log +0 -490
- data/funchook/config.status +0 -1016
- data/funchook/configure +0 -4976
- data/funchook/src/Makefile +0 -70
- data/funchook/src/config.h +0 -101
- data/funchook/src/config.h.in +0 -100
- data/funchook/src/decoder.o +0 -0
- data/funchook/src/distorm.o +0 -0
- data/funchook/src/funchook.o +0 -0
- data/funchook/src/funchook_io.o +0 -0
- data/funchook/src/funchook_syscall.o +0 -0
- data/funchook/src/funchook_unix.o +0 -0
- data/funchook/src/funchook_x86.o +0 -0
- data/funchook/src/instructions.o +0 -0
- data/funchook/src/insts.o +0 -0
- data/funchook/src/libfunchook.so +0 -0
- data/funchook/src/mnemonics.o +0 -0
- data/funchook/src/operands.o +0 -0
- data/funchook/src/os_func.o +0 -0
- data/funchook/src/os_func_unix.o +0 -0
- data/funchook/src/prefix.o +0 -0
- data/funchook/src/printf_base.o +0 -0
- data/funchook/src/textdefs.o +0 -0
- data/funchook/src/wstring.o +0 -0
- data/funchook/test/Makefile +0 -43
- data/funchook/test/funchook_test +0 -0
- data/funchook/test/libfunchook_test.so +0 -0
- data/funchook/test/test_main.o +0 -0
- data/funchook/test/x86_64_test.o +0 -0
- data/lib/contrast/agent/assess/adjusted_span.rb +0 -25
- data/lib/contrast/agent/assess/class_reverter.rb +0 -82
- data/lib/contrast/agent/assess/contrast_event.rb +0 -398
- data/lib/contrast/agent/assess/frozen_properties.rb +0 -41
- data/lib/contrast/agent/assess/insulator.rb +0 -53
- data/lib/contrast/agent/assess/policy/rewriter_patch.rb +0 -79
- data/lib/contrast/agent/assess/rule/base.rb +0 -72
- data/lib/contrast/agent/assess/rule/csrf/csrf_action.rb +0 -28
- data/lib/contrast/agent/assess/rule/csrf/csrf_applicator.rb +0 -69
- data/lib/contrast/agent/assess/rule/csrf/csrf_watcher.rb +0 -132
- data/lib/contrast/agent/assess/rule/csrf.rb +0 -66
- data/lib/contrast/agent/assess/rule/redos.rb +0 -68
- data/lib/contrast/agent/assess/rule/response_scanning_rule.rb +0 -47
- data/lib/contrast/agent/assess/rule/response_watcher.rb +0 -36
- data/lib/contrast/agent/assess/rule/watcher.rb +0 -36
- data/lib/contrast/agent/assess/rule.rb +0 -18
- data/lib/contrast/agent/class_reopener.rb +0 -195
- data/lib/contrast/agent/feature_state.rb +0 -379
- data/lib/contrast/agent/logger_manager.rb +0 -116
- data/lib/contrast/agent/patching/policy/policy_unpatcher.rb +0 -28
- data/lib/contrast/agent/protect/rule/csrf/csrf_evaluator.rb +0 -103
- data/lib/contrast/agent/protect/rule/csrf/csrf_token_injector.rb +0 -85
- data/lib/contrast/agent/protect/rule/csrf.rb +0 -118
- data/lib/contrast/agent/railtie.rb +0 -30
- data/lib/contrast/agent/reaction_processor.rb +0 -47
- data/lib/contrast/agent/require_state.rb +0 -61
- data/lib/contrast/agent/rewriter.rb +0 -244
- data/lib/contrast/agent/service_heartbeat.rb +0 -37
- data/lib/contrast/agent/settings_state.rb +0 -148
- data/lib/contrast/agent/socket_client.rb +0 -125
- data/lib/contrast/api/connection_status.rb +0 -49
- data/lib/contrast/api/dtm_pb.rb +0 -718
- data/lib/contrast/api/settings_pb.rb +0 -416
- data/lib/contrast/api/socket.rb +0 -43
- data/lib/contrast/api/speedracer.rb +0 -206
- data/lib/contrast/api/tcp_socket.rb +0 -31
- data/lib/contrast/api/unix_socket.rb +0 -25
- data/lib/contrast/api.rb +0 -17
- data/lib/contrast/common_agent_configuration.rb +0 -86
- data/lib/contrast/components/contrast_service.rb +0 -113
- data/lib/contrast/components/interface.rb +0 -178
- data/lib/contrast/config/agent_configuration.rb +0 -24
- data/lib/contrast/config/application_configuration.rb +0 -27
- data/lib/contrast/config/assess_configuration.rb +0 -22
- data/lib/contrast/config/assess_rules_configuration.rb +0 -18
- data/lib/contrast/config/default_value.rb +0 -16
- data/lib/contrast/config/heap_dump_configuration.rb +0 -23
- data/lib/contrast/config/inventory_configuration.rb +0 -20
- data/lib/contrast/config/logger_configuration.rb +0 -20
- data/lib/contrast/config/protect_configuration.rb +0 -20
- data/lib/contrast/config/root_configuration.rb +0 -26
- data/lib/contrast/config/ruby_configuration.rb +0 -39
- data/lib/contrast/config/sampling_configuration.rb +0 -22
- data/lib/contrast/config/service_configuration.rb +0 -22
- data/lib/contrast/core_extensions/assess/array.rb +0 -58
- data/lib/contrast/core_extensions/assess/assess_extension.rb +0 -145
- data/lib/contrast/core_extensions/assess/basic_object.rb +0 -15
- data/lib/contrast/core_extensions/assess/erb.rb +0 -42
- data/lib/contrast/core_extensions/assess/fiber.rb +0 -125
- data/lib/contrast/core_extensions/assess/hash.rb +0 -22
- data/lib/contrast/core_extensions/assess/kernel.rb +0 -95
- data/lib/contrast/core_extensions/assess/module.rb +0 -14
- data/lib/contrast/core_extensions/assess/regexp.rb +0 -206
- data/lib/contrast/core_extensions/assess/string.rb +0 -75
- data/lib/contrast/core_extensions/assess/tilt_template_trigger.rb +0 -73
- data/lib/contrast/core_extensions/assess.rb +0 -51
- data/lib/contrast/core_extensions/eval_trigger.rb +0 -52
- data/lib/contrast/core_extensions/inventory/datastores.rb +0 -37
- data/lib/contrast/core_extensions/inventory.rb +0 -22
- data/lib/contrast/core_extensions/module.rb +0 -42
- data/lib/contrast/core_extensions/object.rb +0 -27
- data/lib/contrast/core_extensions/protect/applies_command_injection_rule.rb +0 -70
- data/lib/contrast/core_extensions/protect/applies_deserialization_rule.rb +0 -58
- data/lib/contrast/core_extensions/protect/applies_no_sqli_rule.rb +0 -81
- data/lib/contrast/core_extensions/protect/applies_path_traversal_rule.rb +0 -119
- data/lib/contrast/core_extensions/protect/applies_sqli_rule.rb +0 -63
- data/lib/contrast/core_extensions/protect/applies_xxe_rule.rb +0 -141
- data/lib/contrast/core_extensions/protect/kernel.rb +0 -30
- data/lib/contrast/core_extensions/protect/psych.rb +0 -7
- data/lib/contrast/core_extensions/thread.rb +0 -31
- data/lib/contrast/internal_exception.rb +0 -8
- data/lib/contrast/rails_extensions/assess/action_controller_inheritance.rb +0 -48
- data/lib/contrast/rails_extensions/assess/active_record.rb +0 -32
- data/lib/contrast/rails_extensions/assess/active_record_named.rb +0 -61
- data/lib/contrast/rails_extensions/assess/configuration.rb +0 -26
- data/lib/contrast/rails_extensions/buffer.rb +0 -30
- data/lib/contrast/rails_extensions/rack.rb +0 -45
- data/lib/contrast/sinatra_extensions/assess/cookie.rb +0 -26
- data/lib/contrast/sinatra_extensions/inventory/sinatra_base.rb +0 -59
- data/lib/contrast/tasks/service.rb +0 -95
- data/lib/contrast/utils/boolean_util.rb +0 -33
- data/lib/contrast/utils/cache.rb +0 -69
- data/lib/contrast/utils/comment_range.rb +0 -19
- data/lib/contrast/utils/data_store_util.rb +0 -23
- data/lib/contrast/utils/environment_util.rb +0 -152
- data/lib/contrast/utils/freeze_util.rb +0 -36
- data/lib/contrast/utils/gemfile_reader.rb +0 -191
- data/lib/contrast/utils/inventory_util.rb +0 -126
- data/lib/contrast/utils/operating_environment.rb +0 -38
- data/lib/contrast/utils/path_util.rb +0 -151
- data/lib/contrast/utils/performs_logging.rb +0 -152
- data/lib/contrast/utils/preflight_util.rb +0 -13
- data/lib/contrast/utils/prevent_serialization.rb +0 -52
- data/lib/contrast/utils/rack_assess_session_cookie.rb +0 -104
- data/lib/contrast/utils/rails_assess_configuration.rb +0 -95
- data/lib/contrast/utils/random_util.rb +0 -22
- data/lib/contrast/utils/ruby_ast_rewriter.rb +0 -74
- data/lib/contrast/utils/scope_util.rb +0 -99
- data/lib/contrast/utils/service_response_util.rb +0 -116
- data/lib/contrast/utils/service_sender_util.rb +0 -98
- data/lib/contrast/utils/sinatra_helper.rb +0 -49
- data/resources/csrf/inject.js +0 -44
- data/resources/factory-bot-spec/spec_helper.rb +0 -30
- data/resources/rubocops/kernel/catch_cop.rb +0 -37
- data/resources/rubocops/kernel/require_cop.rb +0 -37
- data/resources/rubocops/kernel/require_relative_cop.rb +0 -33
- data/resources/rubocops/module/autoload_cop.rb +0 -37
- data/resources/rubocops/module/const_defined_cop.rb +0 -37
- data/resources/rubocops/module/const_get_cop.rb +0 -37
- data/resources/rubocops/module/const_set_cop.rb +0 -37
- data/resources/rubocops/module/constants_cop.rb +0 -37
- data/resources/rubocops/module/name_cop.rb +0 -37
- data/resources/rubocops/object/class_cop.rb +0 -37
- data/resources/rubocops/object/freeze_cop.rb +0 -37
- data/resources/rubocops/object/frozen_cop.rb +0 -37
- data/resources/rubocops/object/is_a_cop.rb +0 -37
- data/resources/rubocops/object/method_cop.rb +0 -37
- data/resources/rubocops/object/respond_to_cop.rb +0 -37
- data/resources/rubocops/object/singleton_class_cop.rb +0 -37
- data/resources/rubocops/regexp/spelling_cop.rb +0 -44
- data/resources/rubocops/thread/new_cop.rb +0 -39
- data/resources/ruby-spec/ancestors_spec.rb +0 -70
- data/resources/ruby-spec/modulo_spec.rb +0 -831
- data/resources/ruby-spec/parameters_spec.rb +0 -261
- data/resources/ruby-spec/ruby_spec_spec_helper.rb +0 -35
- 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
- data/shared_libraries/funchook.h +0 -123
- data/shared_libraries/libfunchook.so +0 -0
@@ -1,8 +1,9 @@
|
|
1
|
-
/* Copyright (c)
|
1
|
+
/* Copyright (c) 2022 Contrast Security, Inc. See
|
2
2
|
* https://www.contrastsecurity.com/enduser-terms-0317a for more details. */
|
3
3
|
|
4
4
|
#include "cs__contrast_patch.h"
|
5
5
|
#include "../cs__common/cs__common.h"
|
6
|
+
#include "../cs__scope/cs__scope.h"
|
6
7
|
#include <ruby.h>
|
7
8
|
|
8
9
|
VALUE build_preshift(const VALUE method_policy, const VALUE object,
|
@@ -28,22 +29,35 @@ VALUE contrast_patch_call_original(const VALUE *args) {
|
|
28
29
|
int argc;
|
29
30
|
VALUE method, method_id, object;
|
30
31
|
VALUE *params;
|
31
|
-
|
32
|
-
|
32
|
+
argc = NUM2INT(args[0]);
|
33
|
+
params = (VALUE *)args[1];
|
34
|
+
object = args[2];
|
35
|
+
method = args[3];
|
33
36
|
method_id = SYM2ID(method);
|
34
|
-
argc = NUM2INT(args[2]);
|
35
|
-
params = (VALUE *)args[3];
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
/* It looks like we can find the last Ruby block given so long as we don't
|
39
|
+
* change Ruby method scope (always call this function from C, not Ruby),
|
40
|
+
* which is the point of this C call.
|
41
|
+
*/
|
42
|
+
/* Ruby >= 2.7 */
|
43
|
+
#ifdef RB_PASS_CALLED_KEYWORDS
|
44
|
+
if (rb_block_given_p()) {
|
45
|
+
return rb_funcall_with_block_kw(object, method_id, argc, params,
|
46
|
+
rb_block_proc(),
|
47
|
+
RB_PASS_CALLED_KEYWORDS);
|
48
|
+
} else {
|
49
|
+
return rb_funcallv_kw(object, method_id, argc, params,
|
50
|
+
RB_PASS_CALLED_KEYWORDS);
|
51
|
+
}
|
52
|
+
/* Ruby < 2.7 */
|
53
|
+
#else
|
41
54
|
if (rb_block_given_p()) {
|
42
55
|
return rb_funcall_with_block(object, method_id, argc, params,
|
43
56
|
rb_block_proc());
|
44
57
|
} else {
|
45
58
|
return rb_funcall2(object, method_id, argc, params);
|
46
59
|
}
|
60
|
+
#endif
|
47
61
|
}
|
48
62
|
|
49
63
|
VALUE contrast_call_pre_patch(const VALUE method_policy, const VALUE method,
|
@@ -75,15 +89,33 @@ VALUE contrast_call_post_patch(const VALUE method_policy, const VALUE preshift,
|
|
75
89
|
method_policy, preshift, object, ret, send, block);
|
76
90
|
}
|
77
91
|
|
78
|
-
|
79
|
-
|
80
|
-
VALUE exception
|
81
|
-
VALUE *argv;
|
82
|
-
|
92
|
+
/* wrap rb_ensure so we can rescue an exception */
|
93
|
+
VALUE rescue_func(VALUE arg1) {
|
94
|
+
VALUE exception;
|
83
95
|
/* rb_errinfo() gives the value of $!, the exception that
|
84
96
|
* triggered a rescue block.
|
85
97
|
*/
|
86
98
|
exception = rb_errinfo();
|
99
|
+
rb_exc_raise(exception);
|
100
|
+
|
101
|
+
return Qnil;
|
102
|
+
}
|
103
|
+
|
104
|
+
/**
|
105
|
+
* In the event that the original_method call throws an exception we need to ensure that contrast_post_patch is called
|
106
|
+
* to report that error. However, if there is no error we will call post_patch with the original_return instead of
|
107
|
+
* Qnil.
|
108
|
+
*
|
109
|
+
**/
|
110
|
+
VALUE contrast_patch_call_ensure(const VALUE *args) {
|
111
|
+
// we do not need to ensure that post patch is called if no error was thrown
|
112
|
+
if(!RTEST(rb_errinfo())) {
|
113
|
+
return Qnil;
|
114
|
+
}
|
115
|
+
|
116
|
+
int argc;
|
117
|
+
VALUE object, preshift, method_policy, method;
|
118
|
+
VALUE *argv;
|
87
119
|
|
88
120
|
object = args[0];
|
89
121
|
method = args[1];
|
@@ -94,29 +126,137 @@ VALUE contrast_patch_call_rescue(const VALUE *args) {
|
|
94
126
|
|
95
127
|
contrast_call_post_patch(method_policy, preshift, object, Qnil, argc, argv);
|
96
128
|
|
97
|
-
|
98
|
-
|
129
|
+
return Qnil;
|
130
|
+
}
|
99
131
|
|
100
|
-
|
101
|
-
|
132
|
+
VALUE ensure_wrapper(const VALUE *args) {
|
133
|
+
VALUE original_method, original_args, ensure_args;
|
102
134
|
|
103
|
-
|
135
|
+
original_method = args[0];
|
136
|
+
original_args = (VALUE)args[1];
|
137
|
+
ensure_args = (VALUE)args[2];
|
138
|
+
|
139
|
+
//this ensure if being treated as a rescue due to issues surrounding Kernel#throw
|
140
|
+
return rb_ensure(original_method, original_args, contrast_patch_call_ensure,
|
141
|
+
(VALUE)ensure_args);
|
104
142
|
}
|
105
143
|
|
106
144
|
VALUE contrast_call_super(const VALUE *args) {
|
107
|
-
int argc
|
108
|
-
VALUE *argv
|
145
|
+
int argc;
|
146
|
+
VALUE *argv;
|
147
|
+
argc = NUM2INT(args[0]);
|
148
|
+
argv = (VALUE *)args[1];
|
109
149
|
|
110
150
|
return rb_call_super(argc, argv);
|
111
151
|
}
|
112
152
|
|
153
|
+
VALUE contrast_run_patches(const VALUE *wrapped_args) {
|
154
|
+
VALUE impl, method, method_policy, object, original_args, original_ret,
|
155
|
+
preshift, transformed_ret;
|
156
|
+
int argc;
|
157
|
+
VALUE *argv;
|
158
|
+
VALUE ensure_args[6];
|
159
|
+
VALUE rescue_wrapper_args[3];
|
160
|
+
|
161
|
+
impl = wrapped_args[0];
|
162
|
+
original_args = wrapped_args[1];
|
163
|
+
method = wrapped_args[2];
|
164
|
+
method_policy = wrapped_args[3];
|
165
|
+
object = wrapped_args[4];
|
166
|
+
argc = NUM2INT(wrapped_args[5]);
|
167
|
+
argv = (VALUE *)wrapped_args[6];
|
168
|
+
|
169
|
+
rescue_wrapper_args[0] = contrast_patch_call_original;
|
170
|
+
rescue_wrapper_args[1] = original_args;
|
171
|
+
rescue_wrapper_args[2] = ensure_args;
|
172
|
+
|
173
|
+
ensure_args[0] = object;
|
174
|
+
ensure_args[1] = method;
|
175
|
+
ensure_args[2] = INT2NUM(argc);
|
176
|
+
ensure_args[3] = (VALUE)argv;
|
177
|
+
ensure_args[4] = method_policy;
|
178
|
+
|
179
|
+
/* Tracking, triggering, and propagation here. */
|
180
|
+
contrast_call_pre_patch(method_policy, method, object, argc, argv, Qnil);
|
181
|
+
|
182
|
+
/* Capture pre-call state */
|
183
|
+
preshift = build_preshift(method_policy, object, argc, argv);
|
184
|
+
ensure_args[5] = preshift;
|
185
|
+
|
186
|
+
/* We wrap a call to the original method with a rescue block, and we use
|
187
|
+
* rb_rescue2 to capture all Exception-inheriting exceptions (and if your
|
188
|
+
* software is well-behaved, all exceptions should inherit from Exception.)
|
189
|
+
*
|
190
|
+
* The rescue block is responsible for doing Contrast post-call analysis
|
191
|
+
* in the event the original method has thrown an exception.
|
192
|
+
*
|
193
|
+
* EDGE CASES:
|
194
|
+
* Given how extensively we patch and instrument, this code is
|
195
|
+
* prone to some esoteric edge cases that are not well-documented or
|
196
|
+
* easy to research.
|
197
|
+
*
|
198
|
+
* There is an esoteric edge case in core Ruby, upon Thread#kill, where
|
199
|
+
* it raises Fixnum 8 (Qnil==8). This is an intentional choice on the
|
200
|
+
* part of the core Ruby devs, as blindly rescuing Thread#kill would be
|
201
|
+
* disastrous.
|
202
|
+
* A consequence of this is that Thread#kill will leak scope, if you
|
203
|
+
* happen to ever instrument it.
|
204
|
+
*
|
205
|
+
* If you are within a catch block, and the original function results
|
206
|
+
* in a throw, you will leak scope. We handle this by not instrumenting
|
207
|
+
* methods that do that. (Tracked in RUBY-552.)
|
208
|
+
*
|
209
|
+
* If you're thinking of cleaning this up by using rb_protect,
|
210
|
+
* you will catch ALL exceptions, as well as ANYTHING
|
211
|
+
* else that unwinds the stack. This includes fiber context switches
|
212
|
+
* (which are used to implement Enumerator#next) and catch/throw blocks.
|
213
|
+
* I spent a week debugging that so you don't have to. -ajm
|
214
|
+
*/
|
215
|
+
|
216
|
+
switch (impl) {
|
217
|
+
case IMPL_ALIAS_INSTANCE:
|
218
|
+
case IMPL_ALIAS_SINGLETON:
|
219
|
+
original_ret =
|
220
|
+
rb_rescue(ensure_wrapper, rescue_wrapper_args, rescue_func, Qnil);
|
221
|
+
break;
|
222
|
+
case IMPL_PREPEND_INSTANCE:
|
223
|
+
case IMPL_PREPEND_SINGLETON:
|
224
|
+
rescue_wrapper_args[0] = contrast_call_super;
|
225
|
+
original_ret =
|
226
|
+
rb_rescue(ensure_wrapper, rescue_wrapper_args, rescue_func, Qnil);
|
227
|
+
break;
|
228
|
+
};
|
229
|
+
|
230
|
+
/* If you're here, the original method did not throw an exception
|
231
|
+
* (or unwind the stack otherwise).
|
232
|
+
* If the original method threw an exception, contrast_patch_call_rescue
|
233
|
+
* re-raises the original exception, which unwinds the stack back to the
|
234
|
+
* call site. This means the rest of this function is not executed.
|
235
|
+
* post_patch is called in the ensure_wrapper on exception. rb_rescue
|
236
|
+
* raises the exception so the below will not be executed in that event.
|
237
|
+
*/
|
238
|
+
|
239
|
+
/* Invoke Contrast post-call patching. */
|
240
|
+
contrast_call_post_patch(method_policy, preshift, object,
|
241
|
+
original_ret, argc, argv);
|
242
|
+
|
243
|
+
return original_ret;
|
244
|
+
}
|
245
|
+
|
246
|
+
VALUE contrast_ensure_function(const VALUE method_policy) {
|
247
|
+
/* exit scope */
|
248
|
+
VALUE scopes = rb_funcall(method_policy, rb_sym_scopes_to_exit, 0);
|
249
|
+
|
250
|
+
inst_methods_exit_method_scope(contrast_patcher(), scopes);
|
251
|
+
inst_methods_exit_cntr_scope(contrast_patcher(), 0);
|
252
|
+
|
253
|
+
return Qnil;
|
254
|
+
}
|
255
|
+
|
113
256
|
VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
|
114
257
|
const patch_impl impl, const VALUE object) {
|
115
|
-
VALUE cs__method, known, method,
|
116
|
-
method_policy, preshift;
|
258
|
+
VALUE cs__method, known, method, method_policy;
|
117
259
|
VALUE original_args[4];
|
118
|
-
VALUE rescue_args[7];
|
119
|
-
|
120
260
|
int do_contrast, nested_scope;
|
121
261
|
|
122
262
|
/* Do Contrast analysis, unless our subsequent checks tell us no. */
|
@@ -128,10 +268,10 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
|
|
128
268
|
* which is unnecessary, or run Contrast analysis on Contrast code,
|
129
269
|
* which will never terminate.
|
130
270
|
*/
|
131
|
-
nested_scope =
|
271
|
+
nested_scope = inst_methods_in_cntr_scope(contrast_patcher(), 0);
|
132
272
|
|
133
273
|
/* enter scope */
|
134
|
-
|
274
|
+
inst_methods_enter_cntr_scope(contrast_patcher(), 0);
|
135
275
|
|
136
276
|
/* Get the name of the calling method */
|
137
277
|
method = rb_funcall(object, rb_sym_method, 0);
|
@@ -141,10 +281,14 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
|
|
141
281
|
*/
|
142
282
|
switch (impl) {
|
143
283
|
case IMPL_ALIAS_INSTANCE:
|
144
|
-
case
|
284
|
+
case IMPL_PREPEND_INSTANCE:
|
145
285
|
known =
|
146
286
|
rb_funcall(patch_status, rb_sym_info_for, 3, object, method, Qtrue);
|
147
287
|
break;
|
288
|
+
case IMPL_PREPEND_SINGLETON:
|
289
|
+
known = rb_funcall(patch_status, rb_sym_info_for, 3, object, method,
|
290
|
+
Qfalse);
|
291
|
+
break;
|
148
292
|
case IMPL_ALIAS_SINGLETON:
|
149
293
|
known = rb_funcall(patch_status, rb_sym_info_for, 3, object, method,
|
150
294
|
Qfalse);
|
@@ -158,6 +302,22 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
|
|
158
302
|
method_policy = Qnil;
|
159
303
|
}
|
160
304
|
|
305
|
+
/* Check conditions for not doing Contrast analysis */
|
306
|
+
if (nested_scope == Qtrue) {
|
307
|
+
/* if we were in scope */
|
308
|
+
do_contrast = 0;
|
309
|
+
} else if (!RTEST(known)) {
|
310
|
+
/* nothing to be done with entirely unknown method*/
|
311
|
+
do_contrast = 0;
|
312
|
+
} else if (!RTEST(method_policy)) {
|
313
|
+
/* nothing to be done without a method policy */
|
314
|
+
do_contrast = 0;
|
315
|
+
}
|
316
|
+
|
317
|
+
original_args[0] = INT2NUM(argc);
|
318
|
+
original_args[1] = (VALUE)argv;
|
319
|
+
original_args[2] = object;
|
320
|
+
|
161
321
|
if (impl == IMPL_ALIAS_INSTANCE || impl == IMPL_ALIAS_SINGLETON) {
|
162
322
|
/* Alias patching moves the original method to "cs__#{method}" */
|
163
323
|
cs__method = rb_funcall(known, rb_sym_brackets, 1, INT2NUM(1));
|
@@ -168,140 +328,43 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
|
|
168
328
|
rb_funcall(contrast_patcher(), rb_sym_build_method_name, 2,
|
169
329
|
object, method);
|
170
330
|
}
|
331
|
+
original_args[3] = cs__method;
|
171
332
|
}
|
172
333
|
|
173
|
-
/*
|
174
|
-
|
175
|
-
/* if we were in scope */
|
176
|
-
do_contrast = 0;
|
177
|
-
} else if (!RTEST(known)) {
|
178
|
-
/* nothing to be done with entirely unknown method*/
|
179
|
-
do_contrast = 0;
|
180
|
-
} else if (!RTEST(method_policy)) {
|
181
|
-
/* nothing to be done without a method policy */
|
182
|
-
do_contrast = 0;
|
183
|
-
} else if (!RTEST(rb_funcall(contrast_patcher(), rb_sym_in_request_context,
|
184
|
-
0))) {
|
185
|
-
/* (RUBY-290, checking for a request_context is to be deprecated)
|
186
|
-
* if we're not within a request context, don't analyze (by fiat)
|
187
|
-
* We reset scope at the end of request contexts right now, don't remove
|
188
|
-
* this check without also handling that code.
|
189
|
-
*/
|
190
|
-
do_contrast = 0;
|
191
|
-
}
|
334
|
+
/* Enter any scopes specific to method policy */
|
335
|
+
VALUE scopes = rb_funcall(method_policy, rb_sym_scopes_to_enter, 0);
|
192
336
|
|
193
|
-
|
194
|
-
case IMPL_ALIAS_INSTANCE:
|
195
|
-
case IMPL_ALIAS_SINGLETON:
|
196
|
-
original_args[0] = object;
|
197
|
-
original_args[1] = cs__method;
|
198
|
-
original_args[2] = INT2NUM(argc);
|
199
|
-
original_args[3] = (VALUE)argv;
|
200
|
-
break;
|
201
|
-
case IMPL_PREPEND:
|
202
|
-
original_args[0] = INT2NUM(argc);
|
203
|
-
original_args[1] = (VALUE)argv;
|
204
|
-
break;
|
205
|
-
}
|
337
|
+
inst_methods_enter_method_scope(contrast_patcher(), scopes);
|
206
338
|
|
207
339
|
/* If we're not doing Contrast analysis, exit scope and treat as normal. */
|
208
340
|
if (!do_contrast) {
|
209
341
|
goto call_original;
|
210
342
|
}
|
211
343
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
/* Capture pre-call state */
|
222
|
-
preshift = build_preshift(method_policy, object, argc, argv);
|
223
|
-
rescue_args[5] = preshift;
|
224
|
-
|
225
|
-
/* We wrap a call to the original method with a rescue block, and we use
|
226
|
-
* rb_rescue2 to capture all Exception-inheriting exceptions (and if your
|
227
|
-
* software is well-behaved, all exceptions should inherit from Exception.)
|
228
|
-
*
|
229
|
-
* The rescue block is responsible for doing Contrast post-call analysis
|
230
|
-
* in the event the original method has thrown an exception.
|
231
|
-
*
|
232
|
-
* EDGE CASES:
|
233
|
-
* Given how extensively we patch and instrument, this code is
|
234
|
-
* prone to some esoteric edge cases that are not well-documented or
|
235
|
-
* easy to research.
|
236
|
-
*
|
237
|
-
* There is an esoteric edge case in core Ruby, upon Thread#kill, where
|
238
|
-
* it raises Fixnum 8 (Qnil==8). This is an intentional choice on the
|
239
|
-
* part of the core Ruby devs, as blindly rescuing Thread#kill would be
|
240
|
-
* disastrous.
|
241
|
-
* A consequence of this is that Thread#kill will leak scope, if you
|
242
|
-
* happen to ever instrument it.
|
243
|
-
*
|
244
|
-
* If you are within a catch block, and the original function results
|
245
|
-
* in a throw, you will leak scope. We handle this by not instrumenting
|
246
|
-
* methods that do that. (Tracked in RUBY-552.)
|
247
|
-
*
|
248
|
-
* If you're thinking of cleaning this up by using rb_protect,
|
249
|
-
* you will catch ALL exceptions, as well as ANYTHING
|
250
|
-
* else that unwinds the stack. This includes fiber context switches
|
251
|
-
* (which are used to implement Enumerator#next) and catch/throw blocks.
|
252
|
-
* I spent a week debugging that so you don't have to. -ajm
|
253
|
-
*/
|
254
|
-
|
255
|
-
switch (impl) {
|
256
|
-
case IMPL_ALIAS_INSTANCE:
|
257
|
-
case IMPL_ALIAS_SINGLETON:
|
258
|
-
original_ret = rb_rescue2(
|
259
|
-
contrast_patch_call_original, (VALUE)original_args,
|
260
|
-
contrast_patch_call_rescue, (VALUE)rescue_args, rb_eException, 0);
|
261
|
-
break;
|
262
|
-
case IMPL_PREPEND:
|
263
|
-
original_ret = rb_rescue2(contrast_call_super, (VALUE)original_args,
|
264
|
-
contrast_patch_call_rescue,
|
265
|
-
(VALUE)rescue_args, rb_eException, 0);
|
266
|
-
break;
|
267
|
-
};
|
268
|
-
|
269
|
-
/* If you're here, the original method did not throw an exception
|
270
|
-
* (or unwind the stack otherwise).
|
271
|
-
* If the original method threw an exception, contrast_patch_call_rescue
|
272
|
-
* re-raises the original exception, which unwinds the stack back to the
|
273
|
-
* call site. This means the rest of this function is not executed.
|
274
|
-
*/
|
275
|
-
|
276
|
-
/* Invoke Contrast post-call patching.
|
277
|
-
* Post-call patching may transform the return value,
|
278
|
-
* hence the assignment.
|
279
|
-
*/
|
280
|
-
transformed_ret = contrast_call_post_patch(method_policy, preshift, object,
|
281
|
-
original_ret, argc, argv);
|
282
|
-
|
283
|
-
/* Special case for tracking frozen sources */
|
284
|
-
if (transformed_ret != Qnil) {
|
285
|
-
ret = transformed_ret;
|
286
|
-
} else {
|
287
|
-
ret = original_ret;
|
288
|
-
}
|
289
|
-
|
290
|
-
/* exit scope */
|
291
|
-
rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
|
344
|
+
/* Otherwise, invoke Contrast analysis. */
|
345
|
+
VALUE wrapped_args[7];
|
346
|
+
wrapped_args[0] = impl;
|
347
|
+
wrapped_args[1] = (VALUE)original_args;
|
348
|
+
wrapped_args[2] = method;
|
349
|
+
wrapped_args[3] = method_policy;
|
350
|
+
wrapped_args[4] = object;
|
351
|
+
wrapped_args[5] = INT2NUM(argc);
|
352
|
+
wrapped_args[6] = (VALUE)argv;
|
292
353
|
|
293
|
-
return
|
354
|
+
return rb_ensure(contrast_run_patches, (VALUE)wrapped_args,
|
355
|
+
contrast_ensure_function, method_policy);
|
294
356
|
|
295
357
|
call_original:
|
296
358
|
|
297
359
|
/* exit scope */
|
298
|
-
|
360
|
+
contrast_ensure_function(method_policy);
|
299
361
|
|
300
362
|
switch (impl) {
|
301
363
|
case IMPL_ALIAS_INSTANCE:
|
302
364
|
case IMPL_ALIAS_SINGLETON:
|
303
365
|
return contrast_patch_call_original(original_args);
|
304
|
-
case
|
366
|
+
case IMPL_PREPEND_INSTANCE:
|
367
|
+
case IMPL_PREPEND_SINGLETON:
|
305
368
|
return contrast_call_super(original_args);
|
306
369
|
};
|
307
370
|
}
|
@@ -316,9 +379,14 @@ VALUE contrast_alias_singleton_patch(const int argc, const VALUE *argv,
|
|
316
379
|
return contrast_patch_dispatch(argc, argv, IMPL_ALIAS_SINGLETON, object);
|
317
380
|
}
|
318
381
|
|
319
|
-
VALUE
|
320
|
-
|
321
|
-
return contrast_patch_dispatch(argc, argv,
|
382
|
+
VALUE contrast_prepend_instance_patch(const int argc, const VALUE *argv,
|
383
|
+
const VALUE object) {
|
384
|
+
return contrast_patch_dispatch(argc, argv, IMPL_PREPEND_INSTANCE, object);
|
385
|
+
}
|
386
|
+
|
387
|
+
VALUE contrast_prepend_singleton_patch(const int argc, const VALUE *argv,
|
388
|
+
const VALUE object) {
|
389
|
+
return contrast_patch_dispatch(argc, argv, IMPL_PREPEND_SINGLETON, object);
|
322
390
|
}
|
323
391
|
|
324
392
|
VALUE contrast_patch_define_method(const VALUE self, const VALUE clazz,
|
@@ -330,8 +398,9 @@ VALUE contrast_patch_define_method(const VALUE self, const VALUE clazz,
|
|
330
398
|
rb_funcall(method_policy, rb_sym_instance_method, 0);
|
331
399
|
char *cStr;
|
332
400
|
VALUE str;
|
333
|
-
rb_funcall(patch_status, rb_sym_set_info_for, 5, clazz,
|
334
|
-
method_policy, is_instance_method,
|
401
|
+
rb_funcall(patch_status, rb_sym_set_info_for, 5, clazz,
|
402
|
+
original_method_name, method_policy, is_instance_method,
|
403
|
+
cs_method);
|
335
404
|
|
336
405
|
/* Some methods we patch rely on a specific C level patch,
|
337
406
|
* in those cases we should still add the method to the info_for hash
|
@@ -383,29 +452,57 @@ VALUE contrast_patch_define_method(const VALUE self, const VALUE clazz,
|
|
383
452
|
VALUE contrast_patch_prepend(const VALUE self, const VALUE originalModule,
|
384
453
|
const VALUE method_policy) {
|
385
454
|
|
455
|
+
const VALUE instance = Qtrue;
|
456
|
+
const VALUE singleton = Qfalse;
|
386
457
|
const VALUE original_method_name =
|
387
458
|
rb_funcall(method_policy, rb_sym_method_name, 0);
|
388
459
|
const VALUE is_private =
|
389
460
|
rb_funcall(method_policy, rb_sym_private_method, 0);
|
390
461
|
const VALUE is_instance_method =
|
391
462
|
rb_funcall(method_policy, rb_sym_instance_method, 0);
|
392
|
-
|
393
|
-
|
463
|
+
|
464
|
+
// Set the value for instance or singleton method
|
465
|
+
if (RTEST(is_instance_method)) {
|
466
|
+
rb_funcall(patch_status, rb_sym_set_info_for, 5, originalModule,
|
467
|
+
original_method_name, method_policy, instance, Qnil);
|
468
|
+
|
469
|
+
} else {
|
470
|
+
rb_funcall(patch_status, rb_sym_set_info_for, 5, originalModule,
|
471
|
+
original_method_name, method_policy, singleton, Qnil);
|
472
|
+
}
|
473
|
+
|
394
474
|
VALUE module = rb_define_module_under(originalModule, "ContrastPrepend");
|
395
475
|
VALUE str = rb_funcall(original_method_name, rb_sym_cs_to_s, 0);
|
396
476
|
char *cMethodName = StringValueCStr(str);
|
397
477
|
if (RTEST(is_instance_method)) {
|
398
478
|
if (RTEST(is_private)) {
|
399
479
|
rb_define_private_method(module, cMethodName,
|
400
|
-
|
480
|
+
contrast_prepend_instance_patch, -1);
|
401
481
|
} else {
|
402
|
-
rb_define_method(module, cMethodName,
|
482
|
+
rb_define_method(module, cMethodName,
|
483
|
+
contrast_prepend_instance_patch, -1);
|
403
484
|
}
|
404
485
|
} else {
|
405
|
-
rb_define_singleton_method(module, cMethodName,
|
406
|
-
-1);
|
486
|
+
rb_define_singleton_method(module, cMethodName,
|
487
|
+
contrast_prepend_singleton_patch, -1);
|
407
488
|
}
|
408
489
|
rb_prepend_module(originalModule, module);
|
490
|
+
|
491
|
+
if (rb_ver_below_three()) {
|
492
|
+
VALUE module_at;
|
493
|
+
VALUE rb_incl_in_mod_ary =
|
494
|
+
rb_funcall(originalModule, rb_intern("included_in"), 0);
|
495
|
+
if (RB_TYPE_P(rb_incl_in_mod_ary, T_ARRAY)) {
|
496
|
+
int i = 0;
|
497
|
+
int size = RARRAY_LEN(rb_incl_in_mod_ary);
|
498
|
+
for (i = 0; i < size; ++i) {
|
499
|
+
module_at = rb_ary_entry(rb_incl_in_mod_ary, i);
|
500
|
+
if (RB_TYPE_P(module_at, T_MODULE)) {
|
501
|
+
rb_include_module(module_at, module);
|
502
|
+
}
|
503
|
+
}
|
504
|
+
}
|
505
|
+
}
|
409
506
|
return Qtrue;
|
410
507
|
}
|
411
508
|
|
@@ -417,7 +514,6 @@ void Init_cs__contrast_patch(void) {
|
|
417
514
|
rb_sym_contrast_apply_pre_patch = rb_intern("apply_pre_patch");
|
418
515
|
rb_sym_cs_to_s = rb_intern("to_s");
|
419
516
|
rb_sym_custom_patch = rb_intern("requires_custom_patch?");
|
420
|
-
rb_sym_in_request_context = rb_intern("in_request_context?");
|
421
517
|
rb_sym_info_for = rb_intern("info_for");
|
422
518
|
rb_sym_propagation_node = rb_intern("propagation_node");
|
423
519
|
rb_sym_set_info_for = rb_intern("set_info_for");
|
@@ -430,6 +526,10 @@ void Init_cs__contrast_patch(void) {
|
|
430
526
|
rb_sym_instance_method = rb_intern("instance_method");
|
431
527
|
rb_sym_cs_singleton_class = rb_intern("cs__singleton_class");
|
432
528
|
|
529
|
+
rb_sym_enter_method_scope = rb_intern("enter_method_scope!");
|
530
|
+
rb_sym_exit_method_scope = rb_intern("exit_method_scope!");
|
531
|
+
rb_sym_scopes_to_enter = rb_intern("scopes_to_enter");
|
532
|
+
rb_sym_scopes_to_exit = rb_intern("scopes_to_exit");
|
433
533
|
|
434
534
|
rb_define_module_function(contrast_patcher(), "contrast_define_method",
|
435
535
|
contrast_patch_define_method, 3);
|
@@ -1,11 +1,6 @@
|
|
1
|
+
#include "../cs__common/cs__common.h"
|
1
2
|
#include <ruby.h>
|
2
3
|
|
3
|
-
typedef enum {
|
4
|
-
IMPL_ALIAS_INSTANCE,
|
5
|
-
IMPL_ALIAS_SINGLETON,
|
6
|
-
IMPL_PREPEND
|
7
|
-
} patch_impl;
|
8
|
-
|
9
4
|
/* Calls to Contrast modules */
|
10
5
|
/* Contrast::Agent::Patching::Policy::PatchStatus */
|
11
6
|
static VALUE patch_status;
|
@@ -21,7 +16,10 @@ static VALUE rb_sym_contrast_apply_pre_patch;
|
|
21
16
|
static VALUE rb_sym_custom_patch;
|
22
17
|
static VALUE rb_sym_cs_to_s;
|
23
18
|
|
24
|
-
static VALUE
|
19
|
+
static VALUE rb_sym_enter_method_scope;
|
20
|
+
static VALUE rb_sym_exit_method_scope;
|
21
|
+
static VALUE rb_sym_scopes_to_enter;
|
22
|
+
static VALUE rb_sym_scopes_to_exit;
|
25
23
|
|
26
24
|
static VALUE rb_sym_build_method_name;
|
27
25
|
static VALUE rb_sym_info_for;
|
@@ -142,8 +140,7 @@ VALUE contrast_call_super(const VALUE *args);
|
|
142
140
|
* instance (specifically for frozen sources)
|
143
141
|
*/
|
144
142
|
VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
|
145
|
-
const patch_impl impl,
|
146
|
-
const VALUE object);
|
143
|
+
const patch_impl impl, const VALUE object);
|
147
144
|
|
148
145
|
VALUE contrast_alias_instance_patch(const int argc, const VALUE *argv,
|
149
146
|
const VALUE object);
|
@@ -151,9 +148,11 @@ VALUE contrast_alias_instance_patch(const int argc, const VALUE *argv,
|
|
151
148
|
VALUE contrast_alias_singleton_patch(const int argc, const VALUE *argv,
|
152
149
|
const VALUE object);
|
153
150
|
|
151
|
+
VALUE contrast_prepend_instance_patch(const int argc, const VALUE *argv,
|
152
|
+
const VALUE object);
|
154
153
|
|
155
|
-
VALUE
|
156
|
-
|
154
|
+
VALUE contrast_prepend_singleton_patch(const int argc, const VALUE *argv,
|
155
|
+
const VALUE object);
|
157
156
|
|
158
157
|
/*
|
159
158
|
* Patches a module's method by prepend:
|
@@ -171,12 +170,12 @@ VALUE contrast_prepend_patch(const int argc, const VALUE *argv,
|
|
171
170
|
* - prepending Foo with Foo::ContrastPrepend
|
172
171
|
*
|
173
172
|
* originalModule - Module; the actual Module being prepended
|
174
|
-
* methodPolicy - :MethodPolicy; the method policy that apply to the method
|
173
|
+
* methodPolicy - :MethodPolicy; the method policy that apply to the method
|
174
|
+
* being redefined
|
175
175
|
*
|
176
176
|
* return - Boolean; if the prepend occurred or not
|
177
177
|
*/
|
178
|
-
VALUE contrast_patch_prepend(const VALUE self,
|
179
|
-
const VALUE originalModule,
|
178
|
+
VALUE contrast_patch_prepend(const VALUE self, const VALUE originalModule,
|
180
179
|
const VALUE methodPolicy);
|
181
180
|
|
182
181
|
/*
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/* Copyright (c) 2022 Contrast Security, Inc. See
|
2
|
+
* https://www.contrastsecurity.com/enduser-terms-0317a for more details. */
|
3
|
+
|
4
|
+
#include "cs__os_information.h"
|
5
|
+
#include <dlfcn.h>
|
6
|
+
#include <ruby.h>
|
7
|
+
#include <sys/utsname.h>
|
8
|
+
|
9
|
+
VALUE contrast, utils, os;
|
10
|
+
|
11
|
+
VALUE contrast_get_system_information() {
|
12
|
+
struct utsname uname_pointer;
|
13
|
+
|
14
|
+
uname(&uname_pointer);
|
15
|
+
|
16
|
+
VALUE rb_data_hash = rb_hash_new();
|
17
|
+
rb_hash_aset(rb_data_hash, rb_str_new2("os_type"),
|
18
|
+
rb_str_new2(uname_pointer.sysname));
|
19
|
+
rb_hash_aset(rb_data_hash, rb_str_new2("os_version"),
|
20
|
+
rb_str_new2(uname_pointer.release));
|
21
|
+
rb_hash_aset(rb_data_hash, rb_str_new2("os_complete_version"),
|
22
|
+
rb_str_new2(uname_pointer.version));
|
23
|
+
rb_hash_aset(rb_data_hash, rb_str_new2("os_arch"),
|
24
|
+
rb_str_new2(uname_pointer.machine));
|
25
|
+
return rb_data_hash;
|
26
|
+
}
|
27
|
+
|
28
|
+
void Init_cs__os_information(void) {
|
29
|
+
contrast = rb_define_module("Contrast");
|
30
|
+
utils = rb_define_module_under(contrast, "Utils");
|
31
|
+
os = rb_define_module_under(utils, "OS");
|
32
|
+
rb_define_module_function(os, "get_system_information",
|
33
|
+
contrast_get_system_information, 0);
|
34
|
+
}
|