contrast-agent 5.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/ext/cs__assess_kernel/cs__assess_kernel.c +7 -4
  3. data/ext/cs__assess_module/cs__assess_module.c +7 -7
  4. data/ext/cs__common/cs__common.c +4 -0
  5. data/ext/cs__common/cs__common.h +1 -0
  6. data/ext/cs__contrast_patch/cs__contrast_patch.c +52 -27
  7. data/ext/cs__contrast_patch/cs__contrast_patch.h +2 -0
  8. data/ext/cs__scope/cs__scope.c +747 -0
  9. data/ext/cs__scope/cs__scope.h +88 -0
  10. data/ext/cs__scope/extconf.rb +5 -0
  11. data/lib/contrast/agent/assess/contrast_event.rb +20 -13
  12. data/lib/contrast/agent/assess/contrast_object.rb +4 -1
  13. data/lib/contrast/agent/assess/policy/propagation_node.rb +2 -5
  14. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +2 -0
  15. data/lib/contrast/agent/assess/policy/trigger_method.rb +4 -1
  16. data/lib/contrast/agent/assess/rule/response/{autocomplete_rule.rb → auto_complete_rule.rb} +4 -3
  17. data/lib/contrast/agent/assess/rule/response/base_rule.rb +12 -79
  18. data/lib/contrast/agent/assess/rule/response/body_rule.rb +109 -0
  19. data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +157 -0
  20. data/lib/contrast/agent/assess/rule/response/click_jacking_header_rule.rb +26 -0
  21. data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +14 -15
  22. data/lib/contrast/agent/assess/rule/response/csp_header_missing_rule.rb +5 -25
  23. data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +29 -0
  24. data/lib/contrast/agent/assess/rule/response/header_rule.rb +70 -0
  25. data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +12 -36
  26. data/lib/contrast/agent/assess/rule/response/parameters_pollution_rule.rb +2 -1
  27. data/lib/contrast/agent/assess/rule/response/x_content_type_header_rule.rb +26 -0
  28. data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +36 -0
  29. data/lib/contrast/agent/middleware.rb +1 -0
  30. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +1 -3
  31. data/lib/contrast/agent/patching/policy/patch.rb +2 -6
  32. data/lib/contrast/agent/patching/policy/patcher.rb +1 -1
  33. data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +94 -0
  34. data/lib/contrast/agent/protect/rule/base.rb +28 -1
  35. data/lib/contrast/agent/protect/rule/base_service.rb +10 -1
  36. data/lib/contrast/agent/protect/rule/cmd_injection.rb +2 -0
  37. data/lib/contrast/agent/protect/rule/deserialization.rb +6 -0
  38. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +5 -1
  39. data/lib/contrast/agent/protect/rule/no_sqli.rb +1 -0
  40. data/lib/contrast/agent/protect/rule/path_traversal.rb +1 -0
  41. data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +124 -0
  42. data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +121 -0
  43. data/lib/contrast/agent/protect/rule/sqli.rb +33 -0
  44. data/lib/contrast/agent/protect/rule/xxe.rb +4 -0
  45. data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +44 -0
  46. data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +115 -0
  47. data/lib/contrast/agent/reporting/input_analysis/input_type.rb +44 -0
  48. data/lib/contrast/agent/reporting/input_analysis/score_level.rb +21 -0
  49. data/lib/contrast/agent/reporting/report.rb +1 -0
  50. data/lib/contrast/agent/reporting/reporter.rb +8 -1
  51. data/lib/contrast/agent/reporting/reporting_events/finding.rb +69 -36
  52. data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +88 -59
  53. data/lib/contrast/agent/reporting/reporting_events/{finding_object.rb → finding_event_object.rb} +24 -20
  54. data/lib/contrast/agent/reporting/reporting_events/finding_event_parent_object.rb +39 -0
  55. data/lib/contrast/agent/reporting/reporting_events/finding_event_property.rb +40 -0
  56. data/lib/contrast/agent/reporting/reporting_events/{finding_signature.rb → finding_event_signature.rb} +29 -24
  57. data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +12 -8
  58. data/lib/contrast/agent/reporting/reporting_events/{finding_stack.rb → finding_event_stack.rb} +23 -19
  59. data/lib/contrast/agent/reporting/reporting_events/{finding_taint_range.rb → finding_event_taint_range.rb} +17 -15
  60. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +26 -53
  61. data/lib/contrast/agent/reporting/reporting_events/poll.rb +29 -0
  62. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +5 -4
  63. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +1 -0
  64. data/lib/contrast/agent/reporting/reporting_events/server_activity.rb +1 -1
  65. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +10 -3
  66. data/lib/contrast/agent/reporting/reporting_utilities/endpoints.rb +0 -1
  67. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +1 -0
  68. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +28 -20
  69. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +1 -1
  70. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +13 -1
  71. data/lib/contrast/agent/request_context.rb +6 -1
  72. data/lib/contrast/agent/request_context_extend.rb +85 -21
  73. data/lib/contrast/agent/scope.rb +102 -107
  74. data/lib/contrast/agent/service_heartbeat.rb +45 -2
  75. data/lib/contrast/agent/version.rb +1 -1
  76. data/lib/contrast/api/decorators/bot_blocker.rb +37 -0
  77. data/lib/contrast/api/decorators/ip_denylist.rb +37 -0
  78. data/lib/contrast/api/decorators/rasp_rule_sample.rb +29 -0
  79. data/lib/contrast/api/decorators/user_input.rb +11 -1
  80. data/lib/contrast/api/decorators/virtual_patch.rb +34 -0
  81. data/lib/contrast/components/logger.rb +5 -0
  82. data/lib/contrast/components/protect.rb +4 -2
  83. data/lib/contrast/components/scope.rb +98 -91
  84. data/lib/contrast/config/agent_configuration.rb +58 -12
  85. data/lib/contrast/config/api_configuration.rb +100 -12
  86. data/lib/contrast/config/api_proxy_configuration.rb +55 -3
  87. data/lib/contrast/config/application_configuration.rb +114 -15
  88. data/lib/contrast/config/assess_configuration.rb +106 -12
  89. data/lib/contrast/config/assess_rules_configuration.rb +44 -3
  90. data/lib/contrast/config/base_configuration.rb +1 -0
  91. data/lib/contrast/config/certification_configuration.rb +74 -3
  92. data/lib/contrast/config/exception_configuration.rb +61 -3
  93. data/lib/contrast/config/heap_dump_configuration.rb +101 -17
  94. data/lib/contrast/config/inventory_configuration.rb +64 -3
  95. data/lib/contrast/config/logger_configuration.rb +46 -3
  96. data/lib/contrast/config/protect_rule_configuration.rb +36 -9
  97. data/lib/contrast/config/protect_rules_configuration.rb +120 -17
  98. data/lib/contrast/config/request_audit_configuration.rb +68 -3
  99. data/lib/contrast/config/ruby_configuration.rb +96 -22
  100. data/lib/contrast/config/sampling_configuration.rb +76 -10
  101. data/lib/contrast/config/server_configuration.rb +56 -11
  102. data/lib/contrast/configuration.rb +6 -3
  103. data/lib/contrast/logger/cef_log.rb +151 -0
  104. data/lib/contrast/utils/hash_digest.rb +14 -6
  105. data/lib/contrast/utils/log_utils.rb +114 -0
  106. data/lib/contrast/utils/middleware_utils.rb +6 -7
  107. data/lib/contrast/utils/net_http_base.rb +12 -9
  108. data/lib/contrast/utils/patching/policy/patch_utils.rb +0 -4
  109. data/lib/contrast.rb +4 -3
  110. data/ruby-agent.gemspec +1 -1
  111. data/service_executables/VERSION +1 -1
  112. data/service_executables/linux/contrast-service +0 -0
  113. data/service_executables/mac/contrast-service +0 -0
  114. metadata +41 -21
  115. data/lib/contrast/agent/assess/rule/response/cachecontrol_rule.rb +0 -184
  116. data/lib/contrast/agent/assess/rule/response/clickjacking_rule.rb +0 -66
  117. data/lib/contrast/agent/assess/rule/response/x_content_type_rule.rb +0 -52
  118. data/lib/contrast/agent/assess/rule/response/x_xss_protection_rule.rb +0 -53
  119. data/lib/contrast/extension/kernel.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c756fb0e7fe0433c7507c2cdb7082e635adabea8847c545333d65800225b1e3d
