contrast-agent 4.4.1 → 4.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +6 -1
- data/.gitmodules +1 -1
- data/.simplecov +2 -1
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/Rakefile +2 -3
- data/exe/contrast_service +1 -1
- data/ext/build_funchook.rb +4 -4
- data/ext/cs__assess_active_record_named/cs__active_record_named.c +1 -1
- data/ext/cs__assess_active_record_named/extconf.rb +1 -1
- data/ext/cs__assess_array/cs__assess_array.c +1 -1
- data/ext/cs__assess_array/extconf.rb +1 -1
- data/ext/cs__assess_basic_object/cs__assess_basic_object.c +1 -1
- data/ext/cs__assess_basic_object/extconf.rb +1 -1
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +1 -1
- data/ext/cs__assess_fiber_track/extconf.rb +1 -1
- data/ext/cs__assess_hash/cs__assess_hash.c +4 -2
- data/ext/cs__assess_hash/extconf.rb +1 -1
- data/ext/cs__assess_kernel/cs__assess_kernel.c +1 -1
- data/ext/cs__assess_kernel/extconf.rb +1 -1
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +1 -1
- data/ext/cs__assess_marshal_module/extconf.rb +1 -1
- data/ext/cs__assess_module/cs__assess_module.c +1 -1
- data/ext/cs__assess_module/extconf.rb +1 -1
- data/ext/cs__assess_regexp/cs__assess_regexp.c +1 -1
- data/ext/cs__assess_regexp/extconf.rb +1 -1
- data/ext/cs__assess_string/cs__assess_string.c +1 -1
- data/ext/cs__assess_string/extconf.rb +1 -1
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +1 -1
- data/ext/cs__assess_string_interpolation26/extconf.rb +1 -1
- data/ext/cs__assess_yield_track/cs__assess_yield_track.c +1 -1
- data/ext/cs__assess_yield_track/extconf.rb +1 -1
- data/ext/cs__common/cs__common.c +5 -5
- data/ext/cs__common/cs__common.h +4 -4
- data/ext/cs__common/extconf.rb +1 -1
- data/ext/cs__contrast_patch/cs__contrast_patch.c +22 -25
- data/ext/cs__contrast_patch/extconf.rb +1 -1
- data/ext/cs__protect_kernel/cs__protect_kernel.c +1 -1
- data/ext/cs__protect_kernel/extconf.rb +1 -1
- data/ext/extconf_common.rb +2 -6
- data/lib/contrast-agent.rb +1 -1
- data/lib/contrast.rb +44 -15
- data/lib/contrast/agent.rb +1 -3
- data/lib/contrast/agent/assess.rb +2 -2
- data/lib/contrast/agent/assess/contrast_event.rb +54 -72
- data/lib/contrast/agent/assess/contrast_object.rb +3 -3
- data/lib/contrast/agent/assess/events/event_factory.rb +3 -2
- data/lib/contrast/agent/assess/events/source_event.rb +7 -2
- data/lib/contrast/agent/assess/finalizers/freeze.rb +1 -1
- data/lib/contrast/agent/assess/finalizers/hash.rb +28 -38
- data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +24 -20
- data/lib/contrast/agent/assess/policy/patcher.rb +17 -22
- data/lib/contrast/agent/assess/policy/policy.rb +2 -2
- data/lib/contrast/agent/assess/policy/policy_node.rb +26 -34
- data/lib/contrast/agent/assess/policy/policy_scanner.rb +4 -6
- data/lib/contrast/agent/assess/policy/preshift.rb +8 -6
- data/lib/contrast/agent/assess/policy/propagation_method.rb +12 -25
- data/lib/contrast/agent/assess/policy/propagation_node.rb +20 -9
- data/lib/contrast/agent/assess/policy/propagator.rb +2 -1
- data/lib/contrast/agent/assess/policy/propagator/append.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/base.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/center.rb +3 -2
- data/lib/contrast/agent/assess/policy/propagator/custom.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/database_write.rb +4 -7
- data/lib/contrast/agent/assess/policy/propagator/insert.rb +4 -2
- data/lib/contrast/agent/assess/policy/propagator/keep.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/match_data.rb +3 -2
- data/lib/contrast/agent/assess/policy/propagator/next.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/prepend.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/rack_protection.rb +73 -0
- data/lib/contrast/agent/assess/policy/propagator/remove.rb +23 -19
- data/lib/contrast/agent/assess/policy/propagator/replace.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/reverse.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/select.rb +3 -13
- data/lib/contrast/agent/assess/policy/propagator/splat.rb +1 -1
- data/lib/contrast/agent/assess/policy/propagator/split.rb +13 -14
- data/lib/contrast/agent/assess/policy/propagator/substitution.rb +4 -11
- data/lib/contrast/agent/assess/policy/propagator/trim.rb +64 -45
- data/lib/contrast/agent/assess/policy/rewriter_patch.rb +14 -11
- data/lib/contrast/agent/assess/policy/source_method.rb +97 -86
- data/lib/contrast/agent/assess/policy/source_node.rb +1 -1
- data/lib/contrast/agent/assess/policy/source_validation/cross_site_validator.rb +8 -6
- data/lib/contrast/agent/assess/policy/source_validation/source_validation.rb +2 -4
- data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +7 -3
- data/lib/contrast/agent/assess/policy/trigger/xpath.rb +7 -11
- data/lib/contrast/agent/assess/policy/trigger_method.rb +104 -77
- data/lib/contrast/agent/assess/policy/trigger_node.rb +6 -5
- data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +5 -4
- data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +2 -3
- data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +1 -1
- data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +2 -9
- data/lib/contrast/agent/assess/properties.rb +1 -1
- data/lib/contrast/agent/assess/property/evented.rb +9 -6
- data/lib/contrast/agent/assess/property/tagged.rb +1 -1
- data/lib/contrast/agent/assess/property/updated.rb +1 -1
- data/lib/contrast/agent/assess/rule/provider.rb +1 -1
- data/lib/contrast/agent/assess/rule/provider/hardcoded_key.rb +12 -6
- data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +5 -2
- data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +8 -10
- data/lib/contrast/agent/assess/tag.rb +1 -1
- data/lib/contrast/agent/assess/tracker.rb +1 -1
- data/lib/contrast/agent/at_exit_hook.rb +4 -4
- data/lib/contrast/agent/class_reopener.rb +10 -7
- data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +1 -1
- data/lib/contrast/agent/deadzone/policy/policy.rb +7 -3
- data/lib/contrast/agent/disable_reaction.rb +5 -8
- data/lib/contrast/agent/exclusion_matcher.rb +8 -15
- data/lib/contrast/agent/inventory.rb +1 -2
- data/lib/contrast/agent/inventory/dependencies.rb +3 -1
- data/lib/contrast/agent/inventory/dependency_analysis.rb +3 -7
- data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +38 -28
- data/lib/contrast/agent/inventory/policy/datastores.rb +4 -5
- data/lib/contrast/agent/inventory/policy/policy.rb +2 -2
- data/lib/contrast/agent/inventory/policy/trigger_node.rb +1 -1
- data/lib/contrast/agent/middleware.rb +52 -80
- data/lib/contrast/agent/module_data.rb +4 -4
- data/lib/contrast/agent/patching/policy/after_load_patch.rb +4 -4
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +10 -10
- data/lib/contrast/agent/patching/policy/method_policy.rb +7 -3
- data/lib/contrast/agent/patching/policy/module_policy.rb +15 -8
- data/lib/contrast/agent/patching/policy/patch.rb +32 -38
- data/lib/contrast/agent/patching/policy/patch_status.rb +7 -8
- data/lib/contrast/agent/patching/policy/patcher.rb +29 -28
- data/lib/contrast/agent/patching/policy/policy.rb +16 -25
- data/lib/contrast/agent/patching/policy/policy_node.rb +17 -8
- data/lib/contrast/agent/patching/policy/trigger_node.rb +22 -9
- data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +2 -2
- data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +2 -2
- data/lib/contrast/agent/protect/policy/applies_no_sqli_rule.rb +2 -2
- data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +3 -4
- data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +2 -2
- data/lib/contrast/agent/protect/policy/applies_xxe_rule.rb +6 -10
- data/lib/contrast/agent/protect/policy/policy.rb +2 -2
- data/lib/contrast/agent/protect/policy/rule_applicator.rb +8 -10
- data/lib/contrast/agent/protect/policy/trigger_node.rb +1 -1
- data/lib/contrast/agent/protect/rule.rb +1 -1
- data/lib/contrast/agent/protect/rule/base.rb +26 -40
- data/lib/contrast/agent/protect/rule/base_service.rb +10 -6
- data/lib/contrast/agent/protect/rule/cmd_injection.rb +19 -24
- data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/deserialization.rb +7 -14
- data/lib/contrast/agent/protect/rule/http_method_tampering.rb +4 -15
- data/lib/contrast/agent/protect/rule/no_sqli.rb +7 -3
- data/lib/contrast/agent/protect/rule/no_sqli/mongo_no_sql_scanner.rb +2 -4
- data/lib/contrast/agent/protect/rule/path_traversal.rb +7 -11
- data/lib/contrast/agent/protect/rule/sqli.rb +3 -3
- 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/sqlite_sql_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +2 -2
- data/lib/contrast/agent/protect/rule/xss.rb +2 -2
- data/lib/contrast/agent/protect/rule/xxe.rb +6 -13
- data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +2 -3
- data/lib/contrast/agent/reaction_processor.rb +14 -14
- data/lib/contrast/agent/request.rb +29 -27
- data/lib/contrast/agent/request_context.rb +20 -30
- data/lib/contrast/agent/request_handler.rb +6 -4
- data/lib/contrast/agent/response.rb +3 -4
- data/lib/contrast/agent/rewriter.rb +10 -7
- data/lib/contrast/agent/rule_set.rb +6 -5
- data/lib/contrast/agent/scope.rb +1 -1
- data/lib/contrast/agent/service_heartbeat.rb +5 -7
- data/lib/contrast/agent/static_analysis.rb +7 -6
- data/lib/contrast/agent/thread.rb +3 -5
- data/lib/contrast/agent/thread_watcher.rb +4 -5
- data/lib/contrast/agent/tracepoint_hook.rb +6 -6
- data/lib/contrast/agent/version.rb +2 -2
- data/lib/contrast/agent/worker_thread.rb +1 -1
- data/lib/contrast/api.rb +1 -1
- data/lib/contrast/api/communication.rb +1 -1
- data/lib/contrast/api/communication/connection_status.rb +1 -1
- data/lib/contrast/api/communication/messaging_queue.rb +5 -6
- data/lib/contrast/api/communication/response_processor.rb +13 -15
- data/lib/contrast/api/communication/service_lifecycle.rb +10 -7
- data/lib/contrast/api/communication/socket.rb +1 -1
- data/lib/contrast/api/communication/socket_client.rb +23 -32
- data/lib/contrast/api/communication/speedracer.rb +10 -15
- data/lib/contrast/api/communication/tcp_socket.rb +1 -1
- data/lib/contrast/api/communication/unix_socket.rb +1 -1
- data/lib/contrast/api/decorators.rb +1 -1
- data/lib/contrast/api/decorators/address.rb +3 -4
- data/lib/contrast/api/decorators/agent_startup.rb +8 -10
- data/lib/contrast/api/decorators/application_settings.rb +1 -1
- data/lib/contrast/api/decorators/application_startup.rb +14 -10
- data/lib/contrast/api/decorators/application_update.rb +1 -5
- data/lib/contrast/api/decorators/http_request.rb +4 -8
- data/lib/contrast/api/decorators/input_analysis.rb +1 -1
- data/lib/contrast/api/decorators/instrumentation_mode.rb +35 -0
- data/lib/contrast/api/decorators/library.rb +9 -7
- data/lib/contrast/api/decorators/library_usage_update.rb +1 -1
- data/lib/contrast/api/decorators/message.rb +10 -10
- data/lib/contrast/api/decorators/rasp_rule_sample.rb +1 -1
- data/lib/contrast/api/decorators/route_coverage.rb +1 -1
- data/lib/contrast/api/decorators/server_features.rb +1 -1
- data/lib/contrast/api/decorators/trace_event.rb +4 -2
- data/lib/contrast/api/decorators/trace_event_object.rb +4 -7
- data/lib/contrast/api/decorators/trace_event_signature.rb +1 -1
- data/lib/contrast/api/decorators/trace_taint_range.rb +1 -1
- data/lib/contrast/api/decorators/trace_taint_range_tags.rb +2 -7
- data/lib/contrast/api/decorators/user_input.rb +1 -1
- data/lib/contrast/components/agent.rb +20 -26
- data/lib/contrast/components/app_context.rb +12 -16
- data/lib/contrast/components/assess.rb +20 -25
- data/lib/contrast/components/base.rb +40 -0
- data/lib/contrast/components/config.rb +3 -4
- data/lib/contrast/components/contrast_service.rb +13 -19
- data/lib/contrast/components/heap_dump.rb +6 -5
- data/lib/contrast/components/inventory.rb +3 -8
- data/lib/contrast/components/logger.rb +2 -3
- data/lib/contrast/components/protect.rb +14 -20
- data/lib/contrast/components/sampling.rb +14 -8
- data/lib/contrast/components/scope.rb +2 -5
- data/lib/contrast/components/settings.rb +28 -103
- data/lib/contrast/config.rb +1 -1
- data/lib/contrast/config/agent_configuration.rb +1 -1
- data/lib/contrast/config/application_configuration.rb +1 -1
- data/lib/contrast/config/assess_configuration.rb +1 -1
- data/lib/contrast/config/assess_rules_configuration.rb +2 -4
- data/lib/contrast/config/base_configuration.rb +5 -6
- data/lib/contrast/config/default_value.rb +1 -1
- data/lib/contrast/config/exception_configuration.rb +2 -6
- data/lib/contrast/config/heap_dump_configuration.rb +13 -7
- data/lib/contrast/config/inventory_configuration.rb +1 -1
- data/lib/contrast/config/logger_configuration.rb +2 -6
- data/lib/contrast/config/protect_configuration.rb +1 -1
- data/lib/contrast/config/protect_rule_configuration.rb +23 -1
- data/lib/contrast/config/protect_rules_configuration.rb +1 -1
- data/lib/contrast/config/root_configuration.rb +1 -1
- data/lib/contrast/config/ruby_configuration.rb +1 -1
- data/lib/contrast/config/sampling_configuration.rb +1 -1
- data/lib/contrast/config/server_configuration.rb +1 -1
- data/lib/contrast/config/service_configuration.rb +1 -1
- data/lib/contrast/configuration.rb +7 -19
- data/lib/contrast/extension/assess.rb +1 -1
- data/lib/contrast/extension/assess/array.rb +4 -11
- data/lib/contrast/extension/assess/erb.rb +2 -8
- data/lib/contrast/extension/assess/eval_trigger.rb +5 -14
- data/lib/contrast/extension/assess/exec_trigger.rb +4 -14
- data/lib/contrast/extension/assess/fiber.rb +9 -18
- data/lib/contrast/extension/assess/hash.rb +4 -4
- data/lib/contrast/extension/assess/kernel.rb +5 -14
- data/lib/contrast/extension/assess/marshal.rb +7 -15
- data/lib/contrast/extension/assess/regexp.rb +7 -11
- data/lib/contrast/extension/assess/string.rb +9 -7
- data/lib/contrast/extension/delegator.rb +1 -1
- data/lib/contrast/extension/inventory.rb +1 -1
- data/lib/contrast/extension/kernel.rb +3 -3
- data/lib/contrast/extension/module.rb +1 -1
- data/lib/contrast/extension/protect.rb +1 -1
- data/lib/contrast/extension/protect/kernel.rb +1 -6
- data/lib/contrast/extension/protect/psych.rb +1 -1
- data/lib/contrast/extension/thread.rb +1 -1
- data/lib/contrast/framework/base_support.rb +1 -1
- data/lib/contrast/framework/manager.rb +7 -12
- data/lib/contrast/framework/platform_version.rb +1 -1
- data/lib/contrast/framework/rack/patch/session_cookie.rb +12 -25
- data/lib/contrast/framework/rack/patch/support.rb +7 -5
- data/lib/contrast/framework/rack/support.rb +1 -1
- data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -1
- data/lib/contrast/framework/rails/patch/assess_configuration.rb +13 -10
- data/lib/contrast/framework/rails/patch/rails_application_configuration.rb +4 -4
- data/lib/contrast/framework/rails/patch/support.rb +42 -36
- data/lib/contrast/framework/rails/railtie.rb +34 -0
- data/lib/contrast/framework/rails/rewrite/action_controller_railties_helper_inherited.rb +5 -2
- data/lib/contrast/framework/rails/rewrite/active_record_attribute_methods_read.rb +3 -1
- data/lib/contrast/framework/rails/rewrite/active_record_named.rb +6 -5
- data/lib/contrast/framework/rails/rewrite/active_record_time_zone_inherited.rb +3 -1
- data/lib/contrast/framework/rails/support.rb +3 -3
- data/lib/contrast/framework/sinatra/support.rb +4 -2
- data/lib/contrast/funchook/funchook.rb +6 -9
- data/lib/contrast/logger/application.rb +14 -16
- data/lib/contrast/logger/format.rb +3 -6
- data/lib/contrast/logger/log.rb +27 -10
- data/lib/contrast/logger/request.rb +2 -7
- data/lib/contrast/logger/time.rb +1 -1
- data/lib/contrast/security_exception.rb +2 -2
- data/lib/contrast/tasks/config.rb +1 -1
- data/lib/contrast/tasks/service.rb +7 -8
- data/lib/contrast/utils/assess/sampling_util.rb +3 -4
- data/lib/contrast/utils/assess/tracking_util.rb +4 -7
- data/lib/contrast/utils/class_util.rb +15 -11
- data/lib/contrast/utils/duck_utils.rb +1 -1
- data/lib/contrast/utils/env_configuration_item.rb +1 -1
- data/lib/contrast/utils/hash_digest.rb +16 -24
- data/lib/contrast/utils/heap_dump_util.rb +6 -4
- data/lib/contrast/utils/invalid_configuration_util.rb +5 -4
- data/lib/contrast/utils/inventory_util.rb +3 -4
- data/lib/contrast/utils/io_util.rb +4 -6
- data/lib/contrast/utils/job_servers_running.rb +14 -8
- data/lib/contrast/utils/object_share.rb +1 -1
- data/lib/contrast/utils/os.rb +5 -5
- data/lib/contrast/utils/preflight_util.rb +1 -1
- data/lib/contrast/utils/resource_loader.rb +1 -1
- data/lib/contrast/utils/ruby_ast_rewriter.rb +3 -2
- data/lib/contrast/utils/sha256_builder.rb +1 -1
- data/lib/contrast/utils/stack_trace_utils.rb +1 -1
- data/lib/contrast/utils/string_utils.rb +3 -4
- data/lib/contrast/utils/tag_util.rb +26 -20
- data/lib/contrast/utils/thread_tracker.rb +1 -1
- data/lib/contrast/utils/timer.rb +1 -1
- data/resources/assess/policy.json +60 -2
- data/resources/deadzone/policy.json +7 -17
- data/ruby-agent.gemspec +25 -21
- data/service_executables/VERSION +1 -1
- data/service_executables/linux/contrast-service +0 -0
- data/service_executables/mac/contrast-service +0 -0
- data/sonar-project.properties +9 -0
- metadata +108 -51
- data/lib/contrast/agent/inventory/gemfile_digest_cache.rb +0 -38
- data/lib/contrast/agent/railtie.rb +0 -31
- data/lib/contrast/common_agent_configuration.rb +0 -87
- data/lib/contrast/components/interface.rb +0 -195
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'contrast/agent/patching/policy/after_load_patch'
|
@@ -12,10 +12,12 @@ module Contrast
|
|
12
12
|
module Support
|
13
13
|
# (See BaseSupport#after_load_patches)
|
14
14
|
def after_load_patches
|
15
|
-
Set.new([
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
Set.new([
|
16
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
17
|
+
'Rack::Session::Cookie',
|
18
|
+
'contrast/framework/rack/patch/session_cookie',
|
19
|
+
instrumenting_module: 'Contrast::Framework::Rack::Patch::SessionCookie')
|
20
|
+
])
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'contrast/framework/base_support'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Contrast
|
@@ -1,7 +1,6 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require 'contrast/components/interface'
|
5
4
|
require 'contrast/utils/invalid_configuration_util'
|
6
5
|
|
7
6
|
module Contrast
|
@@ -10,9 +9,8 @@ module Contrast
|
|
10
9
|
module Patch
|
11
10
|
# This module is used to analyze rails session storage configuration for assess vulnerabilities
|
12
11
|
module AssessConfiguration
|
13
|
-
include Contrast::Components::
|
12
|
+
include Contrast::Components::Logger::InstanceMethods
|
14
13
|
|
15
|
-
access_component :agent, :analysis, :logging
|
16
14
|
|
17
15
|
CS__SESSION_TIMEOUT_NAME = 'session-timeout'
|
18
16
|
SAFE_SESSION_TIMEOUT = (30 * 60 * 1000)
|
@@ -23,7 +21,7 @@ module Contrast
|
|
23
21
|
include Contrast::Utils::InvalidConfigurationUtil
|
24
22
|
|
25
23
|
def analyze_session_store *args
|
26
|
-
return if ASSESS.forcibly_disabled?
|
24
|
+
return if ::Contrast::ASSESS.forcibly_disabled?
|
27
25
|
|
28
26
|
apply_httponly_disabled(*args)
|
29
27
|
apply_secure_cookie_disabled(*args)
|
@@ -32,7 +30,11 @@ module Contrast
|
|
32
30
|
|
33
31
|
private
|
34
32
|
|
35
|
-
def vulnerable_setting?
|
33
|
+
def vulnerable_setting?(setting_key,
|
34
|
+
safe_settings_value,
|
35
|
+
original_args,
|
36
|
+
safe_default: true,
|
37
|
+
comparison_type: nil)
|
36
38
|
# In most cases, Rails is pretty nice and the default value is safe
|
37
39
|
return !safe_default unless original_args && original_args.length > 1
|
38
40
|
|
@@ -48,8 +50,9 @@ module Contrast
|
|
48
50
|
end
|
49
51
|
|
50
52
|
def apply_session_timeout *args
|
51
|
-
return if ASSESS.rule_disabled? CS__SESSION_TIMEOUT_NAME
|
52
|
-
return unless vulnerable_setting?(:expire_after, SAFE_SESSION_TIMEOUT, args,
|
53
|
+
return if ::Contrast::ASSESS.rule_disabled? CS__SESSION_TIMEOUT_NAME
|
54
|
+
return unless vulnerable_setting?(:expire_after, SAFE_SESSION_TIMEOUT, args,
|
55
|
+
comparison_type: :greater_than, safe_default: false)
|
53
56
|
|
54
57
|
rails_session_settings = args[1]
|
55
58
|
cs__report_finding(CS__SESSION_TIMEOUT_NAME, rails_session_settings, caller_locations(3, 2)[0])
|
@@ -62,7 +65,7 @@ module Contrast
|
|
62
65
|
end
|
63
66
|
|
64
67
|
def apply_secure_cookie_disabled *args
|
65
|
-
return if ASSESS.rule_disabled? CS__SECURE_RULE_NAME
|
68
|
+
return if ::Contrast::ASSESS.rule_disabled? CS__SECURE_RULE_NAME
|
66
69
|
return unless vulnerable_setting?(:secure, true, args)
|
67
70
|
|
68
71
|
rails_session_settings = args[1]
|
@@ -76,7 +79,7 @@ module Contrast
|
|
76
79
|
end
|
77
80
|
|
78
81
|
def apply_httponly_disabled *args
|
79
|
-
return if ASSESS.rule_disabled? CS__HTTPONLY_RULE_NAME
|
82
|
+
return if ::Contrast::ASSESS.rule_disabled? CS__HTTPONLY_RULE_NAME
|
80
83
|
return unless vulnerable_setting?(:httponly, true, args)
|
81
84
|
|
82
85
|
rails_session_settings = args[1]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'contrast/framework/rails/patch/assess_configuration'
|
@@ -15,9 +15,9 @@ module Contrast
|
|
15
15
|
@_instrument ||= begin
|
16
16
|
::Rails::Application::Configuration.class_eval do
|
17
17
|
alias_method :cs__patched_session_store, :session_store
|
18
|
-
def session_store *args
|
19
|
-
ret = cs__patched_session_store(*args)
|
20
|
-
Contrast::Framework::Rails::Patch::AssessConfiguration.analyze_session_store(*args)
|
18
|
+
def session_store *args, **kwargs
|
19
|
+
ret = cs__patched_session_store(*args, **kwargs)
|
20
|
+
Contrast::Framework::Rails::Patch::AssessConfiguration.analyze_session_store(*args, **kwargs)
|
21
21
|
ret
|
22
22
|
end
|
23
23
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'contrast/framework/rails/patch/rails_application_configuration'
|
@@ -20,45 +20,51 @@ module Contrast
|
|
20
20
|
# (i.e., where we normally patch) we will miss the configuration
|
21
21
|
# and will never be able to report session misconfiguration rules.
|
22
22
|
Contrast::Framework::Rails::Patch::RailsApplicationConfiguration.instrument
|
23
|
-
require 'contrast/
|
23
|
+
require 'contrast/framework/rails/railtie' if ::Rails::VERSION::MAJOR.to_i >= 3
|
24
24
|
end
|
25
25
|
|
26
26
|
# (See BaseSupport#after_load_patches)
|
27
27
|
def after_load_patches
|
28
|
-
Set.new([
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
28
|
+
patches = Set.new([
|
29
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
30
|
+
'ActionController::Live::Buffer',
|
31
|
+
'contrast/framework/rails/patch/action_controller_live_buffer',
|
32
|
+
instrumenting_module: 'Contrast::Framework::Rails::Patch::ActionControllerLiveBuffer'),
|
33
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
34
|
+
'Rails::Application::Configuration',
|
35
|
+
'contrast/framework/rails/patch/rails_application_configuration',
|
36
|
+
method_to_instrument: :session_store,
|
37
|
+
instrumenting_module: 'Contrast::Framework::Rails::Patch::RailsApplicationConfiguration')
|
38
|
+
])
|
39
|
+
if RUBY_VERSION < '2.6.0'
|
40
|
+
patches.merge([
|
41
|
+
# TODO: RUBY-714 remove w/ EOL of 2.5
|
42
|
+
#
|
43
|
+
# @deprecated Everything past here is used for Rewriting and can
|
44
|
+
# be removed once we no longer support 2.5.
|
45
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
46
|
+
'ActionController::Railties::Helper::ClassMethods',
|
47
|
+
'contrast/framework/rails/rewrite/action_controller_railties_helper_inherited',
|
48
|
+
method_to_instrument: :inherited,
|
49
|
+
instrumenting_module:
|
50
|
+
'Contrast::Framework::Rails::Rewrite::ActionControllerRailtiesHelperInherited'),
|
51
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
52
|
+
'ActiveRecord::AttributeMethods::Read::ClassMethods',
|
53
|
+
'contrast/framework/rails/rewrite/active_record_attribute_methods_read',
|
54
|
+
instrumenting_module:
|
55
|
+
'Contrast::Framework::Rails::Rewrite::ActiveRecordAttributeMethodsRead'),
|
56
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
57
|
+
'ActiveRecord::Scoping::Named::ClassMethods',
|
58
|
+
'contrast/framework/rails/rewrite/active_record_named',
|
59
|
+
instrumenting_module: 'Contrast::Framework::Rails::Rewrite::ActiveRecordNamed'),
|
60
|
+
Contrast::Agent::Patching::Policy::AfterLoadPatch.new(
|
61
|
+
'ActiveRecord::AttributeMethods::TimeZoneConversion::ClassMethods',
|
62
|
+
'contrast/framework/rails/rewrite/active_record_time_zone_inherited',
|
63
|
+
method_to_instrument: :inherited,
|
64
|
+
instrumenting_module: 'Contrast::Framework::Rails::Rewrite::ActiveRecordTimeZoneInherited')
|
65
|
+
])
|
66
|
+
end
|
67
|
+
patches
|
62
68
|
end
|
63
69
|
end
|
64
70
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'contrast/utils/job_servers_running'
|
5
|
+
require 'contrast/components/logger'
|
6
|
+
|
7
|
+
module Contrast
|
8
|
+
module Framework
|
9
|
+
module Rails
|
10
|
+
# A Railtie to allow for the automatic hooking of the Agent into a Rails application.
|
11
|
+
class Railtie < ::Rails::Railtie
|
12
|
+
include Contrast::Components::Logger::InstanceMethods
|
13
|
+
|
14
|
+
initializer 'Contrast Ruby Agent Initializer' do |app|
|
15
|
+
log_rails = defined?(Rails) && defined?(Rails.logger)
|
16
|
+
|
17
|
+
Rails.logger.debug("In railtie ::#{ app.middleware.inspect }") if log_rails
|
18
|
+
|
19
|
+
if ::Contrast::APP_CONTEXT.instrument_middleware_stack?
|
20
|
+
::Contrast::AGENT.insert_middleware(app)
|
21
|
+
else
|
22
|
+
Rails.logger.debug('Detected a running job server, skipping Contrast middleware insertion.') if log_rails
|
23
|
+
logger.debug('Disabling Contrast for process', p_id: Process.pid)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
rake_tasks do
|
28
|
+
load 'contrast/tasks/service.rb'
|
29
|
+
load 'contrast/tasks/config.rb'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
return unless RUBY_VERSION < '2.6.0' # TODO: RUBY-714 remove guard w/ EOL of 2.5
|
5
|
+
|
4
6
|
module Contrast
|
5
7
|
module Framework
|
6
8
|
module Rails
|
@@ -19,7 +21,8 @@ module Contrast
|
|
19
21
|
alias_method :cs__patched_helper_inherited, :inherited
|
20
22
|
def inherited klass # rubocop:disable Lint/MissingSuper
|
21
23
|
klass&.instance_variable_set(:@cs__defining_class, true)
|
22
|
-
|
24
|
+
# This calls the original inherited, which should handle super as needed.
|
25
|
+
cs__patched_helper_inherited(klass)
|
23
26
|
ensure
|
24
27
|
klass&.instance_variable_set(:@cs__defining_class, false)
|
25
28
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
return unless RUBY_VERSION < '2.6.0' # TODO: RUBY-714 remove guard w/ EOL of 2.5
|
5
|
+
|
4
6
|
module Contrast
|
5
7
|
module Framework
|
6
8
|
module Rails
|
@@ -1,7 +1,9 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
return unless RUBY_VERSION < '2.6.0' # TODO: RUBY-714 remove guard w/ EOL of 2.5
|
5
|
+
|
6
|
+
require 'contrast/components/logger'
|
5
7
|
|
6
8
|
module Contrast
|
7
9
|
module Framework
|
@@ -15,12 +17,11 @@ module Contrast
|
|
15
17
|
# @deprecated Changes to this class are discouraged as this approach is
|
16
18
|
# being phased out with support for those language versions.
|
17
19
|
class ActiveRecordNamed
|
18
|
-
include Contrast::Components::
|
19
|
-
access_component :agent, :logging
|
20
|
+
include Contrast::Components::Logger::InstanceMethods
|
20
21
|
|
21
22
|
class << self
|
22
23
|
def rewrite mod, method_name, body
|
23
|
-
return body unless AGENT.rewrite_interpolation?
|
24
|
+
return body unless ::Contrast::AGENT.rewrite_interpolation?
|
24
25
|
return body unless body.is_a?(Proc)
|
25
26
|
|
26
27
|
location = body.source_location
|
@@ -1,6 +1,8 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
return unless RUBY_VERSION < '2.6.0' # TODO: RUBY-714 remove guard w/ EOL of 2.5
|
5
|
+
|
4
6
|
module Contrast
|
5
7
|
module Framework
|
6
8
|
module Rails
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'contrast/api/dtm.pb'
|
@@ -27,8 +27,8 @@ module Contrast
|
|
27
27
|
|
28
28
|
def application_name
|
29
29
|
app_class = ::Rails.application.cs__class
|
30
|
-
# Rails version 6.0.0 deprecated Rails::Application#parent_name, in Rails 6.1.0 that method will be removed
|
31
|
-
# and instead we need to use parent_module_name
|
30
|
+
# Rails version 6.0.0 deprecated Rails::Application#parent_name, in Rails 6.1.0 that method will be removed
|
31
|
+
# entirely and instead we need to use parent_module_name
|
32
32
|
return app_class.parent_module_name if Gem::Version.new(::Rails.version) >= RAILS_MODULE_NAME_VERSION
|
33
33
|
|
34
34
|
app_class.parent_name
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'contrast/framework/base_support'
|
@@ -114,7 +114,9 @@ module Contrast
|
|
114
114
|
return controller, route_pattern if route_pattern
|
115
115
|
|
116
116
|
# Check routes defined in superclass if present.
|
117
|
-
return
|
117
|
+
return unless controller.superclass&.instance_variable_get(:@routes)
|
118
|
+
|
119
|
+
_route_recurse(controller.superclass, method, route)
|
118
120
|
end
|
119
121
|
|
120
122
|
# Get route and do some cleanup matching that of Sinatra::Base#process_route.
|
@@ -1,22 +1,19 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require 'contrast/components/
|
4
|
+
require 'contrast/components/logger'
|
5
|
+
|
5
6
|
# This module is used to find funchook library and determine availability
|
6
7
|
module Funchook
|
7
|
-
|
8
|
-
|
8
|
+
extend Contrast::Components::Logger::InstanceMethods
|
9
|
+
|
9
10
|
attr_accessor :path
|
10
11
|
|
11
12
|
# Possible platform library files
|
12
13
|
ACCEPTABLE_FILES = %w[libfunchook.dylib libfunchook.so].cs__freeze
|
13
14
|
|
14
15
|
# Top level agent directories that should have the funchook libraries
|
15
|
-
SEARCH_DIRS = [
|
16
|
-
File.join('ext'),
|
17
|
-
File.join('shared_libraries'),
|
18
|
-
File.join('funchook', 'src')
|
19
|
-
].cs__freeze
|
16
|
+
SEARCH_DIRS = [File.join('ext'), File.join('shared_libraries'), File.join('funchook', 'src')].cs__freeze
|
20
17
|
|
21
18
|
AGENT_ROOT = File.join(__dir__, '..', '..', '..')
|
22
19
|
|
@@ -1,25 +1,18 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2021 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require 'contrast/components/interface'
|
5
|
-
|
6
4
|
module Contrast
|
7
5
|
module Logger
|
8
6
|
# Our decorator for the Ougai logger allowing for the logging of the
|
9
7
|
# application environment, used to provide context during troubleshooting.
|
10
8
|
module Application
|
11
|
-
include Contrast::Components::Interface
|
12
|
-
access_component :config
|
13
|
-
|
14
9
|
ENV_KEYS = %w[HOME PWD RACK_ENV RAILS_ENV RUBY_VERSION GEM_HOME GEM_PATH].cs__freeze
|
15
10
|
# Utility method to log some current ruby and rails information from environment
|
16
11
|
def application_environment
|
17
12
|
return unless info?
|
18
13
|
|
19
|
-
info('Process environment information',
|
20
|
-
|
21
|
-
pp_id: Process.ppid,
|
22
|
-
agent_version: Contrast::Agent::VERSION)
|
14
|
+
info('Process environment information', p_id: Process.pid, pp_id: Process.ppid,
|
15
|
+
agent_version: Contrast::Agent::VERSION)
|
23
16
|
ENV.each do |env_key, env_value|
|
24
17
|
env_key = env_key.to_s
|
25
18
|
next unless ENV_KEYS.include?(env_key) ||
|
@@ -33,9 +26,11 @@ module Contrast
|
|
33
26
|
def application_configuration
|
34
27
|
return unless info?
|
35
28
|
|
36
|
-
loggable = CONFIG.loggable
|
29
|
+
loggable = ::Contrast::CONFIG.loggable
|
37
30
|
info('Current configuration', configuration: loggable)
|
38
|
-
env_keys = ENV.keys.select
|
31
|
+
env_keys = ENV.keys.select do |env_key|
|
32
|
+
env_key&.to_s&.start_with?(Contrast::Components::Config::CONTRAST_ENV_MARKER)
|
33
|
+
end
|
39
34
|
env_items = env_keys.map { |env_key| Contrast::Utils::EnvConfigurationItem.new(env_key, nil) }
|
40
35
|
env_translations = env_items.each_with_object({}) do |conversion, hash|
|
41
36
|
hash[conversion.key] = conversion.dot_path_array.join('.')
|
@@ -52,7 +47,10 @@ module Contrast
|
|
52
47
|
end
|
53
48
|
|
54
49
|
FRAMEWORKS = %w[rails sinatra grape].cs__freeze
|
55
|
-
WEB_SERVERS = %w[
|
50
|
+
WEB_SERVERS = %w[
|
51
|
+
agoo falcon hoof iodine mongrel mongrel2 passenger puma rack skinny thin trinidad unicorn
|
52
|
+
webrick yarn
|
53
|
+
].cs__freeze
|
56
54
|
LIBRARIES = %w[excon json mongo moped mysql nokogiri oga ox pg psych sqlite3 typhoeus yaml].cs__freeze
|
57
55
|
def log_specific_libraries
|
58
56
|
FRAMEWORKS.each(&cs__method(:log_gem_data))
|
@@ -67,6 +65,7 @@ module Contrast
|
|
67
65
|
|
68
66
|
Gem.loaded_specs.each_pair do |_name, gem_spec|
|
69
67
|
debug('Gem loaded',
|
68
|
+
# rubocop:disable Security/Module/Name -- gems builtin.
|
70
69
|
gem_name: gem_spec.name,
|
71
70
|
gem_version: gem_spec.version.to_s)
|
72
71
|
end
|
@@ -76,9 +75,8 @@ module Contrast
|
|
76
75
|
gem_spec = Gem.loaded_specs[gem_name]
|
77
76
|
return unless gem_spec
|
78
77
|
|
79
|
-
info('Gem loaded',
|
80
|
-
|
81
|
-
gem_version: gem_spec.version.to_s)
|
78
|
+
info('Gem loaded', gem_name: gem_spec.name, gem_version: gem_spec.version.to_s)
|
79
|
+
# rubocop:enable Security/Module/Name
|
82
80
|
end
|
83
81
|
end
|
84
82
|
end
|