newrelic_security 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. data/.github/ISSUE_TEMPLATE/enhancement.md +27 -0
  4. data/.github/actions/simplecov-report/LICENSE +22 -0
  5. data/.github/actions/simplecov-report/README.md +36 -0
  6. data/.github/actions/simplecov-report/__tests__/.keep +0 -0
  7. data/.github/actions/simplecov-report/__tests__/main.test.ts +3 -0
  8. data/.github/actions/simplecov-report/action.yml +25 -0
  9. data/.github/actions/simplecov-report/dist/index.js +10238 -0
  10. data/.github/actions/simplecov-report/dummy_coverage/.last_run.json +5 -0
  11. data/.github/actions/simplecov-report/jest.config.js +11 -0
  12. data/.github/actions/simplecov-report/package.json +51 -0
  13. data/.github/actions/simplecov-report/src/main.ts +54 -0
  14. data/.github/actions/simplecov-report/src/report.ts +28 -0
  15. data/.github/actions/simplecov-report/tsconfig.json +12 -0
  16. data/.github/workflows/pr_ci.yml +77 -0
  17. data/.github/workflows/release.yml +51 -0
  18. data/.github/workflows/repolinter.yml +31 -0
  19. data/.github/workflows/rubocop.yml +17 -0
  20. data/.github/workflows/scripts/rubygems-authenticate.py +13 -0
  21. data/.github/workflows/scripts/rubygems-publish.rb +33 -0
  22. data/.gitignore +72 -0
  23. data/.rubocop.yml +9 -0
  24. data/.rubocop_todo.yml +1414 -0
  25. data/.simplecov +16 -0
  26. data/CHANGELOG.md +69 -0
  27. data/CONTRIBUTING.md +22 -0
  28. data/Gemfile +6 -0
  29. data/Gemfile_test +58 -0
  30. data/LICENSE +43 -0
  31. data/README.md +133 -0
  32. data/README_agent.md +44 -0
  33. data/Rakefile +28 -0
  34. data/THIRD_PARTY_NOTICES.md +36 -0
  35. data/lib/newrelic_security/agent/agent.rb +109 -0
  36. data/lib/newrelic_security/agent/configuration/default_source.rb +8 -0
  37. data/lib/newrelic_security/agent/configuration/environment_source.rb +8 -0
  38. data/lib/newrelic_security/agent/configuration/manager.rb +178 -0
  39. data/lib/newrelic_security/agent/configuration/manual_source.rb +8 -0
  40. data/lib/newrelic_security/agent/configuration/server_source.rb +8 -0
  41. data/lib/newrelic_security/agent/configuration/yaml_source.rb +8 -0
  42. data/lib/newrelic_security/agent/control/app_info.rb +132 -0
  43. data/lib/newrelic_security/agent/control/application_url_mappings.rb +66 -0
  44. data/lib/newrelic_security/agent/control/collector.rb +117 -0
  45. data/lib/newrelic_security/agent/control/control_command.rb +117 -0
  46. data/lib/newrelic_security/agent/control/critical_message.rb +58 -0
  47. data/lib/newrelic_security/agent/control/event.rb +149 -0
  48. data/lib/newrelic_security/agent/control/event_counter.rb +28 -0
  49. data/lib/newrelic_security/agent/control/event_processor.rb +134 -0
  50. data/lib/newrelic_security/agent/control/event_stats.rb +26 -0
  51. data/lib/newrelic_security/agent/control/event_subscriber.rb +28 -0
  52. data/lib/newrelic_security/agent/control/exit_event.rb +38 -0
  53. data/lib/newrelic_security/agent/control/fuzz_request.rb +18 -0
  54. data/lib/newrelic_security/agent/control/grpc_context.rb +57 -0
  55. data/lib/newrelic_security/agent/control/health_check.rb +136 -0
  56. data/lib/newrelic_security/agent/control/http_context.rb +73 -0
  57. data/lib/newrelic_security/agent/control/iast_client.rb +151 -0
  58. data/lib/newrelic_security/agent/control/iast_data_transfer_request.rb +32 -0
  59. data/lib/newrelic_security/agent/control/reflected_xss.rb +258 -0
  60. data/lib/newrelic_security/agent/control/websocket_client.rb +131 -0
  61. data/lib/newrelic_security/agent/logging/init_logger.rb +91 -0
  62. data/lib/newrelic_security/agent/logging/logger.rb +92 -0
  63. data/lib/newrelic_security/agent/logging/null_logger.rb +21 -0
  64. data/lib/newrelic_security/agent/resources/cert.pem +50 -0
  65. data/lib/newrelic_security/agent/utils/agent_utils.rb +219 -0
  66. data/lib/newrelic_security/agent.rb +57 -0
  67. data/lib/newrelic_security/constants.rb +67 -0
  68. data/lib/newrelic_security/instrumentation-security/active_record/mysql2_adapter/chain.rb +70 -0
  69. data/lib/newrelic_security/instrumentation-security/active_record/mysql2_adapter/instrumentation.rb +187 -0
  70. data/lib/newrelic_security/instrumentation-security/active_record/mysql2_adapter/prepend.rb +54 -0
  71. data/lib/newrelic_security/instrumentation-security/active_record/postgresql_adapter/chain.rb +60 -0
  72. data/lib/newrelic_security/instrumentation-security/active_record/postgresql_adapter/instrumentation.rb +143 -0
  73. data/lib/newrelic_security/instrumentation-security/active_record/postgresql_adapter/prepend.rb +48 -0
  74. data/lib/newrelic_security/instrumentation-security/active_record/sqlite3_adapter/chain.rb +72 -0
  75. data/lib/newrelic_security/instrumentation-security/active_record/sqlite3_adapter/instrumentation.rb +187 -0
  76. data/lib/newrelic_security/instrumentation-security/active_record/sqlite3_adapter/prepend.rb +54 -0
  77. data/lib/newrelic_security/instrumentation-security/async-http/chain.rb +21 -0
  78. data/lib/newrelic_security/instrumentation-security/async-http/instrumentation.rb +46 -0
  79. data/lib/newrelic_security/instrumentation-security/async-http/prepend.rb +16 -0
  80. data/lib/newrelic_security/instrumentation-security/curb/chain.rb +26 -0
  81. data/lib/newrelic_security/instrumentation-security/curb/instrumentation.rb +52 -0
  82. data/lib/newrelic_security/instrumentation-security/curb/prepend.rb +18 -0
  83. data/lib/newrelic_security/instrumentation-security/dir/chain.rb +42 -0
  84. data/lib/newrelic_security/instrumentation-security/dir/instrumentation.rb +102 -0
  85. data/lib/newrelic_security/instrumentation-security/dir/prepend.rb +28 -0
  86. data/lib/newrelic_security/instrumentation-security/ethon/chain.rb +53 -0
  87. data/lib/newrelic_security/instrumentation-security/ethon/instrumentation.rb +122 -0
  88. data/lib/newrelic_security/instrumentation-security/ethon/prepend.rb +39 -0
  89. data/lib/newrelic_security/instrumentation-security/excon/chain.rb +23 -0
  90. data/lib/newrelic_security/instrumentation-security/excon/instrumentation.rb +44 -0
  91. data/lib/newrelic_security/instrumentation-security/excon/prepend.rb +17 -0
  92. data/lib/newrelic_security/instrumentation-security/file/chain.rb +34 -0
  93. data/lib/newrelic_security/instrumentation-security/file/instrumentation.rb +62 -0
  94. data/lib/newrelic_security/instrumentation-security/file/prepend.rb +22 -0
  95. data/lib/newrelic_security/instrumentation-security/grape/chain.rb +42 -0
  96. data/lib/newrelic_security/instrumentation-security/grape/instrumentation.rb +56 -0
  97. data/lib/newrelic_security/instrumentation-security/grape/prepend.rb +30 -0
  98. data/lib/newrelic_security/instrumentation-security/grpc/client/chain.rb +47 -0
  99. data/lib/newrelic_security/instrumentation-security/grpc/client/instrumentation.rb +37 -0
  100. data/lib/newrelic_security/instrumentation-security/grpc/client/prepend.rb +36 -0
  101. data/lib/newrelic_security/instrumentation-security/grpc/server/chain.rb +62 -0
  102. data/lib/newrelic_security/instrumentation-security/grpc/server/instrumentation.rb +65 -0
  103. data/lib/newrelic_security/instrumentation-security/grpc/server/prepend.rb +46 -0
  104. data/lib/newrelic_security/instrumentation-security/httpclient/chain.rb +30 -0
  105. data/lib/newrelic_security/instrumentation-security/httpclient/instrumentation.rb +82 -0
  106. data/lib/newrelic_security/instrumentation-security/httpclient/prepend.rb +22 -0
  107. data/lib/newrelic_security/instrumentation-security/httprb/chain.rb +21 -0
  108. data/lib/newrelic_security/instrumentation-security/httprb/instrumentation.rb +44 -0
  109. data/lib/newrelic_security/instrumentation-security/httprb/prepend.rb +16 -0
  110. data/lib/newrelic_security/instrumentation-security/httpx/chain.rb +23 -0
  111. data/lib/newrelic_security/instrumentation-security/httpx/instrumentation.rb +51 -0
  112. data/lib/newrelic_security/instrumentation-security/httpx/prepend.rb +18 -0
  113. data/lib/newrelic_security/instrumentation-security/instrumentation_loader.rb +50 -0
  114. data/lib/newrelic_security/instrumentation-security/instrumentation_utils.rb +165 -0
  115. data/lib/newrelic_security/instrumentation-security/io/chain.rb +113 -0
  116. data/lib/newrelic_security/instrumentation-security/io/instrumentation.rb +300 -0
  117. data/lib/newrelic_security/instrumentation-security/io/prepend.rb +86 -0
  118. data/lib/newrelic_security/instrumentation-security/kernel/chain.rb +65 -0
  119. data/lib/newrelic_security/instrumentation-security/kernel/instrumentation.rb +167 -0
  120. data/lib/newrelic_security/instrumentation-security/kernel/prepend.rb +50 -0
  121. data/lib/newrelic_security/instrumentation-security/mongo/chain.rb +106 -0
  122. data/lib/newrelic_security/instrumentation-security/mongo/instrumentation.rb +273 -0
  123. data/lib/newrelic_security/instrumentation-security/mongo/prepend.rb +77 -0
  124. data/lib/newrelic_security/instrumentation-security/mysql2/chain.rb +53 -0
  125. data/lib/newrelic_security/instrumentation-security/mysql2/instrumentation.rb +84 -0
  126. data/lib/newrelic_security/instrumentation-security/mysql2/prepend.rb +37 -0
  127. data/lib/newrelic_security/instrumentation-security/net_http/chain.rb +21 -0
  128. data/lib/newrelic_security/instrumentation-security/net_http/instrumentation.rb +60 -0
  129. data/lib/newrelic_security/instrumentation-security/net_http/prepend.rb +16 -0
  130. data/lib/newrelic_security/instrumentation-security/net_ldap/chain.rb +21 -0
  131. data/lib/newrelic_security/instrumentation-security/net_ldap/instrumentation.rb +42 -0
  132. data/lib/newrelic_security/instrumentation-security/net_ldap/prepend.rb +16 -0
  133. data/lib/newrelic_security/instrumentation-security/nokogiri/chain.rb +46 -0
  134. data/lib/newrelic_security/instrumentation-security/nokogiri/instrumentation.rb +36 -0
  135. data/lib/newrelic_security/instrumentation-security/nokogiri/prepend.rb +31 -0
  136. data/lib/newrelic_security/instrumentation-security/padrino/chain.rb +26 -0
  137. data/lib/newrelic_security/instrumentation-security/padrino/instrumentation.rb +42 -0
  138. data/lib/newrelic_security/instrumentation-security/padrino/prepend.rb +20 -0
  139. data/lib/newrelic_security/instrumentation-security/patron/chain.rb +23 -0
  140. data/lib/newrelic_security/instrumentation-security/patron/instrumentation.rb +50 -0
  141. data/lib/newrelic_security/instrumentation-security/patron/prepend.rb +18 -0
  142. data/lib/newrelic_security/instrumentation-security/pg/chain.rb +49 -0
  143. data/lib/newrelic_security/instrumentation-security/pg/instrumentation.rb +102 -0
  144. data/lib/newrelic_security/instrumentation-security/pg/prepend.rb +36 -0
  145. data/lib/newrelic_security/instrumentation-security/pty/chain.rb +31 -0
  146. data/lib/newrelic_security/instrumentation-security/pty/instrumentation.rb +52 -0
  147. data/lib/newrelic_security/instrumentation-security/pty/prepend.rb +22 -0
  148. data/lib/newrelic_security/instrumentation-security/rails/chain.rb +46 -0
  149. data/lib/newrelic_security/instrumentation-security/rails/instrumentation.rb +67 -0
  150. data/lib/newrelic_security/instrumentation-security/rails/prepend.rb +33 -0
  151. data/lib/newrelic_security/instrumentation-security/roda/chain.rb +22 -0
  152. data/lib/newrelic_security/instrumentation-security/roda/instrumentation.rb +41 -0
  153. data/lib/newrelic_security/instrumentation-security/roda/prepend.rb +16 -0
  154. data/lib/newrelic_security/instrumentation-security/sinatra/chain.rb +29 -0
  155. data/lib/newrelic_security/instrumentation-security/sinatra/instrumentation.rb +49 -0
  156. data/lib/newrelic_security/instrumentation-security/sinatra/prepend.rb +21 -0
  157. data/lib/newrelic_security/instrumentation-security/sqlite3/chain.rb +79 -0
  158. data/lib/newrelic_security/instrumentation-security/sqlite3/instrumentation.rb +164 -0
  159. data/lib/newrelic_security/instrumentation-security/sqlite3/prepend.rb +56 -0
  160. data/lib/newrelic_security/newrelic-security-api/api.rb +72 -0
  161. data/lib/newrelic_security/version.rb +5 -0
  162. data/lib/newrelic_security/websocket-client-simple/client.rb +128 -0
  163. data/lib/newrelic_security/websocket-client-simple/event_emitter.rb +72 -0
  164. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/error.rb +129 -0
  165. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/exception_handler.rb +32 -0
  166. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/base.rb +62 -0
  167. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/data.rb +49 -0
  168. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler/base.rb +41 -0
  169. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler/handler03.rb +224 -0
  170. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler/handler04.rb +18 -0
  171. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler/handler05.rb +15 -0
  172. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler/handler07.rb +78 -0
  173. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler/handler75.rb +78 -0
  174. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/handler.rb +15 -0
  175. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/incoming/client.rb +17 -0
  176. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/incoming/server.rb +17 -0
  177. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/incoming.rb +52 -0
  178. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/outgoing/client.rb +17 -0
  179. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/outgoing/server.rb +17 -0
  180. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame/outgoing.rb +35 -0
  181. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/frame.rb +11 -0
  182. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/base.rb +142 -0
  183. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/client.rb +130 -0
  184. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/base.rb +49 -0
  185. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/client.rb +32 -0
  186. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/client01.rb +20 -0
  187. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/client04.rb +63 -0
  188. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/client11.rb +22 -0
  189. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/client75.rb +39 -0
  190. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/client76.rb +105 -0
  191. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/server.rb +10 -0
  192. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/server04.rb +56 -0
  193. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/server75.rb +40 -0
  194. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler/server76.rb +75 -0
  195. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/handler.rb +21 -0
  196. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake/server.rb +179 -0
  197. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/handshake.rb +10 -0
  198. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/nice_inspect.rb +12 -0
  199. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket/version.rb +5 -0
  200. data/lib/newrelic_security/websocket-client-simple/websocket-ruby/lib/websocket.rb +50 -0
  201. data/lib/newrelic_security.rb +6 -0
  202. data/lib/tasks/all.rb +8 -0
  203. data/lib/tasks/coverage_report.rake +27 -0
  204. data/newrelic_security.gemspec +51 -0
  205. metadata +342 -0
