ddtrace 1.8.0 → 1.9.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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -1
  3. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +10 -10
  4. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +32 -32
  5. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +2 -2
  6. data/ext/ddtrace_profiling_native_extension/http_transport.c +50 -49
  7. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +5 -1
  8. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +34 -12
  9. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +10 -0
  10. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +32 -32
  11. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +4 -4
  12. data/lib/datadog/appsec/assets/waf_rules/recommended.json +75 -8
  13. data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
  14. data/lib/datadog/appsec/assets/waf_rules/strict.json +1 -1
  15. data/lib/datadog/appsec/assets.rb +1 -1
  16. data/lib/datadog/appsec/configuration/settings.rb +35 -22
  17. data/lib/datadog/appsec/configuration.rb +4 -2
  18. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  19. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  20. data/lib/datadog/appsec/contrib/integration.rb +1 -1
  21. data/lib/datadog/appsec/contrib/patcher.rb +1 -1
  22. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +1 -1
  23. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  24. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +1 -1
  25. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  26. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  27. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  28. data/lib/datadog/appsec/contrib/rack/request.rb +1 -1
  29. data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
  30. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +1 -1
  31. data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
  32. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
  33. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +1 -1
  34. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  35. data/lib/datadog/appsec/contrib/rails/request.rb +1 -1
  36. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
  37. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +1 -1
  38. data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -1
  39. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
  40. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
  41. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +1 -1
  42. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
  43. data/lib/datadog/appsec/event.rb +1 -1
  44. data/lib/datadog/appsec/extensions.rb +36 -26
  45. data/lib/datadog/appsec/instrumentation/gateway.rb +3 -3
  46. data/lib/datadog/appsec/processor.rb +15 -19
  47. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  48. data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
  49. data/lib/datadog/appsec/reactive/engine.rb +1 -1
  50. data/lib/datadog/appsec/reactive/operation.rb +2 -2
  51. data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
  52. data/lib/datadog/appsec/response.rb +18 -9
  53. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  54. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  55. data/lib/datadog/appsec/utils/http.rb +9 -0
  56. data/lib/datadog/appsec/utils.rb +7 -0
  57. data/lib/datadog/appsec.rb +1 -1
  58. data/lib/datadog/ci/ext/environment.rb +57 -13
  59. data/lib/datadog/core/configuration/agent_settings_resolver.rb +2 -2
  60. data/lib/datadog/core/configuration/base.rb +3 -0
  61. data/lib/datadog/core/configuration/ext.rb +8 -0
  62. data/lib/datadog/core/configuration/option_definition.rb +11 -2
  63. data/lib/datadog/core/configuration/settings.rb +6 -4
  64. data/lib/datadog/core/diagnostics/environment_logger.rb +4 -3
  65. data/lib/datadog/core/metrics/client.rb +3 -2
  66. data/lib/datadog/core/metrics/ext.rb +0 -2
  67. data/lib/datadog/core/telemetry/collector.rb +1 -0
  68. data/lib/datadog/kit/appsec/events.rb +75 -0
  69. data/lib/datadog/kit/enable_core_dumps.rb +1 -0
  70. data/lib/datadog/kit/identity.rb +8 -7
  71. data/lib/datadog/opentelemetry/api/context.rb +187 -0
  72. data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
  73. data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
  74. data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
  75. data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
  76. data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
  77. data/lib/datadog/opentelemetry.rb +48 -0
  78. data/lib/datadog/tracing/configuration/ext.rb +1 -2
  79. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -0
  80. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +10 -3
  81. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  82. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -6
  83. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -0
  84. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  85. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -4
  86. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -0
  87. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  88. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +3 -4
  89. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +44 -31
  90. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  91. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  92. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  93. data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
  94. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  95. data/lib/datadog/tracing/contrib.rb +1 -0
  96. data/lib/datadog/tracing/distributed/trace_context.rb +16 -7
  97. data/lib/datadog/tracing/metadata/tagging.rb +6 -0
  98. data/lib/datadog/tracing/trace_digest.rb +17 -7
  99. data/lib/datadog/tracing/trace_operation.rb +8 -0
  100. data/lib/ddtrace/version.rb +1 -1
  101. metadata +23 -6
@@ -2,7 +2,7 @@
2
2
 
3
3
  # typed: ignore
4
4
 
5
- require 'libdatadog'
5
+ require 'rubygems'
6
6
  require 'pathname'
7
7
 
8
8
  module Datadog
@@ -17,6 +17,8 @@ module Datadog
17
17
  # Older Rubies don't have the MJIT header, used by the JIT compiler, so we need to use a different approach
18
18
  CAN_USE_MJIT_HEADER = RUBY_VERSION >= '2.6'
19
19
 
20
+ LIBDATADOG_VERSION = '~> 1.0.1.1.0'
21
+
20
22
  def self.fail_install_if_missing_extension?
21
23
  ENV[ENV_FAIL_INSTALL_IF_MISSING_EXTENSION].to_s.strip.downcase == 'true'
22
24
  end
@@ -88,6 +90,7 @@ module Datadog
88
90
  not_on_amd64_or_arm64? ||
89
91
  on_ruby_2_1? ||
90
92
  expected_to_use_mjit_but_mjit_is_disabled? ||
93
+ libdatadog_not_available? ||
91
94
  libdatadog_not_usable?
92
95
  end
93
96
 
@@ -142,11 +145,6 @@ module Datadog
142
145
  '<https://dtdg.co/ruby-profiler-troubleshooting>.'
143
146
  ].freeze
144
147
 
145
- REPORT_ISSUE = [
146
- 'If you needed to use this, please tell us why on',
147
- '<https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :)',
148
- ].freeze
149
-
150
148
  GET_IN_TOUCH = [
151
149
  "Get in touch with us if you're interested in profiling your app!"
152
150
  ].freeze