4
- data.tar.gz: c71e1a8d020e3dfe98ea58d844924b0b0a9e1576b5f6899d186abc28e4efb152
3
+ metadata.gz: fa7aa416c6a15843424449814734c462a46e2951cbe41f010bd2570c03717cc5
4
+ data.tar.gz: ade4eac9f0f32d9aa339d6429a30728f0b7950a68db8b8b1aad2e0e5cfe52d71
5
5
  SHA512:
6
- metadata.gz: 82a0a252fa7696b2590f8be43fba09e03c6b13371a58a678b31e088e01a244311e0ac9d5b077de5d7970c16bc9a2144504d01a0e037c5e0f0b06d06e8530c57a
7
- data.tar.gz: d9fd4708ab8238a22a2e3187e880a898635739b00f0d2f4f224904325f3b88b28f3470cf37733d5875e97018a02a5bfe10bd7f041219fd842b596e9697bfdbb6
6
+ metadata.gz: fd24331e49a9d2826628613ccc3f1bcf5c3ba337ba866ea321fd5a795d9b585507d935b92e64bffca5d70f83d4dbac7a978b484b372ae9c590c2d82ca3a57e91
7
+ data.tar.gz: cc3b03f3b101658f74006af2b4ef4c81256c2890372727fcd6f5d300926ca6454a6da64be5500cd0d5cc103e36d92a5c8f24495677558e33856fe5e8f99e71f9
@@ -3,19 +3,22 @@
3
3
 