@@ -0,0 +1,187 @@
1
+ require_relative 'prepend'
2
+ require_relative 'chain'
3
+
4
+ module NewRelic::Security
5
+ module Instrumentation
6
+ module ActiveRecord::ConnectionAdapters::Mysql2Adapter
7
+
8
+ def execute_on_enter(sql, name)
9
+ event = nil
10
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
11
+ hash = {}
12
+ hash[:sql] = sql #sql query
13
+ hash[:parameters] = []
14
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], MYSQL) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
15
+ rescue => exception
16
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
17
+ ensure
18
+ yield
19
+ return event
20
+ end
21
+
22
+ def execute_on_exit(event)
23
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
24
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
25
+ rescue => exception
26
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
27
+ ensure
28
+ yield
29
+ end
30
+
31
+ def exec_query_on_enter(*var, **key_vars)
32
+ event = nil
33
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
34
+ type_casted_binds = []
35
+ binds = var[2] #third arg
36
+ if !binds.nil? && !binds.empty? #if bind params present
37
+ binds.each { |x|
38
+ if x.is_a? Integer or x.is_a? String
39
+ type_casted_binds << x
40
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
41
+ type_casted_binds << x[1].to_s
42
+ else
43
+ type_casted_binds << x.value_before_type_cast.to_s
44
+ end
45
+ }
46
+ # binds_copy = binds.clone #it is a shallow copy
47
+ # type_casted_binds = type_casted_binds(binds_copy.to_s)
48
+ end
49
+ hash = {}
50
+ hash[:sql] = var[0] #sql query
51
+ hash[:parameters] = type_casted_binds #bind params
52
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], MYSQL) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
53
+ rescue => exception
54
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
55
+ ensure
56
+ yield
57
+ return event
58
+ end
59
+
60
+ def exec_query_on_exit(event)
61
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
62
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
63
+ rescue => exception
64
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
65
+ ensure
66
+ yield
67
+ end
68
+
69
+ def exec_insert_on_enter(*var, **key_vars)
70
+ event = nil
71
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
72
+ type_casted_binds = []
73
+ binds = var[2] #third arg
74
+ if !binds.nil? && !binds.empty? #if bind params present
75
+ binds.each { |x|
76
+ if x.is_a? Integer or x.is_a? String
77
+ type_casted_binds << x
78
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
79
+ type_casted_binds << x[1].to_s
80
+ else
81
+ type_casted_binds << x.value_before_type_cast.to_s
82
+ end
83
+ }
84
+ # binds_copy = binds.clone #it is a shallow copy
85
+ # type_casted_binds = type_casted_binds(binds_copy.to_s)
86
+ end
87
+ hash = {}
88
+ hash[:sql] = var[0] #sql query
89
+ hash[:parameters] = type_casted_binds #bind params
90
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], MYSQL) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
91
+ rescue => exception
92
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
93
+ ensure
94
+ yield
95
+ return event
96
+ end
97
+
98
+ def exec_insert_on_exit(event)
99
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
100
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
101
+ rescue => exception
102
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
103
+ ensure
104
+ yield
105
+ end
106
+
107
+ def exec_update_on_enter(*var, **key_vars)
108
+ event = nil
109
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
110
+ type_casted_binds = []
111
+ binds = var[2] #third arg
112
+ if !binds.nil? && !binds.empty? #if bind params present
113
+ binds.each { |x|
114
+ if x.is_a? Integer or x.is_a? String
115
+ type_casted_binds << x
116
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
117
+ type_casted_binds << x[1].to_s
118
+ else
119
+ type_casted_binds << x.value_before_type_cast.to_s
120
+ end
121
+ }
122
+ # binds_copy = binds.clone #it is a shallow copy
123
+ # type_casted_binds = type_casted_binds(binds_copy.to_s)
124
+ end
125
+ hash = {}
126
+ hash[:sql] = var[0] #sql query
127
+ hash[:parameters] = type_casted_binds #bind params
128
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], MYSQL) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
129
+ rescue => exception
130
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
131
+ ensure
132
+ yield
133
+ return event
134
+ end
135
+
136
+ def exec_update_on_exit(event)
137
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
138
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
139
+ rescue => exception
140
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
141
+ ensure
142
+ yield
143
+ end
144
+
145
+ def exec_delete_on_enter(*var, **key_vars)
146
+ event = nil
147
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
148
+ type_casted_binds = []
149
+ binds = var[2] #third arg
150
+ if !binds.nil? && !binds.empty? #if bind params present
151
+ binds.each { |x|
152
+ if x.is_a? Integer or x.is_a? String
153
+ type_casted_binds << x
154
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
155
+ type_casted_binds << x[1].to_s
156
+ else
157
+ type_casted_binds << x.value_before_type_cast.to_s
158
+ end
159
+ }
160
+ # binds_copy = binds.clone #it is a shallow copy
161
+ # type_casted_binds = type_casted_binds(binds_copy.to_s)
162
+ end
163
+ hash = {}
164
+ hash[:sql] = var[0] #sql query
165
+ hash[:parameters] = type_casted_binds #bind params
166
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], MYSQL) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
167
+ rescue => exception
168
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
169
+ ensure
170
+ yield
171
+ return event
172
+ end
173
+
174
+ def exec_delete_on_exit(event)
175
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
176
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
177
+ rescue => exception
178
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
179
+ ensure
180
+ yield
181
+ end
182
+
183
+ end
184
+ end
185
+ end
186
+
187
+ NewRelic::Security::Instrumentation::InstrumentationLoader.install_instrumentation(:mysql2_adapter, ::ActiveRecord::ConnectionAdapters::Mysql2Adapter, ::NewRelic::Security::Instrumentation::ActiveRecord::ConnectionAdapters::Mysql2Adapter)
@@ -0,0 +1,54 @@
1
+ module NewRelic::Security
2
+ module Instrumentation
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module Mysql2Adapter
6
+ module Prepend
7
+ include NewRelic::Security::Instrumentation::ActiveRecord::ConnectionAdapters::Mysql2Adapter
8
+
9
+ if RUBY_ENGINE == 'jruby'
10
+ def execute(sql, name = nil)
11
+ retval = nil
12
+ event = execute_on_enter(sql, name) { retval = super }
13
+ execute_on_exit(event) { return retval }
14
+ end
15
+
16
+ def exec_insert(*var)
17
+ retval = nil
18
+ event = exec_insert_on_enter(*var) { retval = super }
19
+ exec_insert_on_exit(event) { return retval }
20
+ end
21
+
22
+ def exec_update(*var)
23
+ retval = nil
24
+ event = exec_update_on_enter(*var) { retval = super }
25
+ exec_update_on_exit(event) { return retval }
26
+ end
27
+
28
+ if ::Rails.version < '5'
29
+ def exec_query(*var)
30
+ retval = nil
31
+ event = exec_query_on_enter(*var) { retval = super }
32
+ exec_query_on_exit(event) { return retval }
33
+ end
34
+ else
35
+ def exec_query(*var, **key_vars)
36
+ retval = nil
37
+ event = exec_query_on_enter(*var, **key_vars) { retval = super }
38
+ exec_query_on_exit(event) { return retval }
39
+ end
40
+ end
41
+
42
+ def exec_delete(*var)
43
+ retval = nil
44
+ event = exec_delete_on_enter(*var) { retval = super }
45
+ exec_delete_on_exit(event) { return retval }
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,60 @@
1
+ module NewRelic::Security
2
+ module Instrumentation
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module PostgreSQLAdapter
6
+ module Chain
7
+
8
+ def self.instrument!
9
+ ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
10
+ include NewRelic::Security::Instrumentation::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
11
+
12
+ if RUBY_ENGINE == 'jruby'
13
+ alias_method :execute_without_security, :execute
14
+
15
+ def execute(sql, name = nil)
16
+ retval = nil
17
+ event = execute_on_enter(sql, name) { retval = execute_without_security(sql, name) }
18
+ execute_on_exit(event) { return retval }
19
+ end
20
+ end
21
+
22
+ alias_method :exec_query_without_security, :exec_query
23
+
24
+ if ::Rails.version < '5'
25
+ def exec_query(*var)
26
+ retval = nil
27
+ event = exec_query_on_enter(*var) { retval = exec_query_without_security(*var) }
28
+ exec_query_on_exit(event) { return retval }
29
+ end
30
+ else
31
+ def exec_query(*var, **key_vars)
32
+ retval = nil
33
+ event = exec_query_on_enter(*var, **key_vars) { retval = exec_query_without_security(*var, **key_vars) }
34
+ exec_query_on_exit(event) { return retval }
35
+ end
36
+ end
37
+
38
+ alias_method :exec_update_without_security, :exec_update
39
+
40
+ def exec_update(*var) # Also known as exec_update
41
+ retval = nil
42
+ event = exec_update_on_enter(*var) { retval = exec_update_without_security(*var) }
43
+ exec_update_on_exit(event) { return retval }
44
+ end
45
+
46
+ alias_method :exec_delete_without_security, :exec_delete
47
+
48
+ def exec_delete(*var) # Also known as exec_update
49
+ retval = nil
50
+ event = exec_delete_on_enter(*var) { retval = exec_delete_without_security(*var) }
51
+ exec_delete_on_exit(event) { return retval }
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,143 @@
1
+ require_relative 'prepend'
2
+ require_relative 'chain'
3
+
4
+ module NewRelic::Security
5
+ module Instrumentation
6
+ module ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
7
+
8
+ def execute_on_enter(sql, name)
9
+ event = nil
10
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
11
+ hash = {}
12
+ hash[:sql] = sql #sql query
13
+ hash[:parameters] = []
14
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], POSTGRES) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
15
+ rescue => exception
16
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
17
+ ensure
18
+ yield
19
+ return event
20
+ end
21
+
22
+ def execute_on_exit(event)
23
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
24
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
25
+ rescue => exception
26
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
27
+ ensure
28
+ yield
29
+ end
30
+
31
+ def exec_query_on_enter(*var, **key_vars)
32
+ event = nil
33
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
34
+ type_casted_binds = []
35
+ binds = var[2] #third arg
36
+ if !binds.nil? && !binds.empty? #if bind params present
37
+ binds.each { |x|
38
+ if x.is_a? Integer or x.is_a? String
39
+ type_casted_binds << x
40
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
41
+ type_casted_binds << x[1].to_s
42
+ else
43
+ type_casted_binds << x.value_before_type_cast.to_s
44
+ end
45
+ }
46
+ end
47
+ hash = {}
48
+ hash[:sql] = var[0] #sql query
49
+ hash[:parameters] = type_casted_binds #bind params
50
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], POSTGRES) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
51
+ rescue => exception
52
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
53
+ ensure
54
+ yield
55
+ return event
56
+ end
57
+
58
+ def exec_query_on_exit(event)
59
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
60
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
61
+ rescue => exception
62
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
63
+ ensure
64
+ yield
65
+ end
66
+
67
+ def exec_update_on_enter(*var)
68
+ event = nil
69
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
70
+ type_casted_binds = []
71
+ binds = var[2] #third arg
72
+ if !binds.nil? && !binds.empty? #if bind params present
73
+ binds.each { |x|
74
+ if x.is_a? Integer or x.is_a? String
75
+ type_casted_binds << x
76
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
77
+ type_casted_binds << x[1].to_s
78
+ else
79
+ type_casted_binds << x.value_before_type_cast.to_s
80
+ end
81
+ }
82
+ end
83
+ hash = {}
84
+ hash[:sql] = var[0] #sql query
85
+ hash[:parameters] = type_casted_binds #bind params
86
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], POSTGRES) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
87
+ rescue => exception
88
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
89
+ ensure
90
+ yield
91
+ return event
92
+ end
93
+
94
+ def exec_update_on_exit(event)
95
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
96
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
97
+ rescue => exception
98
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
99
+ ensure
100
+ yield
101
+ end
102
+
103
+ def exec_delete_on_enter(*var)
104
+ event = nil
105
+ NewRelic::Security::Agent.logger.debug "OnEnter : #{self.class}.#{__method__}"
106
+ type_casted_binds = []
107
+ binds = var[2] #third arg
108
+ if !binds.nil? && !binds.empty? #if bind params present
109
+ binds.each { |x|
110
+ if x.is_a? Integer or x.is_a? String
111
+ type_casted_binds << x
112
+ elsif x.is_a? Array and x[0].is_a? ::ActiveRecord::ConnectionAdapters::Column
113
+ type_casted_binds << x[1].to_s
114
+ else
115
+ type_casted_binds << x.value_before_type_cast.to_s
116
+ end
117
+ }
118
+ end
119
+ hash = {}
120
+ hash[:sql] = var[0] #sql query
121
+ hash[:parameters] = type_casted_binds #bind params
122
+ event = NewRelic::Security::Agent::Control::Collector.collect(SQL_DB_COMMAND, [hash], POSTGRES) unless NewRelic::Security::Instrumentation::InstrumentationUtils.sql_filter_events?(hash[:sql])
123
+ rescue => exception
124
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
125
+ ensure
126
+ yield
127
+ return event
128
+ end
129
+
130
+ def exec_delete_on_exit(event)
131
+ NewRelic::Security::Agent.logger.debug "OnExit : #{self.class}.#{__method__}"
132
+ NewRelic::Security::Agent::Utils.create_exit_event(event)
133
+ rescue => exception
134
+ NewRelic::Security::Agent.logger.error "Exception in hook in #{self.class}.#{__method__}, #{exception.inspect}, #{exception.backtrace}"
135
+ ensure
136
+ yield
137
+ end
138
+
139
+ end
140
+ end
141
+ end
142
+
143
+ NewRelic::Security::Instrumentation::InstrumentationLoader.install_instrumentation(:postgresql_adapter, ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter, ::NewRelic::Security::Instrumentation::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
@@ -0,0 +1,48 @@
1
+ module NewRelic::Security
2
+ module Instrumentation
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module PostgreSQLAdapter
6
+ module Prepend
7
+ include NewRelic::Security::Instrumentation::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
8
+
9
+ if RUBY_ENGINE == 'jruby'
10
+ def execute(sql, name = nil)
11
+ retval = nil
12
+ event = execute_on_enter(sql, name) { retval = super }
13
+ execute_on_exit(event) { return retval }
14
+ end
15
+ end
16
+
17
+ if ::Rails.version < '5'
18
+ def exec_query(*var)
19
+ retval = nil
20
+ event = exec_query_on_enter(*var) { retval = super }
21
+ exec_query_on_exit(event) { return retval }
22
+ end
23
+ else
24
+ def exec_query(*var, **key_vars)
25
+ retval = nil
26
+ event = exec_query_on_enter(*var, **key_vars) { retval = super }
27
+ exec_query_on_exit(event) { return retval }
28
+ end
29
+ end
30
+
31
+ def exec_update(*var) # Also known as exec_update
32
+ retval = nil
33
+ event = exec_update_on_enter(*var) { retval = super }
34
+ exec_update_on_exit(event) { return retval }
35
+ end
36
+
37
+ def exec_delete(*var) # Also known as exec_update
38
+ retval = nil
39
+ event = exec_delete_on_enter(*var) { retval = super }
40
+ exec_delete_on_exit(event) { return retval }
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,72 @@
1
+ module NewRelic::Security
2
+ module Instrumentation
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module SQLite3Adapter
6
+ module Chain
7
+
8
+ def self.instrument!
9
+ ::ActiveRecord::ConnectionAdapters::SQLite3Adapter.class_eval do
10
+ include NewRelic::Security::Instrumentation::ActiveRecord::ConnectionAdapters::SQLite3Adapter
11
+
12
+ if RUBY_ENGINE == 'jruby'
13
+ alias_method :execute_without_security, :execute
14
+
15
+ def execute(sql, name = nil)
16
+ retval = nil
17
+ event = execute_on_enter(sql, name) { retval = execute_without_security(sql, name) }
18
+ execute_on_exit(event) { return retval }
19
+ end
20
+
21
+ alias_method :exec_update_without_security, :exec_update
22
+
23
+ def exec_update(*var)
24
+ retval = nil
25
+ event = exec_update_on_enter(*var) { retval = exec_update_without_security(*var) }
26
+ exec_update_on_exit(event) { return retval }
27
+ end
28
+
29
+ alias_method :exec_delete_without_security, :exec_delete
30
+
31
+ def exec_delete(*var)
32
+ retval = nil
33
+ event = exec_delete_on_enter(*var) { retval = exec_delete_without_security(*var) }
34
+ exec_delete_on_exit(event) { return retval }
35
+ end
36
+ end
37
+
38
+ alias_method :exec_query_without_security, :exec_query
39
+
40
+ if ::Rails.version < '5'
41
+ def exec_query(*var)
42
+ retval = nil
43
+ event = exec_query_on_enter(*var) { retval = exec_query_without_security(*var) }
44
+ exec_query_on_exit(event) { return retval }
45
+ end
46
+ else
47
+ def exec_query(*var, **key_vars)
48
+ retval = nil
49
+ event = exec_query_on_enter(*var, **key_vars) { retval = exec_query_without_security(*var, **key_vars) }
50
+ exec_query_on_exit(event) { return retval }
51
+ end
52
+
53
+ if self.instance_methods.include?(:internal_exec_query)
54
+ alias_method :internal_exec_query_without_security, :internal_exec_query
55
+
56
+ def internal_exec_query(*var, **key_vars)
57
+ retval = nil
58
+ event = internal_exec_query_on_enter(*var, **key_vars) { retval = internal_exec_query_without_security(*var, **key_vars) }
59
+ internal_exec_query_on_exit(event) { return retval }
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end