contrast-agent 3.12.1 → 3.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +0 -1
  3. data/.gitignore +1 -1
  4. data/.simplecov +1 -1
  5. data/Rakefile +31 -0
  6. data/exe/contrast_service +1 -7
  7. data/ext/build_funchook.rb +0 -2
  8. data/ext/cs__assess_active_record_named/cs__active_record_named.c +8 -7
  9. data/ext/cs__assess_array/cs__assess_array.c +6 -5
  10. data/ext/cs__assess_basic_object/cs__assess_basic_object.c +5 -5
  11. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +4 -9
  12. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.h +0 -1
  13. data/ext/cs__assess_hash/cs__assess_hash.c +18 -17
  14. data/ext/cs__assess_hash/cs__assess_hash.h +2 -1
  15. data/ext/cs__assess_kernel/cs__assess_kernel.c +7 -8
  16. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +4 -5
  17. data/ext/cs__assess_module/cs__assess_module.c +6 -6
  18. data/ext/cs__assess_regexp/cs__assess_regexp.c +4 -4
  19. data/ext/cs__assess_string/cs__assess_string.c +20 -4
  20. data/ext/cs__assess_string/cs__assess_string.h +4 -1
  21. data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +4 -7
  22. data/ext/cs__assess_yield_track/cs__assess_yield_track.c +3 -7
  23. data/ext/cs__assess_yield_track/cs__assess_yield_track.h +0 -1
  24. data/ext/cs__common/cs__common.c +59 -28
  25. data/ext/cs__common/cs__common.h +18 -20
  26. data/ext/cs__common/extconf.rb +0 -14
  27. data/ext/cs__contrast_patch/cs__contrast_patch.c +27 -25
  28. data/ext/cs__contrast_patch/cs__contrast_patch.h +5 -7
  29. data/ext/cs__protect_kernel/cs__protect_kernel.c +11 -12
  30. data/ext/cs__protect_kernel/cs__protect_kernel.h +2 -2
  31. data/ext/extconf_common.rb +0 -28
  32. data/lib/contrast-agent.rb +1 -1
  33. data/lib/contrast.rb +15 -23
  34. data/lib/contrast/agent.rb +51 -39
  35. data/lib/contrast/agent/assess.rb +11 -12
  36. data/lib/contrast/agent/assess/contrast_event.rb +39 -176
  37. data/lib/contrast/agent/assess/events/event_factory.rb +2 -2
  38. data/lib/contrast/agent/assess/events/source_event.rb +5 -9
  39. data/lib/contrast/agent/assess/finalizers/finalize.rb +21 -0
  40. data/lib/contrast/agent/assess/finalizers/freeze.rb +13 -0
  41. data/lib/contrast/agent/assess/finalizers/hash.rb +53 -0
  42. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +2 -2
  43. data/lib/contrast/agent/assess/policy/patcher.rb +5 -5
  44. data/lib/contrast/agent/assess/policy/policy.rb +9 -9
  45. data/lib/contrast/agent/assess/policy/policy_node.rb +5 -99
  46. data/lib/contrast/agent/assess/policy/policy_scanner.rb +3 -3
  47. data/lib/contrast/agent/assess/policy/preshift.rb +15 -5
  48. data/lib/contrast/agent/assess/policy/propagation_method.rb +26 -24
  49. data/lib/contrast/agent/assess/policy/propagation_node.rb +6 -2
  50. data/lib/contrast/agent/assess/policy/propagator.rb +18 -18
  51. data/lib/contrast/agent/assess/policy/propagator/base.rb +1 -1
  52. data/lib/contrast/agent/assess/policy/propagator/custom.rb +1 -1
  53. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +1 -1
  54. data/lib/contrast/agent/assess/policy/propagator/insert.rb +1 -4
  55. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +12 -3
  56. data/lib/contrast/agent/assess/policy/propagator/prepend.rb +5 -0
  57. data/lib/contrast/agent/assess/policy/propagator/remove.rb +6 -11
  58. data/lib/contrast/agent/assess/policy/propagator/select.rb +4 -4
  59. data/lib/contrast/agent/assess/policy/propagator/split.rb +5 -5
  60. data/lib/contrast/agent/assess/policy/propagator/substitution.rb +8 -7
  61. data/lib/contrast/agent/assess/policy/propagator/trim.rb +6 -10
  62. data/lib/contrast/agent/assess/policy/rewriter_patch.rb +5 -5
  63. data/lib/contrast/agent/assess/policy/source_method.rb +6 -16
  64. data/lib/contrast/agent/assess/policy/source_validation/cross_site_validator.rb +1 -1
  65. data/lib/contrast/agent/assess/policy/source_validation/source_validation.rb +1 -1
  66. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +1 -1
  67. data/lib/contrast/agent/assess/policy/trigger_method.rb +7 -15
  68. data/lib/contrast/agent/assess/policy/trigger_node.rb +18 -6
  69. data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +2 -2
  70. data/lib/contrast/agent/assess/properties.rb +13 -383
  71. data/lib/contrast/agent/assess/property/evented.rb +78 -0
  72. data/lib/contrast/agent/assess/property/tagged.rb +339 -0
  73. data/lib/contrast/agent/assess/rule.rb +2 -2
  74. data/lib/contrast/agent/assess/rule/base.rb +3 -4
  75. data/lib/contrast/agent/assess/rule/provider.rb +3 -3
  76. data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +1 -1
  77. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +4 -22
  78. data/lib/contrast/agent/assess/tag.rb +27 -12
  79. data/lib/contrast/agent/at_exit_hook.rb +4 -2
  80. data/lib/contrast/agent/class_reopener.rb +7 -6
  81. data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +1 -1
  82. data/lib/contrast/agent/deadzone/policy/policy.rb +2 -2
  83. data/lib/contrast/agent/disable_reaction.rb +1 -1
  84. data/lib/contrast/agent/exclusion_matcher.rb +3 -3
  85. data/lib/contrast/agent/inventory/policy/datastores.rb +2 -3
  86. data/lib/contrast/agent/inventory/policy/policy.rb +3 -3
  87. data/lib/contrast/agent/inventory/policy/trigger_node.rb +1 -1
  88. data/lib/contrast/agent/middleware.rb +37 -48
  89. data/lib/contrast/agent/patching/policy/after_load_patch.rb +4 -4
  90. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +6 -5
  91. data/lib/contrast/agent/patching/policy/module_policy.rb +1 -1
  92. data/lib/contrast/agent/patching/policy/patch.rb +16 -16
  93. data/lib/contrast/agent/patching/policy/patcher.rb +30 -22
  94. data/lib/contrast/agent/patching/policy/policy.rb +9 -9
  95. data/lib/contrast/agent/patching/policy/policy_node.rb +3 -3
  96. data/lib/contrast/agent/patching/policy/trigger_node.rb +2 -2
  97. data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +3 -3
  98. data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +2 -2
  99. data/lib/contrast/agent/protect/policy/applies_no_sqli_rule.rb +2 -2
  100. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +3 -3
  101. data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +2 -2
  102. data/lib/contrast/agent/protect/policy/applies_xxe_rule.rb +3 -3
  103. data/lib/contrast/agent/protect/policy/policy.rb +8 -8
  104. data/lib/contrast/agent/protect/policy/rule_applicator.rb +3 -3
  105. data/lib/contrast/agent/protect/policy/trigger_node.rb +1 -1
  106. data/lib/contrast/agent/protect/rule.rb +18 -18
  107. data/lib/contrast/agent/protect/rule/base.rb +21 -32
  108. data/lib/contrast/agent/protect/rule/base_service.rb +2 -2
  109. data/lib/contrast/agent/protect/rule/cmd_injection.rb +5 -5
  110. data/lib/contrast/agent/protect/rule/deserialization.rb +1 -1
  111. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +3 -8
  112. data/lib/contrast/agent/protect/rule/no_sqli.rb +1 -1
  113. data/lib/contrast/agent/protect/rule/path_traversal.rb +4 -5
  114. data/lib/contrast/agent/protect/rule/sqli.rb +2 -2
  115. data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +1 -1
  116. data/lib/contrast/agent/protect/rule/xss.rb +1 -1
  117. data/lib/contrast/agent/protect/rule/xxe.rb +4 -5
  118. data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +2 -2
  119. data/lib/contrast/agent/railtie.rb +1 -1
  120. data/lib/contrast/agent/reaction_processor.rb +5 -5
  121. data/lib/contrast/agent/request.rb +103 -340
  122. data/lib/contrast/agent/request_context.rb +25 -21
  123. data/lib/contrast/agent/request_handler.rb +1 -1
  124. data/lib/contrast/agent/response.rb +8 -20
  125. data/lib/contrast/agent/rewriter.rb +5 -6
  126. data/lib/contrast/agent/scope.rb +1 -1
  127. data/lib/contrast/agent/service_heartbeat.rb +8 -10
  128. data/lib/contrast/agent/static_analysis.rb +4 -4
  129. data/lib/contrast/agent/thread.rb +1 -1
  130. data/lib/contrast/agent/thread_watcher.rb +49 -0
  131. data/lib/contrast/agent/tracepoint_hook.rb +1 -1
  132. data/lib/contrast/agent/version.rb +1 -1
  133. data/lib/contrast/agent/worker_thread.rb +24 -0
  134. data/lib/contrast/api.rb +4 -6
  135. data/lib/contrast/api/communication.rb +20 -0
  136. data/lib/contrast/api/communication/connection_status.rb +41 -0
  137. data/lib/contrast/api/communication/messaging_queue.rb +79 -0
  138. data/lib/contrast/{utils/service_response_util.rb → api/communication/response_processor.rb} +10 -19
  139. data/lib/contrast/api/communication/service_lifecycle.rb +61 -0
  140. data/lib/contrast/api/communication/socket.rb +45 -0
  141. data/lib/contrast/api/communication/socket_client.rb +76 -0
  142. data/lib/contrast/api/communication/speedracer.rb +111 -0
  143. data/lib/contrast/api/communication/tcp_socket.rb +31 -0
  144. data/lib/contrast/api/communication/unix_socket.rb +27 -0
  145. data/lib/contrast/api/decorators.rb +14 -4
  146. data/lib/contrast/api/decorators/address.rb +61 -0
  147. data/lib/contrast/api/decorators/application_settings.rb +10 -5
  148. data/lib/contrast/api/decorators/application_update.rb +5 -13
  149. data/lib/contrast/api/decorators/http_request.rb +140 -0
  150. data/lib/contrast/api/decorators/input_analysis.rb +3 -2
  151. data/lib/contrast/api/decorators/message.rb +76 -0
  152. data/lib/contrast/api/decorators/rasp_rule_sample.rb +29 -0
  153. data/lib/contrast/api/decorators/route_coverage.rb +58 -0
  154. data/lib/contrast/api/decorators/server_features.rb +3 -2
  155. data/lib/contrast/api/decorators/trace_event.rb +100 -0
  156. data/lib/contrast/api/decorators/trace_event_object.rb +58 -0
  157. data/lib/contrast/api/decorators/trace_event_signature.rb +47 -0
  158. data/lib/contrast/api/decorators/trace_taint_range.rb +52 -0
  159. data/lib/contrast/api/decorators/trace_taint_range_tags.rb +109 -0
  160. data/lib/contrast/api/decorators/user_input.rb +40 -0
  161. data/lib/contrast/common_agent_configuration.rb +2 -2
  162. data/lib/contrast/components/agent.rb +2 -2
  163. data/lib/contrast/components/app_context.rb +1 -8
  164. data/lib/contrast/components/config.rb +7 -12
  165. data/lib/contrast/components/contrast_service.rb +1 -1
  166. data/lib/contrast/components/interface.rb +16 -16
  167. data/lib/contrast/components/logger.rb +1 -1
  168. data/lib/contrast/components/scope.rb +3 -3
  169. data/lib/contrast/components/settings.rb +0 -6
  170. data/lib/contrast/config.rb +18 -18
  171. data/lib/contrast/config/base_configuration.rb +2 -2
  172. data/lib/contrast/config/protect_rule_configuration.rb +1 -1
  173. data/lib/contrast/configuration.rb +5 -5
  174. data/lib/contrast/extension/assess.rb +22 -22
  175. data/lib/contrast/extension/assess/array.rb +4 -4
  176. data/lib/contrast/extension/assess/assess_extension.rb +28 -31
  177. data/lib/contrast/extension/assess/eval_trigger.rb +3 -3
  178. data/lib/contrast/extension/assess/exec_trigger.rb +1 -1
  179. data/lib/contrast/extension/assess/fiber.rb +3 -3
  180. data/lib/contrast/extension/assess/hash.rb +5 -3
  181. data/lib/contrast/extension/assess/kernel.rb +7 -6
  182. data/lib/contrast/extension/assess/marshal.rb +62 -0
  183. data/lib/contrast/extension/assess/regexp.rb +3 -3
  184. data/lib/contrast/extension/assess/string.rb +6 -6
  185. data/lib/contrast/extension/inventory.rb +4 -5
  186. data/lib/contrast/extension/kernel.rb +1 -1
  187. data/lib/contrast/extension/module.rb +1 -1
  188. data/lib/contrast/extension/protect.rb +3 -3
  189. data/lib/contrast/extension/protect/kernel.rb +2 -2
  190. data/lib/contrast/extension/protect/psych.rb +2 -2
  191. data/lib/contrast/framework/base_support.rb +0 -23
  192. data/lib/contrast/framework/manager.rb +7 -17
  193. data/lib/contrast/framework/rack/patch/session_cookie.rb +1 -1
  194. data/lib/contrast/framework/rack/patch/support.rb +1 -1
  195. data/lib/contrast/framework/rack/support.rb +2 -2
  196. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -3
  197. data/lib/contrast/framework/rails/patch/assess_configuration.rb +5 -6
  198. data/lib/contrast/framework/rails/patch/rails_application_configuration.rb +1 -1
  199. data/lib/contrast/framework/rails/patch/support.rb +3 -3
  200. data/lib/contrast/framework/rails/rewrite/action_controller_railties_helper_inherited.rb +2 -2
  201. data/lib/contrast/framework/rails/rewrite/active_record_named.rb +2 -2
  202. data/lib/contrast/framework/rails/rewrite/active_record_time_zone_inherited.rb +2 -2
  203. data/lib/contrast/framework/rails/support.rb +56 -37
  204. data/lib/contrast/framework/sinatra/patch/base.rb +2 -2
  205. data/lib/contrast/framework/sinatra/patch/support.rb +1 -1
  206. data/lib/contrast/framework/sinatra/support.rb +13 -24
  207. data/lib/contrast/funchook/funchook.rb +45 -0
  208. data/lib/contrast/logger/application.rb +3 -3
  209. data/lib/contrast/logger/format.rb +64 -0
  210. data/lib/contrast/logger/log.rb +17 -9
  211. data/lib/contrast/logger/request.rb +30 -0
  212. data/lib/contrast/tasks/config.rb +1 -1
  213. data/lib/contrast/tasks/service.rb +2 -2
  214. data/lib/contrast/utils/assess/sampling_util.rb +2 -2
  215. data/lib/contrast/utils/assess/tracking_util.rb +46 -21
  216. data/lib/contrast/utils/boolean_util.rb +1 -1
  217. data/lib/contrast/utils/class_util.rb +5 -3
  218. data/lib/contrast/utils/freeze_util.rb +1 -1
  219. data/lib/contrast/utils/gemfile_reader.rb +5 -5
  220. data/lib/contrast/utils/hash_digest.rb +13 -3
  221. data/lib/contrast/utils/heap_dump_util.rb +2 -2
  222. data/lib/contrast/utils/invalid_configuration_util.rb +2 -18
  223. data/lib/contrast/utils/inventory_util.rb +6 -11
  224. data/lib/contrast/utils/io_util.rb +1 -1
  225. data/lib/contrast/utils/object_share.rb +0 -1
  226. data/lib/contrast/utils/os.rb +16 -4
  227. data/lib/contrast/utils/ruby_ast_rewriter.rb +1 -1
  228. data/lib/contrast/utils/sha256_builder.rb +2 -2
  229. data/lib/contrast/utils/stack_trace_utils.rb +2 -3
  230. data/lib/contrast/utils/string_utils.rb +1 -1
  231. data/lib/contrast/utils/tag_util.rb +1 -1
  232. data/lib/contrast/utils/thread_tracker.rb +1 -14
  233. data/lib/contrast/utils/timer.rb +1 -17
  234. data/resources/deadzone/policy.json +5 -0
  235. data/ruby-agent.gemspec +9 -9
  236. data/service_executables/VERSION +1 -1
  237. data/service_executables/linux/contrast-service +0 -0
  238. data/service_executables/mac/contrast-service +0 -0
  239. metadata +60 -79
  240. data/funchook/Makefile +0 -29
  241. data/funchook/autom4te.cache/output.0 +0 -4976
  242. data/funchook/autom4te.cache/requests +0 -78
  243. data/funchook/autom4te.cache/traces.0 +0 -364
  244. data/funchook/config.log +0 -490
  245. data/funchook/config.status +0 -1016
  246. data/funchook/configure +0 -4976
  247. data/funchook/src/Makefile +0 -70
  248. data/funchook/src/config.h +0 -101
  249. data/funchook/src/config.h.in +0 -100
  250. data/funchook/src/decoder.o +0 -0
  251. data/funchook/src/distorm.o +0 -0
  252. data/funchook/src/funchook.o +0 -0
  253. data/funchook/src/funchook_io.o +0 -0
  254. data/funchook/src/funchook_syscall.o +0 -0
  255. data/funchook/src/funchook_unix.o +0 -0
  256. data/funchook/src/funchook_x86.o +0 -0
  257. data/funchook/src/instructions.o +0 -0
  258. data/funchook/src/insts.o +0 -0
  259. data/funchook/src/libfunchook.so +0 -0
  260. data/funchook/src/mnemonics.o +0 -0
  261. data/funchook/src/operands.o +0 -0
  262. data/funchook/src/os_func.o +0 -0
  263. data/funchook/src/os_func_unix.o +0 -0
  264. data/funchook/src/prefix.o +0 -0
  265. data/funchook/src/printf_base.o +0 -0
  266. data/funchook/src/textdefs.o +0 -0
  267. data/funchook/src/wstring.o +0 -0
  268. data/funchook/test/Makefile +0 -43
  269. data/funchook/test/funchook_test +0 -0
  270. data/funchook/test/libfunchook_test.so +0 -0
  271. data/funchook/test/test_main.o +0 -0
  272. data/funchook/test/x86_64_test.o +0 -0
  273. data/lib/contrast/agent/assess/adjusted_span.rb +0 -27
  274. data/lib/contrast/agent/assess/insulator.rb +0 -49
  275. data/lib/contrast/agent/require_state.rb +0 -61
  276. data/lib/contrast/agent/socket_client.rb +0 -134
  277. data/lib/contrast/api/connection_status.rb +0 -49
  278. data/lib/contrast/api/socket.rb +0 -43
  279. data/lib/contrast/api/speedracer.rb +0 -188
  280. data/lib/contrast/api/tcp_socket.rb +0 -29
  281. data/lib/contrast/api/unix_socket.rb +0 -25
  282. data/lib/contrast/framework/sinatra/application_helper.rb +0 -51
  283. data/lib/contrast/framework/view_technologies_descriptor.rb +0 -21
  284. data/lib/contrast/internal_exception.rb +0 -8
  285. data/lib/contrast/utils/cache.rb +0 -58
  286. data/lib/contrast/utils/service_sender_util.rb +0 -167
  287. data/lib/contrast/utils/sinatra_helper.rb +0 -49
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2d4359b44c796de0747e2234dbd2a4f418c7392ff7238a247dfcf0d9bbb10f6
4
- data.tar.gz: 39131596bd4eb2625c32cd71971ad772c6b5af5540bdfb2b662a1278e24a708b
3
+ metadata.gz: c3ef67bfca5c3d772078af285e4b3fa1ab314b06af04355db1aa50cce0d284e8
4
+ data.tar.gz: 5eb0fe6b5dba8f64b5947c1c7cade90718b18224b62b5e02eed470613e6fbe6d
5
5
  SHA512:
6
- metadata.gz: 38a99de9a280a7334986aaa62f63b73f2c948acf01c1d927b98f3a1ab0dee7da69b0a9bbbca39aad61d8bbcd7a38bd2c4218cff74d37703f63057b23b6e9bca4
7
- data.tar.gz: f6137708523bd8d0c9b995d03002b028f7f7eacf41e0e00ba85d11a6996d7486370b387d295ac060d99b91df7b594bf36d87c55043187116ff1914bec3ff69c9
6
+ metadata.gz: caf748a141fe652cbb1cb3e658969820b22ca4e58a11cdc46ee9bc94932c00e031b186b96e8c44b884d6f658951e8936a75444aa4d52cb9d0d5e563ab29ef26b
7
+ data.tar.gz: b3235852bb77977f244beed747b032bfa6e80eb86ebdcfab622a8dba7acc7a939f87e08022a07e795d2c455ec3d3107771e5cdae0d5b893a4c6019f09945db43
@@ -4,7 +4,6 @@ docker/
4
4
  code-deploy/
5
5
 
6
6
  Jenkinsfile
7
- bitbucket-pipelines.yml
8
7
  docker-compose.yml
9
8
  .rubocop.yml
10
9
  .travis.yml
data/.gitignore CHANGED
@@ -52,7 +52,7 @@ contrast-agent-*.gem
52
52
  service_executables/*-*
53
53
 
54
54
  # Generated Protobuf files
55
- /lib/contrast/api/*_pb.rb
55
+ /lib/contrast/api/*.pb.rb
56
56
 
57
57
  # IDE stuff
58
58
  tags
data/.simplecov CHANGED
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
- SimpleCov.minimum_coverage line: 92.30
4
+ SimpleCov.minimum_coverage line: 94.75
5
5
  SimpleCov.start do
6
6
  add_filter '/spec/'
7
7
  end
data/Rakefile CHANGED
@@ -1,9 +1,13 @@
1
1
  # Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
2
  # frozen_string_literal: true
3
3
 
4
+ $stdout.sync = true
5
+
4
6
  require 'bundler/gem_tasks'
5
7
  require 'rspec/core/rake_task'
6
8
  require 'rake/extensiontask'
9
+ load 'protobuf/tasks/compile.rake'
10
+ require 'fileutils'
7
11
 
8
12
  CLOBBER << 'shared_libraries/*'
9
13
 
@@ -13,3 +17,30 @@ Dir['ext/cs__*'].each do |extension|
13
17
  ext.lib_dir = "lib/#{ name }"
14
18
  end
15
19
  end
20
+
21
+ task :contrast_pb_compile do
22
+ # do some stuff before compile
23
+
24
+ # Invoke the protobuf compile task with your sensible defaults
25
+ ::Rake::Task['protobuf:compile'].invoke('lib',
26
+ './agent-service-api/protobuf ./agent-service-api/protobuf/dtm.proto',
27
+ 'lib/contrast/api',
28
+ nil)
29
+
30
+ ::Rake::Task['protobuf:compile'].reenable
31
+
32
+ ::Rake::Task['protobuf:compile'].invoke('lib',
33
+ './agent-service-api/protobuf ./agent-service-api/protobuf/settings.proto',
34
+ 'lib/contrast/api',
35
+ nil)
36
+
37
+ ['dtm.pb.rb', 'settings.pb.rb'].each do |target_file|
38
+ target_path = File.absolute_path(File.join(__dir__, "./lib/contrast/api/#{ target_file }"))
39
+ unless File.exist?(target_path)
40
+ puts "File not found #{ target_path }"
41
+ exit 1
42
+ end
43
+ end
44
+
45
+ puts 'Protobuf copied successfully'
46
+ end
@@ -3,19 +3,13 @@
3
3
  # frozen_string_literal: true
4
4
 
5
5
  def mac?
6
- RUBY_PLATFORM.match?(/darwin/)
7
- end
8
-
9
- def windows?
10
- RUBY_PLATFORM.match?(/cygwin|mswin|mingw|bccwin|wince|emx/)
6
+ RUBY_PLATFORM.include?('darwin')
11
7
  end
12
8
 
13
9
  def path
14
10
  base_path = "#{ File.dirname(__FILE__) }/.."
15
11
  if mac?
16
12
  "#{ base_path }/service_executables/mac/contrast-service"
17
- elsif windows?
18
- "#{ base_path }/service_executables/windows/contrast-service.exe"
19
13
  else
20
14
  "#{ base_path }/service_executables/linux/contrast-service"
21
15
  end
@@ -62,5 +62,3 @@ unless find_header('funchook.h', ext_path)
62
62
  end
63
63
  end
64
64
  end
65
-
66
- have_header('funchook.h', ext_path)
@@ -2,8 +2,8 @@
2
2
  * https://www.contrastsecurity.com/enduser-terms-0317a for more details. */
