contrast-agent 3.11.0 → 3.13.1

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 (298) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +0 -1
  3. data/.flayignore +1 -0
  4. data/.gitignore +1 -1
  5. data/.simplecov +1 -1
  6. data/Rakefile +31 -0
  7. data/ext/build_funchook.rb +0 -2
  8. data/ext/cs__assess_active_record_named/cs__active_record_named.c +7 -2
  9. data/ext/cs__assess_active_record_named/cs__active_record_named.h +1 -0
  10. data/ext/cs__assess_array/cs__assess_array.c +2 -1
  11. data/ext/cs__assess_array/cs__assess_array.h +1 -0
  12. data/ext/cs__assess_basic_object/cs__assess_basic_object.c +3 -7
  13. data/ext/cs__assess_basic_object/cs__assess_basic_object.h +2 -1
  14. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +2 -8
  15. data/ext/cs__assess_fiber_track/cs__assess_fiber_track.h +0 -1
  16. data/ext/cs__assess_kernel/cs__assess_kernel.c +1 -1
  17. data/ext/cs__assess_module/cs__assess_module.c +5 -7
  18. data/ext/cs__assess_module/cs__assess_module.h +3 -0
  19. data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +1 -6
  20. data/ext/cs__assess_yield_track/cs__assess_yield_track.c +1 -5
  21. data/ext/cs__assess_yield_track/cs__assess_yield_track.h +0 -1
  22. data/ext/cs__common/cs__common.c +25 -1
  23. data/ext/cs__common/cs__common.h +3 -0
  24. data/ext/cs__common/extconf.rb +0 -14
  25. data/ext/cs__protect_kernel/cs__protect_kernel.c +4 -2
  26. data/ext/cs__protect_kernel/cs__protect_kernel.h +1 -0
  27. data/ext/extconf_common.rb +0 -28
  28. data/lib/contrast.rb +3 -2
  29. data/lib/contrast/agent.rb +33 -24
  30. data/lib/contrast/agent/assess.rb +0 -9
  31. data/lib/contrast/agent/assess/contrast_event.rb +28 -167
  32. data/lib/contrast/agent/assess/events/source_event.rb +3 -7
  33. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +1 -1
  34. data/lib/contrast/agent/assess/policy/patcher.rb +1 -0
  35. data/lib/contrast/agent/assess/policy/policy_node.rb +5 -99
  36. data/lib/contrast/agent/assess/policy/policy_scanner.rb +1 -1
  37. data/lib/contrast/agent/assess/policy/propagation_method.rb +4 -2
  38. data/lib/contrast/agent/assess/policy/propagation_node.rb +5 -1
  39. data/lib/contrast/agent/assess/policy/propagator/base.rb +1 -1
  40. data/lib/contrast/agent/assess/policy/propagator/custom.rb +1 -1
  41. data/lib/contrast/agent/assess/policy/propagator/database_write.rb +1 -3
  42. data/lib/contrast/agent/assess/policy/propagator/insert.rb +1 -4
  43. data/lib/contrast/agent/assess/policy/propagator/match_data.rb +9 -1
  44. data/lib/contrast/agent/assess/policy/propagator/remove.rb +6 -11
  45. data/lib/contrast/agent/assess/policy/propagator/select.rb +4 -4
  46. data/lib/contrast/agent/assess/policy/propagator/split.rb +2 -2
  47. data/lib/contrast/agent/assess/policy/propagator/substitution.rb +4 -4
  48. data/lib/contrast/agent/assess/policy/propagator/trim.rb +6 -10
  49. data/lib/contrast/agent/assess/policy/source_method.rb +1 -2
  50. data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +90 -0
  51. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +57 -0
  52. data/lib/contrast/agent/assess/policy/trigger_method.rb +2 -14
  53. data/lib/contrast/agent/assess/policy/trigger_node.rb +20 -5
  54. data/lib/contrast/agent/assess/properties.rb +4 -382
  55. data/lib/contrast/agent/assess/property/evented.rb +78 -0
  56. data/lib/contrast/agent/assess/property/tagged.rb +339 -0
  57. data/lib/contrast/agent/assess/rule/base.rb +0 -15
  58. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +5 -6
  59. data/lib/contrast/agent/assess/rule/redos.rb +0 -1
  60. data/lib/contrast/agent/assess/tag.rb +27 -12
  61. data/lib/contrast/agent/at_exit_hook.rb +4 -2
  62. data/lib/contrast/agent/class_reopener.rb +9 -4
  63. data/lib/contrast/agent/exclusion_matcher.rb +2 -3
  64. data/lib/contrast/agent/inventory/policy/datastores.rb +53 -0
  65. data/lib/contrast/agent/inventory/policy/policy.rb +1 -1
  66. data/lib/contrast/agent/middleware.rb +36 -44
  67. data/lib/contrast/agent/patching/policy/after_load_patch.rb +11 -2
  68. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +51 -56
  69. data/lib/contrast/agent/patching/policy/patch.rb +3 -2
  70. data/lib/contrast/agent/patching/policy/patcher.rb +10 -12
  71. data/lib/contrast/agent/patching/policy/policy.rb +3 -3
  72. data/lib/contrast/agent/patching/policy/policy_node.rb +3 -3
  73. data/lib/contrast/agent/patching/policy/trigger_node.rb +1 -1
  74. data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +63 -0
  75. data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +52 -0
  76. data/lib/contrast/agent/protect/policy/applies_no_sqli_rule.rb +68 -0
  77. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +117 -0
  78. data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +54 -0
  79. data/lib/contrast/agent/protect/policy/applies_xxe_rule.rb +129 -0
  80. data/lib/contrast/agent/protect/policy/policy.rb +6 -6
  81. data/lib/contrast/agent/protect/policy/rule_applicator.rb +51 -0
  82. data/lib/contrast/agent/protect/rule.rb +0 -5
  83. data/lib/contrast/agent/protect/rule/base.rb +25 -36
  84. data/lib/contrast/agent/protect/rule/base_service.rb +1 -1
  85. data/lib/contrast/agent/protect/rule/cmd_injection.rb +3 -3
  86. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +2 -7
  87. data/lib/contrast/agent/protect/rule/path_traversal.rb +2 -7
  88. data/lib/contrast/agent/protect/rule/sqli.rb +4 -4
  89. data/lib/contrast/agent/protect/rule/xxe.rb +1 -0
  90. data/lib/contrast/agent/railtie.rb +1 -0
  91. data/lib/contrast/agent/reaction_processor.rb +3 -3
  92. data/lib/contrast/agent/request.rb +91 -334
  93. data/lib/contrast/agent/request_context.rb +17 -18
  94. data/lib/contrast/agent/request_handler.rb +2 -2
  95. data/lib/contrast/agent/response.rb +2 -83
  96. data/lib/contrast/agent/scope.rb +1 -1
  97. data/lib/contrast/agent/service_heartbeat.rb +8 -10
  98. data/lib/contrast/agent/static_analysis.rb +2 -3
  99. data/lib/contrast/agent/thread_watcher.rb +49 -0
  100. data/lib/contrast/agent/version.rb +1 -1
  101. data/lib/contrast/agent/worker_thread.rb +24 -0
  102. data/lib/contrast/api.rb +3 -5
  103. data/lib/contrast/api/communication.rb +20 -0
  104. data/lib/contrast/api/communication/connection_status.rb +41 -0
  105. data/lib/contrast/api/communication/messaging_queue.rb +79 -0
  106. data/lib/contrast/{utils/service_response_util.rb → api/communication/response_processor.rb} +15 -22
  107. data/lib/contrast/api/communication/service_lifecycle.rb +61 -0
  108. data/lib/contrast/api/communication/socket.rb +45 -0
  109. data/lib/contrast/api/communication/socket_client.rb +76 -0
  110. data/lib/contrast/api/communication/speedracer.rb +111 -0
  111. data/lib/contrast/api/communication/tcp_socket.rb +31 -0
  112. data/lib/contrast/api/communication/unix_socket.rb +27 -0
  113. data/lib/contrast/api/decorators.rb +10 -0
  114. data/lib/contrast/api/decorators/address.rb +60 -0
  115. data/lib/contrast/api/decorators/application_settings.rb +7 -3
  116. data/lib/contrast/api/decorators/application_update.rb +0 -9
  117. data/lib/contrast/api/decorators/http_request.rb +139 -0
  118. data/lib/contrast/api/decorators/message.rb +75 -0
  119. data/lib/contrast/api/decorators/rasp_rule_sample.rb +28 -0
  120. data/lib/contrast/api/decorators/route_coverage.rb +57 -0
  121. data/lib/contrast/api/decorators/trace_event.rb +99 -0
  122. data/lib/contrast/api/decorators/trace_event_object.rb +57 -0
  123. data/lib/contrast/api/decorators/trace_event_signature.rb +46 -0
  124. data/lib/contrast/api/decorators/trace_taint_range.rb +51 -0
  125. data/lib/contrast/api/decorators/trace_taint_range_tags.rb +109 -0
  126. data/lib/contrast/api/decorators/user_input.rb +40 -0
  127. data/lib/contrast/components/agent.rb +17 -12
  128. data/lib/contrast/components/app_context.rb +27 -2
  129. data/lib/contrast/components/assess.rb +25 -15
  130. data/lib/contrast/components/config.rb +4 -9
  131. data/lib/contrast/components/contrast_service.rb +23 -67
  132. data/lib/contrast/components/interface.rb +5 -13
  133. data/lib/contrast/components/inventory.rb +5 -1
  134. data/lib/contrast/components/logger.rb +2 -2
  135. data/lib/contrast/components/protect.rb +40 -4
  136. data/lib/contrast/components/scope.rb +2 -52
  137. data/lib/contrast/components/settings.rb +18 -18
  138. data/lib/contrast/config/protect_rules_configuration.rb +0 -1
  139. data/lib/contrast/configuration.rb +2 -2
  140. data/lib/contrast/{extensions/ruby_core → extension}/assess.rb +12 -15
  141. data/lib/contrast/extension/assess/array.rb +77 -0
  142. data/lib/contrast/{extensions/ruby_core → extension}/assess/assess_extension.rb +3 -4
  143. data/lib/contrast/{extensions/ruby_core → extension}/assess/erb.rb +0 -0
  144. data/lib/contrast/extension/assess/eval_trigger.rb +78 -0
  145. data/lib/contrast/{extensions/ruby_core → extension}/assess/exec_trigger.rb +1 -1
  146. data/lib/contrast/{extensions/ruby_core → extension}/assess/fiber.rb +7 -6
  147. data/lib/contrast/{extensions/ruby_core → extension}/assess/hash.rb +2 -2
  148. data/lib/contrast/extension/assess/kernel.rb +110 -0
  149. data/lib/contrast/{extensions/ruby_core → extension}/assess/regexp.rb +4 -4
  150. data/lib/contrast/{extensions/ruby_core → extension}/assess/string.rb +6 -6
  151. data/lib/contrast/{extensions/ruby_core → extension}/delegator.rb +0 -0
  152. data/lib/contrast/{extensions/ruby_core → extension}/inventory.rb +2 -3
  153. data/lib/contrast/extension/kernel.rb +54 -0
  154. data/lib/contrast/{extensions/ruby_core → extension}/module.rb +0 -0
  155. data/lib/contrast/{extensions/ruby_core → extension}/protect.rb +2 -2
  156. data/lib/contrast/extension/protect/kernel.rb +44 -0
  157. data/lib/contrast/{extensions/ruby_core → extension}/protect/psych.rb +1 -1
  158. data/lib/contrast/{extensions/ruby_core → extension}/thread.rb +0 -0
  159. data/lib/contrast/framework/base_support.rb +22 -23
  160. data/lib/contrast/framework/manager.rb +31 -15
  161. data/lib/contrast/framework/rack/patch/session_cookie.rb +126 -0
  162. data/lib/contrast/framework/rack/patch/support.rb +24 -0
  163. data/lib/contrast/framework/rack/support.rb +22 -0
  164. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +41 -0
  165. data/lib/contrast/framework/rails/patch/assess_configuration.rb +102 -0
  166. data/lib/contrast/framework/rails/patch/rails_application_configuration.rb +31 -0
  167. data/lib/contrast/framework/rails/patch/support.rb +67 -0
  168. data/lib/contrast/framework/rails/rewrite/action_controller_railties_helper_inherited.rb +34 -0
  169. data/lib/contrast/framework/rails/rewrite/active_record_attribute_methods_read.rb +39 -0
  170. data/lib/contrast/framework/rails/rewrite/active_record_named.rb +73 -0
  171. data/lib/contrast/framework/rails/rewrite/active_record_time_zone_inherited.rb +33 -0
  172. data/lib/contrast/framework/rails/support.rb +86 -0
  173. data/lib/contrast/framework/sinatra/patch/base.rb +83 -0
  174. data/lib/contrast/framework/sinatra/patch/support.rb +27 -0
  175. data/lib/contrast/framework/sinatra/support.rb +98 -0
  176. data/lib/contrast/funchook/funchook.rb +45 -0
  177. data/lib/contrast/logger/application.rb +80 -0
  178. data/lib/contrast/logger/format.rb +51 -0
  179. data/lib/contrast/{agent/logger.rb → logger/log.rb} +39 -63
  180. data/lib/contrast/logger/time.rb +50 -0
  181. data/lib/contrast/tasks/config.rb +54 -0
  182. data/lib/contrast/tasks/service.rb +1 -5
  183. data/lib/contrast/utils/assess/tracking_util.rb +45 -20
  184. data/lib/contrast/utils/class_util.rb +4 -2
  185. data/lib/contrast/utils/gemfile_reader.rb +2 -2
  186. data/lib/contrast/utils/hash_digest.rb +13 -9
  187. data/lib/contrast/utils/invalid_configuration_util.rb +2 -18
  188. data/lib/contrast/utils/inventory_util.rb +2 -7
  189. data/lib/contrast/utils/job_servers_running.rb +4 -2
  190. data/lib/contrast/utils/object_share.rb +0 -2
  191. data/lib/contrast/utils/os.rb +16 -4
  192. data/lib/contrast/utils/stack_trace_utils.rb +0 -1
  193. data/lib/contrast/utils/tag_util.rb +1 -1
  194. data/lib/contrast/utils/thread_tracker.rb +1 -14
  195. data/lib/contrast/utils/timer.rb +1 -17
  196. data/resources/assess/policy.json +9 -50
  197. data/resources/inventory/policy.json +2 -2
  198. data/resources/protect/policy.json +6 -6
  199. data/ruby-agent.gemspec +9 -5
  200. data/service_executables/VERSION +1 -1
  201. data/service_executables/linux/contrast-service +0 -0
  202. data/service_executables/mac/contrast-service +0 -0
  203. metadata +103 -139
  204. data/funchook/Makefile +0 -29
  205. data/funchook/autom4te.cache/output.0 +0 -4964
  206. data/funchook/autom4te.cache/requests +0 -77
  207. data/funchook/autom4te.cache/traces.0 +0 -361
  208. data/funchook/config.log +0 -651
  209. data/funchook/config.status +0 -1015
  210. data/funchook/configure +0 -4964
  211. data/funchook/src/Makefile +0 -70
  212. data/funchook/src/config.h +0 -101
  213. data/funchook/src/config.h.in +0 -100
  214. data/funchook/src/decoder.o +0 -0
  215. data/funchook/src/distorm.o +0 -0
  216. data/funchook/src/funchook.o +0 -0
  217. data/funchook/src/funchook_io.o +0 -0
  218. data/funchook/src/funchook_syscall.o +0 -0
  219. data/funchook/src/funchook_unix.o +0 -0
  220. data/funchook/src/funchook_x86.o +0 -0
  221. data/funchook/src/instructions.o +0 -0
  222. data/funchook/src/insts.o +0 -0
  223. data/funchook/src/libfunchook.dylib +0 -0
  224. data/funchook/src/mnemonics.o +0 -0
  225. data/funchook/src/operands.o +0 -0
  226. data/funchook/src/os_func.o +0 -0
  227. data/funchook/src/os_func_unix.o +0 -0
  228. data/funchook/src/prefix.o +0 -0
  229. data/funchook/src/printf_base.o +0 -0
  230. data/funchook/src/textdefs.o +0 -0
  231. data/funchook/src/wstring.o +0 -0
  232. data/funchook/test/Makefile +0 -43
  233. data/funchook/test/funchook_test +0 -0
  234. data/funchook/test/libfunchook_test.so +0 -0
  235. data/funchook/test/libfunchook_test.so.dSYM/Contents/Info.plist +0 -20
  236. data/funchook/test/libfunchook_test.so.dSYM/Contents/Resources/DWARF/libfunchook_test.so +0 -0
  237. data/funchook/test/test_main.o +0 -0
  238. data/funchook/test/x86_64_test.o +0 -0
  239. data/lib/contrast/agent/assess/adjusted_span.rb +0 -27
  240. data/lib/contrast/agent/assess/rule/csrf.rb +0 -66
  241. data/lib/contrast/agent/assess/rule/csrf/csrf_action.rb +0 -28
  242. data/lib/contrast/agent/assess/rule/csrf/csrf_applicator.rb +0 -53
  243. data/lib/contrast/agent/assess/rule/csrf/csrf_watcher.rb +0 -136
  244. data/lib/contrast/agent/assess/rule/response_scanning_rule.rb +0 -47
  245. data/lib/contrast/agent/assess/rule/response_watcher.rb +0 -36
  246. data/lib/contrast/agent/assess/rule/watcher.rb +0 -36
  247. data/lib/contrast/agent/feature_state.rb +0 -346
  248. data/lib/contrast/agent/protect/rule/csrf.rb +0 -119
  249. data/lib/contrast/agent/protect/rule/csrf/csrf_evaluator.rb +0 -100
  250. data/lib/contrast/agent/protect/rule/csrf/csrf_token_injector.rb +0 -85
  251. data/lib/contrast/agent/settings_state.rb +0 -88
  252. data/lib/contrast/agent/socket_client.rb +0 -134
  253. data/lib/contrast/api/connection_status.rb +0 -49
  254. data/lib/contrast/api/decorators/exclusion.rb +0 -20
  255. data/lib/contrast/api/socket.rb +0 -43
  256. data/lib/contrast/api/speedracer.rb +0 -188
  257. data/lib/contrast/api/tcp_socket.rb +0 -29
  258. data/lib/contrast/api/unix_socket.rb +0 -25
  259. data/lib/contrast/extensions/framework/rack/cookie.rb +0 -24
  260. data/lib/contrast/extensions/framework/rack/request.rb +0 -24
  261. data/lib/contrast/extensions/framework/rack/response.rb +0 -23
  262. data/lib/contrast/extensions/framework/rails/action_controller_inheritance.rb +0 -39
  263. data/lib/contrast/extensions/framework/rails/action_controller_railties_helper_inherited.rb +0 -20
  264. data/lib/contrast/extensions/framework/rails/active_record.rb +0 -26
  265. data/lib/contrast/extensions/framework/rails/active_record_named.rb +0 -58
  266. data/lib/contrast/extensions/framework/rails/active_record_time_zone_inherited.rb +0 -21
  267. data/lib/contrast/extensions/framework/rails/buffer.rb +0 -28
  268. data/lib/contrast/extensions/framework/rails/configuration.rb +0 -27
  269. data/lib/contrast/extensions/framework/sinatra/base.rb +0 -59
  270. data/lib/contrast/extensions/ruby_core/assess/array.rb +0 -59
  271. data/lib/contrast/extensions/ruby_core/assess/basic_object.rb +0 -15
  272. data/lib/contrast/extensions/ruby_core/assess/kernel.rb +0 -96
  273. data/lib/contrast/extensions/ruby_core/assess/module.rb +0 -14
  274. data/lib/contrast/extensions/ruby_core/assess/tilt_template_trigger.rb +0 -78
  275. data/lib/contrast/extensions/ruby_core/assess/xpath_library_trigger.rb +0 -40
  276. data/lib/contrast/extensions/ruby_core/eval_trigger.rb +0 -51
  277. data/lib/contrast/extensions/ruby_core/inventory/datastores.rb +0 -37
  278. data/lib/contrast/extensions/ruby_core/protect/applies_command_injection_rule.rb +0 -61
  279. data/lib/contrast/extensions/ruby_core/protect/applies_deserialization_rule.rb +0 -50
  280. data/lib/contrast/extensions/ruby_core/protect/applies_no_sqli_rule.rb +0 -66
  281. data/lib/contrast/extensions/ruby_core/protect/applies_path_traversal_rule.rb +0 -115
  282. data/lib/contrast/extensions/ruby_core/protect/applies_sqli_rule.rb +0 -53
  283. data/lib/contrast/extensions/ruby_core/protect/applies_xxe_rule.rb +0 -127
  284. data/lib/contrast/extensions/ruby_core/protect/kernel.rb +0 -30
  285. data/lib/contrast/extensions/ruby_core/protect/rule_applicator.rb +0 -50
  286. data/lib/contrast/framework/rails_support.rb +0 -104
  287. data/lib/contrast/framework/sinatra_application_helper.rb +0 -49
  288. data/lib/contrast/framework/sinatra_support.rb +0 -104
  289. data/lib/contrast/framework/view_technologies_descriptor.rb +0 -21
  290. data/lib/contrast/internal_exception.rb +0 -8
  291. data/lib/contrast/utils/cache.rb +0 -58
  292. data/lib/contrast/utils/data_store_util.rb +0 -23
  293. data/lib/contrast/utils/rack_assess_session_cookie.rb +0 -104
  294. data/lib/contrast/utils/rails_assess_configuration.rb +0 -95
  295. data/lib/contrast/utils/random_util.rb +0 -22
  296. data/lib/contrast/utils/service_sender_util.rb +0 -110
  297. data/lib/contrast/utils/sinatra_helper.rb +0 -49
  298. data/resources/csrf/inject.js +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ef521f3316b8c5e911a3781bb0dc0c228b01a6166ad1f6a2abb429e67941878
