aikido-zen 1.0.2-aarch64-linux

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 (125) hide show
  1. checksums.yaml +7 -0
  2. data/.aikido +6 -0
  3. data/.ruby-version +1 -0
  4. data/.simplecov +32 -0
  5. data/.standard.yml +3 -0
  6. data/LICENSE +674 -0
  7. data/README.md +148 -0
  8. data/Rakefile +67 -0
  9. data/benchmarks/README.md +22 -0
  10. data/benchmarks/rails7.1_benchmark.js +1 -0
  11. data/benchmarks/rails7.1_sql_injection.js +102 -0
  12. data/docs/banner.svg +202 -0
  13. data/docs/config.md +133 -0
  14. data/docs/proxy.md +10 -0
  15. data/docs/rails.md +112 -0
  16. data/docs/troubleshooting.md +62 -0
  17. data/lib/aikido/zen/actor.rb +146 -0
  18. data/lib/aikido/zen/agent/heartbeats_manager.rb +66 -0
  19. data/lib/aikido/zen/agent.rb +181 -0
  20. data/lib/aikido/zen/api_client.rb +145 -0
  21. data/lib/aikido/zen/attack.rb +217 -0
  22. data/lib/aikido/zen/attack_wave/helpers.rb +457 -0
  23. data/lib/aikido/zen/attack_wave.rb +88 -0
  24. data/lib/aikido/zen/background_worker.rb +52 -0
  25. data/lib/aikido/zen/cache.rb +91 -0
  26. data/lib/aikido/zen/capped_collections.rb +86 -0
  27. data/lib/aikido/zen/collector/event.rb +238 -0
  28. data/lib/aikido/zen/collector/hosts.rb +30 -0
  29. data/lib/aikido/zen/collector/routes.rb +71 -0
  30. data/lib/aikido/zen/collector/sink_stats.rb +95 -0
  31. data/lib/aikido/zen/collector/stats.rb +122 -0
  32. data/lib/aikido/zen/collector/users.rb +32 -0
  33. data/lib/aikido/zen/collector.rb +223 -0
  34. data/lib/aikido/zen/config.rb +312 -0
  35. data/lib/aikido/zen/context/rack_request.rb +27 -0
  36. data/lib/aikido/zen/context/rails_request.rb +47 -0
  37. data/lib/aikido/zen/context.rb +145 -0
  38. data/lib/aikido/zen/detached_agent/agent.rb +79 -0
  39. data/lib/aikido/zen/detached_agent/front_object.rb +41 -0
  40. data/lib/aikido/zen/detached_agent/server.rb +78 -0
  41. data/lib/aikido/zen/detached_agent.rb +2 -0
  42. data/lib/aikido/zen/errors.rb +107 -0
  43. data/lib/aikido/zen/event.rb +116 -0
  44. data/lib/aikido/zen/helpers.rb +24 -0
  45. data/lib/aikido/zen/internals.rb +123 -0
  46. data/lib/aikido/zen/libzen-v0.1.48-aarch64-linux.so +0 -0
  47. data/lib/aikido/zen/middleware/allowed_address_checker.rb +26 -0
  48. data/lib/aikido/zen/middleware/attack_wave_protector.rb +46 -0
  49. data/lib/aikido/zen/middleware/context_setter.rb +26 -0
  50. data/lib/aikido/zen/middleware/fork_detector.rb +23 -0
  51. data/lib/aikido/zen/middleware/middleware.rb +11 -0
  52. data/lib/aikido/zen/middleware/rack_throttler.rb +50 -0
  53. data/lib/aikido/zen/middleware/request_tracker.rb +197 -0
  54. data/lib/aikido/zen/outbound_connection.rb +62 -0
  55. data/lib/aikido/zen/outbound_connection_monitor.rb +23 -0
  56. data/lib/aikido/zen/package.rb +22 -0
  57. data/lib/aikido/zen/payload.rb +50 -0
  58. data/lib/aikido/zen/rails_engine.rb +53 -0
  59. data/lib/aikido/zen/rate_limiter/breaker.rb +61 -0
  60. data/lib/aikido/zen/rate_limiter/bucket.rb +76 -0
  61. data/lib/aikido/zen/rate_limiter/result.rb +31 -0
  62. data/lib/aikido/zen/rate_limiter.rb +50 -0
  63. data/lib/aikido/zen/request/heuristic_router.rb +115 -0
  64. data/lib/aikido/zen/request/rails_router.rb +92 -0
  65. data/lib/aikido/zen/request/schema/auth_discovery.rb +86 -0
  66. data/lib/aikido/zen/request/schema/auth_schemas.rb +54 -0
  67. data/lib/aikido/zen/request/schema/builder.rb +121 -0
  68. data/lib/aikido/zen/request/schema/definition.rb +107 -0
  69. data/lib/aikido/zen/request/schema/empty_schema.rb +28 -0
  70. data/lib/aikido/zen/request/schema.rb +87 -0
  71. data/lib/aikido/zen/request.rb +88 -0
  72. data/lib/aikido/zen/route.rb +96 -0
  73. data/lib/aikido/zen/runtime_settings/endpoints.rb +78 -0
  74. data/lib/aikido/zen/runtime_settings/ip_set.rb +36 -0
  75. data/lib/aikido/zen/runtime_settings/protection_settings.rb +62 -0
  76. data/lib/aikido/zen/runtime_settings/rate_limit_settings.rb +47 -0
  77. data/lib/aikido/zen/runtime_settings.rb +66 -0
  78. data/lib/aikido/zen/scan.rb +75 -0
  79. data/lib/aikido/zen/scanners/path_traversal/helpers.rb +68 -0
  80. data/lib/aikido/zen/scanners/path_traversal_scanner.rb +64 -0
  81. data/lib/aikido/zen/scanners/shell_injection/helpers.rb +159 -0
  82. data/lib/aikido/zen/scanners/shell_injection_scanner.rb +65 -0
  83. data/lib/aikido/zen/scanners/sql_injection_scanner.rb +94 -0
  84. data/lib/aikido/zen/scanners/ssrf/dns_lookups.rb +27 -0
  85. data/lib/aikido/zen/scanners/ssrf/private_ip_checker.rb +97 -0
  86. data/lib/aikido/zen/scanners/ssrf_scanner.rb +266 -0
  87. data/lib/aikido/zen/scanners/stored_ssrf_scanner.rb +55 -0
  88. data/lib/aikido/zen/scanners.rb +7 -0
  89. data/lib/aikido/zen/sink.rb +118 -0
  90. data/lib/aikido/zen/sinks/action_controller.rb +85 -0
  91. data/lib/aikido/zen/sinks/async_http.rb +80 -0
  92. data/lib/aikido/zen/sinks/curb.rb +113 -0
  93. data/lib/aikido/zen/sinks/em_http.rb +83 -0
  94. data/lib/aikido/zen/sinks/excon.rb +118 -0
  95. data/lib/aikido/zen/sinks/file.rb +153 -0
  96. data/lib/aikido/zen/sinks/http.rb +93 -0
  97. data/lib/aikido/zen/sinks/httpclient.rb +95 -0
  98. data/lib/aikido/zen/sinks/httpx.rb +78 -0
  99. data/lib/aikido/zen/sinks/kernel.rb +33 -0
  100. data/lib/aikido/zen/sinks/mysql2.rb +31 -0
  101. data/lib/aikido/zen/sinks/net_http.rb +101 -0
  102. data/lib/aikido/zen/sinks/patron.rb +103 -0
  103. data/lib/aikido/zen/sinks/pg.rb +72 -0
  104. data/lib/aikido/zen/sinks/resolv.rb +62 -0
  105. data/lib/aikido/zen/sinks/socket.rb +85 -0
  106. data/lib/aikido/zen/sinks/sqlite3.rb +46 -0
  107. data/lib/aikido/zen/sinks/trilogy.rb +31 -0
  108. data/lib/aikido/zen/sinks/typhoeus.rb +78 -0
  109. data/lib/aikido/zen/sinks.rb +36 -0
  110. data/lib/aikido/zen/sinks_dsl.rb +250 -0
  111. data/lib/aikido/zen/synchronizable.rb +24 -0
  112. data/lib/aikido/zen/system_info.rb +80 -0
  113. data/lib/aikido/zen/version.rb +10 -0
  114. data/lib/aikido/zen/worker.rb +87 -0
  115. data/lib/aikido/zen.rb +303 -0
  116. data/lib/aikido-zen.rb +3 -0
  117. data/placeholder/.gitignore +4 -0
  118. data/placeholder/README.md +11 -0
  119. data/placeholder/Rakefile +75 -0
  120. data/placeholder/lib/placeholder.rb.template +3 -0
  121. data/placeholder/placeholder.gemspec.template +20 -0
  122. data/tasklib/bench.rake +94 -0
  123. data/tasklib/libzen.rake +133 -0
  124. data/tasklib/wrk.rb +88 -0
  125. metadata +214 -0