3
3
 
4
4
  #include "cs__active_record_named.h"
5
- #include <ruby.h>
6
5
  #include "../cs__common/cs__common.h"
6
+ #include <ruby.h>
7
7
 
8
8
  VALUE contrast_assess_active_record_scope(const int argc, const VALUE *argv,
9
9
  const VALUE self) {
@@ -19,7 +19,8 @@ VALUE contrast_assess_active_record_scope(const int argc, const VALUE *argv,
19
19
  */
20
20
  VALUE new_body, ret;
21
21
  VALUE new_args[3];
22
- new_body = rb_funcall(active_record_named, rb_sym_assess_rewrite, 3, self, argv[0], argv[1]);
22
+ new_body = rb_funcall(active_record_named, rb_sym_assess_rewrite, 3, self,
23
+ argv[0], argv[1]);
23
24
  new_args[0] = argv[0];
24
25
  if (NIL_P(new_body)) {
25
26
  new_args[1] = argv[1];
@@ -36,10 +37,10 @@ void Init_cs__assess_active_record_named(void) {
36
37
  framework = rb_define_module_under(contrast, "Framework");
37
38
  rails = rb_define_module_under(framework, "Rails");
38
39
  rewrite = rb_define_module_under(rails, "Rewrite");
39
- active_record_named = rb_define_class_under(rewrite, "ActiveRecordNamed", rb_cObject);
40
+ active_record_named =
41
+ rb_define_class_under(rewrite, "ActiveRecordNamed", rb_cObject);
40
42
  rb_sym_assess_rewrite = rb_intern("rewrite");
41
- rb_sym_assess_scope = contrast_register_patch("ActiveRecord::Scoping::Named::ClassMethods",
42
- "scope",
43
- contrast_assess_active_record_scope);
43
+ rb_sym_assess_scope =
44
+ contrast_register_patch("ActiveRecord::Scoping::Named::ClassMethods",
45
+ "scope", contrast_assess_active_record_scope);
44
46
  }
45
-
@@ -23,15 +23,16 @@ static VALUE contrast_assess_array_join(const int argc, const VALUE *argv,
23
23
  /* Finally, default to empty String. Implicit since nil.to_s is ''*/
24
24
 
25
25
  result = rb_funcall2(ary, rb_sym_assess_array_join, argc, argv);
26
- result = rb_funcall(array_propagator, rb_sym_assess_track_array_join, 3, ary, sep, result);
26
+ result = rb_funcall(array_propagator, rb_sym_assess_track_array_join, 3,
27
+ ary, sep, result);
27
28
 
28
29
  return result;
29
30
  }
30
31
 
31
32
  void Init_cs__assess_array(void) {
32
- array_propagator = rb_define_class_under(core_assess, "ArrayPropagator", rb_cObject);
33
+ array_propagator =
34
+ rb_define_class_under(core_assess, "ArrayPropagator", rb_cObject);
33
35
  rb_sym_assess_track_array_join = rb_intern("cs__track_join");
34
- rb_sym_assess_array_join = contrast_register_patch("Array",
35
- "join",
36
- contrast_assess_array_join);
36
+ rb_sym_assess_array_join =
37
+ contrast_register_patch("Array", "join", contrast_assess_array_join);
37
38
  }
@@ -7,7 +7,8 @@
7
7
 
8
8
  void contrast_assess_instance_eval_trigger_check(VALUE self, VALUE source,
9
9
  VALUE ret) {
10
- rb_funcall(basic_eval_trigger, instance_trigger_check_method, 3, self, source, ret);
10
+ rb_funcall(basic_eval_trigger, instance_trigger_check_method, 3, self,
11
+ source, ret);
11
12
  }
12
13
 
13
14
  VALUE
@@ -36,7 +37,8 @@ contrast_assess_basic_object_instance_eval(const int argc, const VALUE *argv,
36
37
  }
37
38
 
38
39
  void Init_cs__assess_basic_object(void) {
39
- basic_eval_trigger = rb_define_class_under(core_assess, "EvalTrigger", rb_cObject);
40
+ basic_eval_trigger =
41
+ rb_define_class_under(core_assess, "EvalTrigger", rb_cObject);
40
42
  instance_trigger_check_method = rb_intern("instance_eval_trigger_check");
41
43
 
42
44
  /* We don't keep a reference to the underlying method.
@@ -45,8 +47,6 @@ void Init_cs__assess_basic_object(void) {
45
47
  * but if someone else patched BasicObject#instance_eval,
46
48
  * IDK if this is intentional... noting it. -ajm
47
49
  */
48
- contrast_register_patch("BasicObject",
49
- "instance_eval",
50
+ contrast_register_patch("BasicObject", "instance_eval",
50
51
  contrast_assess_basic_object_instance_eval);
51
-
52
52
  }
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "cs__assess_fiber_track.h"
5
5
  #include "../cs__common/cs__common.h"
6
- #include <funchook.h>
7
6
  #include <ruby.h>
8
7
 
9
8
  VALUE rb_fiber_new_hook(VALUE (*func)(ANYARGS), VALUE obj) {
@@ -64,22 +63,18 @@ VALUE rb_fiber_yield_hook(int argc, const VALUE *argv) {
64
63
  }
65
64
 
66
65
  int install_fiber_hooks() {
67
- funchook_t *funchook = funchook_create();
68
-
69
66
  rb_fiber_new_original = rb_fiber_new;
70
- funchook_prepare(funchook, (void **)&rb_fiber_new_original,
71
- rb_fiber_new_hook);
67
+ patch_via_funchook(&rb_fiber_new_original, &rb_fiber_new_hook);
72
68
 
73
69
  rb_fiber_yield_original = rb_fiber_yield;
74
- funchook_prepare(funchook, (void **)&rb_fiber_yield_original,
75
- rb_fiber_yield_hook);
70
+ patch_via_funchook(&rb_fiber_yield_original, &rb_fiber_yield_hook);
76
71
 
77
- funchook_install(funchook, 0);
78
72
  return 0;
79
73
  }
80
74
 
81
75
  void Init_cs__assess_fiber_track(void) {
82
- fiber_propagator = rb_define_class_under(core_assess, "FiberPropagator", rb_cObject);
76
+ fiber_propagator =
77
+ rb_define_class_under(core_assess, "FiberPropagator", rb_cObject);
83
78
  track_rb_fiber_new = rb_intern("track_rb_fiber_new");
84
79
  track_rb_fiber_yield = rb_intern("track_rb_fiber_yield");
85
80
  rb_sym_next = rb_intern("next");
@@ -1,4 +1,3 @@
1
- #include <funchook.h>
2
1
  #include <ruby.h>
3
2
 
4
3
  static VALUE rb_sym_next;
@@ -12,23 +12,24 @@
12
12
  * This method instruments that unique bracket-construction style
13
13
  * of initializing a hash.
14
14
  */
15
- static VALUE contrast_assess_hash_bracket_constructor(const int argc, VALUE *argv,
16
- const VALUE hash) {
15
+ static VALUE contrast_assess_hash_bracket_constructor(const int argc,
16
+ VALUE *argv,
17
+ const VALUE hash) {
17
18
  VALUE result;
18
19
 
19
20
  /* Array of Arrays: Hash[ [ [key, value], ... ] ] -> new_hash */
20
21
  if (RB_TYPE_P(argv[0], T_ARRAY)) {
21
22
  int i;
22
23
  for (i = 0; i < argc; i++) {
23
- argv[i] =
24
- rb_funcall(hash_propagator, rb_sym_assess_hash_dup_and_freeze, 1, argv[i]);
24
+ argv[i] = rb_funcall(hash_propagator,
25
+ rb_sym_assess_hash_dup_and_freeze, 1, argv[i]);
25
26
  }
26
27
  /* Hash[ key, value, ... ] -> new_hash */
27
28
  } else if (argc > 1) {
28
29
  int i;
29
30
  for (i = 0; i < argc; i += 2) {
30
- argv[i] =
31
- rb_funcall(hash_propagator, rb_sym_assess_hash_dup_and_freeze, 1, argv[i]);
31
+ argv[i] = rb_funcall(hash_propagator,
32
+ rb_sym_assess_hash_dup_and_freeze, 1, argv[i]);
32
33
  }
33
34
  }
34
35
 
@@ -36,7 +37,8 @@ static VALUE contrast_assess_hash_bracket_constructor(const int argc, VALUE *arg
36
37
  * String keys
37
38
  * # Hash[ object ] -> new_hash
38
39
  */
39
- result = rb_funcall2(hash, rb_sym_assess_hash_bracket_constructor, argc, argv);
40
+ result =
41
+ rb_funcall2(hash, rb_sym_assess_hash_bracket_constructor, argc, argv);
40
42
 
41
43
  return result;
42
44
  }
@@ -61,8 +63,9 @@ static VALUE contrast_assess_hash_bracket_set(const int argc, VALUE *argv,
61
63
  * We haven't revisited this approach since we started more extensively
62
64
  * hooking public C functions.)
63
65
  */
64
- if(argc > 0) {
65
- argv[0] = rb_funcall(hash_propagator, rb_sym_assess_hash_dup_and_freeze, 1, argv[0]);
66
+ if (argc > 0) {
67
+ argv[0] = rb_funcall(hash_propagator, rb_sym_assess_hash_dup_and_freeze,
68
+ 1, argv[0]);
66
69
  }
67
70
  /* This is the underlying assignment, w/ our instrumented key. */
68
71
  result = rb_funcall2(hash, rb_sym_assess_hash_bracket_equals, argc, argv);
@@ -71,17 +74,15 @@ static VALUE contrast_assess_hash_bracket_set(const int argc, VALUE *argv,
71
74
  }
72
75
 
73
76
  void Init_cs__assess_hash(void) {
74
- hash_propagator = rb_define_class_under(core_assess, "HashPropagator", rb_cObject);
77
+ hash_propagator =
78
+ rb_define_class_under(core_assess, "HashPropagator", rb_cObject);
75
79
  rb_sym_assess_hash_dup_and_freeze = rb_intern("cs__duplicate_and_freeze");
76
80
 
77
81
  VALUE hash_class = rb_define_class("Hash", rb_cObject);
78
82
 
79
- rb_sym_assess_hash_bracket_constructor = contrast_register_singleton_patch("Hash",
80
- "[]",
81
- contrast_assess_hash_bracket_constructor);
82
-
83
- rb_sym_assess_hash_bracket_equals = contrast_register_patch("Hash",
84
- "[]=",
85
- contrast_assess_hash_bracket_set);
83
+ rb_sym_assess_hash_bracket_constructor = contrast_register_singleton_patch(
84
+ "Hash", "[]", contrast_assess_hash_bracket_constructor);
86
85
 
86
+ rb_sym_assess_hash_bracket_equals = contrast_register_patch(
87
+ "Hash", "[]=", contrast_assess_hash_bracket_set);
87
88
  }
@@ -13,7 +13,8 @@ static VALUE hash_propagator;
13
13
  * ahead of time should avoid this, similar to the behavior of the -@ Strings
14
14
  * -HM
15
15
  */
16
- static VALUE contrast_assess_hash_bracket_constructor(const int argc, VALUE *argv,
16
+ static VALUE contrast_assess_hash_bracket_constructor(const int argc,
17
+ VALUE *argv,
17
18
  const VALUE hash);
18
19
 
19
20
  static VALUE contrast_assess_hash_bracket_set(const int argc, VALUE *argv,
@@ -18,8 +18,9 @@ contrast_patched_kernel_exec(const int argc, const VALUE *argv,
18
18
  rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
19
19
  }
20
20
 
21
- /* maybe this should be rb_funcall2. this works right now because *argv == argv[0].
22
- * exec shouldn't ever be called with != 1 argc, so not a huge problem */
21
+ /* maybe this should be rb_funcall2. this works right now because *argv ==
22
+ * argv[0]. exec shouldn't ever be called with != 1 argc, so not a huge
23
+ * problem */
23
24
  return rb_funcall(self, rb_sym_assess_kernel_exec, argc, *argv);
24
25
  }
25
26
 
@@ -27,12 +28,10 @@ void Init_cs__assess_kernel(void) {
27
28
  kernel_propagator = rb_define_module_under(core_assess, "KernelPropagator");
28
29
  exec_apply_trigger = rb_intern("apply_trigger");
29
30
 
30
- rb_sym_assess_kernel_exec = contrast_register_patch("Kernel",
31
- "exec",
32
- contrast_patched_kernel_exec);
31
+ rb_sym_assess_kernel_exec =
32
+ contrast_register_patch("Kernel", "exec", contrast_patched_kernel_exec);
33
33
 
34
34
  /* should return the same value as above */
35
- rb_sym_assess_kernel_exec = contrast_register_singleton_patch("Kernel",
36
- "exec",
37
- contrast_patched_kernel_exec);
35
+ rb_sym_assess_kernel_exec = contrast_register_singleton_patch(
36
+ "Kernel", "exec", contrast_patched_kernel_exec);
38
37
  }
@@ -9,7 +9,6 @@ static VALUE contrast_assess_marshal_module_load(const int argc,
9
9
  const VALUE *argv) {
10
10
  VALUE result;
11
11
  VALUE source_string;
12
-
13
12
  result = rb_call_super(argc, argv);
14
13
 
15
14
  if (argc >= 1) {
@@ -27,7 +26,7 @@ static VALUE contrast_assess_marshal_module_load(const int argc,
27
26
  rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
28
27
  rb_funcall(marshal_module, rb_sym_assess_load_trigger_check,
29
28
  2, source_string, result);
30
- rb_funcall(contrast_patcher(), rb_sym_exit_scope, 1, scope);
29
+ rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
31
30
  }
32
31
  }
33
32
  }
@@ -36,9 +35,9 @@ static VALUE contrast_assess_marshal_module_load(const int argc,
36
35
  }
37
36
 
38
37
  void Init_cs__assess_marshal_module(void) {
38
+ marshal_module = rb_define_class_under(core_assess, "MarshalPropagator", rb_cObject);
39
39
  rb_sym_assess_load_trigger_check = rb_intern("cs__load_trigger_check");
40
40
 
41
- contrast_register_singleton_prepend_patch("Marshal",
42
- "load",
43
- &contrast_assess_marshal_module_load);
41
+ contrast_register_singleton_prepend_patch(
42
+ "Marshal", "load", &contrast_assess_marshal_module_load);
44
43
  }
@@ -21,7 +21,8 @@ void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
21
21
  /* If this method ever throws an exception, the scope-leave
22
22
  * needs to be moved within a rescue call.
23
23
  */
24
- rb_funcall(module_eval_trigger, trigger_check_method, 4, module, source, ret, method);
24
+ rb_funcall(module_eval_trigger, trigger_check_method, 4, module, source,
25
+ ret, method);
25
26
  }
26
27
 
27
28
  rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
@@ -57,7 +58,8 @@ contrast_assess_module_module_eval(const int argc, const VALUE *argv,
57
58
  }
58
59
 
59
60
  void Init_cs__assess_module(void) {
60
- module_eval_trigger = rb_define_class_under(core_assess, "EvalTrigger", rb_cObject);
61
+ module_eval_trigger =
62
+ rb_define_class_under(core_assess, "EvalTrigger", rb_cObject);
61
63
  trigger_check_method = rb_intern("eval_trigger_check");
62
64
 
63
65
  rb_sym_assess_patch_eval = rb_intern("patch_assess_on_eval");
@@ -69,11 +71,9 @@ void Init_cs__assess_module(void) {
69
71
  * See similar comments in basic_object C ext patch.
70
72
  */
71
73
 
72
- contrast_register_patch("Module",
73
- "class_eval",
74
+ contrast_register_patch("Module", "class_eval",
74
75
  contrast_assess_module_class_eval);
75
76
 
76
- contrast_register_patch("Module",
77
- "module_eval",
77
+ contrast_register_patch("Module", "module_eval",
78
78
  contrast_assess_module_module_eval);
79
79
  }
@@ -29,7 +29,8 @@ static VALUE contrast_assess_regexp_equal_squiggle(const int argc,
29
29
  }
30
30
 
31
31
  void Init_cs__assess_regexp(void) {
32
- regexp_propagator = rb_define_class_under(core_assess, "RegexpPropagator", rb_cObject);
32
+ regexp_propagator =
33
+ rb_define_class_under(core_assess, "RegexpPropagator", rb_cObject);
33
34
  rb_sym_assess_track_regexp = rb_intern("track_equal_squiggle");
34
35
 
35
36
  /* These are the keys we use to define our hash of
@@ -46,7 +47,6 @@ void Init_cs__assess_regexp(void) {
46
47
  rb_sym_back_ref = ID2SYM(rb_intern("back_ref"));
47
48
  rb_global_variable(&rb_sym_back_ref);
48
49
 
49
- rb_sym_assess_regexp_equal_squiggle = contrast_register_patch("Regexp",
50
- "=~",
51
- contrast_assess_regexp_equal_squiggle);
50
+ rb_sym_assess_regexp_equal_squiggle = contrast_register_patch(
51
+ "Regexp", "=~", contrast_assess_regexp_equal_squiggle);
52
52
  }
@@ -6,7 +6,7 @@
6
6
  #include <ruby.h>
7
7
 
8
8
  static VALUE contrast_assess_string_uminus(const int argc, VALUE *argv,
9
- const VALUE obj) {
9
+ const VALUE obj) {
10
10
  VALUE dup, tracked;
11
11
  if (!OBJ_FROZEN(obj)) {
12
12
  tracked = rb_funcall(obj, rb_sym_cs_tracked, 0);
@@ -17,6 +17,7 @@ static VALUE contrast_assess_string_uminus(const int argc, VALUE *argv,
17
17
  * string.c, but we ignore any other monkey patches on String#-@
18
18
  */
19
19
  dup = rb_funcall(obj, rb_sym_dup, 0);
20
+ rb_funcall(obj, rb_intern("cs__transfer_properties"), 1, dup);
20
21
  rb_funcall(dup, rb_sym_freeze, 0);
21
22
  return dup;
22
23
  }
@@ -25,11 +26,26 @@ static VALUE contrast_assess_string_uminus(const int argc, VALUE *argv,
25
26
  return rb_funcall(obj, rb_sym_assess_string_uminus, 0);
26
27
  }
27
28
 
29
+ static VALUE contrast_assess_string_freeze(const int argc, VALUE *argv,
30
+ const VALUE obj) {
31
+ if (!OBJ_FROZEN(obj)) {
32
+ // Contrast::Agent::Assess::Finalizers::Finalize::PROPERTIES_HASH.pre_freeze(self)
33
+ rb_funcall(properties_hash, rb_intern("pre_freeze"), 1, obj);
34
+ }
35
+ return rb_funcall(obj, rb_sym_assess_string_freeze, 0);
36
+ }
37
+
28
38
  void Init_cs__assess_string(void) {
29
39
  rb_sym_dup = rb_intern("dup");
30
40
  rb_sym_freeze = rb_intern("freeze");
31
41
 
32
- rb_sym_assess_string_uminus = contrast_register_patch("String",
33
- "-@",
34
- &contrast_assess_string_uminus);
42
+ // Contrast::Agent::Assess::Finalizers::Finalize::PROPERTIES_HASH
43
+ VALUE finalizers = rb_define_module_under(assess, "Finalizers");
44
+ VALUE finalize = rb_define_module_under(finalizers, "Finalize");
45
+ properties_hash = rb_const_get(finalize, rb_intern("PROPERTIES_HASH"));
46
+
47
+ rb_sym_assess_string_uminus =
48
+ contrast_register_patch("String", "-@", &contrast_assess_string_uminus);
49
+ rb_sym_assess_string_freeze = contrast_register_patch(
50
+ "String", "freeze", &contrast_assess_string_freeze);
35
51
  }