4
- data.tar.gz: 16305c60287b244efb6d0a1fb23a979b405e4960deaa2a84e45b1da994c21c14
3
+ metadata.gz: 243b30b36043569647a00b004f6e1b2055f488b63cfd8a3f023a106f101cf889
4
+ data.tar.gz: 3bee1adbd1399cda966e480e982c15ac4cf29151148a0f3583707f976bd65704
5
5
  SHA512:
6
- metadata.gz: 228c42ed0e8453f3b2720818d7127729991e8d2cad7e480fc616f0975481e7810ff0ebfae44ebe406c62ff51398307e6cadd685a0805b34a7cb699641278c064
7
- data.tar.gz: e9d180bb7004a818d346bb2d5f4ea5b57d1d6fef58284569fdb80dcbaf44cb215d4ae3b86c7984c683387011af9bf20f9428947820bf9e13fa67cc9084d6d8b8
6
+ metadata.gz: 25b33e16000c0ff543bce8d3b01185cc161e88c9d2d14f14210966f7789962f06fadad30c2343cb8a8b00c22e754dbd2f7335a177d2c42be1251c74debb26ca4
7
+ data.tar.gz: 186908641b731c23c873ee5a4821d74e2c112e61e33c1206769837774196055431de419e8e826f3324f85812ab324e9c2c6c15d02ca6b5d1001bd6a9fb2f2277
@@ -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
@@ -0,0 +1 @@
1
+ ./lib/contrast/api/*_pb.rb
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
@@ -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)
@@ -19,7 +19,7 @@ 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(self, rb_sym_assess_rewrite, 2, argv[0], argv[1]);
22
+ new_body = rb_funcall(active_record_named, rb_sym_assess_rewrite, 3, self, argv[0], argv[1]);
23
23
  new_args[0] = argv[0];
24
24
  if (NIL_P(new_body)) {
25
25
  new_args[1] = argv[1];
@@ -32,7 +32,12 @@ VALUE contrast_assess_active_record_scope(const int argc, const VALUE *argv,
32
32
  }
33
33
 
34
34
  void Init_cs__assess_active_record_named(void) {
35
- rb_sym_assess_rewrite = rb_intern("_cs__rewrite");
35
+ VALUE framework, rails, rewrite;
36
+ framework = rb_define_module_under(contrast, "Framework");
37
+ rails = rb_define_module_under(framework, "Rails");
38
+ rewrite = rb_define_module_under(rails, "Rewrite");
39
+ active_record_named = rb_define_class_under(rewrite, "ActiveRecordNamed", rb_cObject);
40
+ rb_sym_assess_rewrite = rb_intern("rewrite");
36
41
  rb_sym_assess_scope = contrast_register_patch("ActiveRecord::Scoping::Named::ClassMethods",
37
42
  "scope",
38
43
  contrast_assess_active_record_scope);
@@ -1,5 +1,6 @@
1
1
  #include <ruby.h>
2
2
 
3
+ static VALUE active_record_named;
3
4
  static VALUE rb_sym_assess_rewrite;
4
5
  static VALUE rb_sym_assess_scope;
5
6
 
@@ -23,12 +23,13 @@ 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(ary, rb_sym_assess_track_array_join, 2, sep, result);
26
+ result = rb_funcall(array_propagator, rb_sym_assess_track_array_join, 3, ary, sep, result);
27
27
 
28
28
  return result;
29
29
  }
30
30
 
31
31
  void Init_cs__assess_array(void) {
32
+ array_propagator = rb_define_class_under(core_assess, "ArrayPropagator", rb_cObject);
32
33
  rb_sym_assess_track_array_join = rb_intern("cs__track_join");
33
34
  rb_sym_assess_array_join = contrast_register_patch("Array",
34
35
  "join",
@@ -1,5 +1,6 @@
1
1
  #include <ruby.h>
2
2
 
3
+ static VALUE array_propagator;
3
4
  static VALUE rb_sym_assess_array_join;
4
5
  static VALUE rb_sym_assess_track_array_join;
5
6
 
@@ -5,14 +5,9 @@
5
5
  #include "../cs__common/cs__common.h"
6
6
  #include <ruby.h>
7
7
 
8
- void contrast_assess_instance_eval_trigger_check(VALUE module, VALUE source,
8
+ void contrast_assess_instance_eval_trigger_check(VALUE self, VALUE source,
9
9
  VALUE ret) {
10
- VALUE has_trigger_check =
11
- rb_respond_to(rb_cBasicObject, instance_trigger_check_method);
12
- if (has_trigger_check) {
13
- rb_funcall(rb_cBasicObject, instance_trigger_check_method, 2, source,
14
- ret);
15
- }
10
+ rb_funcall(basic_eval_trigger, instance_trigger_check_method, 3, self, source, ret);
16
11
  }
17
12
 
18
13
  VALUE
@@ -41,6 +36,7 @@ contrast_assess_basic_object_instance_eval(const int argc, const VALUE *argv,
41
36
  }
42
37
 
43
38
  void Init_cs__assess_basic_object(void) {
39
+ basic_eval_trigger = rb_define_class_under(core_assess, "EvalTrigger", rb_cObject);
44
40
  instance_trigger_check_method = rb_intern("instance_eval_trigger_check");
45
41
 
46
42
  /* We don't keep a reference to the underlying method.
@@ -1,6 +1,7 @@
1
1
  #include <ruby.h>
2
2
 
3
- /* Contrast::Agent::Patching::Policy::Patcher */
3
+ /* Contrast::Extension::Assess::EvalTrigger */
4
+ static VALUE basic_eval_trigger;
4
5
  static VALUE instance_trigger_check_method;
