datadog 2.12.1 → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +243 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
- data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
- data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
- data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
- data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
- data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
- data/ext/libdatadog_api/crashtracker.c +11 -12
- data/ext/libdatadog_api/crashtracker.h +5 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
- data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
- data/ext/libdatadog_api/extconf.rb +2 -2
- data/ext/libdatadog_api/init.c +15 -0
- data/ext/libdatadog_api/library_config.c +164 -0
- data/ext/libdatadog_api/library_config.h +25 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +112 -0
- data/ext/libdatadog_api/process_discovery.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +2 -2
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
- data/lib/datadog/appsec/actions_handler.rb +24 -2
- data/lib/datadog/appsec/anonymizer.rb +16 -0
- data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
- data/lib/datadog/appsec/api_security/sampler.rb +59 -0
- data/lib/datadog/appsec/api_security.rb +23 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
- data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +46 -61
- data/lib/datadog/appsec/compressed_json.rb +40 -0
- data/lib/datadog/appsec/configuration/settings.rb +153 -30
- data/lib/datadog/appsec/context.rb +7 -7
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
- data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
- data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
- data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
- data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
- data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/event.rb +96 -135
- data/lib/datadog/appsec/ext.rb +4 -2
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
- data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
- data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
- data/lib/datadog/appsec/remote.rb +31 -59
- data/lib/datadog/appsec/response.rb +6 -6
- data/lib/datadog/appsec/security_engine/engine.rb +194 -0
- data/lib/datadog/appsec/security_engine/runner.rb +13 -14
- data/lib/datadog/appsec/security_event.rb +39 -0
- data/lib/datadog/appsec/utils.rb +0 -2
- data/lib/datadog/appsec.rb +5 -8
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
- data/lib/datadog/core/configuration/components.rb +48 -31
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/ext.rb +4 -0
- data/lib/datadog/core/configuration/option.rb +81 -45
- data/lib/datadog/core/configuration/option_definition.rb +4 -4
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +109 -44
- data/lib/datadog/core/configuration/stable_config.rb +22 -0
- data/lib/datadog/core/configuration.rb +40 -16
- data/lib/datadog/core/crashtracking/component.rb +3 -10
- data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
- data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/core/encoding.rb +1 -1
- data/lib/datadog/core/environment/agent_info.rb +4 -3
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -6
- data/lib/datadog/core/environment/git.rb +1 -0
- data/lib/datadog/core/environment/identity.rb +3 -3
- data/lib/datadog/core/environment/platform.rb +3 -3
- data/lib/datadog/core/environment/variable_helpers.rb +1 -1
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +20 -21
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
- data/lib/datadog/core/process_discovery.rb +36 -0
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +40 -32
- data/lib/datadog/core/remote/component.rb +6 -9
- data/lib/datadog/core/remote/configuration/digest.rb +7 -7
- data/lib/datadog/core/remote/configuration/path.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +14 -1
- data/lib/datadog/core/remote/negotiation.rb +9 -9
- data/lib/datadog/core/remote/transport/config.rb +4 -3
- data/lib/datadog/core/remote/transport/http/client.rb +5 -4
- data/lib/datadog/core/remote/transport/http/config.rb +27 -37
- data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
- data/lib/datadog/core/remote/transport/http.rb +22 -57
- data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
- data/lib/datadog/core/runtime/metrics.rb +12 -5
- data/lib/datadog/core/tag_builder.rb +56 -0
- data/lib/datadog/core/telemetry/component.rb +81 -52
- data/lib/datadog/core/telemetry/emitter.rb +23 -11
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
- data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +17 -472
- data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
- data/lib/datadog/core/telemetry/logger.rb +5 -4
- data/lib/datadog/core/telemetry/logging.rb +11 -5
- data/lib/datadog/core/telemetry/metric.rb +8 -8
- data/lib/datadog/core/telemetry/request.rb +4 -4
- data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
- data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
- data/lib/datadog/core/telemetry/transport/http.rb +63 -0
- data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
- data/lib/datadog/core/telemetry/worker.rb +90 -24
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
- data/lib/datadog/core/transport/http/api/instance.rb +17 -0
- data/lib/datadog/core/transport/http/api/spec.rb +17 -0
- data/lib/datadog/core/transport/http/builder.rb +19 -17
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/transport/http.rb +39 -2
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +6 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +20 -0
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/utils.rb +7 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +29 -12
- data/lib/datadog/core/workers/interval_loop.rb +12 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
- data/lib/datadog/core.rb +8 -0
- data/lib/datadog/di/boot.rb +34 -0
- data/lib/datadog/di/component.rb +0 -2
- data/lib/datadog/di/instrumenter.rb +48 -5
- data/lib/datadog/di/probe_notification_builder.rb +38 -43
- data/lib/datadog/di/probe_notifier_worker.rb +25 -17
- data/lib/datadog/di/remote.rb +2 -0
- data/lib/datadog/di/serializer.rb +10 -2
- data/lib/datadog/di/transport/diagnostics.rb +4 -3
- data/lib/datadog/di/transport/http/api.rb +2 -12
- data/lib/datadog/di/transport/http/client.rb +4 -3
- data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
- data/lib/datadog/di/transport/http/input.rb +18 -35
- data/lib/datadog/di/transport/http.rb +14 -62
- data/lib/datadog/di/transport/input.rb +14 -5
- data/lib/datadog/di/utils.rb +5 -0
- data/lib/datadog/di.rb +0 -33
- data/lib/datadog/error_tracking/collector.rb +87 -0
- data/lib/datadog/error_tracking/component.rb +167 -0
- data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
- data/lib/datadog/error_tracking/configuration.rb +11 -0
- data/lib/datadog/error_tracking/ext.rb +18 -0
- data/lib/datadog/error_tracking/extensions.rb +16 -0
- data/lib/datadog/error_tracking/filters.rb +77 -0
- data/lib/datadog/error_tracking.rb +18 -0
- data/lib/datadog/kit/appsec/events/v2.rb +195 -0
- data/lib/datadog/kit/appsec/events.rb +12 -0
- data/lib/datadog/kit/identity.rb +5 -1
- data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
- data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
- data/lib/datadog/opentelemetry/api/context.rb +16 -2
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
- data/lib/datadog/opentelemetry.rb +2 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
- data/lib/datadog/profiling/collectors/info.rb +44 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +8 -9
- data/lib/datadog/profiling/encoded_profile.rb +11 -0
- data/lib/datadog/profiling/exporter.rb +12 -7
- data/lib/datadog/profiling/ext.rb +0 -14
- data/lib/datadog/profiling/flush.rb +5 -8
- data/lib/datadog/profiling/http_transport.rb +7 -61
- data/lib/datadog/profiling/profiler.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +10 -2
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +9 -9
- data/lib/datadog/profiling/tag_builder.rb +7 -41
- data/lib/datadog/profiling/tasks/setup.rb +2 -0
- data/lib/datadog/profiling.rb +7 -2
- data/lib/datadog/single_step_instrument.rb +9 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/component.rb +15 -12
- data/lib/datadog/tracing/configuration/ext.rb +7 -1
- data/lib/datadog/tracing/configuration/settings.rb +18 -2
- data/lib/datadog/tracing/context_provider.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/karafka.rb +37 -0
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/patcher.rb +5 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +9 -2
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +131 -0
- data/lib/datadog/tracing/distributed/datadog.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +25 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +5 -0
- data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
- data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
- data/lib/datadog/tracing/span.rb +10 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +68 -16
- data/lib/datadog/tracing/sync_writer.rb +2 -3
- data/lib/datadog/tracing/trace_digest.rb +9 -2
- data/lib/datadog/tracing/trace_operation.rb +55 -27
- data/lib/datadog/tracing/trace_segment.rb +6 -4
- data/lib/datadog/tracing/tracer.rb +51 -7
- data/lib/datadog/tracing/transport/http/api.rb +2 -10
- data/lib/datadog/tracing/transport/http/client.rb +5 -4
- data/lib/datadog/tracing/transport/http/traces.rb +13 -41
- data/lib/datadog/tracing/transport/http.rb +11 -44
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
- data/lib/datadog/tracing/transport/traces.rb +26 -9
- data/lib/datadog/tracing/utils.rb +1 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
- data/lib/datadog/tracing/writer.rb +2 -6
- data/lib/datadog/tracing.rb +16 -3
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +8 -2
- metadata +88 -23
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
- data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
- data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
- data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
- data/lib/datadog/appsec/processor.rb +0 -107
- data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
- data/lib/datadog/core/telemetry/http/env.rb +0 -20
- data/lib/datadog/core/telemetry/http/ext.rb +0 -28
- data/lib/datadog/core/telemetry/http/response.rb +0 -70
- data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -4,7 +4,7 @@ if %w[1 true].include?((ENV['DD_APPSEC_ENABLED'] || '').downcase)
|
|
4
4
|
begin
|
5
5
|
require_relative 'contrib/auto_instrument'
|
6
6
|
Datadog::AppSec::Contrib::AutoInstrument.patch_all
|
7
|
-
rescue
|
7
|
+
rescue => e
|
8
8
|
Kernel.warn(
|
9
9
|
'[datadog] AppSec failed to instrument. No security check will be performed. error: ' \
|
10
10
|
" #{e.class.name} #{e.message}"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
3
|
+
require_relative 'security_engine/engine'
|
4
|
+
require_relative 'security_engine/runner'
|
5
5
|
require_relative 'processor/rule_loader'
|
6
6
|
require_relative 'actions_handler'
|
7
7
|
|
@@ -12,9 +12,28 @@ module Datadog
|
|
12
12
|
class << self
|
13
13
|
def build_appsec_component(settings, telemetry:)
|
14
14
|
return if !settings.respond_to?(:appsec) || !settings.appsec.enabled
|
15
|
-
return if incompatible_ffi_version?
|
16
15
|
|
17
|
-
|
16
|
+
ffi_version = Gem.loaded_specs['ffi']&.version
|
17
|
+
unless ffi_version
|
18
|
+
Datadog.logger.warn('FFI gem is not loaded, AppSec will be disabled.')
|
19
|
+
telemetry.error('AppSec: Component not loaded, due to missing FFI gem')
|
20
|
+
|
21
|
+
return
|
22
|
+
end
|
23
|
+
|
24
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.3') && ffi_version < Gem::Version.new('1.16.0')
|
25
|
+
Datadog.logger.warn(
|
26
|
+
'AppSec is not supported in Ruby versions above 3.3.0 when using `ffi` versions older than 1.16.0, ' \
|
27
|
+
'and will be forcibly disabled due to a memory leak in `ffi`. ' \
|
28
|
+
'Please upgrade your `ffi` version to 1.16.0 or higher.'
|
29
|
+
)
|
30
|
+
telemetry.error('AppSec: Component not loaded, ffi version is leaky with ruby > 3.3.0')
|
31
|
+
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
require_libddwaf(telemetry: telemetry)
|
36
|
+
Datadog::AppSec::WAF.logger = Datadog.logger if Datadog.logger.debug? && settings.appsec.waf_debug
|
18
37
|
|
19
38
|
# We want to always instrument user events when AppSec is enabled.
|
20
39
|
# There could be cases in which users use the DD_APPSEC_ENABLED Env variable to
|
@@ -24,76 +43,44 @@ module Datadog
|
|
24
43
|
devise_integration = Datadog::AppSec::Contrib::Devise::Integration.new
|
25
44
|
settings.appsec.instrument(:devise) unless devise_integration.patcher.patched?
|
26
45
|
|
27
|
-
new(
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
def incompatible_ffi_version?
|
33
|
-
ffi_version = Gem.loaded_specs['ffi'] && Gem.loaded_specs['ffi'].version
|
34
|
-
return true unless ffi_version
|
46
|
+
security_engine = SecurityEngine::Engine.new(appsec_settings: settings.appsec, telemetry: telemetry)
|
47
|
+
new(security_engine: security_engine, telemetry: telemetry)
|
48
|
+
rescue
|
49
|
+
Datadog.logger.warn('AppSec is disabled, see logged errors above')
|
35
50
|
|
36
|
-
|
37
|
-
ffi_version < Gem::Version.new('1.16.0')
|
38
|
-
|
39
|
-
Datadog.logger.warn(
|
40
|
-
'AppSec is not supported in Ruby versions above 3.3.0 when using `ffi` versions older than 1.16.0, ' \
|
41
|
-
'and will be forcibly disabled due to a memory leak in `ffi`. ' \
|
42
|
-
'Please upgrade your `ffi` version to 1.16.0 or higher.'
|
43
|
-
)
|
44
|
-
|
45
|
-
true
|
51
|
+
nil
|
46
52
|
end
|
47
53
|
|
48
|
-
|
49
|
-
rules = AppSec::Processor::RuleLoader.load_rules(
|
50
|
-
telemetry: telemetry,
|
51
|
-
ruleset: settings.appsec.ruleset
|
52
|
-
)
|
53
|
-
return nil unless rules
|
54
|
-
|
55
|
-
data = AppSec::Processor::RuleLoader.load_data(
|
56
|
-
ip_denylist: settings.appsec.ip_denylist,
|
57
|
-
user_id_denylist: settings.appsec.user_id_denylist,
|
58
|
-
)
|
54
|
+
private
|
59
55
|
|
60
|
-
|
56
|
+
def require_libddwaf(telemetry:)
|
57
|
+
require('libddwaf')
|
58
|
+
rescue LoadError => e
|
59
|
+
libddwaf_platform = Gem.loaded_specs['libddwaf']&.platform || 'unknown'
|
60
|
+
ruby_platforms = Gem.platforms.map(&:to_s)
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
data: data,
|
65
|
-
exclusions: exclusions,
|
66
|
-
telemetry: telemetry
|
67
|
-
)
|
62
|
+
error_message = "libddwaf failed to load - installed platform: #{libddwaf_platform}, " \
|
63
|
+
"ruby platforms: #{ruby_platforms}"
|
68
64
|
|
69
|
-
|
70
|
-
|
65
|
+
Datadog.logger.error("#{error_message}, error #{e.inspect}")
|
66
|
+
telemetry.report(e, description: error_message)
|
71
67
|
|
72
|
-
|
68
|
+
raise e
|
73
69
|
end
|
74
70
|
end
|
75
71
|
|
76
|
-
attr_reader :
|
72
|
+
attr_reader :security_engine, :telemetry
|
77
73
|
|
78
|
-
def initialize(
|
79
|
-
@
|
74
|
+
def initialize(security_engine:, telemetry:)
|
75
|
+
@security_engine = security_engine
|
80
76
|
@telemetry = telemetry
|
81
77
|
|
82
78
|
@mutex = Mutex.new
|
83
79
|
end
|
84
80
|
|
85
|
-
def reconfigure
|
81
|
+
def reconfigure!
|
86
82
|
@mutex.synchronize do
|
87
|
-
|
88
|
-
|
89
|
-
if new_processor && new_processor.ready?
|
90
|
-
old_processor = @processor
|
91
|
-
|
92
|
-
@telemetry = telemetry
|
93
|
-
@processor = new_processor
|
94
|
-
|
95
|
-
old_processor.finalize if old_processor
|
96
|
-
end
|
83
|
+
security_engine.reconfigure!
|
97
84
|
end
|
98
85
|
end
|
99
86
|
|
@@ -103,10 +90,8 @@ module Datadog
|
|
103
90
|
|
104
91
|
def shutdown!
|
105
92
|
@mutex.synchronize do
|
106
|
-
|
107
|
-
|
108
|
-
@processor = nil
|
109
|
-
end
|
93
|
+
security_engine.finalize!
|
94
|
+
@security_engine = nil
|
110
95
|
end
|
111
96
|
end
|
112
97
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'zlib'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
require_relative '../core/utils/base64'
|
8
|
+
|
9
|
+
module Datadog
|
10
|
+
module AppSec
|
11
|
+
# Converts derivative schema payloads into JSON and compresses them into a
|
12
|
+
# base64 encoded string if the payload is worth compressing.
|
13
|
+
#
|
14
|
+
# See: https://github.com/DataDog/dd-trace-rb/pull/3177#issuecomment-1747221082
|
15
|
+
module CompressedJson
|
16
|
+
MIN_SIZE_FOR_COMPRESSION = 260
|
17
|
+
|
18
|
+
def self.dump(payload)
|
19
|
+
value = JSON.dump(payload)
|
20
|
+
return value if value.bytesize < MIN_SIZE_FOR_COMPRESSION
|
21
|
+
|
22
|
+
compress_and_encode(value)
|
23
|
+
rescue ArgumentError, Encoding::UndefinedConversionError, JSON::JSONError => e
|
24
|
+
AppSec.telemetry.report(e, description: 'AppSec: Failed to convert value into JSON')
|
25
|
+
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
private_class_method def self.compress_and_encode(payload)
|
30
|
+
Core::Utils::Base64.strict_encode64(
|
31
|
+
Zlib.gzip(payload, level: Zlib::BEST_SPEED, strategy: Zlib::DEFAULT_STRATEGY)
|
32
|
+
)
|
33
|
+
rescue Zlib::Error, TypeError => e
|
34
|
+
AppSec.telemetry.report(e, description: 'AppSec: Failed to compress and encode value')
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -80,16 +80,49 @@ module Datadog
|
|
80
80
|
|
81
81
|
option :ip_passlist do |o|
|
82
82
|
o.default []
|
83
|
+
|
84
|
+
o.setter do |value|
|
85
|
+
next value if value.nil? || value.empty?
|
86
|
+
|
87
|
+
Datadog::Core.log_deprecation(disallowed_next_major: false) do
|
88
|
+
'The ip_passlist setting is deprecated and will be removed in the next release. ' \
|
89
|
+
'Please migrate this configuration to your service settings via the Datadog UI'
|
90
|
+
end
|
91
|
+
|
92
|
+
value
|
93
|
+
end
|
83
94
|
end
|
84
95
|
|
85
96
|
option :ip_denylist do |o|
|
86
97
|
o.type :array
|
87
98
|
o.default []
|
99
|
+
|
100
|
+
o.setter do |value|
|
101
|
+
next value if value.nil? || value.empty?
|
102
|
+
|
103
|
+
Datadog::Core.log_deprecation(disallowed_next_major: false) do
|
104
|
+
'The ip_denylist setting is deprecated and will be removed in the next release. ' \
|
105
|
+
'Please migrate this configuration to your service settings via the Datadog UI'
|
106
|
+
end
|
107
|
+
|
108
|
+
value
|
109
|
+
end
|
88
110
|
end
|
89
111
|
|
90
112
|
option :user_id_denylist do |o|
|
91
113
|
o.type :array
|
92
114
|
o.default []
|
115
|
+
|
116
|
+
o.setter do |value|
|
117
|
+
next value if value.nil? || value.empty?
|
118
|
+
|
119
|
+
Datadog::Core.log_deprecation(disallowed_next_major: false) do
|
120
|
+
'The user_id_denylist setting is deprecated and will be removed in the next release. ' \
|
121
|
+
'Please migrate this configuration to your service settings via the Datadog UI'
|
122
|
+
end
|
123
|
+
|
124
|
+
value
|
125
|
+
end
|
93
126
|
end
|
94
127
|
|
95
128
|
option :waf_timeout do |o|
|
@@ -131,9 +164,12 @@ module Datadog
|
|
131
164
|
o.type :string, nilable: true
|
132
165
|
o.setter do |value|
|
133
166
|
if value
|
134
|
-
|
167
|
+
unless File.exist?(value)
|
168
|
+
raise(ArgumentError,
|
169
|
+
"appsec.templates.html: file not found: #{value}")
|
170
|
+
end
|
135
171
|
|
136
|
-
File.
|
172
|
+
File.binread(value) || ''
|
137
173
|
end
|
138
174
|
end
|
139
175
|
end
|
@@ -143,9 +179,12 @@ module Datadog
|
|
143
179
|
o.type :string, nilable: true
|
144
180
|
o.setter do |value|
|
145
181
|
if value
|
146
|
-
|
182
|
+
unless File.exist?(value)
|
183
|
+
raise(ArgumentError,
|
184
|
+
"appsec.templates.json: file not found: #{value}")
|
185
|
+
end
|
147
186
|
|
148
|
-
File.
|
187
|
+
File.binread(value) || ''
|
149
188
|
end
|
150
189
|
end
|
151
190
|
end
|
@@ -155,15 +194,78 @@ module Datadog
|
|
155
194
|
o.type :string, nilable: true
|
156
195
|
o.setter do |value|
|
157
196
|
if value
|
158
|
-
|
197
|
+
unless File.exist?(value)
|
198
|
+
raise(ArgumentError,
|
199
|
+
"appsec.templates.text: file not found: #{value}")
|
200
|
+
end
|
159
201
|
|
160
|
-
File.
|
202
|
+
File.binread(value) || ''
|
161
203
|
end
|
162
204
|
end
|
163
205
|
end
|
164
206
|
end
|
165
207
|
end
|
166
208
|
|
209
|
+
settings :stack_trace do
|
210
|
+
option :enabled do |o|
|
211
|
+
o.type :bool
|
212
|
+
o.env 'DD_APPSEC_STACK_TRACE_ENABLED'
|
213
|
+
o.default true
|
214
|
+
end
|
215
|
+
|
216
|
+
# The maximum number of stack trace frames to collect for each stack trace.
|
217
|
+
#
|
218
|
+
# If the stack trace exceeds this limit, the frames are dropped from the middle of the stack trace:
|
219
|
+
# 75% of the frames are kept from the top of the stack trace and 25% from the bottom
|
220
|
+
# (this percentage is also configurable).
|
221
|
+
#
|
222
|
+
# Minimum value is 10.
|
223
|
+
# Set to zero if you don't want any frames to be dropped.
|
224
|
+
#
|
225
|
+
# Default value is 32
|
226
|
+
option :max_depth do |o|
|
227
|
+
o.type :int
|
228
|
+
o.env 'DD_APPSEC_MAX_STACK_TRACE_DEPTH'
|
229
|
+
o.default 32
|
230
|
+
|
231
|
+
o.setter do |value|
|
232
|
+
value = 0 if value < 0
|
233
|
+
value
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# The percentage of frames to keep from the top of the stack trace.
|
238
|
+
#
|
239
|
+
# Default value is 75
|
240
|
+
option :top_percentage do |o|
|
241
|
+
o.type :int
|
242
|
+
o.env 'DD_APPSEC_MAX_STACK_TRACE_DEPTH_TOP_PERCENT'
|
243
|
+
o.default 75
|
244
|
+
|
245
|
+
o.setter do |value|
|
246
|
+
value = 100 if value > 100
|
247
|
+
value = 0 if value.negative?
|
248
|
+
value
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
# Maximum number of stack traces to collect per span.
|
253
|
+
#
|
254
|
+
# Set to zero if you want to collect all stack traces.
|
255
|
+
#
|
256
|
+
# Default value is 2
|
257
|
+
option :max_stack_traces do |o|
|
258
|
+
o.type :int
|
259
|
+
o.env 'DD_APPSEC_MAX_STACK_TRACES'
|
260
|
+
o.default 2
|
261
|
+
|
262
|
+
o.setter do |value|
|
263
|
+
value = 0 if value < 0
|
264
|
+
value
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
167
269
|
settings :auto_user_instrumentation do
|
168
270
|
define_method(:enabled?) { get_option(:mode) != DISABLED_AUTO_USER_INSTRUMENTATION_MODE }
|
169
271
|
|
@@ -177,11 +279,11 @@ module Datadog
|
|
177
279
|
|
178
280
|
Datadog.logger.warn(
|
179
281
|
'The appsec.auto_user_instrumentation.mode value provided is not supported. ' \
|
180
|
-
"Supported values are: #{AUTO_USER_INSTRUMENTATION_MODES.join(
|
181
|
-
"Using
|
282
|
+
"Supported values are: #{AUTO_USER_INSTRUMENTATION_MODES.join(" | ")}. " \
|
283
|
+
"Using value: #{DISABLED_AUTO_USER_INSTRUMENTATION_MODE}."
|
182
284
|
)
|
183
285
|
|
184
|
-
|
286
|
+
DISABLED_AUTO_USER_INSTRUMENTATION_MODE
|
185
287
|
end
|
186
288
|
end
|
187
289
|
end
|
@@ -199,11 +301,13 @@ module Datadog
|
|
199
301
|
APPSEC_VALID_TRACK_USER_EVENTS_ENABLED_VALUES.include?(env_value.strip.downcase)
|
200
302
|
end
|
201
303
|
end
|
202
|
-
o.after_set do
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
304
|
+
o.after_set do |_, _, precedence|
|
305
|
+
unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
|
306
|
+
Core.log_deprecation(key: :appsec_track_user_events_enabled) do
|
307
|
+
'The appsec.track_user_events.enabled setting is deprecated. ' \
|
308
|
+
'Please remove it from your Datadog.configure block and use ' \
|
309
|
+
'appsec.auto_user_instrumentation.mode instead.'
|
310
|
+
end
|
207
311
|
end
|
208
312
|
end
|
209
313
|
end
|
@@ -220,30 +324,48 @@ module Datadog
|
|
220
324
|
else
|
221
325
|
Datadog.logger.warn(
|
222
326
|
'The appsec.track_user_events.mode value provided is not supported.' \
|
223
|
-
"Supported values are: #{APPSEC_VALID_TRACK_USER_EVENTS_MODE.join(
|
327
|
+
"Supported values are: #{APPSEC_VALID_TRACK_USER_EVENTS_MODE.join(" | ")}." \
|
224
328
|
"Using default value: #{SAFE_TRACK_USER_EVENTS_MODE}."
|
225
329
|
)
|
226
330
|
|
227
331
|
SAFE_TRACK_USER_EVENTS_MODE
|
228
332
|
end
|
229
333
|
end
|
230
|
-
o.after_set do
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
334
|
+
o.after_set do |_, _, precedence|
|
335
|
+
unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
|
336
|
+
Core.log_deprecation(key: :appsec_track_user_events_mode) do
|
337
|
+
'The appsec.track_user_events.mode setting is deprecated. ' \
|
338
|
+
'Please remove it from your Datadog.configure block and use ' \
|
339
|
+
'appsec.auto_user_instrumentation.mode instead.'
|
340
|
+
end
|
235
341
|
end
|
236
342
|
end
|
237
343
|
end
|
238
344
|
end
|
239
345
|
|
240
346
|
settings :api_security do
|
347
|
+
define_method(:enabled?) { get_option(:enabled) }
|
348
|
+
|
241
349
|
option :enabled do |o|
|
242
350
|
o.type :bool
|
243
|
-
o.env '
|
244
|
-
o.default
|
351
|
+
o.env 'DD_API_SECURITY_ENABLED'
|
352
|
+
o.default true
|
245
353
|
end
|
246
354
|
|
355
|
+
# NOTE: Unfortunately, we have to go with Float due to other libs
|
356
|
+
# setup, even tho we don't plan to support sub-second delays.
|
357
|
+
#
|
358
|
+
# WARNING: The value will be converted to Integer.
|
359
|
+
option :sample_delay do |o|
|
360
|
+
o.type :float
|
361
|
+
o.env 'DD_API_SECURITY_SAMPLE_DELAY'
|
362
|
+
o.default 30
|
363
|
+
o.setter do |value|
|
364
|
+
value.to_i
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
# DEV-3.0: Remove `api_security.sample_rate` option
|
247
369
|
option :sample_rate do |o|
|
248
370
|
o.type :float
|
249
371
|
o.env 'DD_API_SECURITY_REQUEST_SAMPLE_RATE'
|
@@ -252,6 +374,15 @@ module Datadog
|
|
252
374
|
value = 1 if value > 1
|
253
375
|
SampleRate.new(value)
|
254
376
|
end
|
377
|
+
o.after_set do |_, _, precedence|
|
378
|
+
next if precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
|
379
|
+
|
380
|
+
Core.log_deprecation(key: :appsec_api_security_sample_rate) do
|
381
|
+
'The appsec.api_security.sample_rate setting is deprecated. ' \
|
382
|
+
'Please remove it from your Datadog.configure block and use ' \
|
383
|
+
'appsec.api_security.sample_delay instead.'
|
384
|
+
end
|
385
|
+
end
|
255
386
|
end
|
256
387
|
end
|
257
388
|
|
@@ -259,14 +390,6 @@ module Datadog
|
|
259
390
|
o.type :bool, nilable: true
|
260
391
|
o.env 'DD_APPSEC_SCA_ENABLED'
|
261
392
|
end
|
262
|
-
|
263
|
-
settings :standalone do
|
264
|
-
option :enabled do |o|
|
265
|
-
o.type :bool
|
266
|
-
o.env 'DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED'
|
267
|
-
o.default false
|
268
|
-
end
|
269
|
-
end
|
270
393
|
end
|
271
394
|
end
|
272
395
|
end
|
@@ -9,6 +9,7 @@ module Datadog
|
|
9
9
|
class Context
|
10
10
|
ActiveContextError = Class.new(StandardError)
|
11
11
|
|
12
|
+
# TODO: add delegators for active trace span
|
12
13
|
attr_reader :trace, :span, :events
|
13
14
|
|
14
15
|
class << self
|
@@ -20,7 +21,7 @@ module Datadog
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def deactivate
|
23
|
-
active&.finalize
|
24
|
+
active&.finalize!
|
24
25
|
ensure
|
25
26
|
Thread.current[Ext::ACTIVE_CONTEXT_KEY] = nil
|
26
27
|
end
|
@@ -30,12 +31,11 @@ module Datadog
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
def initialize(trace, span,
|
34
|
+
def initialize(trace, span, waf_runner)
|
34
35
|
@trace = trace
|
35
36
|
@span = span
|
36
37
|
@events = []
|
37
|
-
@
|
38
|
-
@waf_runner = security_engine.new_runner
|
38
|
+
@waf_runner = waf_runner
|
39
39
|
@metrics = Metrics::Collector.new
|
40
40
|
end
|
41
41
|
|
@@ -56,7 +56,7 @@ module Datadog
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def extract_schema
|
59
|
-
@waf_runner.run({
|
59
|
+
@waf_runner.run({'waf.context.processor' => {'extract-schema' => true}}, {})
|
60
60
|
end
|
61
61
|
|
62
62
|
def export_metrics
|
@@ -66,8 +66,8 @@ module Datadog
|
|
66
66
|
Metrics::Exporter.export_rasp_metrics(@metrics.rasp, @span)
|
67
67
|
end
|
68
68
|
|
69
|
-
def finalize
|
70
|
-
@waf_runner.finalize
|
69
|
+
def finalize!
|
70
|
+
@waf_runner.finalize!
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../../event'
|
4
|
+
require_relative '../../security_event'
|
5
|
+
|
3
6
|
module Datadog
|
4
7
|
module AppSec
|
5
8
|
module Contrib
|
@@ -28,18 +31,13 @@ module Datadog
|
|
28
31
|
result = context.run_rasp(Ext::RASP_SQLI, {}, ephemeral_data, waf_timeout)
|
29
32
|
|
30
33
|
if result.match?
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
actions: result.actions
|
39
|
-
}
|
40
|
-
context.events << event
|
41
|
-
|
42
|
-
ActionsHandler.handle(result.actions)
|
34
|
+
AppSec::Event.tag_and_keep!(context, result)
|
35
|
+
|
36
|
+
context.events.push(
|
37
|
+
AppSec::SecurityEvent.new(result, trace: context.trace, span: context.span)
|
38
|
+
)
|
39
|
+
|
40
|
+
AppSec::ActionsHandler.handle(result.actions)
|
43
41
|
end
|
44
42
|
end
|
45
43
|
|
@@ -13,10 +13,10 @@ module Datadog
|
|
13
13
|
|
14
14
|
MINIMUM_VERSION = Gem::Version.new('4')
|
15
15
|
|
16
|
-
register_as :active_record, auto_patch:
|
16
|
+
register_as :active_record, auto_patch: true
|
17
17
|
|
18
18
|
def self.version
|
19
|
-
Gem.loaded_specs['activerecord']
|
19
|
+
Gem.loaded_specs['activerecord']&.version
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.loaded?
|
@@ -53,43 +53,43 @@ module Datadog
|
|
53
53
|
|
54
54
|
def patch_sqlite3_adapter
|
55
55
|
instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
Instrumentation::InternalExecQueryAdapterPatch
|
57
|
+
elsif ::ActiveRecord.gem_version.segments.first == 4
|
58
|
+
Instrumentation::Rails4ExecQueryAdapterPatch
|
59
|
+
else
|
60
|
+
Instrumentation::ExecQueryAdapterPatch
|
61
|
+
end
|
62
62
|
|
63
63
|
::ActiveRecord::ConnectionAdapters::SQLite3Adapter.prepend(instrumentation_module)
|
64
64
|
end
|
65
65
|
|
66
66
|
def patch_mysql2_adapter
|
67
67
|
instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
68
|
+
Instrumentation::InternalExecQueryAdapterPatch
|
69
|
+
elsif ::ActiveRecord.gem_version.segments.first == 4
|
70
|
+
Instrumentation::Rails4ExecQueryAdapterPatch
|
71
|
+
else
|
72
|
+
Instrumentation::ExecQueryAdapterPatch
|
73
|
+
end
|
74
74
|
|
75
75
|
::ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(instrumentation_module)
|
76
76
|
end
|
77
77
|
|
78
78
|
def patch_postgresql_adapter
|
79
79
|
instrumentation_module = if ::ActiveRecord.gem_version.segments.first == 4
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
80
|
+
Instrumentation::Rails4ExecuteAndClearAdapterPatch
|
81
|
+
else
|
82
|
+
Instrumentation::ExecuteAndClearAdapterPatch
|
83
|
+
end
|
84
84
|
|
85
85
|
if defined?(::ActiveRecord::ConnectionAdapters::JdbcAdapter)
|
86
86
|
instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
87
|
+
Instrumentation::InternalExecQueryAdapterPatch
|
88
|
+
elsif ::ActiveRecord.gem_version.segments.first == 4
|
89
|
+
Instrumentation::Rails4ExecQueryAdapterPatch
|
90
|
+
else
|
91
|
+
Instrumentation::ExecQueryAdapterPatch
|
92
|
+
end
|
93
93
|
end
|
94
94
|
|
95
95
|
::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(instrumentation_module)
|
@@ -9,7 +9,7 @@ module Datadog
|
|
9
9
|
def self.patch_all
|
10
10
|
integrations = []
|
11
11
|
|
12
|
-
Datadog::AppSec::Contrib::Integration.registry.
|
12
|
+
Datadog::AppSec::Contrib::Integration.registry.each_value do |integration|
|
13
13
|
next unless integration.klass.auto_instrument?
|
14
14
|
|
15
15
|
integrations << integration.name
|