4
4
  #include "cs__assess_kernel.h"
5
5
  #include "../cs__common/cs__common.h"
6
+ #include "../cs__scope/cs__scope.h"
6
7
  #include <ruby.h>
7
8
 
8
9
  VALUE
9
10
  contrast_patched_kernel_exec(const int argc, const VALUE *argv,
10
11
  const VALUE self) {
11
12
  int nested_scope =
12
- RTEST(rb_funcall(contrast_patcher(), rb_sym_in_scope, 0));
13
+ inst_methods_in_cntr_scope(contrast_patcher(), 0);
13
14
 
14
- if (!nested_scope && argc > 0) {
15
- rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
15
+ if (nested_scope == Qfalse && argc > 0) {
16
+ /* enter scope */
17
+ inst_methods_enter_cntr_scope(contrast_patcher(), 0);
16
18
  VALUE data = argv[0];
17
19
  rb_funcall(kernel_propagator, exec_apply_trigger, 1, data);
18
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
20
+ /* exit scope */
21
+ inst_methods_exit_cntr_scope(contrast_patcher(), 0);
19
22
  }
20
23
 
21
24
  /* maybe this should be rb_funcall2. this works right now because *argv ==
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "cs__assess_module.h"
5
5
  #include "../cs__common/cs__common.h"
6
+ #include "../cs__scope/cs__scope.h"
6
7
  #include <ruby.h>
7
8
 
8
9
  void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
@@ -11,12 +12,11 @@ void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
11
12
  return;
12
13
  }
13
14
 
14
- int nested_scope =
15
- RTEST(rb_funcall(contrast_patcher(), rb_sym_in_scope, 0));
15
+ int nested_scope = inst_methods_in_cntr_scope(contrast_patcher(), 0);
16
+ /* enter scope */
17
+ inst_methods_enter_cntr_scope(contrast_patcher(), 0);
16
18
 
17
- rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
18
-
19
- if (!nested_scope) {
19
+ if (nested_scope == Qfalse) {
20
20
  VALUE method = rb_funcall(rb_mKernel, rb_sym_method, 0);
21
21
  /* If this method ever throws an exception, the scope-leave
22
22
  * needs to be moved within a rescue call.
@@ -24,8 +24,8 @@ void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
24
24
  rb_funcall(module_eval_trigger, trigger_check_method, 4, module, source,
25
25
  ret, method);
26
26
  }
27
-
28
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
27
+ /* exit scope */
28
+ inst_methods_exit_cntr_scope(contrast_patcher(), 0);
29
29
  }
30
30
 
31
31
  VALUE
@@ -10,6 +10,7 @@
10
10
  VALUE contrast, agent, patching, policy, assess;
11
11
  VALUE core_extensions, core_assess;
12
12
  VALUE assess_policy, assess_propagator;
13
+ VALUE components;
13
14
  VALUE funchook_path;
14
15
 
15
16
  VALUE rb_sym_enter_scope;
@@ -175,6 +176,9 @@ void Init_cs__common(void) {
175
176
  contrast = rb_define_module("Contrast");
176
177
  agent = rb_define_module_under(contrast, "Agent");
177
178
 
179
+ /* components => Contrast::Components */
180
+ components = rb_define_module_under(contrast, "Components");
181
+
178
182
  assess = rb_define_module_under(agent, "Assess");
179
183
 
180
184
  patching = rb_define_module_under(agent, "Patching");
@@ -17,6 +17,7 @@ extern VALUE contrast, agent, patching, policy, assess;
17
17
  extern VALUE core_extensions, core_assess;
18
18
  extern VALUE assess_policy, assess_propagator;
19
19
  extern VALUE funchook_path;
20
+ extern VALUE components;
20
21
 
21
22
  extern VALUE rb_sym_enter_scope;
22
23
  extern VALUE rb_sym_exit_scope;
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "cs__contrast_patch.h"
5
5
  #include "../cs__common/cs__common.h"
6
+ #include "../cs__scope/cs__scope.h"
6
7
  #include <ruby.h>
7
8
 
8
9
  VALUE build_preshift(const VALUE method_policy, const VALUE object,
@@ -84,15 +85,22 @@ VALUE contrast_call_post_patch(const VALUE method_policy, const VALUE preshift,
84
85
  method_policy, preshift, object, ret, send, block);
85
86
  }
86
87
 
87
- VALUE contrast_patch_call_rescue(const VALUE *args) {
88
- int argc;
89
- VALUE exception, object, preshift, method_policy, method;
90
- VALUE *argv;
91
-
88
+ /* wrap rb_ensure so we can rescue an exception */
89
+ VALUE rescue_func(VALUE arg1) {
90
+ VALUE exception;
92
91
  /* rb_errinfo() gives the value of $!, the exception that
93
92
  * triggered a rescue block.
94
93
  */
95
94
  exception = rb_errinfo();
95
+ rb_exc_raise(exception);
96
+
97
+ return Qnil;
98
+ }
99
+
100
+ VALUE contrast_patch_call_ensure(const VALUE *args) {
101
+ int argc;
102
+ VALUE object, preshift, method_policy, method;
103
+ VALUE *argv;
96
104
 
97
105
  object = args[0];
98
106
  method = args[1];
@@ -103,12 +111,19 @@ VALUE contrast_patch_call_rescue(const VALUE *args) {
103
111
 
104
112
  contrast_call_post_patch(method_policy, preshift, object, Qnil, argc, argv);
105
113
 
106
- /* reraise the exception that got us here */
107
- rb_exc_raise(exception);
108
-
109
114
  return Qnil;
110
115
  }
111
116
 
117
+ VALUE ensure_wrapper(const VALUE *args) {
118
+ VALUE original_method, original_args, ensure_args;
119
+
120
+ original_method = args[0];
121
+ original_args = (VALUE)args[1];
122
+ ensure_args = (VALUE)args[2];
123
+
124
+ return rb_ensure(original_method, original_args, contrast_patch_call_ensure, (VALUE)ensure_args);
125
+ }
126
+
112
127
  VALUE contrast_call_super(const VALUE *args) {
113
128
  int argc;
114
129
  VALUE *argv;
@@ -122,7 +137,8 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
122
137
  VALUE impl, method, method_policy, object, original_args, original_ret, preshift, transformed_ret;
123
138
  int argc;
124
139
  VALUE *argv;
125
- VALUE rescue_args[6];
140
+ VALUE ensure_args[6];
141
+ VALUE rescue_wrapper_args[3];
126
142
 
127
143
  impl = wrapped_args[0];
128
144
  original_args = wrapped_args[1];
@@ -132,18 +148,22 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
132
148
  argc = NUM2INT(wrapped_args[5]);
133
149
  argv = (VALUE *)wrapped_args[6];
134
150
 
135
- rescue_args[0] = object;
136
- rescue_args[1] = method;
137
- rescue_args[2] = INT2NUM(argc);
138
- rescue_args[3] = (VALUE)argv;
139
- rescue_args[4] = method_policy;
151
+ rescue_wrapper_args[0] = contrast_patch_call_original;
152
+ rescue_wrapper_args[1] = original_args;
153
+ rescue_wrapper_args[2] = ensure_args;
154
+
155
+ ensure_args[0] = object;
156
+ ensure_args[1] = method;
157
+ ensure_args[2] = INT2NUM(argc);
158
+ ensure_args[3] = (VALUE)argv;
159
+ ensure_args[4] = method_policy;
140
160
 
141
161
  /* Tracking, triggering, and propagation here. */
142
162
  contrast_call_pre_patch(method_policy, method, object, argc, argv, Qnil);
143
163
 
144
164
  /* Capture pre-call state */
145
165
  preshift = build_preshift(method_policy, object, argc, argv);
146
- rescue_args[5] = preshift;
166
+ ensure_args[5] = preshift;
147
167
 
148
168
  /* We wrap a call to the original method with a rescue block, and we use
149
169
  * rb_rescue2 to capture all Exception-inheriting exceptions (and if your
@@ -178,15 +198,12 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
178
198
  switch (impl) {
179
199
  case IMPL_ALIAS_INSTANCE:
180
200
  case IMPL_ALIAS_SINGLETON:
181
- original_ret = rb_rescue2(contrast_patch_call_original, original_args,
182
- contrast_patch_call_rescue,
183
- (VALUE)rescue_args, rb_eException, 0);
201
+ original_ret = rb_rescue(ensure_wrapper, rescue_wrapper_args, rescue_func, Qnil);
184
202
  break;
185
203
  case IMPL_PREPEND_INSTANCE:
186
204
  case IMPL_PREPEND_SINGLETON:
187
- original_ret = rb_rescue2(contrast_call_super, original_args,
188
- contrast_patch_call_rescue,
189
- (VALUE)rescue_args, rb_eException, 0);
205
+ rescue_wrapper_args[0] = contrast_call_super;
206
+ original_ret = rb_rescue(ensure_wrapper, rescue_wrapper_args, rescue_func, Qnil);
190
207
  break;
191
208
  };
192
209
 
@@ -214,8 +231,10 @@ VALUE contrast_run_patches(const VALUE *wrapped_args) {
214
231
 
215
232
  VALUE contrast_ensure_function(const VALUE method_policy) {
216
233
  /* exit scope */
217
- rb_funcall(contrast_patcher(), rb_sym_exit_method_scope, 1, method_policy);
218
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
234
+ VALUE scopes = rb_funcall(method_policy, rb_sym_scopes_to_exit, 0);
235
+
236
+ inst_methods_exit_method_scope(contrast_patcher(), scopes);
237
+ inst_methods_exit_cntr_scope(contrast_patcher(), 0);
219
238
 
220
239
  return Qnil;
221
240
  }
@@ -235,10 +254,10 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
235
254
  * which is unnecessary, or run Contrast analysis on Contrast code,
236
255
  * which will never terminate.
237
256
  */
238
- nested_scope = RTEST(rb_funcall(contrast_patcher(), rb_sym_in_scope, 0));
257
+ nested_scope = inst_methods_in_cntr_scope(contrast_patcher(), 0);
239
258
 
240
259
  /* enter scope */
241
- rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
260
+ inst_methods_enter_cntr_scope(contrast_patcher(), 0);
242
261
 
243
262
  /* Get the name of the calling method */
244
263
  method = rb_funcall(object, rb_sym_method, 0);
@@ -270,7 +289,7 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
270
289
  }
271
290
 
272
291
  /* Check conditions for not doing Contrast analysis */
273
- if (nested_scope) {
292
+ if (nested_scope == Qtrue) {
274
293
  /* if we were in scope */
275
294
  do_contrast = 0;
276
295
  } else if (!RTEST(known)) {
@@ -299,7 +318,9 @@ VALUE contrast_patch_dispatch(const int argc, const VALUE *argv,
299
318
  }
300
319
 
301
320
  /* Enter any scopes specific to method policy */
302
- rb_funcall(contrast_patcher(), rb_sym_enter_method_scope, 1, method_policy);
321
+ VALUE scopes = rb_funcall(method_policy, rb_sym_scopes_to_enter, 0);
322
+
323
+ inst_methods_enter_method_scope(contrast_patcher(), scopes);
303
324
 
304
325
  /* If we're not doing Contrast analysis, exit scope and treat as normal. */
305
326
  if (!do_contrast) {
@@ -488,6 +509,9 @@ void Init_cs__contrast_patch(void) {
488
509
 
489
510
  rb_sym_enter_method_scope = rb_intern("enter_method_scope!");
490
511
  rb_sym_exit_method_scope = rb_intern("exit_method_scope!");
512
+ rb_sym_scopes_to_enter = rb_intern("scopes_to_enter");
513
+ rb_sym_scopes_to_exit = rb_intern("scopes_to_exit");
514
+
491
515
 
492
516
  rb_define_module_function(contrast_patcher(), "contrast_define_method",
493
517
  contrast_patch_define_method, 3);
@@ -500,4 +524,5 @@ void Init_cs__contrast_patch(void) {
500
524
 
501
525
  /* preshift_class = Contrast::Agent::Assess::PreShift */
502
526
  preshift_class = rb_define_class_under(assess, "PreShift", rb_cObject);
527
+
503
528
  }
@@ -18,6 +18,8 @@ static VALUE rb_sym_cs_to_s;
18
18
 
19
19
  static VALUE rb_sym_enter_method_scope;
20
20
  static VALUE rb_sym_exit_method_scope;
21
+ static VALUE rb_sym_scopes_to_enter;
22
+ static VALUE rb_sym_scopes_to_exit;
21
23
 
22
24
  static VALUE rb_sym_build_method_name;
23
25
  static VALUE rb_sym_info_for;