@@ -172,10 +170,10 @@ module Datadog
172
170
  PKG_CONFIG_IS_MISSING = explain_issue(
173
171
  #+-----------------------------------------------------------------------------+
174
172
  'the `pkg-config` system tool is missing.',
175
- 'This issue can usually be fixed by installing:',
176
- '1. the `pkg-config` package on Homebrew and Debian/Ubuntu-based Linux;',
177
- '2. the `pkgconf` package on Arch and Alpine-based Linux;',
178
- '3. the `pkgconf-pkg-config` package on Fedora/Red Hat-based Linux.',
173
+ 'This issue can usually be fixed by installing one of the following:',
174
+ 'the `pkg-config` package on Homebrew and Debian/Ubuntu-based Linux;',
175
+ 'the `pkgconf` package on Arch and Alpine-based Linux;',
176
+ 'the `pkgconf-pkg-config` package on Fedora/Red Hat-based Linux.',
179
177
  suggested: CONTACT_SUPPORT,
180
178
  )
181
179
 
@@ -188,10 +186,15 @@ module Datadog
188
186
  )
189
187
 
190
188
  private_class_method def self.disabled_via_env?
189
+ report_disabled = [
190
+ 'If you needed to use this, please tell us why on',
191
+ '<https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :)',
192
+ ].freeze
193
+
191
194
  disabled_via_env = explain_issue(
192
195
  'the `DD_PROFILING_NO_EXTENSION` environment variable is/was set to',
193
196
  '`true` during installation.',
194
- suggested: REPORT_ISSUE,
197
+ suggested: report_disabled,
195
198
  )
196
199
 
197
200
  return unless ENV[ENV_NO_EXTENSION].to_s.strip.downcase == 'true'
@@ -254,7 +257,7 @@ module Datadog
254
257
  suggested: GET_IN_TOUCH,
255
258
  )
256
259
 
257
- architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64')
260
+ architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64', 'arm64')
258
261
  end
259
262
 
260
263
  private_class_method def self.on_ruby_2_1?
@@ -279,6 +282,25 @@ module Datadog
279
282
  ruby_without_mjit if CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
280
283
  end
281
284
 
285
+ private_class_method def self.libdatadog_not_available?
286
+ begin
287
+ gem 'libdatadog', LIBDATADOG_VERSION
288
+ require 'libdatadog'
289
+ nil
290
+ # rubocop:disable Lint/RescueException
291
+ rescue Exception => e
292
+ explain_issue(
293
+ 'there was an exception during loading of the `libdatadog` gem:',
294
+ e.class.name,
295
+ *e.message.split("\n"),
296
+ *Array(e.backtrace),
297
+ '.',
298
+ suggested: CONTACT_SUPPORT,
299
+ )
300
+ end
301
+ # rubocop:enable Lint/RescueException
302
+ end
303
+
282
304
  private_class_method def self.libdatadog_not_usable?