5
6
 
6
7
  void contrast_alias_method(const VALUE target, const char *to,
@@ -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,17 +63,12 @@ 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
 
@@ -1,4 +1,3 @@
1
- #include <funchook.h>
2
1
  #include <ruby.h>
3
2
 
4
3
  static VALUE rb_sym_next;
@@ -24,7 +24,7 @@ contrast_patched_kernel_exec(const int argc, const VALUE *argv,
24
24
  }
25
25
 
26
26
  void Init_cs__assess_kernel(void) {
27
- kernel_propagator = rb_define_module("KernelPropagator");
27
+ kernel_propagator = rb_define_module_under(core_assess, "KernelPropagator");
28
28
  exec_apply_trigger = rb_intern("apply_trigger");
29
29
 
30
30
  rb_sym_assess_kernel_exec = contrast_register_patch("Kernel",
@@ -6,8 +6,6 @@
6
6
  #include <ruby.h>
7
7
 
8
8
  void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
9
- VALUE has_trigger_check = rb_respond_to(module, trigger_check_method);
10
-
11
9
  if (RTEST(
12
10
  rb_funcall(contrast_patcher(), rb_sym_skip_contrast_analysis, 0))) {
13
11
  return;
@@ -18,12 +16,12 @@ void contrast_assess_eval_trigger_check(VALUE module, VALUE source, VALUE ret) {
18
16
 
19
17
  rb_funcall(contrast_patcher(), rb_sym_enter_scope, 0);
20
18
 
21
- if (!nested_scope && has_trigger_check) {
19
+ if (!nested_scope) {
22
20
  VALUE method = rb_funcall(rb_mKernel, rb_sym_method, 0);
23
21
  /* If this method ever throws an exception, the scope-leave
24
22
  * needs to be moved within a rescue call.
25
23
  */
26
- rb_funcall(module, trigger_check_method, 3, source, ret, method);
24
+ rb_funcall(module_eval_trigger, trigger_check_method, 4, module, source, ret, method);
27
25
  }
28
26
 
29
27
  rb_funcall(contrast_patcher(), rb_sym_exit_scope, 0);
@@ -59,12 +57,12 @@ contrast_assess_module_module_eval(const int argc, const VALUE *argv,
59
57
  }
60
58
 
61
59
  void Init_cs__assess_module(void) {
62
- rb_sym_assess_patch_eval = rb_intern("patch_assess_on_eval");
60
+ module_eval_trigger = rb_define_class_under(core_assess, "EvalTrigger", rb_cObject);
61
+ trigger_check_method = rb_intern("eval_trigger_check");
63
62
 
63
+ rb_sym_assess_patch_eval = rb_intern("patch_assess_on_eval");
64
64
  assess_patcher = rb_define_module_under(assess_policy, "Patcher");
65
65
 
66
- trigger_check_method = rb_intern("eval_trigger_check");
67
-
68
66
  /* Returns of these 2 patches are discarded.
69
67
  * We're calling the underlying via direct C, instead of
70
68
  * whatever method was there before.
@@ -4,6 +4,9 @@
4
4
  static VALUE assess_patcher;
5
5
 
6
6
  static VALUE rb_sym_assess_patch_eval;
7
+
8
+ /* Contrast::Extension::Assess::EvalTrigger */
9
+ static VALUE module_eval_trigger;
7
10
  static VALUE trigger_check_method;
8
11
 
9
12
  /* c.f. cs__assess_basic_object.c for more context on how eval is patched. */
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "cs__assess_string_interpolation26.h"
5
5
  #include "../cs__common/cs__common.h"
6
- #include <funchook.h>
7
6
  #include <ruby.h>
8
7
 
9
8
  static VALUE rb_str_concat_literals_hook(size_t num, VALUE *strary) {
@@ -14,13 +13,9 @@ static VALUE rb_str_concat_literals_hook(size_t num, VALUE *strary) {
14
13
  }
15
14
 
16
15
  static int install_hooks() {
17
- funchook_t *funchook = funchook_create();
18
-
19
16
  rb_str_concat_literals_original = rb_str_concat_literals;
20
- funchook_prepare(funchook, (void **)&rb_str_concat_literals_original,
21
- rb_str_concat_literals_hook);
17
+ patch_via_funchook(&rb_str_concat_literals_original, &rb_str_concat_literals_hook);
22
18
 
23
- funchook_install(funchook, 0);
24
19
  return 0;
25
20
  }
26
21
 
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "cs__assess_yield_track.h"
5
5
  #include "../cs__common/cs__common.h"
6
- #include <funchook.h>
7
6
  #include <ruby.h>
8
7
 
9
8
  static VALUE rb_yield_hook(VALUE val, const VALUE self) {
@@ -17,11 +16,8 @@ static VALUE rb_yield_hook(VALUE val, const VALUE self) {
17
16
  }
18
17
 
19
18
  static int install_yield_hooks() {
20
- funchook_t *funchook = funchook_create();
21
19
  rb_yield_original = rb_yield;
22
- funchook_prepare(funchook, (void **)&rb_yield_original,
23
- rb_yield_hook);
24
- funchook_install(funchook, 0);
20
+ patch_via_funchook(&rb_yield_original, &rb_yield_hook);
25
21
  return 0;
26
22
  }
27
23
 
@@ -1,4 +1,3 @@
1
- #include <funchook.h>
2
1
  #include <ruby.h>
3
2
 
4
3
  static VALUE split_class;
@@ -3,12 +3,14 @@
3
3
 
4
4
  #include "cs__common.h"
5
5
  #include <ruby.h>
6
+ #include <dlfcn.h>
6
7
 
7
8
  /* Globals */
8
9
  /* These are defined w/ `extern` in the header */
9
10
  VALUE contrast, agent, patching, policy, assess;
10
11
  VALUE core_extensions, core_assess;
11
12
  VALUE assess_policy, assess_propagator;
13
+ VALUE funchook_path;
12
14
 
13
15
  VALUE rb_sym_enter_scope;
14
16
  VALUE rb_sym_exit_scope;
@@ -19,6 +21,28 @@ VALUE rb_sym_method;
19
21
  VALUE rb_sym_cs_tracked;
20
22
  /* end globals */
21
23
 
24
+ void patch_via_funchook(void *original_function, void *hook_function) {
25
+ VALUE funchook_module_wrapper = rb_define_module("Funchook");
26
+ funchook_path = rb_iv_get(funchook_module_wrapper, "@path");
27
+
28
+ void *funchook_lib_handle;
29
+ void *funchook_reference, *(*funchook_create)(void);
30
+ int prepareResult, (*funchook_prepare)(void*, void**, void*);
31
+ int installResult, (*funchook_install)(void*, int);
32
+
33
+ funchook_lib_handle = dlopen(StringValueCStr(funchook_path), RTLD_NOW | RTLD_GLOBAL);
34
+
35
+ /* Load the funchook methods we need */
36
+ funchook_create = (void* (*)(void))dlsym(funchook_lib_handle, "funchook_create");
37
+ funchook_prepare = (int (*)(void*, void**, void*))dlsym(funchook_lib_handle, "funchook_prepare");
38
+ funchook_install = (int (*)(void*, int))dlsym(funchook_lib_handle, "funchook_install");
39
+
40
+ funchook_reference = (void*)(*funchook_create)();
41
+
42
+ prepareResult = (*funchook_prepare)(funchook_reference, (void**)original_function, hook_function);
43
+ installResult = (*funchook_install)(funchook_reference, 0);
44
+ }
45
+
22
46
  void contrast_alias_method(const VALUE target, const char *to,
23
47
  const char *from) {
24
48
  rb_funcall(target, cs__send_method, 3, cs__alias_method_sym,
@@ -134,6 +158,6 @@ void Init_cs__common(void) {
134
158
  assess_policy = rb_define_module_under(assess, "Policy");
135
159
  assess_propagator = rb_define_module_under(assess_policy, "Propagator");
136
160
 
137
- core_extensions = rb_define_module_under(contrast, "CoreExtensions");
161
+ core_extensions = rb_define_module_under(contrast, "Extension");
138
162
  core_assess = rb_define_module_under(core_extensions, "Assess");
139
163
  }
@@ -16,6 +16,7 @@ static VALUE cs__alias_method_sym;
16
16
  extern VALUE contrast, agent, patching, policy, assess;
17
17
  extern VALUE core_extensions, core_assess;
18
18
  extern VALUE assess_policy, assess_propagator;
19
+ extern VALUE funchook_path;
19
20
 
20
21
  extern VALUE rb_sym_enter_scope;
21
22
  extern VALUE rb_sym_exit_scope;
@@ -32,6 +33,8 @@ static VALUE rb_sym_alias_instance;
32
33
  static VALUE rb_sym_alias_singleton;
33
34
  static VALUE rb_sym_prepend;
34
35
 
36
+ void patch_via_funchook(void *original_function, void *hook_function);
37
+
35
38
  void contrast_alias_method(const VALUE target, const char *to,
36
39
  const char *from);
37
40
 
@@ -4,18 +4,4 @@
4
4
  require 'mkmf'
5
5
  require_relative '../../lib/contrast/agent/version'
6
6
 
7
- installed_path = __dir__
8
-
9
- origin = if !(/darwin/ =~ RUBY_PLATFORM).nil?
10
- '@loader_path'
11
- else
12
- '\$${ORIGIN}'
13
- end
14
-
15
- options = " -Wl,-rpath,#{ origin }/../../shared_libraries"
16
-
17
- $LDFLAGS << options if try_link('int main() {return 0;}', options)
18
-
19
- $LIBPATH << installed_path
20
-
21
7
  create_makefile 'cs__common/cs__common'
@@ -20,7 +20,7 @@ static VALUE contrast_protect_fork(const int argc, const VALUE *argv,
20
20
  */
21
21
  VALUE wrapper;
22
22
  wrapper =
23
- rb_funcall_with_block(rb_mKernel, rb_sym_protect_kernel_wrapper, 0,
23
+ rb_funcall_with_block(kernel_protect, rb_sym_protect_kernel_wrapper, 0,
24
24
  NULL, rb_block_proc());
25
25
  rb_funcall(rb_mKernel, rb_intern("public"), 1, ID2SYM(rb_sym_protect_kernel_fork));
26
26
  ret = rb_funcall_with_block(self, rb_sym_protect_kernel_fork, argc,
@@ -33,7 +33,9 @@ static VALUE contrast_protect_fork(const int argc, const VALUE *argv,
33
33
  }
34
34
 
35
35
  void Init_cs__protect_kernel(void) {
36
- rb_sym_protect_kernel_wrapper = rb_intern("cs__protect_build_wrapper");
36
+ VALUE core_protect = rb_define_module_under(core_extensions, "Protect");
37
+ kernel_protect = rb_define_module_under(core_protect, "Kernel");
38
+ rb_sym_protect_kernel_wrapper = rb_intern("build_wrapper");
37
39
 
38
40
  rb_sym_protect_kernel_fork = contrast_register_patch("Kernel",
39
41
  "fork",
@@ -2,6 +2,7 @@
2
2
 
3
3
  extern VALUE rb_vm_top_self(void);
4
4
 
5
+ static VALUE kernel_protect;
5
6
  static VALUE rb_sym_protect_kernel_fork;
6
7
  static VALUE rb_sym_protect_kernel_wrapper;
7
8