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
@@ -1,114 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"id": "d962f7ddb3f55041e39195a60ff79d4814a7c331",
|
4
|
-
"name": "US Passport Scanner",
|
5
|
-
"key": {
|
6
|
-
"operator": "match_regex",
|
7
|
-
"parameters": {
|
8
|
-
"regex": "passport",
|
9
|
-
"options": {
|
10
|
-
"case_sensitive": false,
|
11
|
-
"min_length": 8
|
12
|
-
}
|
13
|
-
}
|
14
|
-
},
|
15
|
-
"value": {
|
16
|
-
"operator": "match_regex",
|
17
|
-
"parameters": {
|
18
|
-
"regex": "\\b[0-9A-Z]{9}\\b|\\b[0-9]{6}[A-Z][0-9]{2}\\b",
|
19
|
-
"options": {
|
20
|
-
"case_sensitive": false,
|
21
|
-
"min_length": 8
|
22
|
-
}
|
23
|
-
}
|
24
|
-
},
|
25
|
-
"tags": {
|
26
|
-
"type": "passport_number",
|
27
|
-
"category": "pii"
|
28
|
-
}
|
29
|
-
},
|
30
|
-
{
|
31
|
-
"id": "ac6d683cbac77f6e399a14990793dd8fd0fca333",
|
32
|
-
"name": "US Vehicle Identification Number Scanner",
|
33
|
-
"key": {
|
34
|
-
"operator": "match_regex",
|
35
|
-
"parameters": {
|
36
|
-
"regex": "vehicle[_\\s-]*identification[_\\s-]*number|vin",
|
37
|
-
"options": {
|
38
|
-
"case_sensitive": false,
|
39
|
-
"min_length": 3
|
40
|
-
}
|
41
|
-
}
|
42
|
-
},
|
43
|
-
"value": {
|
44
|
-
"operator": "match_regex",
|
45
|
-
"parameters": {
|
46
|
-
"regex": "\\b[A-HJ-NPR-Z0-9]{17}\\b",
|
47
|
-
"options": {
|
48
|
-
"case_sensitive": false,
|
49
|
-
"min_length": 17
|
50
|
-
}
|
51
|
-
}
|
52
|
-
},
|
53
|
-
"tags": {
|
54
|
-
"type": "vin",
|
55
|
-
"category": "pii"
|
56
|
-
}
|
57
|
-
},
|
58
|
-
{
|
59
|
-
"id": "de0899e0cbaaa812bb624cf04c912071012f616d",
|
60
|
-
"name": "UK National Insurance Number Scanner",
|
61
|
-
"key": {
|
62
|
-
"operator": "match_regex",
|
63
|
-
"parameters": {
|
64
|
-
"regex": "national[\\s_]?(?:insurance(?:\\s+number)?)?|NIN|NI[\\s_]?number|insurance[\\s_]?number",
|
65
|
-
"options": {
|
66
|
-
"case_sensitive": false,
|
67
|
-
"min_length": 3
|
68
|
-
}
|
69
|
-
}
|
70
|
-
},
|
71
|
-
"value": {
|
72
|
-
"operator": "match_regex",
|
73
|
-
"parameters": {
|
74
|
-
"regex": "\\b[A-Z]{2}\\d{6}[A-Z]?\\b",
|
75
|
-
"options": {
|
76
|
-
"case_sensitive": false,
|
77
|
-
"min_length": 8
|
78
|
-
}
|
79
|
-
}
|
80
|
-
},
|
81
|
-
"tags": {
|
82
|
-
"type": "uk_nin",
|
83
|
-
"category": "pii"
|
84
|
-
}
|
85
|
-
},
|
86
|
-
{
|
87
|
-
"id": "450239afc250a19799b6c03dc0e16fd6a4b2a1af",
|
88
|
-
"name": "Canadian Social Insurance Number Scanner",
|
89
|
-
"key": {
|
90
|
-
"operator": "match_regex",
|
91
|
-
"parameters": {
|
92
|
-
"regex": "social[\\s_]?(?:insurance(?:\\s+number)?)?|SIN|Canadian[\\s_]?(?:social[\\s_]?(?:insurance)?|insurance[\\s_]?number)?",
|
93
|
-
"options": {
|
94
|
-
"case_sensitive": false,
|
95
|
-
"min_length": 3
|
96
|
-
}
|
97
|
-
}
|
98
|
-
},
|
99
|
-
"value": {
|
100
|
-
"operator": "match_regex",
|
101
|
-
"parameters": {
|
102
|
-
"regex": "\\b\\d{3}-\\d{3}-\\d{3}\\b",
|
103
|
-
"options": {
|
104
|
-
"case_sensitive": false,
|
105
|
-
"min_length": 11
|
106
|
-
}
|
107
|
-
}
|
108
|
-
},
|
109
|
-
"tags": {
|
110
|
-
"type": "canadian_sin",
|
111
|
-
"category": "pii"
|
112
|
-
}
|
113
|
-
}
|
114
|
-
]
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Contrib
|
6
|
-
module Devise
|
7
|
-
# Class to extract event information from the resource
|
8
|
-
class Event
|
9
|
-
UUID_REGEX = /^\h{8}-\h{4}-\h{4}-\h{4}-\h{12}$/.freeze
|
10
|
-
|
11
|
-
attr_reader :user_id
|
12
|
-
|
13
|
-
def initialize(resource, mode)
|
14
|
-
@resource = resource
|
15
|
-
@mode = mode
|
16
|
-
@user_id = nil
|
17
|
-
@email = nil
|
18
|
-
@username = nil
|
19
|
-
|
20
|
-
extract if @resource
|
21
|
-
end
|
22
|
-
|
23
|
-
def to_h
|
24
|
-
return @event if defined?(@event)
|
25
|
-
|
26
|
-
@event = {}
|
27
|
-
@event[:email] = @email if @email
|
28
|
-
@event[:username] = @username if @username
|
29
|
-
@event
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def extract
|
35
|
-
@user_id = @resource.id
|
36
|
-
|
37
|
-
case @mode
|
38
|
-
when AppSec::Configuration::Settings::IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
|
39
|
-
@email = @resource.email
|
40
|
-
@username = @resource.username
|
41
|
-
when AppSec::Configuration::Settings::ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE
|
42
|
-
@user_id = nil unless @user_id && @user_id.to_s =~ UUID_REGEX
|
43
|
-
else
|
44
|
-
Datadog.logger.warn(
|
45
|
-
"Invalid auto_user_instrumentation.mode: `#{@mode}`. " \
|
46
|
-
"Supported modes are: #{AppSec::Configuration::Settings::AUTO_USER_INSTRUMENTATION_MODES.join(' | ')}."
|
47
|
-
)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../configuration'
|
4
|
-
require_relative '../tracking'
|
5
|
-
require_relative '../resource'
|
6
|
-
require_relative '../event'
|
7
|
-
|
8
|
-
module Datadog
|
9
|
-
module AppSec
|
10
|
-
module Contrib
|
11
|
-
module Devise
|
12
|
-
module Patcher
|
13
|
-
# Hook in devise validate method
|
14
|
-
module AuthenticatablePatch
|
15
|
-
# rubocop:disable Metrics/MethodLength
|
16
|
-
def validate(resource, &block)
|
17
|
-
result = super
|
18
|
-
|
19
|
-
return result unless AppSec.enabled?
|
20
|
-
return result if @_datadog_appsec_skip_track_login_event
|
21
|
-
return result unless Configuration.auto_user_instrumentation_enabled?
|
22
|
-
return result unless AppSec.active_context
|
23
|
-
|
24
|
-
devise_resource = resource ? Resource.new(resource) : nil
|
25
|
-
event_information = Event.new(devise_resource, Configuration.auto_user_instrumentation_mode)
|
26
|
-
|
27
|
-
if result
|
28
|
-
if event_information.user_id
|
29
|
-
Datadog.logger.debug { 'AppSec: User successful login event' }
|
30
|
-
else
|
31
|
-
Datadog.logger.debug do
|
32
|
-
"AppSec: User successful login event, but can't extract user ID. Tracking empty event"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
Tracking.track_login_success(
|
37
|
-
AppSec.active_context.trace,
|
38
|
-
AppSec.active_context.span,
|
39
|
-
user_id: event_information.user_id,
|
40
|
-
**event_information.to_h
|
41
|
-
)
|
42
|
-
|
43
|
-
return result
|
44
|
-
end
|
45
|
-
|
46
|
-
user_exists = nil
|
47
|
-
|
48
|
-
if resource
|
49
|
-
user_exists = true
|
50
|
-
Datadog.logger.debug { 'AppSec: User failed login event, but user exists' }
|
51
|
-
else
|
52
|
-
user_exists = false
|
53
|
-
Datadog.logger.debug { 'AppSec: User failed login event and user does not exist' }
|
54
|
-
end
|
55
|
-
|
56
|
-
Tracking.track_login_failure(
|
57
|
-
AppSec.active_context.trace,
|
58
|
-
AppSec.active_context.span,
|
59
|
-
user_id: event_information.user_id,
|
60
|
-
user_exists: user_exists,
|
61
|
-
**event_information.to_h
|
62
|
-
)
|
63
|
-
|
64
|
-
result
|
65
|
-
end
|
66
|
-
# rubocop:enable Metrics/MethodLength
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../configuration'
|
4
|
-
require_relative '../tracking'
|
5
|
-
require_relative '../resource'
|
6
|
-
require_relative '../event'
|
7
|
-
|
8
|
-
module Datadog
|
9
|
-
module AppSec
|
10
|
-
module Contrib
|
11
|
-
module Devise
|
12
|
-
module Patcher
|
13
|
-
# Hook in devise registration controller
|
14
|
-
module RegistrationControllerPatch
|
15
|
-
def create
|
16
|
-
return super unless AppSec.enabled?
|
17
|
-
return super unless Configuration.auto_user_instrumentation_enabled?
|
18
|
-
return super unless AppSec.active_context
|
19
|
-
|
20
|
-
super do |resource|
|
21
|
-
if resource.persisted?
|
22
|
-
devise_resource = Resource.new(resource)
|
23
|
-
event_information = Event.new(devise_resource, Configuration.auto_user_instrumentation_mode)
|
24
|
-
|
25
|
-
if event_information.user_id
|
26
|
-
Datadog.logger.debug { 'AppSec: User signup event' }
|
27
|
-
else
|
28
|
-
Datadog.logger.warn { "AppSec: User signup event, but can't extract user ID. Tracking empty event" }
|
29
|
-
end
|
30
|
-
|
31
|
-
Tracking.track_signup(
|
32
|
-
AppSec.active_context.trace,
|
33
|
-
AppSec.active_context.span,
|
34
|
-
user_id: event_information.user_id,
|
35
|
-
**event_information.to_h
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
|
-
yield resource if block_given?
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Contrib
|
6
|
-
module Devise
|
7
|
-
# Class to encpasulate extracting information from a Devise resource
|
8
|
-
# Normally a devise resource would be an Active::Record instance
|
9
|
-
class Resource
|
10
|
-
def initialize(resource)
|
11
|
-
@resource = resource
|
12
|
-
end
|
13
|
-
|
14
|
-
def id
|
15
|
-
extract(:id) || extract(:uuid)
|
16
|
-
end
|
17
|
-
|
18
|
-
def email
|
19
|
-
extract(:email)
|
20
|
-
end
|
21
|
-
|
22
|
-
def username
|
23
|
-
extract(:username)
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def extract(method)
|
29
|
-
@resource.send(method) if @resource.respond_to?(method)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../../../kit/identity'
|
4
|
-
|
5
|
-
module Datadog
|
6
|
-
module AppSec
|
7
|
-
module Contrib
|
8
|
-
module Devise
|
9
|
-
# Internal module to track user events
|
10
|
-
module Tracking
|
11
|
-
LOGIN_SUCCESS_EVENT = 'users.login.success'
|
12
|
-
LOGIN_FAILURE_EVENT = 'users.login.failure'
|
13
|
-
SIGNUP_EVENT = 'users.signup'
|
14
|
-
|
15
|
-
def self.track_login_success(trace, span, user_id:, **others)
|
16
|
-
return if trace.nil? || span.nil?
|
17
|
-
|
18
|
-
track(LOGIN_SUCCESS_EVENT, trace, span, **others)
|
19
|
-
|
20
|
-
Kit::Identity.set_user(trace, span, id: user_id.to_s, **others) if user_id
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.track_login_failure(trace, span, user_id:, user_exists:, **others)
|
24
|
-
return if trace.nil? || span.nil?
|
25
|
-
|
26
|
-
track(LOGIN_FAILURE_EVENT, trace, span, **others)
|
27
|
-
|
28
|
-
span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
|
29
|
-
span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists)
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.track_signup(trace, span, user_id:, **others)
|
33
|
-
return if trace.nil? || span.nil?
|
34
|
-
|
35
|
-
track(SIGNUP_EVENT, trace, span, **others)
|
36
|
-
Kit::Identity.set_user(trace, id: user_id.to_s, **others) if user_id
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.track(event, trace, span, **others)
|
40
|
-
return if trace.nil? || span.nil?
|
41
|
-
|
42
|
-
span.set_tag("appsec.events.#{event}.track", 'true')
|
43
|
-
span.set_tag("_dd.appsec.events.#{event}.auto.mode", Configuration.track_user_events_mode)
|
44
|
-
|
45
|
-
others.each do |k, v|
|
46
|
-
raise ArgumentError, 'key cannot be :track' if k.to_sym == :track
|
47
|
-
|
48
|
-
span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
|
49
|
-
end
|
50
|
-
|
51
|
-
trace.keep!
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,170 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../assets'
|
4
|
-
|
5
|
-
module Datadog
|
6
|
-
module AppSec
|
7
|
-
class Processor
|
8
|
-
# RuleMerger merge different sources of information
|
9
|
-
# into the rules payload
|
10
|
-
module RuleMerger
|
11
|
-
# RuleVersionMismatchError
|
12
|
-
class RuleVersionMismatchError < StandardError
|
13
|
-
def initialize(version1, version2)
|
14
|
-
msg = 'Merging rule files with different version could lead to unkown behaviour. '\
|
15
|
-
"We have receieve two rule files with versions: #{version1}, #{version2}. "\
|
16
|
-
'Please validate the configuration is correct and try again.'
|
17
|
-
super(msg)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class << self
|
22
|
-
# TODO: `processors` and `scanners` are not provided by the caller, consider removing them
|
23
|
-
def merge(
|
24
|
-
telemetry:,
|
25
|
-
rules:, data: [], overrides: [], exclusions: [], custom_rules: [],
|
26
|
-
processors: nil, scanners: nil
|
27
|
-
)
|
28
|
-
processors ||= begin
|
29
|
-
default_waf_processors
|
30
|
-
rescue StandardError => e
|
31
|
-
Datadog.logger.error("libddwaf rulemerger failed to parse default waf processors. Error: #{e.inspect}")
|
32
|
-
telemetry.report(
|
33
|
-
e,
|
34
|
-
description: 'libddwaf rulemerger failed to parse default waf processors'
|
35
|
-
)
|
36
|
-
[]
|
37
|
-
end
|
38
|
-
|
39
|
-
scanners ||= begin
|
40
|
-
default_waf_scanners
|
41
|
-
rescue StandardError => e
|
42
|
-
Datadog.logger.error("libddwaf rulemerger failed to parse default waf scanners. Error: #{e.inspect}")
|
43
|
-
telemetry.report(
|
44
|
-
e,
|
45
|
-
description: 'libddwaf rulemerger failed to parse default waf scanners'
|
46
|
-
)
|
47
|
-
[]
|
48
|
-
end
|
49
|
-
|
50
|
-
combined_rules = combine_rules(rules)
|
51
|
-
|
52
|
-
combined_data = combine_data(data) if data.any?
|
53
|
-
combined_overrides = combine_overrides(overrides) if overrides.any?
|
54
|
-
combined_exclusions = combine_exclusions(exclusions) if exclusions.any?
|
55
|
-
combined_custom_rules = combine_custom_rules(custom_rules) if custom_rules.any?
|
56
|
-
|
57
|
-
combined_rules['rules_data'] = combined_data if combined_data
|
58
|
-
combined_rules['rules_override'] = combined_overrides if combined_overrides
|
59
|
-
combined_rules['exclusions'] = combined_exclusions if combined_exclusions
|
60
|
-
combined_rules['custom_rules'] = combined_custom_rules if combined_custom_rules
|
61
|
-
combined_rules['processors'] = processors
|
62
|
-
combined_rules['scanners'] = scanners
|
63
|
-
combined_rules
|
64
|
-
end
|
65
|
-
|
66
|
-
def default_waf_processors
|
67
|
-
@default_waf_processors ||= JSON.parse(Datadog::AppSec::Assets.waf_processors)
|
68
|
-
end
|
69
|
-
|
70
|
-
def default_waf_scanners
|
71
|
-
@default_waf_scanners ||= JSON.parse(Datadog::AppSec::Assets.waf_scanners)
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def combine_rules(rules)
|
77
|
-
return rules[0].dup if rules.size == 1
|
78
|
-
|
79
|
-
final_rules = []
|
80
|
-
# @type var final_version: ::String
|
81
|
-
final_version = (_ = nil)
|
82
|
-
|
83
|
-
rules.each do |rule_file|
|
84
|
-
version = rule_file['version']
|
85
|
-
|
86
|
-
if version && !final_version
|
87
|
-
final_version = version
|
88
|
-
elsif final_version != version
|
89
|
-
raise RuleVersionMismatchError.new(final_version, version)
|
90
|
-
end
|
91
|
-
|
92
|
-
final_rules.concat(rule_file['rules'])
|
93
|
-
end
|
94
|
-
|
95
|
-
{
|
96
|
-
'version' => final_version,
|
97
|
-
'rules' => final_rules
|
98
|
-
}
|
99
|
-
end
|
100
|
-
|
101
|
-
def combine_data(data)
|
102
|
-
result = []
|
103
|
-
|
104
|
-
data.each do |data_entry|
|
105
|
-
data_entry.each do |value|
|
106
|
-
existing_data = result.find { |x| x['id'] == value['id'] }
|
107
|
-
|
108
|
-
if existing_data && existing_data['type'] == value['type']
|
109
|
-
# Duplicate entry base on type and id
|
110
|
-
# We need to merge the existing data with the new one
|
111
|
-
# and make sure to remove duplicates
|
112
|
-
merged_data = merge_data_base_on_expiration(existing_data['data'], value['data'])
|
113
|
-
existing_data['data'] = merged_data
|
114
|
-
else
|
115
|
-
result << value
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
return unless result.any?
|
121
|
-
|
122
|
-
result
|
123
|
-
end
|
124
|
-
|
125
|
-
def merge_data_base_on_expiration(data1, data2)
|
126
|
-
result = data1.each_with_object({}) do |value, acc|
|
127
|
-
acc[value['value']] = value['expiration']
|
128
|
-
end
|
129
|
-
|
130
|
-
data2.each do |data|
|
131
|
-
if result.key?(data['value'])
|
132
|
-
# The value is duplicated so we need to keep
|
133
|
-
# the one with the highest expiration value
|
134
|
-
# We replace it if the expiration is higher than the current one
|
135
|
-
# or if no experiration
|
136
|
-
current_expiration = result[data['value']]
|
137
|
-
new_expiration = data['expiration']
|
138
|
-
|
139
|
-
if new_expiration.nil? || current_expiration && new_expiration > current_expiration
|
140
|
-
result[data['value']] = new_expiration
|
141
|
-
end
|
142
|
-
else
|
143
|
-
result[data['value']] = data['expiration']
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
result.each_with_object([]) do |entry, acc|
|
148
|
-
value = { 'value' => entry[0] }
|
149
|
-
value['expiration'] = entry[1] if entry[1]
|
150
|
-
|
151
|
-
acc << value
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def combine_overrides(overrides)
|
156
|
-
overrides.flatten
|
157
|
-
end
|
158
|
-
|
159
|
-
def combine_exclusions(exclusions)
|
160
|
-
exclusions.flatten
|
161
|
-
end
|
162
|
-
|
163
|
-
def combine_custom_rules(custom_rules)
|
164
|
-
custom_rules.flatten
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
@@ -1,107 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'security_engine/runner'
|
4
|
-
|
5
|
-
module Datadog
|
6
|
-
module AppSec
|
7
|
-
# Processor integrates libddwaf into datadog/appsec
|
8
|
-
# NOTE: This class will be moved under AppSec::SecurityEngine namespace
|
9
|
-
class Processor
|
10
|
-
attr_reader :diagnostics, :addresses
|
11
|
-
|
12
|
-
def initialize(ruleset:, telemetry:)
|
13
|
-
@telemetry = telemetry
|
14
|
-
@diagnostics = nil
|
15
|
-
@addresses = []
|
16
|
-
|
17
|
-
settings = Datadog.configuration.appsec
|
18
|
-
|
19
|
-
# TODO: Refactor to make it easier to test
|
20
|
-
unless require_libddwaf && libddwaf_provides_waf? && create_waf_handle(settings, ruleset)
|
21
|
-
Datadog.logger.warn('AppSec is disabled, see logged errors above')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def ready?
|
26
|
-
!@handle.nil?
|
27
|
-
end
|
28
|
-
|
29
|
-
def finalize
|
30
|
-
@handle.finalize
|
31
|
-
end
|
32
|
-
|
33
|
-
def new_runner
|
34
|
-
SecurityEngine::Runner.new(@handle, telemetry: @telemetry)
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
# libddwaf raises a LoadError on unsupported platforms; it may at some
|
40
|
-
# point succeed in being required yet not provide a specific needed feature.
|
41
|
-
def require_libddwaf
|
42
|
-
Datadog.logger.debug { "libddwaf platform: #{libddwaf_platform}" }
|
43
|
-
|
44
|
-
require 'libddwaf'
|
45
|
-
|
46
|
-
true
|
47
|
-
rescue LoadError => e
|
48
|
-
Datadog.logger.error do
|
49
|
-
'libddwaf failed to load,' \
|
50
|
-
"installed platform: #{libddwaf_platform} ruby platforms: #{ruby_platforms} error: #{e.inspect}"
|
51
|
-
end
|
52
|
-
@telemetry.report(e, description: 'libddwaf failed to load')
|
53
|
-
|
54
|
-
false
|
55
|
-
end
|
56
|
-
|
57
|
-
# check whether libddwaf is required *and* able to provide the needed feature
|
58
|
-
def libddwaf_provides_waf?
|
59
|
-
defined?(Datadog::AppSec::WAF) ? true : false
|
60
|
-
end
|
61
|
-
|
62
|
-
def create_waf_handle(settings, ruleset)
|
63
|
-
# TODO: this may need to be reset if the main Datadog logging level changes after initialization
|
64
|
-
Datadog::AppSec::WAF.logger = Datadog.logger if Datadog.logger.debug? && settings.waf_debug
|
65
|
-
|
66
|
-
obfuscator_config = {
|
67
|
-
key_regex: settings.obfuscator_key_regex,
|
68
|
-
value_regex: settings.obfuscator_value_regex,
|
69
|
-
}
|
70
|
-
|
71
|
-
@handle = Datadog::AppSec::WAF::Handle.new(ruleset, obfuscator: obfuscator_config)
|
72
|
-
@diagnostics = @handle.diagnostics
|
73
|
-
@addresses = @handle.required_addresses
|
74
|
-
|
75
|
-
true
|
76
|
-
rescue WAF::LibDDWAF::Error => e
|
77
|
-
Datadog.logger.error do
|
78
|
-
"libddwaf failed to initialize, error: #{e.inspect}"
|
79
|
-
end
|
80
|
-
@telemetry.report(e, description: 'libddwaf failed to initialize')
|
81
|
-
|
82
|
-
@diagnostics = e.diagnostics if e.diagnostics
|
83
|
-
|
84
|
-
false
|
85
|
-
rescue StandardError => e
|
86
|
-
Datadog.logger.error do
|
87
|
-
"libddwaf failed to initialize, error: #{e.inspect}"
|
88
|
-
end
|
89
|
-
@telemetry.report(e, description: 'libddwaf failed to initialize')
|
90
|
-
|
91
|
-
false
|
92
|
-
end
|
93
|
-
|
94
|
-
def libddwaf_platform
|
95
|
-
if Gem.loaded_specs['libddwaf']
|
96
|
-
Gem.loaded_specs['libddwaf'].platform.to_s
|
97
|
-
else
|
98
|
-
'unknown'
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def ruby_platforms
|
103
|
-
Gem.platforms.map(&:to_s)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Utils
|
6
|
-
# Utility class to to AppSec-specific trace operations
|
7
|
-
class TraceOperation
|
8
|
-
def self.appsec_standalone_reject?(trace)
|
9
|
-
Datadog.configuration.appsec.standalone.enabled &&
|
10
|
-
(trace.nil? || trace.get_tag(Datadog::AppSec::Ext::TAG_DISTRIBUTED_APPSEC_EVENT) != '1')
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module Core
|
5
|
-
module Telemetry
|
6
|
-
module Http
|
7
|
-
# Data structure for an HTTP request
|
8
|
-
class Env
|
9
|
-
attr_accessor :path, :body
|
10
|
-
|
11
|
-
attr_writer :headers
|
12
|
-
|
13
|
-
def headers
|
14
|
-
@headers ||= {}
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|