283
305
  no_binaries_for_current_platform = explain_issue(
284
306
  'the `libdatadog` gem installed on your system is missing binaries for your',
@@ -390,6 +390,7 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
390
390
  // for iseqs created from calls to `eval` and `instance_eval`. This makes it so that `rb_profile_frame_path` on
391
391
  // the `VALUE` returned by rb_profile_frames returns `(eval)` instead of the path of the file where the `eval`
392
392
  // was called from.
393
+ // * Imported fix from https://github.com/ruby/ruby/pull/7116 to avoid sampling threads that are still being created
393
394
  //
394
395
  // **IMPORTANT: WHEN CHANGING THIS FUNCTION, CONSIDER IF THE SAME CHANGE ALSO NEEDS TO BE MADE TO THE VARIANT FOR
395
396
  // RUBY 2.2 AND BELOW WHICH IS ALSO PRESENT ON THIS FILE**
@@ -436,6 +437,10 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i
436
437
  const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
437
438
  const rb_callable_method_entry_t *cme;
438
439
 
440
+ // This should not happen for ddtrace (it can only happen when a thread is still being created), but I've imported
441
+ // it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset.
442
+ if (cfp == NULL) return 0;
443
+
439
444
  // Avoid sampling dead threads
440
445
  if (th->status == THREAD_KILLED) return 0;
441
446
 
@@ -747,6 +752,7 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
747
752
  // `vm_backtrace.c` (`backtrace_each`, `backtrace_size`, `rb_ec_partial_backtrace_object`) but are conspicuously
748
753
  // absent from `rb_profile_frames`. Oversight?
749
754
  // * Check thread status and do not sample if thread has been killed.
755
+ // * Imported fix from https://github.com/ruby/ruby/pull/7116 to avoid sampling threads that are still being created
750
756
  //
751
757
  // The `rb_profile_frames` function changed quite a bit between Ruby 2.2 and 2.3. Since the change was quite complex
752
758
  // I opted not to try to extend support to Ruby 2.2 using the same custom function, and instead I started
@@ -760,6 +766,10 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i
760
766
  rb_thread_t *th = thread_struct_from_object(thread);
761
767
  rb_control_frame_t *cfp = th->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(th);
762
768
 
769
+ // This should not happen for ddtrace (it can only happen when a thread is still being created), but I've imported
770
+ // it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset.
771
+ if (cfp == NULL) return 0;
772
+
763
773
  // Avoid sampling dead threads
764
774
  if (th->status == THREAD_KILLED) return 0;
765
775
 
@@ -7,7 +7,7 @@
7
7
  #include "libdatadog_helpers.h"
8
8
  #include "ruby_helpers.h"
9
9
 
10
- // Used to wrap a ddog_Profile in a Ruby object and expose Ruby-level serialization APIs
10
+ // Used to wrap a ddog_prof_Profile in a Ruby object and expose Ruby-level serialization APIs
11
11
  // This file implements the native bits of the Datadog::Profiling::StackRecorder class
12
12
 
13
13
  // ---
@@ -24,7 +24,7 @@
24
24
  // 2. The thread that serializes and reports profiles, let's call it the **serializer thread**. We enforce that there
25
25
  // cannot be more than one thread attempting to serialize profiles at a time.
26
26
  //
27
- // If both the sampler and serializer threads are trying to access the same `ddog_Profile` in parallel, we will
27
+ // If both the sampler and serializer threads are trying to access the same `ddog_prof_Profile` in parallel, we will
28
28
  // have a concurrency issue. Thus, the StackRecorder has an added mechanism to avoid this.
29
29
  //
30
30
  // As an additional constraint, the **sampler thread** has absolute priority and must never block while
@@ -32,7 +32,7 @@
32
32
  //
33
33
  // ### The solution: Keep two profiles at the same time
34
34
  //
35
- // To solve for the constraints above, the StackRecorder keeps two `ddog_Profile` profile instances inside itself.
35
+ // To solve for the constraints above, the StackRecorder keeps two `ddog_prof_Profile` profile instances inside itself.
36
36
  // They are called the `slot_one_profile` and `slot_two_profile`.
37
37
  //
38
38
  // Each profile is paired with its own mutex. `slot_one_profile` is protected by `slot_one_mutex` and `slot_two_profile`
@@ -135,10 +135,10 @@ static VALUE stack_recorder_class = Qnil;
135
135
  // Contains native state for each instance
136
136
  struct stack_recorder_state {
137
137
  pthread_mutex_t slot_one_mutex;
138
- ddog_Profile *slot_one_profile;
138
+ ddog_prof_Profile *slot_one_profile;
139
139
 
140
140
  pthread_mutex_t slot_two_mutex;
141
- ddog_Profile *slot_two_profile;
141
+ ddog_prof_Profile *slot_two_profile;
142
142
 
143
143
  short active_slot; // MUST NEVER BE ACCESSED FROM record_sample; this is NOT for the sampler thread to use.
144
144
  };
@@ -146,7 +146,7 @@ struct stack_recorder_state {
146
146
  // Used to return a pair of values from sampler_lock_active_profile()
147
147
  struct active_slot_pair {
148
148
  pthread_mutex_t *mutex;
149
- ddog_Profile *profile;
149
+ ddog_prof_Profile *profile;
150
150
  };
151
151
 
152
152
  struct call_serialize_without_gvl_arguments {
@@ -155,8 +155,8 @@ struct call_serialize_without_gvl_arguments {
155
155
  ddog_Timespec finish_timestamp;
156
156
 
157
157
  // Set by callee
158
- ddog_Profile *profile;
159
- ddog_SerializeResult result;
158
+ ddog_prof_Profile *profile;
159
+ ddog_prof_Profile_SerializeResult result;
160
160
 
161
161
  // Set by both
162
162
  bool serialize_ran;
@@ -170,7 +170,7 @@ static VALUE ruby_time_from(ddog_Timespec ddprof_time);
170
170
  static void *call_serialize_without_gvl(void *call_args);
171
171
  static struct active_slot_pair sampler_lock_active_profile();
172
172
  static void sampler_unlock_active_profile(struct active_slot_pair active_slot);
173
- static ddog_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state);
173
+ static ddog_prof_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state);
174
174
  static VALUE _native_active_slot(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
175
175
  static VALUE _native_is_slot_one_mutex_locked(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
176
176
  static VALUE _native_is_slot_two_mutex_locked(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
@@ -207,7 +207,7 @@ void stack_recorder_init(VALUE profiling_module) {
207
207
  ruby_time_from_id = rb_intern_const("ruby_time_from");
208
208
  }
209
209
 
210
- // This structure is used to define a Ruby object that stores a pointer to a ddog_Profile instance
210
+ // This structure is used to define a Ruby object that stores a pointer to a ddog_prof_Profile instance
211
211
  // See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
212
212
  static const rb_data_type_t stack_recorder_typed_data = {
213
213
  .wrap_struct_name = "Datadog::Profiling::StackRecorder",
@@ -222,14 +222,14 @@ static const rb_data_type_t stack_recorder_typed_data = {
222
222
  static VALUE _native_new(VALUE klass) {
223
223
  struct stack_recorder_state *state = ruby_xcalloc(1, sizeof(struct stack_recorder_state));
224
224
 
225
- ddog_Slice_value_type sample_types = {.ptr = enabled_value_types, .len = ENABLED_VALUE_TYPES_COUNT};
225
+ ddog_prof_Slice_ValueType sample_types = {.ptr = enabled_value_types, .len = ENABLED_VALUE_TYPES_COUNT};
226
226
 
227
227
  initialize_slot_concurrency_control(state);
228
228
 
229
229
  // Note: Don't raise exceptions after this point, since it'll lead to libdatadog memory leaking!
230
230
 
231
- state->slot_one_profile = ddog_Profile_new(sample_types, NULL /* period is optional */, NULL /* start_time is optional */);
232
- state->slot_two_profile = ddog_Profile_new(sample_types, NULL /* period is optional */, NULL /* start_time is optional */);
231
+ state->slot_one_profile = ddog_prof_Profile_new(sample_types, NULL /* period is optional */, NULL /* start_time is optional */);
232
+ state->slot_two_profile = ddog_prof_Profile_new(sample_types, NULL /* period is optional */, NULL /* start_time is optional */);
233
233
 
234
234
  return TypedData_Wrap_Struct(klass, &stack_recorder_typed_data, state);
235
235
  }
@@ -248,10 +248,10 @@ static void stack_recorder_typed_data_free(void *state_ptr) {
248
248
  struct stack_recorder_state *state = (struct stack_recorder_state *) state_ptr;
249
249
 
250
250
  pthread_mutex_destroy(&state->slot_one_mutex);
251
- ddog_Profile_free(state->slot_one_profile);
251
+ ddog_prof_Profile_drop(state->slot_one_profile);
252
252
 
253
253
  pthread_mutex_destroy(&state->slot_two_mutex);
254
- ddog_Profile_free(state->slot_two_profile);
254
+ ddog_prof_Profile_drop(state->slot_two_profile);
255
255
 
256
256
  ruby_xfree(state);
257
257
  }
@@ -282,26 +282,26 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan
282
282
  rb_thread_call_without_gvl2(call_serialize_without_gvl, &args, NULL /* No interruption function needed in this case */, NULL /* Not needed */);
283
283
  }
284
284
 
285
- ddog_SerializeResult serialized_profile = args.result;
285
+ ddog_prof_Profile_SerializeResult serialized_profile = args.result;
286
286
 
287
- if (serialized_profile.tag == DDOG_SERIALIZE_RESULT_ERR) {
288
- VALUE err_details = ruby_string_from_vec_u8(serialized_profile.err);
289
- ddog_SerializeResult_drop(serialized_profile);
287
+ if (serialized_profile.tag == DDOG_PROF_PROFILE_SERIALIZE_RESULT_ERR) {
288
+ VALUE err_details = ruby_string_from_prof_vec_u8(serialized_profile.err);
289
+ ddog_prof_Profile_SerializeResult_drop(serialized_profile);
290
290
  return rb_ary_new_from_args(2, error_symbol, err_details);
291
291
  }
292
292
 
293
- VALUE encoded_pprof = ruby_string_from_vec_u8(serialized_profile.ok.buffer);
293
+ VALUE encoded_pprof = ruby_string_from_prof_vec_u8(serialized_profile.ok.buffer);
294
294
 
295
295
  ddog_Timespec ddprof_start = serialized_profile.ok.start;
296
296
  ddog_Timespec ddprof_finish = serialized_profile.ok.end;
297
297
 
298
298
  // Clean up libdatadog object to avoid leaking in case ruby_time_from raises an exception
299
- ddog_SerializeResult_drop(serialized_profile);
299
+ ddog_prof_Profile_SerializeResult_drop(serialized_profile);
300
300
 
301
301
  VALUE start = ruby_time_from(ddprof_start);
302
302
  VALUE finish = ruby_time_from(ddprof_finish);
303
303
 
304
- if (!ddog_Profile_reset(args.profile, NULL /* start_time is optional */ )) {
304
+ if (!ddog_prof_Profile_reset(args.profile, NULL /* start_time is optional */ )) {
305
305
  return rb_ary_new_from_args(2, error_symbol, rb_str_new_cstr("Failed to reset profile"));
306
306
  }
307
307
 
@@ -318,13 +318,13 @@ static VALUE ruby_time_from(ddog_Timespec ddprof_time) {
318
318
  #endif
319
319
  }
320
320
 
321
- void record_sample(VALUE recorder_instance, ddog_Sample sample) {
321
+ void record_sample(VALUE recorder_instance, ddog_prof_Sample sample) {
322
322
  struct stack_recorder_state *state;
323
323
  TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
324
324
 
325
325
  struct active_slot_pair active_slot = sampler_lock_active_profile(state);
326
326
 
327
- ddog_Profile_add(active_slot.profile, sample);
327
+ ddog_prof_Profile_add(active_slot.profile, sample);
328
328
 
329
329
  sampler_unlock_active_profile(active_slot);
330
330
  }
@@ -335,7 +335,7 @@ void record_endpoint(VALUE recorder_instance, ddog_CharSlice local_root_span_id,
335
335
 
336
336
  struct active_slot_pair active_slot = sampler_lock_active_profile(state);
337
337
 
338
- ddog_Profile_set_endpoint(active_slot.profile, local_root_span_id, endpoint);
338
+ ddog_prof_Profile_set_endpoint(active_slot.profile, local_root_span_id, endpoint);
339
339
 
340
340
  sampler_unlock_active_profile(active_slot);
341
341
  }
@@ -344,7 +344,7 @@ static void *call_serialize_without_gvl(void *call_args) {
344
344
  struct call_serialize_without_gvl_arguments *args = (struct call_serialize_without_gvl_arguments *) call_args;
345
345
 
346
346
  args->profile = serializer_flip_active_and_inactive_slots(args->state);
347
- args->result = ddog_Profile_serialize(args->profile, &args->finish_timestamp, NULL /* duration_nanos is optional */);
347
+ args->result = ddog_prof_Profile_serialize(args->profile, &args->finish_timestamp, NULL /* duration_nanos is optional */);
348
348
  args->serialize_ran = true;
349
349
 
350
350
  return NULL; // Unused
@@ -382,7 +382,7 @@ static void sampler_unlock_active_profile(struct active_slot_pair active_slot) {
382
382
  ENFORCE_SUCCESS_GVL(pthread_mutex_unlock(active_slot.mutex));
383
383
  }
384
384
 
385
- static ddog_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state) {
385
+ static ddog_prof_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state) {
386
386
  int previously_active_slot = state->active_slot;
387
387
 
388
388
  if (previously_active_slot != 1 && previously_active_slot != 2) {
@@ -466,19 +466,19 @@ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_
466
466
  // resulting state is inconsistent, we make sure to reset it back to the initial state.
467
467
  initialize_slot_concurrency_control(state);
468
468
 
469
- ddog_Profile_reset(state->slot_one_profile, /* start_time: */ NULL);
470
- ddog_Profile_reset(state->slot_two_profile, /* start_time: */ NULL);
469
+ ddog_prof_Profile_reset(state->slot_one_profile, /* start_time: */ NULL);
470
+ ddog_prof_Profile_reset(state->slot_two_profile, /* start_time: */ NULL);
471
471
 
472
472
  return Qtrue;
473
473
  }
474
474
 
475
- // Assumption 1: This method is called with the GVL being held, because `ddog_Profile_reset` mutates the profile and should
475
+ // Assumption 1: This method is called with the GVL being held, because `ddog_prof_Profile_reset` mutates the profile and should
476
476
  // not be interrupted part-way through by a VM fork.
477
477
  static void serializer_set_start_timestamp_for_next_profile(struct stack_recorder_state *state, ddog_Timespec timestamp) {
478
478
  // Before making this profile active, we reset it so that it uses the correct timestamp for its start
479
- ddog_Profile *next_profile = (state->active_slot == 1) ? state->slot_two_profile : state->slot_one_profile;
479
+ ddog_prof_Profile *next_profile = (state->active_slot == 1) ? state->slot_two_profile : state->slot_one_profile;
480
480
 
481
- if (!ddog_Profile_reset(next_profile, &timestamp)) rb_raise(rb_eRuntimeError, "Failed to reset profile");
481
+ if (!ddog_prof_Profile_reset(next_profile, &timestamp)) rb_raise(rb_eRuntimeError, "Failed to reset profile");
482
482
  }
483
483
 
484
484
  static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE local_root_span_id, VALUE endpoint) {
@@ -10,7 +10,7 @@
10
10
  // ```
11
11
  // compiling ../../../../ext/ddtrace_profiling_native_extension/stack_recorder.c
12
12
  // ../../../../ext/ddtrace_profiling_native_extension/stack_recorder.c:23:1: error: initializer element is not constant
13
- // static const ddog_ValueType enabled_value_types[] = {CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE};
13
+ // static const ddog_prof_ValueType enabled_value_types[] = {CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE};
14
14
  // ^
15
15
  // ```
16
16
  #define VALUE_STRING(string) {.ptr = "" string, .len = sizeof(string) - 1}
@@ -23,7 +23,7 @@
23
23
  #define HEAP_LIVE_SIZE_VALUE {.type_ = VALUE_STRING("heap-live-size"), .unit = VALUE_STRING("bytes")}
24
24
  #define HEAP_LIVE_SAMPLES_VALUE {.type_ = VALUE_STRING("heap-live-samples"), .unit = VALUE_STRING("count")}
25
25
 
26
- static const ddog_ValueType enabled_value_types[] = {
26
+ static const ddog_prof_ValueType enabled_value_types[] = {
27
27
  #define CPU_TIME_VALUE_POS 0
28
28
  CPU_TIME_VALUE,
29
29
  #define CPU_SAMPLES_VALUE_POS 1
@@ -32,8 +32,8 @@ static const ddog_ValueType enabled_value_types[] = {
32
32
  WALL_TIME_VALUE
33
33
  };
34
34
 
35
- #define ENABLED_VALUE_TYPES_COUNT (sizeof(enabled_value_types) / sizeof(ddog_ValueType))
35
+ #define ENABLED_VALUE_TYPES_COUNT (sizeof(enabled_value_types) / sizeof(ddog_prof_ValueType))
36
36
 
37
- void record_sample(VALUE recorder_instance, ddog_Sample sample);
37
+ void record_sample(VALUE recorder_instance, ddog_prof_Sample sample);
38
38
  void record_endpoint(VALUE recorder_instance, ddog_CharSlice local_root_span_id, ddog_CharSlice endpoint);
39
39
  VALUE enforce_recorder_instance(VALUE object);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "2.2",
3
3
  "metadata": {
4
- "rules_version": "1.4.2"
4
+ "rules_version": "1.4.3"
5
5
  },
6
6
  "rules": [
7
7
  {
@@ -1802,7 +1802,7 @@
1802
1802
  "address": "server.request.path_params"
1803
1803
  }
1804
1804
  ],
1805
- "regex": "^(?i:file|ftps?|https?).*?\\?+$",
1805
+ "regex": "^(?i:file|ftps?|http)://.*?\\?+$",
1806
1806
  "options": {
1807
1807
  "case_sensitive": true,
1808
1808
  "min_length": 4
@@ -2694,8 +2694,9 @@
2694
2694
  "address": "grpc.server.request.message"
2695
2695
  }
2696
2696
  ],
2697
- "regex": "\\b(?:s(?:e(?:t(?:_(?:e(?:xception|rror)_handler|magic_quotes_runtime|include_path)|defaultstub)|ssion_s(?:et_save_handler|tart))|qlite_(?:(?:(?:unbuffered|single|array)_)?query|create_(?:aggregate|function)|p?open|exec)|tr(?:eam_(?:context_create|socket_client)|ipc?slashes|rev)|implexml_load_(?:string|file)|ocket_c(?:onnect|reate)|h(?:ow_sourc|a1_fil)e|pl_autoload_register|ystem)|p(?:r(?:eg_(?:replace(?:_callback(?:_array)?)?|match(?:_all)?|split)|oc_(?:(?:terminat|clos|nic)e|get_status|open)|int_r)|o(?:six_(?:get(?:(?:e[gu]|g)id|login|pwnam)|mk(?:fifo|nod)|ttyname|kill)|pen)|hp(?:_(?:strip_whitespac|unam)e|version|info)|g_(?:(?:execut|prepar)e|connect|query)|a(?:rse_(?:ini_file|str)|ssthru)|utenv)|r(?:unkit_(?:function_(?:re(?:defin|nam)e|copy|add)|method_(?:re(?:defin|nam)e|copy|add)|constant_(?:redefine|add))|e(?:(?:gister_(?:shutdown|tick)|name)_function|ad(?:(?:gz)?file|_exif_data|dir))|awurl(?:de|en)code)|i(?:mage(?:createfrom(?:(?:jpe|pn)g|x[bp]m|wbmp|gif)|(?:jpe|pn)g|g(?:d2?|if)|2?wbmp|xbm)|s_(?:(?:(?:execut|write?|read)ab|fi)le|dir)|ni_(?:get(?:_all)?|set)|terator_apply|ptcembed)|g(?:et(?:_(?:c(?:urrent_use|fg_va)r|meta_tags)|my(?:[gpu]id|inode)|(?:lastmo|cw)d|imagesize|env)|z(?:(?:(?:defla|wri)t|encod|fil)e|compress|open|read)|lob)|a(?:rray_(?:u(?:intersect(?:_u?assoc)?|diff(?:_u?assoc)?)|intersect_u(?:assoc|key)|diff_u(?:assoc|key)|filter|reduce|map)|ssert(?:_options)?|lert|tob)|h(?:tml(?:specialchars(?:_decode)?|_entity_decode|entities)|(?:ash(?:_(?:update|hmac))?|ighlight)_file|e(?:ader_register_callback|x2bin))|f(?:i(?:le(?:(?:[acm]tim|inod)e|(?:_exist|perm)s|group)?|nfo_open)|tp_(?:nb_(?:ge|pu)|connec|ge|pu)t|(?:unction_exis|pu)ts|write|open)|o(?:b_(?:get_(?:c(?:ontents|lean)|flush)|end_(?:clean|flush)|clean|flush|start)|dbc_(?:result(?:_all)?|exec(?:ute)?|connect)|pendir)|m(?:b_(?:ereg(?:_(?:replace(?:_callback)?|match)|i(?:_replace)?)?|parse_str)|(?:ove_uploaded|d5)_file|ethod_exists|ysql_query|kdir)|e(?:x(?:if_(?:t(?:humbnail|agname)|imagetype|read_data)|ec)|scapeshell(?:arg|cmd)|rror_reporting|val)|c(?:url_(?:file_create|exec|init)|onvert_uuencode|reate_function|hr)|u(?:n(?:serialize|pack)|rl(?:de|en)code|[ak]?sort)|b(?:(?:son_(?:de|en)|ase64_en)code|zopen|toa)|(?:json_(?:de|en)cod|debug_backtrac|tmpfil)e|var_dump)(?:\\s|/\\*.*\\*/|//.*|#.*|\\\")*\\(.*\\)",
2697
+ "regex": "\\b(?:s(?:e(?:t(?:_(?:e(?:xception|rror)_handler|magic_quotes_runtime|include_path)|defaultstub)|ssion_s(?:et_save_handler|tart))|qlite_(?:(?:(?:unbuffered|single|array)_)?query|create_(?:aggregate|function)|p?open|exec)|tr(?:eam_(?:context_create|socket_client)|ipc?slashes|rev)|implexml_load_(?:string|file)|ocket_c(?:onnect|reate)|h(?:ow_sourc|a1_fil)e|pl_autoload_register|ystem)|p(?:r(?:eg_(?:replace(?:_callback(?:_array)?)?|match(?:_all)?|split)|oc_(?:(?:terminat|clos|nic)e|get_status|open)|int_r)|o(?:six_(?:get(?:(?:e[gu]|g)id|login|pwnam)|mk(?:fifo|nod)|ttyname|kill)|pen)|hp(?:_(?:strip_whitespac|unam)e|version|info)|g_(?:(?:execut|prepar)e|connect|query)|a(?:rse_(?:ini_file|str)|ssthru)|utenv)|r(?:unkit_(?:function_(?:re(?:defin|nam)e|copy|add)|method_(?:re(?:defin|nam)e|copy|add)|constant_(?:redefine|add))|e(?:(?:gister_(?:shutdown|tick)|name)_function|ad(?:(?:gz)?file|_exif_data|dir))|awurl(?:de|en)code)|i(?:mage(?:createfrom(?:(?:jpe|pn)g|x[bp]m|wbmp|gif)|(?:jpe|pn)g|g(?:d2?|if)|2?wbmp|xbm)|s_(?:(?:(?:execut|write?|read)ab|fi)le|dir)|ni_(?:get(?:_all)?|set)|terator_apply|ptcembed)|g(?:et(?:_(?:c(?:urrent_use|fg_va)r|meta_tags)|my(?:[gpu]id|inode)|(?:lastmo|cw)d|imagesize|env)|z(?:(?:(?:defla|wri)t|encod|fil)e|compress|open|read)|lob)|a(?:rray_(?:u(?:intersect(?:_u?assoc)?|diff(?:_u?assoc)?)|intersect_u(?:assoc|key)|diff_u(?:assoc|key)|filter|reduce|map)|ssert(?:_options)?|lert|tob)|h(?:tml(?:specialchars(?:_decode)?|_entity_decode|entities)|(?:ash(?:_(?:update|hmac))?|ighlight)_file|e(?:ader_register_callback|x2bin))|f(?:i(?:le(?:(?:[acm]tim|inod)e|(?:_exist|perm)s|group)?|nfo_open)|tp_(?:nb_(?:ge|pu)|connec|ge|pu)t|(?:unction_exis|pu)ts|write|open)|o(?:b_(?:get_(?:c(?:ontents|lean)|flush)|end_(?:clean|flush)|clean|flush|start)|dbc_(?:result(?:_all)?|exec(?:ute)?|connect)|pendir)|m(?:b_(?:ereg(?:_(?:replace(?:_callback)?|match)|i(?:_replace)?)?|parse_str)|(?:ove_uploaded|d5)_file|ethod_exists|ysql_query|kdir)|e(?:x(?:if_(?:t(?:humbnail|agname)|imagetype|read_data)|ec)|scapeshell(?:arg|cmd)|rror_reporting|val)|c(?:url_(?:file_create|exec|init)|onvert_uuencode|reate_function|hr)|u(?:n(?:serialize|pack)|rl(?:de|en)code|[ak]?sort)|b(?:(?:son_(?:de|en)|ase64_en)code|zopen|toa)|(?:json_(?:de|en)cod|debug_backtrac|tmpfil)e|var_dump)(?:\\s|/\\*.*\\*/|//.*|#.*|\\\"|')*\\((?:(?:\\s|/\\*.*\\*/|//.*|#.*)*(?:\\$\\w+|[A-Z\\d]\\w*|\\w+\\(.*\\)|\\\\?\"(?:[^\"]|\\\\\"|\"\"|\"\\+\")*\\\\?\"|\\\\?'(?:[^']|''|'\\+')*\\\\?')(?:\\s|/\\*.*\\*/|//.*|#.*)*(?:(?:::|\\.|->)(?:\\s|/\\*.*\\*/|//.*|#.*)*\\w+(?:\\(.*\\))?)?,)*(?:(?:\\s|/\\*.*\\*/|//.*|#.*)*(?:\\$\\w+|[A-Z\\d]\\w*|\\w+\\(.*\\)|\\\\?\"(?:[^\"]|\\\\\"|\"\"|\"\\+\")*\\\\?\"|\\\\?'(?:[^']|''|'\\+')*\\\\?')(?:\\s|/\\*.*\\*/|//.*|#.*)*(?:(?:::|\\.|->)(?:\\s|/\\*.*\\*/|//.*|#.*)*\\w+(?:\\(.*\\))?)?)?\\)",
2698
2698
  "options": {
2699
+ "case_sensitive": true,
2699
2700
  "min_length": 5
2700
2701
  }
2701
2702
  },
@@ -3524,7 +3525,7 @@
3524
3525
  "address": "grpc.server.request.message"
3525
3526
  }
3526
3527
  ],
3527
- "regex": "\\b(?i:eval|settimeout|setinterval|new\\s+Function)\\s*\\(",
3528
+ "regex": "\\b(?i:eval|settimeout|setinterval|new\\s+Function|alert|prompt)\\s*\\([^\\)]",
3528
3529
  "options": {
3529
3530
  "case_sensitive": true,
3530
3531
  "min_length": 5
@@ -3770,7 +3771,7 @@
3770
3771
  "address": "grpc.server.request.message"
3771
3772
  }
3772
3773
  ],
3773
- "regex": "(?i:(?:\\[?\\$(?:(?:s(?:lic|iz)|wher)e|e(?:lemMatch|xists|q)|n(?:o[rt]|in?|e)|l(?:ike|te?)|t(?:ext|ype)|a(?:ll|nd)|jsonSchema|between|regex|x?or|div|mod)\\]?))",
3774
+ "regex": "(?i:(?:\\[?\\$(?:(?:s(?:lic|iz)|wher)e|e(?:lemMatch|xists|q)|n(?:o[rt]|in?|e)|l(?:ike|te?)|t(?:ext|ype)|a(?:ll|nd)|jsonSchema|between|regex|x?or|div|mod)\\]?)\\b)",
3774
3775
  "options": {
3775
3776
  "case_sensitive": true,
3776
3777
  "min_length": 3
@@ -3808,7 +3809,7 @@
3808
3809
  "address": "grpc.server.request.message"
3809
3810
  }
3810
3811
  ],
3811
- "regex": "(?:^[\\W\\d]+\\s*?(?:alter\\s*(?:a(?:(?:pplication\\s*rol|ggregat)e|s(?:ymmetric\\s*ke|sembl)y|u(?:thorization|dit)|vailability\\s*group)|c(?:r(?:yptographic\\s*provider|edential)|o(?:l(?:latio|um)|nversio)n|ertificate|luster)|s(?:e(?:rv(?:ice|er)|curity|quence|ssion|arch)|y(?:mmetric\\s*key|nonym)|togroup|chema)|m(?:a(?:s(?:ter\\s*key|k)|terialized)|e(?:ssage\\s*type|thod)|odule)|l(?:o(?:g(?:file\\s*group|in)|ckdown)|a(?:ngua|r)ge|ibrary)|t(?:(?:abl(?:espac)?|yp)e|r(?:igger|usted)|hreshold|ext)|p(?:a(?:rtition|ckage)|ro(?:cedur|fil)e|ermission)|d(?:i(?:mension|skgroup)|atabase|efault|omain)|r(?:o(?:l(?:lback|e)|ute)|e(?:sourc|mot)e)|f(?:u(?:lltext|nction)|lashback|oreign)|e(?:xte(?:nsion|rnal)|(?:ndpoi|ve)nt)|in(?:dex(?:type)?|memory|stance)|b(?:roker\\s*priority|ufferpool)|x(?:ml\\s*schema|srobject)|w(?:ork(?:load)?|rapper)|hi(?:erarchy|stogram)|o(?:perator|utline)|(?:nicknam|queu)e|us(?:age|er)|group|java|view)\\b|(?:(?:(?:trunc|cre)at|renam)e|d(?:e(?:lete|sc)|rop)|(?:inser|selec)t|load)\\s+\\w+|u(?:nion\\s*(?:(?:distin|sele)ct|all)\\b|pdate\\s+\\w+))|\\b(?:(?:(?:(?:trunc|cre|upd)at|renam)e|(?:inser|selec)t|de(?:lete|sc)|alter|load)\\s+(?:group_concat|load_file|char)\\b\\s*\\(?|end\\s*?\\);)|[\\\"'`\\w]\\s+as\\b\\s*[\\\"'`\\w]+\\s*\\bfrom|[\\s(?:]load_file\\s*?\\(|[\\\"'`]\\s+regexp\\W)",
3812
+ "regex": "(?:^[\\W\\d]+\\s*?(?:alter\\s*(?:a(?:(?:pplication\\s*rol|ggregat)e|s(?:ymmetric\\s*ke|sembl)y|u(?:thorization|dit)|vailability\\s*group)|c(?:r(?:yptographic\\s*provider|edential)|o(?:l(?:latio|um)|nversio)n|ertificate|luster)|s(?:e(?:rv(?:ice|er)|curity|quence|ssion|arch)|y(?:mmetric\\s*key|nonym)|togroup|chema)|m(?:a(?:s(?:ter\\s*key|k)|terialized)|e(?:ssage\\s*type|thod)|odule)|l(?:o(?:g(?:file\\s*group|in)|ckdown)|a(?:ngua|r)ge|ibrary)|t(?:(?:abl(?:espac)?|yp)e|r(?:igger|usted)|hreshold|ext)|p(?:a(?:rtition|ckage)|ro(?:cedur|fil)e|ermission)|d(?:i(?:mension|skgroup)|atabase|efault|omain)|r(?:o(?:l(?:lback|e)|ute)|e(?:sourc|mot)e)|f(?:u(?:lltext|nction)|lashback|oreign)|e(?:xte(?:nsion|rnal)|(?:ndpoi|ve)nt)|in(?:dex(?:type)?|memory|stance)|b(?:roker\\s*priority|ufferpool)|x(?:ml\\s*schema|srobject)|w(?:ork(?:load)?|rapper)|hi(?:erarchy|stogram)|o(?:perator|utline)|(?:nicknam|queu)e|us(?:age|er)|group|java|view)|union\\s*(?:(?:distin|sele)ct|all))\\b|\\b(?:(?:(?:trunc|cre|upd)at|renam)e|(?:inser|selec)t|de(?:lete|sc)|alter|load)\\s+(?:group_concat|load_file|char)\\b\\s*\\(?|[\\s(]load_file\\s*?\\(|[\\\"'`]\\s+regexp\\W)",
3812
3813
  "options": {
3813
3814
  "min_length": 5
3814
3815
  }
@@ -4177,7 +4178,7 @@
4177
4178
  "address": "grpc.server.request.message"
4178
4179
  }
4179
4180
  ],
4180
- "regex": "[#%$]{[^}]+[^\\w\\s][^}]+}",
4181
+ "regex": "[#%$]{(?:[^}]+[^\\w\\s}\\-_][^}]+|\\d+-\\d+)}",
4181
4182
  "options": {
4182
4183
  "case_sensitive": true
4183
4184
  }
@@ -4352,6 +4353,38 @@
4352
4353
  ],
4353
4354
  "transformers": []
4354
4355
  },
4356
+ {
4357
+ "id": "dog-931-001",
4358
+ "name": "RFI: URL Payload to well known RFI target",
4359
+ "tags": {
4360
+ "type": "rfi",
4361
+ "category": "attack_attempt"
4362
+ },
4363
+ "conditions": [
4364
+ {
4365
+ "parameters": {
4366
+ "inputs": [
4367
+ {
4368
+ "address": "server.request.query"
4369
+ },
4370
+ {
4371
+ "address": "server.request.body"
4372
+ },
4373
+ {
4374
+ "address": "server.request.path_params"
4375
+ }
4376
+ ],
4377
+ "regex": "^(?i:file|ftps?|https?).*/rfiinc\\.txt\\?+$",
4378
+ "options": {
4379
+ "case_sensitive": true,
4380
+ "min_length": 17
4381
+ }
4382
+ },
4383
+ "operator": "match_regex"
4384
+ }
4385
+ ],
4386
+ "transformers": []
4387
+ },
4355
4388
  {
4356
4389
  "id": "nfd-000-001",
4357
4390
  "name": "Detect common directory discovery scans",
@@ -5160,7 +5193,7 @@
5160
5193
  "address": "grpc.server.request.message"
5161
5194
  }
5162
5195
  ],
5163
- "regex": "^(jar:)?(http|https):\\/\\/([0-9oq]{1,5}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|[0-9]{1,10}|localhost)(:[0-9]{1,5})?(\\/.*|)$"
5196
+ "regex": "^(jar:)?(http|https):\\/\\/([0-9oq]{1,5}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|[0-9]{1,10})(:[0-9]{1,5})?(\\/.*|)$"
5164
5197
  },