@@ -0,0 +1,217 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aikido::Zen
4
+ # Attack objects gather information about a type of detected attack.
5
+ # They can be used in a few ways, like for reporting an attack event
6
+ # to the Aikido server, or can be raised as errors to block requests
7
+ # if blocking_mode is on.
8
+ class Attack
9
+ attr_reader :context
10
+ attr_reader :operation
11
+ attr_accessor :sink
12
+
13
+ def initialize(context:, sink:, operation:, stack: nil)
14
+ @context = context
15
+ @operation = operation
16
+ @sink = sink
17
+ @stack = stack
18
+ @blocked = false
19
+ end
20
+
21
+ def will_be_blocked!
22
+ @blocked = true
23
+ end
24
+
25
+ def blocked?
26
+ @blocked
27
+ end
28
+
29
+ def humanized_name
30
+ raise NotImplementedError, "implement in subclasses"
31
+ end
32
+
33
+ def kind
34
+ raise NotImplementedError, "implement in subclasses"
35
+ end
36
+
37
+ def input
38
+ raise NotImplementedError, "implement in subclasses"
39
+ end
40
+
41
+ def metadata
42
+ raise NotImplementedError, "implement in subclasses"
43
+ end
44
+
45
+ def as_json
46
+ {
47
+ kind: kind,
48
+ blocked: blocked?,
49
+ metadata: metadata,
50
+ operation: @operation,
51
+ stack: @stack
52
+ }.compact.merge(input.as_json)
53
+ end
54
+
55
+ def exception(*)
56
+ raise NotImplementedError, "implement in subclasses"
57
+ end
58
+ end
59
+
60
+ module Attacks
61
+ class PathTraversalAttack < Attack
62
+ attr_reader :input
63
+ attr_reader :filepath
64
+
65
+ def initialize(input:, filepath:, **opts)
66
+ super(**opts)
67
+ @input = input
68
+ @filepath = filepath
69
+ end
70
+
71
+ def metadata
72
+ {
73
+ filename: filepath
74
+ }
75
+ end
76
+
77
+ def humanized_name
78
+ "path traversal attack"
79
+ end
80
+
81
+ def kind
82
+ "path_traversal"
83
+ end
84
+
85
+ def exception(*)
86
+ PathTraversalError.new(self)
87
+ end
88
+ end
89
+
90
+ class ShellInjectionAttack < Attack
91
+ attr_reader :input
92
+ attr_reader :command
93
+
94
+ def initialize(input:, command:, **opts)
95
+ super(**opts)
96
+ @input = input
97
+ @command = command
98
+ end
99
+
100
+ def humanized_name
101
+ "shell injection"
102
+ end
103
+
104
+ def kind
105
+ "shell_injection"
106
+ end
107
+
108
+ def metadata
109
+ {
110
+ command: @command
111
+ }
112
+ end
113
+
114
+ def exception(*)
115
+ ShellInjectionError.new(self)
116
+ end
117
+ end
118
+
119
+ class SQLInjectionAttack < Attack
120
+ attr_reader :query
121
+ attr_reader :input
122
+ attr_reader :dialect
123
+
124
+ def initialize(query:, input:, dialect:, **opts)
125
+ super(**opts)
126
+ @query = query
127
+ @input = input
128
+ @dialect = dialect
129
+ end
130
+
131
+ def humanized_name
132
+ "SQL injection"
133
+ end
134
+
135
+ def kind
136
+ "sql_injection"
137
+ end
138
+
139
+ def metadata
140
+ {
141
+ sql: @query,
142
+ dialect: @dialect.name
143
+ }
144
+ end
145
+
146
+ def exception(*)
147
+ SQLInjectionError.new(self)
148
+ end
149
+ end
150
+
151
+ class SSRFAttack < Attack
152
+ attr_reader :input
153
+ attr_reader :request
154
+
155
+ def initialize(request:, input:, **opts)
156
+ super(**opts)
157
+ @input = input
158
+ @request = request
159
+ end
160
+
161
+ def humanized_name
162
+ "server-side request forgery"
163
+ end
164
+
165
+ def kind
166
+ "ssrf"
167
+ end
168
+
169
+ def exception(*)
170
+ SSRFDetectedError.new(self)
171
+ end
172
+
173
+ def metadata
174
+ {
175
+ hostname: @request.uri.hostname,
176
+ port: @request.uri.port.to_s
177
+ }
178
+ end
179
+ end
180
+
181
+ # Special case of an SSRF attack where we don't have a context—we're just
182
+ # detecting a request to a particularly sensitive address.
183
+ class StoredSSRFAttack < Attack
184
+ attr_reader :hostname
185
+ attr_reader :address
186
+
187
+ def initialize(hostname:, address:, **opts)
188
+ super(**opts)
189
+ @hostname = hostname
190
+ @address = address
191
+ end
192
+
193
+ def humanized_name
194
+ "server-side request forgery"
195
+ end
196
+
197
+ def exception(*)
198
+ SSRFDetectedError.new(self)
199
+ end
200
+
201
+ def kind
202
+ "stored_ssrf"
203
+ end
204
+
205
+ def input
206
+ Aikido::Zen::Payload::UNKNOWN_PAYLOAD
207
+ end
208
+
209
+ def metadata
210
+ {
211
+ hostname: @hostname,
212
+ privateIP: @address
213
+ }
214
+ end
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,457 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aikido::Zen
4
+ module AttackWave
5
+ module Helpers
6
+ def self.web_scanner?(context)
7
+ return true if suspicious_request?(context)
8
+
9
+ return true if include_suspicious_payload?(context)
10
+
11
+ false
12
+ end
13
+
14
+ def self.suspicious_request?(context)
15
+ request = context.request
16
+
17
+ suspicious_method?(request.request_method) || suspicious_path?(request.path_info)
18
+ end
19
+
20
+ def self.suspicious_method?(method)
21
+ SUSPICIOUS_METHODS.include?(method.downcase)
22
+ end
23
+
24
+ def self.suspicious_path?(path)
25
+ path_parts = path.downcase.split("/")
26
+
27
+ file_name = path_parts.pop if path_parts.length > 0
28
+
29
+ if file_name
30
+ return true if SUSPICIOUS_FILE_NAMES.include?(file_name)
31
+
32
+ file_name_parts = file_name.split(".")
33
+
34
+ file_extension = file_name_parts.pop if file_name_parts.length > 1
35
+
36
+ return true if SUSPICIOUS_FILE_EXTENSIONS.include?(file_extension)
37
+ end
38
+
39
+ path_parts.any? do |directory_name|
40
+ SUSPICIOUS_DIRECTORY_NAMES.include?(directory_name)
41
+ end
42
+ end
43
+
44
+ def self.include_suspicious_payload?(context)
45
+ context.payloads.each do |payload|
46
+ next unless payload.source == :query
47
+
48
+ value = payload.value.downcase
49
+
50
+ length = value.length
51
+
52
+ next if length < 5 || length > 1_000
53
+
54
+ return true if SUSPICIOUS_SQL_KEYWORDS.any? do |keyword|
55
+ value.include?(keyword)
56
+ end
57
+ end
58
+
59
+ false
60
+ end
61
+
62
+ SUSPICIOUS_METHODS = [
63
+ "BADMETHOD",
64
+ "BADHTTPMETHOD",
65
+ "BADDATA",
66
+ "BADMTHD",
67
+ "BDMTHD"
68
+ ].map(&:downcase).freeze
69
+
70
+ SUSPICIOUS_DIRECTORY_NAMES = [
71
+ ".",
72
+ "..",
73
+ ".anydesk",
74
+ ".aptitude",
75
+ ".aws",
76
+ ".azure",
77
+ ".cache",
78
+ ".circleci",
79
+ ".config",
80
+ ".dbus",
81
+ ".docker",
82
+ ".drush",
83
+ ".TODO: gem",
84
+ ".git",
85
+ ".github",
86
+ ".gnupg",
87
+ ".gsutil",
88
+ ".hg",
89
+ ".idea",
90
+ ".java",
91
+ ".kube",
92
+ ".lftp",
93
+ ".minikube",
94
+ ".npm",
95
+ ".nvm",
96
+ ".pki",
97
+ ".snap",
98
+ ".ssh",
99
+ ".subversion",
100
+ ".svn",
101
+ ".tconn",
102
+ ".thunderbird",
103
+ ".tor",
104
+ ".vagrant.d",
105
+ ".vidalia",
106
+ ".vim",
107
+ ".vmware",
108
+ ".vscode",
109
+ "apache",
110
+ "apache2",
111
+ "grub",
112
+ "System32",
113
+ "tmp",
114
+ "xampp",
115
+ "cgi-bin",
116
+ "%systemroot%"
117
+ ].map(&:downcase).freeze
118
+
119
+ SUSPICIOUS_FILE_NAMES = [
120
+ ".addressbook",
121
+ ".atom",
122
+ ".bashrc",
123
+ ".boto",
124
+ ".config",
125
+ ".config.json",
126
+ ".config.xml",
127
+ ".config.yaml",
128
+ ".config.yml",
129
+ ".envrc",
130
+ ".eslintignore",
131
+ ".fbcindex",
132
+ ".forward",
133
+ ".gitattributes",
134
+ ".gitconfig",
135
+ ".gitignore",
136
+ ".gitkeep",
137
+ ".gitlab-ci.yaml",
138
+ ".gitlab-ci.yml",
139
+ ".gitmodules",
140
+ ".google_authenticator",
141
+ ".hgignore",
142
+ ".htaccess",
143
+ ".htpasswd",
144
+ ".htdigest",
145
+ ".ksh_history",
146
+ ".lesshst",
147
+ ".lhistory",
148
+ ".lighttpdpassword",
149
+ ".lldb-history",
150
+ ".lynx_cookies",
151
+ ".my.cnf",
152
+ ".mysql_history",
153
+ ".nano_history",
154
+ ".netrc",
155
+ ".node_repl_history",
156
+ ".npmrc",
157
+ ".nsconfig",
158
+ ".nsr",
159
+ ".password-store",
160
+ ".pearrc",
161
+ ".pgpass",
162
+ ".php_history",
163
+ ".pinerc",
164
+ ".proclog",
165
+ ".procmailrc",
166
+ ".profile",
167
+ ".psql_history",
168
+ ".python_history",
169
+ ".rediscli_history",
170
+ ".rhosts",
171
+ ".selected_editor",
172
+ ".sh_history",
173
+ ".sqlite_history",
174
+ ".svnignore",
175
+ ".tcshrc",
176
+ ".tmux.conf",
177
+ ".travis.yaml",
178
+ ".travis.yml",
179
+ ".viminfo",
180
+ ".vimrc",
181
+ ".www_acl",
182
+ ".wwwacl",
183
+ ".xauthority",
184
+ ".yarnrc",
185
+ ".zhistory",
186
+ ".zsh_history",
187
+ ".zshenv",
188
+ ".zshrc",
189
+ "Dockerfile",
190
+ "aws-key.yaml",
191
+ "aws-key.yml",
192
+ "aws.yaml",
193
+ "aws.yml",
194
+ "docker-compose.yaml",
195
+ "docker-compose.yml",
196
+ "npm-shrinkwrap.json",
197
+ "package-lock.json",
198
+ "package.json",
199
+ "phpinfo.php",
200
+ "wp-config.php",
201
+ "wp-config.php3",
202
+ "wp-config.php4",
203
+ "wp-config.php5",
204
+ "wp-config.phtml",
205
+ "composer.json",
206
+ "composer.lock",
207
+ "composer.phar",
208
+ "yarn.lock",
209
+ ".env.local",
210
+ ".env.development",
211
+ ".env.test",
212
+ ".env.production",
213
+ ".env.prod",
214
+ ".env.dev",
215
+ ".env.example",
216
+ "php.ini",
217
+ "wp-settings.php",
218
+ "config.asp",
219
+ "config_dev.asp",
220
+ "config-dev.asp",
221
+ "config.dev.asp",
222
+ "config_prod.asp",
223
+ "config-prod.asp",
224
+ "config.prod.asp",
225
+ "config.sample.asp",
226
+ "config-sample.asp",
227
+ "config_sample.asp",
228
+ "config_test.asp",
229
+ "config-test.asp",
230
+ "config.test.asp",
231
+ "config.ini",
232
+ "config_dev.ini",
233
+ "config-dev.ini",
234
+ "config.dev.ini",
235
+ "config_prod.ini",
236
+ "config-prod.ini",
237
+ "config.prod.ini",
238
+ "config.sample.ini",
239
+ "config-sample.ini",
240
+ "config_sample.ini",
241
+ "config_test.ini",
242
+ "config-test.ini",
243
+ "config.test.ini",
244
+ "config.json",
245
+ "config_dev.json",
246
+ "config-dev.json",
247
+ "config.dev.json",
248
+ "config_prod.json",
249
+ "config-prod.json",
250
+ "config.prod.json",
251
+ "config.sample.json",
252
+ "config-sample.json",
253
+ "config_sample.json",
254
+ "config_test.json",
255
+ "config-test.json",
256
+ "config.test.json",
257
+ "config.php",
258
+ "config_dev.php",
259
+ "config-dev.php",
260
+ "config.dev.php",
261
+ "config_prod.php",
262
+ "config-prod.php",
263
+ "config.prod.php",
264
+ "config.sample.php",
265
+ "config-sample.php",
266
+ "config_sample.php",
267
+ "config_test.php",
268
+ "config-test.php",
269
+ "config.test.php",
270
+ "config.pl",
271
+ "config_dev.pl",
272
+ "config-dev.pl",
273
+ "config.dev.pl",
274
+ "config_prod.pl",
275
+ "config-prod.pl",
276
+ "config.prod.pl",
277
+ "config.sample.pl",
278
+ "config-sample.pl",
279
+ "config_sample.pl",
280
+ "config_test.pl",
281
+ "config-test.pl",
282
+ "config.test.pl",
283
+ "config.py",
284
+ "config_dev.py",
285
+ "config-dev.py",
286
+ "config.dev.py",
287
+ "config_prod.py",
288
+ "config-prod.py",
289
+ "config.prod.py",
290
+ "config.sample.py",
291
+ "config-sample.py",
292
+ "config_sample.py",
293
+ "config_test.py",
294
+ "config-test.py",
295
+ "config.test.py",
296
+ "config.rb",
297
+ "config_dev.rb",
298
+ "config-dev.rb",
299
+ "config.dev.rb",
300
+ "config_prod.rb",
301
+ "config-prod.rb",
302
+ "config.prod.rb",
303
+ "config.sample.rb",
304
+ "config-sample.rb",
305
+ "config_sample.rb",
306
+ "config_test.rb",
307
+ "config-test.rb",
308
+ "config.test.rb",
309
+ "config.toml",
310
+ "config_dev.toml",
311
+ "config-dev.toml",
312
+ "config.dev.toml",
313
+ "config_prod.toml",
314
+ "config-prod.toml",
315
+ "config.prod.toml",
316
+ "config.sample.toml",
317
+ "config-sample.toml",
318
+ "config_sample.toml",
319
+ "config_test.toml",
320
+ "config-test.toml",
321
+ "config.test.toml",
322
+ "config.txt",
323
+ "config_dev.txt",
324
+ "config-dev.txt",
325
+ "config.dev.txt",
326
+ "config_prod.txt",
327
+ "config-prod.txt",
328
+ "config.prod.txt",
329
+ "config.sample.txt",
330
+ "config-sample.txt",
331
+ "config_sample.txt",
332
+ "config_test.txt",
333
+ "config-test.txt",
334
+ "config.test.txt",
335
+ "config.xml",
336
+ "config_dev.xml",
337
+ "config-dev.xml",
338
+ "config.dev.xml",
339
+ "config_prod.xml",
340
+ "config-prod.xml",
341
+ "config.prod.xml",
342
+ "config.sample.xml",
343
+ "config-sample.xml",
344
+ "config_sample.xml",
345
+ "config_test.xml",
346
+ "config-test.xml",
347
+ "config.test.xml",
348
+ "config.yaml",
349
+ "config_dev.yaml",
350
+ "config-dev.yaml",
351
+ "config.dev.yaml",
352
+ "config_prod.yaml",
353
+ "config-prod.yaml",
354
+ "config.prod.yaml",
355
+ "config.sample.yaml",
356
+ "config-sample.yaml",
357
+ "config_sample.yaml",
358
+ "config_test.yaml",
359
+ "config-test.yaml",
360
+ "config.test.yaml",
361
+ "config.yml",
362
+ "config_dev.yml",
363
+ "config-dev.yml",
364
+ "config.dev.yml",
365
+ "config_prod.yml",
366
+ "config-prod.yml",
367
+ "config.prod.yml",
368
+ "config.sample.yml",
369
+ "config-sample.yml",
370
+ "config_sample.yml",
371
+ "config_test.yml",
372
+ "config-test.yml",
373
+ "config.test.yml",
374
+ "boot.ini",
375
+ "gruntfile.js",
376
+ "localsettings.php",
377
+ "my.ini",
378
+ "npm-debug.log",
379
+ "parameters.yml",
380
+ "parameters.yaml",
381
+ "services.yml",
382
+ "services.yaml",
383
+ "web.config",
384
+ "webpack.config.js",
385
+ "config.old",
386
+ "config.inc.php",
387
+ "error.log",
388
+ "access.log",
389
+ ".DS_Store",
390
+ "passwd",
391
+ "win.ini",
392
+ "cmd.exe",
393
+ "my.cnf",
394
+ ".bash_history",
395
+ "docker-compose-dev.yml",
396
+ "docker-compose.override.yml",
397
+ "docker-compose.dev.yml",
398
+ "Cargo.lock",
399
+ "secrets.yml",
400
+ "secrets.yaml",
401
+ "docker-compose.staging.yml",
402
+ "docker-compose.production.yml",
403
+ "yaws-key.pem",
404
+ "mysql_config.ini",
405
+ "firewall.log",
406
+ "log4j.properties",
407
+ "serviceAccountCredentials.json",
408
+ "haproxy.cfg",
409
+ "service-account-credentials.json",
410
+ "vpn.log",
411
+ "system.log",
412
+ "webuser-auth.xml",
413
+ "fastcgi.conf",
414
+ "smb.conf",
415
+ "iis.log",
416
+ "pom.xml",
417
+ "openapi.json",
418
+ "vim_settings.xml",
419
+ "winscp.ini",
420
+ "ws_ftp.ini"
421
+ ].map(&:downcase).freeze
422
+
423
+ SUSPICIOUS_FILE_EXTENSIONS = [
424
+ "env",
425
+ "bak",
426
+ "sql",
427
+ "sqlite",
428
+ "sqlite3",
429
+ "db",
430
+ "old",
431
+ "save",
432
+ "orig",
433
+ "sqlitedb",
434
+ "sqlite3db"
435
+ ].map(&:downcase).freeze
436
+
437
+ SUSPICIOUS_SQL_KEYWORDS = [
438
+ "SELECT (CASE WHEN",
439
+ "SELECT COUNT(",
440
+ "SLEEP(",
441
+ "WAITFOR DELAY",
442
+ "SELECT LIKE(CHAR(",
443
+ "INFORMATION_SCHEMA.COLUMNS",
444
+ "INFORMATION_SCHEMA.TABLES",
445
+ "MD5(",
446
+ "DBMS_PIPE.RECEIVE_MESSAGE",
447
+ "SYSIBM.SYSTABLES",
448
+ "RANDOMBLOB(",
449
+ "SELECT * FROM",
450
+ "1'='1",
451
+ "PG_SLEEP(",
452
+ "UNION ALL SELECT",
453
+ "../"
454
+ ].map(&:downcase).freeze
455
+ end
456
+ end
457
+ end