5165
5198
  "operator": "match_regex"
5166
5199
  }
@@ -6417,6 +6450,40 @@
6417
6450
  ],
6418
6451
  "transformers": []
6419
6452
  },
6453
+ {
6454
+ "id": "ua0-600-56x",
6455
+ "name": "Datadog test scanner - blocking version: user-agent",
6456
+ "tags": {
6457
+ "type": "security_scanner",
6458
+ "category": "attack_attempt"
6459
+ },
6460
+ "conditions": [
6461
+ {
6462
+ "parameters": {
6463
+ "inputs": [
6464
+ {
6465
+ "address": "server.request.headers.no_cookies",
6466
+ "key_path": [
6467
+ "user-agent"
6468
+ ]
6469
+ },
6470
+ {
6471
+ "address": "grpc.server.request.metadata",
6472
+ "key_path": [
6473
+ "dd-canary"
6474
+ ]
6475
+ }
6476
+ ],
6477
+ "regex": "^dd-test-scanner-log-block$"
6478
+ },
6479
+ "operator": "match_regex"
6480
+ }
6481
+ ],
6482
+ "transformers": [],
6483
+ "on_match": [
6484
+ "block"
6485
+ ]
6486
+ },
6420
6487
  {
6421
6488
  "id": "ua0-600-5xx",
6422
6489
  "name": "Blind SQL Injection Brute Forcer",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "2.2",
3
3
  "metadata": {
4
- "rules_version": "1.4.2"
4
+ "rules_version": "1.4.3"
5
5
  },
6
6
  "rules": [
7
7
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "2.2",
3
3
  "metadata": {
4
- "rules_version": "1.4.2"
4
+ "rules_version": "1.4.3"
5
5
  },
6
6
  "rules": [
7
7
  {
@@ -1,4 +1,4 @@
1
- # typed: false
1
+ # typed: ignore
2
2
 
3
3
  require 'pathname'
4
4