owasp-pipeline 0.8.3

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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +23 -0
  3. data/FEATURES +19 -0
  4. data/README.md +101 -0
  5. data/bin/pipeline +67 -0
  6. data/lib/pipeline.rb +301 -0
  7. data/lib/pipeline/event.rb +14 -0
  8. data/lib/pipeline/filters.rb +41 -0
  9. data/lib/pipeline/filters/base_filter.rb +19 -0
  10. data/lib/pipeline/filters/jira_one_time_filter.rb +57 -0
  11. data/lib/pipeline/filters/remove_all_filter.rb +16 -0
  12. data/lib/pipeline/finding.rb +52 -0
  13. data/lib/pipeline/mounters.rb +55 -0
  14. data/lib/pipeline/mounters/base_mounter.rb +31 -0
  15. data/lib/pipeline/mounters/docker_mounter.rb +44 -0
  16. data/lib/pipeline/mounters/filesystem_mounter.rb +25 -0
  17. data/lib/pipeline/mounters/git_mounter.rb +52 -0
  18. data/lib/pipeline/mounters/iso_mounter.rb +42 -0
  19. data/lib/pipeline/mounters/url_mounter.rb +28 -0
  20. data/lib/pipeline/options.rb +240 -0
  21. data/lib/pipeline/reporters.rb +50 -0
  22. data/lib/pipeline/reporters/base_reporter.rb +21 -0
  23. data/lib/pipeline/reporters/csv_reporter.rb +19 -0
  24. data/lib/pipeline/reporters/jira_reporter.rb +61 -0
  25. data/lib/pipeline/reporters/json_reporter.rb +20 -0
  26. data/lib/pipeline/reporters/text_reporter.rb +19 -0
  27. data/lib/pipeline/scanner.rb +28 -0
  28. data/lib/pipeline/tasks.rb +124 -0
  29. data/lib/pipeline/tasks/av.rb +43 -0
  30. data/lib/pipeline/tasks/base_task.rb +64 -0
  31. data/lib/pipeline/tasks/brakeman.rb +60 -0
  32. data/lib/pipeline/tasks/bundle-audit.rb +93 -0
  33. data/lib/pipeline/tasks/checkmarx.rb +62 -0
  34. data/lib/pipeline/tasks/eslint.rb +71 -0
  35. data/lib/pipeline/tasks/fim.rb +61 -0
  36. data/lib/pipeline/tasks/nsp.rb +59 -0
  37. data/lib/pipeline/tasks/owasp-dep-check.rb +120 -0
  38. data/lib/pipeline/tasks/patterns.json +394 -0
  39. data/lib/pipeline/tasks/retirejs.rb +106 -0
  40. data/lib/pipeline/tasks/scanjs-eslintrc +106 -0
  41. data/lib/pipeline/tasks/scanjs.rb +32 -0
  42. data/lib/pipeline/tasks/sfl.rb +67 -0
  43. data/lib/pipeline/tasks/test.rb +47 -0
  44. data/lib/pipeline/tasks/zap.rb +84 -0
  45. data/lib/pipeline/tracker.rb +47 -0
  46. data/lib/pipeline/util.rb +39 -0
  47. data/lib/pipeline/version.rb +3 -0
  48. data/lib/zapjson.json +0 -0
  49. metadata +205 -0
@@ -0,0 +1,71 @@
1
+ require 'pipeline/tasks/base_task'
2
+ require 'json'
3
+ require 'pipeline/util'
4
+
5
+ class Pipeline::ESLint < Pipeline::BaseTask
6
+
7
+ Pipeline::Tasks.add self
8
+ include Pipeline::Util
9
+
10
+ def initialize(trigger, tracker)
11
+ super(trigger,tracker)
12
+ @name = "ESLint/ScanJS"
13
+ @description = "Source analysis for JavaScript"
14
+ @stage = :code
15
+ @labels << "code" << "javascript"
16
+ end
17
+
18
+ def run
19
+ Pipeline.notify "#{@name}"
20
+ rootpath = @trigger.path
21
+ currentpath = File.expand_path File.dirname(__FILE__)
22
+ Pipeline.debug "ESLint Config Path: #{currentpath}"
23
+ @result = `eslint -c #{currentpath}/scanjs-eslintrc --no-color --quiet --format json #{rootpath}`
24
+ end
25
+
26
+ def analyze
27
+ # puts @result
28
+ begin
29
+ parsed = JSON.parse(@result)
30
+ parsed.each do |result|
31
+ findings = {}
32
+ prints = []
33
+ messages = []
34
+ result['messages'].each do |msg|
35
+ message = msg['message']
36
+ findings[message] = {} if findings[message].nil?
37
+ findings[message][:detail] = msg['ruleId']
38
+ if messages.include?(message)
39
+ findings[message][:source] = "#{findings[message][:source]},#{msg['line']}" unless findings[message][:source].include?(",#{msg['line']}")
40
+ else
41
+ findings[message][:source] = "#{result['filePath']} Line: #{msg['line']}"
42
+ messages << message
43
+ end
44
+ findings[message][:severity] = severity(msg['severity'].to_s)
45
+ end
46
+ findings.each do |key, value|
47
+ print = fingerprint("#{key}#{value[:detail]}#{value[:source]}#{value[:sev]}")
48
+ unless prints.include?(print)
49
+ prints << print
50
+ report key, value[:detail], value[:source], value[:severity], print
51
+ end
52
+ end
53
+ end
54
+ rescue Exception => e
55
+ Pipeline.warn e.message
56
+ Pipeline.warn e.backtrace
57
+ end
58
+ end
59
+
60
+ def supported?
61
+ supported=runsystem(true, "eslint", "-c", "~/.scanjs-eslintrc")
62
+ if supported =~ /command not found/
63
+ Pipeline.notify "Install eslint and the scanjs .eslintrc"
64
+ return false
65
+ else
66
+ return true
67
+ end
68
+ end
69
+
70
+ end
71
+
@@ -0,0 +1,61 @@
1
+ # https://github.com/jessek/hashdeep/releases/tag/release-4.4
2
+
3
+ require 'pipeline/tasks/base_task'
4
+ require 'open3'
5
+
6
+ class Pipeline::FIM < Pipeline::BaseTask
7
+
8
+ Pipeline::Tasks.add self
9
+
10
+ def initialize(trigger, tracker)
11
+ super(trigger,tracker)
12
+ @name = "FIM"
13
+ @description = "File integrity monitor"
14
+ @stage = :file
15
+ @result = ''
16
+ @labels << "filesystem"
17
+ end
18
+
19
+ def run
20
+ Pipeline.notify "#{@name}"
21
+ rootpath = @trigger.path
22
+ if File.exists?("/area81/tmp/#{rootpath}/filehash")
23
+ Pipeline.notify "File Hashes found, comparing to file system"
24
+ cmd="hashdeep -j99 -r -a -vv -k /area81/tmp/#{rootpath}/filehash #{rootpath}"
25
+
26
+ # Ugly stdout parsing
27
+ r=/(.*): No match/
28
+ Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
29
+ while line = stdout.gets
30
+ if line.match r
31
+ @result << line
32
+ end
33
+ end
34
+ end
35
+ else
36
+ Pipeline.notify "No existing baseline - generating initial hashes"
37
+ cmd="mkdir -p /area81/tmp/#{rootpath}; hashdeep -j99 -r #{rootpath} > /area81/tmp/#{rootpath}/filehash"
38
+ Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
39
+ while line = stdout.gets
40
+ puts "."
41
+ end
42
+ end
43
+ @result = ''
44
+ end
45
+ end
46
+
47
+ def analyze
48
+ list = @result.split(/\n/)
49
+ list.each do |v|
50
+ # v.slice! installdir
51
+ Pipeline.notify v
52
+ report "File changed.", v, @name, :low
53
+ end
54
+ end
55
+
56
+ def supported?
57
+ # In future, verify tool is available.
58
+ return true
59
+ end
60
+
61
+ end
@@ -0,0 +1,59 @@
1
+ require 'pipeline/tasks/base_task'
2
+ require 'pipeline/util'
3
+
4
+ class Pipeline::NodeSecurityProject < Pipeline::BaseTask
5
+
6
+ Pipeline::Tasks.add self
7
+ include Pipeline::Util
8
+
9
+ def initialize(trigger, tracker)
10
+ super(trigger, tracker)
11
+ @name = "NodeSecurityProject"
12
+ @description = "Node Security Project"
13
+ @stage = :code
14
+ @labels << "code"
15
+ end
16
+
17
+ def run
18
+ Pipeline.notify "#{@name}"
19
+ rootpath = @trigger.path
20
+ Dir.chdir("#{rootpath}") do
21
+ @results = JSON.parse `nsp check --output json 2>&1`
22
+ end
23
+ end
24
+
25
+ def analyze
26
+ begin
27
+ # This block iterates through each package name found and selects the unique nsp advisories
28
+ # regardless of version, and builds a pipeline finding hash for each unique package/advisory combo.
29
+ @results.uniq {|finding| finding['module']}.each do |package|
30
+ @results.select {|f| f['module'] == package['module']}.uniq {|m| m['advisory']}.each do |unique_finding|
31
+ description = "#{unique_finding['module']} - #{unique_finding['title']}"
32
+ detail = "Upgrade to versions: #{unique_finding['patched_versions']}\n#{unique_finding['advisory']}"
33
+ source = {
34
+ :scanner => 'NodeSecurityProject',
35
+ :file => "#{unique_finding['module']} - #{unique_finding['vulnerable_versions']}",
36
+ :line => nil,
37
+ :code => nil
38
+ }
39
+ report description, detail, source, 'medium', fingerprint("#{description}#{detail}#{source}")
40
+ end
41
+ end
42
+ rescue Exception => e
43
+ Pipeline.warn e.message
44
+ Pipeline.warn e.backtrace
45
+ end
46
+ end
47
+
48
+ def supported?
49
+ supported=runsystem(true, "nsp", "--version")
50
+ if supported =~ /command not found/
51
+ Pipeline.notify "Install nodesecurity: 'npm install -g nsp'"
52
+ return false
53
+ else
54
+ return true
55
+ end
56
+ end
57
+
58
+ end
59
+
@@ -0,0 +1,120 @@
1
+ require 'pipeline/tasks/base_task'
2
+ require 'pipeline/util'
3
+ require 'rexml/document'
4
+ require 'rexml/streamlistener'
5
+ include REXML
6
+
7
+ # SAX Like Parser for OWASP DEP CHECK XML.
8
+ class Pipeline::DepCheckListener
9
+ include StreamListener
10
+
11
+ def initialize(task)
12
+ @task = task
13
+ @count = 0
14
+ @sw = ""
15
+ @url = ""
16
+ @desc = ""
17
+ @cwe = ""
18
+ @cvss = ""
19
+ @name = ""
20
+ @fingerprint = ""
21
+ end
22
+
23
+ def tag_start(name, attrs)
24
+ case name
25
+ when "vulnerability"
26
+ @count = @count + 1
27
+ # Pipeline.debug "Grabbed #{@count} vulns."
28
+ @sw = ""
29
+ @url = ""
30
+ @desc = ""
31
+ @cwe = ""
32
+ @cvss = ""
33
+ @name = ""
34
+ @fingerprint = ""
35
+ end
36
+ end
37
+
38
+ def tag_end(name)
39
+ case name
40
+ when "name"
41
+ if @text =~ /\D/
42
+ @name = @text
43
+ end
44
+ when "cvssScore"
45
+ @cvss = @text
46
+ when "cwe"
47
+ @cwe = @text
48
+ when "description"
49
+ @desc = @text
50
+ when "vulnerableSoftware"
51
+ @sw = ""
52
+ when "software"
53
+ @sw << ", " << @text
54
+ when "url"
55
+ @url << ", " << @text
56
+ when "vulnerability"
57
+ detail = @sw + "\n"+ @url
58
+ description = @desc + "\n" + @cwe
59
+ @fingerprint = @sw+"-"+@name
60
+ puts "Fingerprint: #{@fingerprint}"
61
+ puts "Vuln: #{@name} CVSS: #{@cvss} Description #{description} Detail #{detail}"
62
+ @task.report @name, description, detail, @cvss, @fingerprint
63
+ end
64
+ end
65
+
66
+ def text(text)
67
+ @text = text
68
+ end
69
+ end
70
+
71
+ class Pipeline::OWASPDependencyCheck < Pipeline::BaseTask
72
+
73
+ Pipeline::Tasks.add self
74
+ include Pipeline::Util
75
+
76
+ def initialize(trigger,tracker)
77
+ super(trigger,tracker)
78
+ @name = "OWASP Dependency Check"
79
+ @description = "Dependency analysis for Java and .NET"
80
+ @stage = :code
81
+ @labels << "code" << "java" << ".net"
82
+ end
83
+
84
+ def run
85
+ Pipeline.notify "#{@name}"
86
+ rootpath = @trigger.path
87
+ @result= runsystem(true, "/home/pipe/line/tools/dependency-check/bin/dependency-check.sh", "-a", "pipeline", "-f", "XML", "-out", "#{rootpath}", "-s", "#{rootpath}")
88
+ end
89
+
90
+ def analyze
91
+ path = @trigger.path + "/dependency-check-report.xml"
92
+ begin
93
+ Pipeline.debug "Parsing report #{path}"
94
+ get_warnings(path)
95
+ rescue Exception => e
96
+ Pipeline.notify "Problem running OWASP Dep Check ... skipped."
97
+ Pipeline.notify e.message
98
+ raise e
99
+ end
100
+ end
101
+
102
+ def supported?
103
+ supported=runsystem(true, "/home/pipe/line/tools//dependency-check/bin/dependency-check.sh", "-v")
104
+ if supported =~ /command not found/
105
+ Pipeline.notify "Install dependency-check."
106
+ return false
107
+ else
108
+ return true
109
+ end
110
+ end
111
+
112
+ def get_warnings(path)
113
+ listener = Pipeline::DepCheckListener.new(self)
114
+ parser = Parsers::StreamParser.new(File.new(path), listener)
115
+ parser.parse
116
+ end
117
+ end
118
+
119
+
120
+
@@ -0,0 +1,394 @@
1
+ [
2
+ {
3
+ "part": "filename",
4
+ "type": "regex",
5
+ "pattern": "\\A.*_rsa\\z",
6
+ "caption": "Private SSH key",
7
+ "description": null
8
+ },
9
+ {
10
+ "part": "filename",
11
+ "type": "regex",
12
+ "pattern": "\\A.*_dsa\\z",
13
+ "caption": "Private SSH key",
14
+ "description": null
15
+ },
16
+ {
17
+ "part": "filename",
18
+ "type": "regex",
19
+ "pattern": "\\A.*_ed25519\\z",
20
+ "caption": "Private SSH key",
21
+ "description": null
22
+ },
23
+ {
24
+ "part": "filename",
25
+ "type": "regex",
26
+ "pattern": "\\A.*_ecdsa\\z",
27
+ "caption": "Private SSH key",
28
+ "description": null
29
+ },
30
+ {
31
+ "part": "extension",
32
+ "type": "match",
33
+ "pattern": "pem",
34
+ "caption": "Potential cryptographic private key",
35
+ "description": null
36
+ },
37
+ {
38
+ "part": "extension",
39
+ "type": "regex",
40
+ "pattern": "\\Akey(pair)?\\z",
41
+ "caption": "Potential cryptographic private key",
42
+ "description": null
43
+ },
44
+ {
45
+ "part": "extension",
46
+ "type": "match",
47
+ "pattern": "pkcs12",
48
+ "caption": "Potential cryptographic key bundle",
49
+ "description": null
50
+ },
51
+ {
52
+ "part": "extension",
53
+ "type": "match",
54
+ "pattern": "pfx",
55
+ "caption": "Potential cryptographic key bundle",
56
+ "description": null
57
+ },
58
+ {
59
+ "part": "extension",
60
+ "type": "match",
61
+ "pattern": "p12",
62
+ "caption": "Potential cryptographic key bundle",
63
+ "description": null
64
+ },
65
+ {
66
+ "part": "extension",
67
+ "type": "match",
68
+ "pattern": "asc",
69
+ "caption": "Potential cryptographic key bundle",
70
+ "description": null
71
+ },
72
+ {
73
+ "part": "filename",
74
+ "type": "match",
75
+ "pattern": "otr.private_key",
76
+ "caption": "Pidgin OTR private key",
77
+ "description": null
78
+ },
79
+ {
80
+ "part": "filename",
81
+ "type": "regex",
82
+ "pattern": "\\A\\.?(bash_|zsh_|z)?history\\z",
83
+ "caption": "Shell command history file",
84
+ "description": null
85
+ },
86
+ {
87
+ "part": "filename",
88
+ "type": "regex",
89
+ "pattern": "\\A\\.?mysql_history\\z",
90
+ "caption": "MySQL client command history file",
91
+ "description": null
92
+ },
93
+ {
94
+ "part": "filename",
95
+ "type": "regex",
96
+ "pattern": "\\A\\.?psql_history\\z",
97
+ "caption": "PostgreSQL client command history file",
98
+ "description": null
99
+ },
100
+ {
101
+ "part": "filename",
102
+ "type": "regex",
103
+ "pattern": "\\A\\.?irb_history\\z",
104
+ "caption": "Ruby IRB console history file",
105
+ "description": null
106
+ },
107
+ {
108
+ "part": "path",
109
+ "type": "regex",
110
+ "pattern": "\\.?purple\\/accounts\\.xml\\z",
111
+ "caption": "Pidgin chat client account configuration file",
112
+ "description": null
113
+ },
114
+ {
115
+ "part": "path",
116
+ "type": "regex",
117
+ "pattern": "\\.?xchat2?\\/servlist_?\\.conf\\z",
118
+ "caption": "Hexchat/XChat IRC client server list configuration file",
119
+ "description": null
120
+ },
121
+ {
122
+ "part": "path",
123
+ "type": "regex",
124
+ "pattern": "\\.?irssi\\/config\\z",
125
+ "caption": "Irssi IRC client configuration file",
126
+ "description": null
127
+ },
128
+ {
129
+ "part": "path",
130
+ "type": "regex",
131
+ "pattern": "\\.?recon-ng\\/keys\\.db\\z",
132
+ "caption": "Recon-ng web reconnaissance framework API key database",
133
+ "description": null
134
+ },
135
+ {
136
+ "part": "filename",
137
+ "type": "regex",
138
+ "pattern": "\\A\\.?dbeaver-data-sources.xml\\z",
139
+ "caption": "DBeaver SQL database manager configuration file",
140
+ "description": null
141
+ },
142
+ {
143
+ "part": "filename",
144
+ "type": "regex",
145
+ "pattern": "\\A\\.?muttrc\\z",
146
+ "caption": "Mutt e-mail client configuration file",
147
+ "description": null
148
+ },
149
+ {
150
+ "part": "filename",
151
+ "type": "regex",
152
+ "pattern": "\\A\\.?s3cfg\\z",
153
+ "caption": "S3cmd configuration file",
154
+ "description": null
155
+ },
156
+ {
157
+ "part": "filename",
158
+ "type": "regex",
159
+ "pattern": "\\A\\.?trc\\z",
160
+ "caption": "T command-line Twitter client configuration file",
161
+ "description": null
162
+ },
163
+ {
164
+ "part": "extension",
165
+ "type": "match",
166
+ "pattern": "ovpn",
167
+ "caption": "OpenVPN client configuration file",
168
+ "description": null
169
+ },
170
+ {
171
+ "part": "filename",
172
+ "type": "regex",
173
+ "pattern": "\\A\\.?gitrobrc\\z",
174
+ "caption": "Well, this is awkward... Gitrob configuration file",
175
+ "description": null
176
+ },
177
+ {
178
+ "part": "filename",
179
+ "type": "regex",
180
+ "pattern": "\\A\\.?(bash|zsh)rc\\z",
181
+ "caption": "Shell configuration file",
182
+ "description": "Shell configuration files might contain information such as server hostnames, passwords and API keys."
183
+ },
184
+ {
185
+ "part": "filename",
186
+ "type": "regex",
187
+ "pattern": "\\A\\.?(bash_|zsh_)?profile\\z",
188
+ "caption": "Shell profile configuration file",
189
+ "description": "Shell configuration files might contain information such as server hostnames, passwords and API keys."
190
+ },
191
+ {
192
+ "part": "filename",
193
+ "type": "regex",
194
+ "pattern": "\\A\\.?(bash_|zsh_)?aliases\\z",
195
+ "caption": "Shell command alias configuration file",
196
+ "description": "Shell configuration files might contain information such as server hostnames, passwords and API keys."
197
+ },
198
+ {
199
+ "part": "filename",
200
+ "type": "match",
201
+ "pattern": "secret_token.rb",
202
+ "caption": "Ruby On Rails secret token configuration file",
203
+ "description": "If the Rails secret token is known, it can allow for remote code execution. (http://www.exploit-db.com/exploits/27527/)"
204
+ },
205
+ {
206
+ "part": "filename",
207
+ "type": "match",
208
+ "pattern": "omniauth.rb",
209
+ "caption": "OmniAuth configuration file",
210
+ "description": "The OmniAuth configuration file might contain client application secrets."
211
+ },
212
+ {
213
+ "part": "filename",
214
+ "type": "match",
215
+ "pattern": "carrierwave.rb",
216
+ "caption": "Carrierwave configuration file",
217
+ "description": "Can contain credentials for online storage systems such as Amazon S3 and Google Storage."
218
+ },
219
+ {
220
+ "part": "filename",
221
+ "type": "match",
222
+ "pattern": "schema.rb",
223
+ "caption": "Ruby On Rails database schema file",
224
+ "description": "Contains information on the database schema of a Ruby On Rails application."
225
+ },
226
+ {
227
+ "part": "filename",
228
+ "type": "match",
229
+ "pattern": "database.yml",
230
+ "caption": "Potential Ruby On Rails database configuration file",
231
+ "description": "Might contain database credentials."
232
+ },
233
+ {
234
+ "part": "filename",
235
+ "type": "match",
236
+ "pattern": "settings.py",
237
+ "caption": "Django configuration file",
238
+ "description": "Might contain database credentials, online storage system credentials, secret keys, etc."
239
+ },
240
+ {
241
+ "part": "filename",
242
+ "type": "regex",
243
+ "pattern": "\\A(.*)?config(\\.inc)?\\.php\\z",
244
+ "caption": "PHP configuration file",
245
+ "description": "Might contain credentials and keys."
246
+ },
247
+ {
248
+ "part": "extension",
249
+ "type": "match",
250
+ "pattern": "kdb",
251
+ "caption": "KeePass password manager database file",
252
+ "description": null
253
+ },
254
+ {
255
+ "part": "extension",
256
+ "type": "match",
257
+ "pattern": "agilekeychain",
258
+ "caption": "1Password password manager database file",
259
+ "description": null
260
+ },
261
+ {
262
+ "part": "extension",
263
+ "type": "match",
264
+ "pattern": "keychain",
265
+ "caption": "Apple Keychain database file",
266
+ "description": null
267
+ },
268
+ {
269
+ "part": "extension",
270
+ "type": "regex",
271
+ "pattern": "\\Akey(store|ring)\\z",
272
+ "caption": "GNOME Keyring database file",
273
+ "description": null
274
+ },
275
+ {
276
+ "part": "extension",
277
+ "type": "match",
278
+ "pattern": "log",
279
+ "caption": "Log file",
280
+ "description": "Log files might contain information such as references to secret HTTP endpoints, session IDs, user information, passwords and API keys."
281
+ },
282
+ {
283
+ "part": "extension",
284
+ "type": "match",
285
+ "pattern": "pcap",
286
+ "caption": "Network traffic capture file",
287
+ "description": null
288
+ },
289
+ {
290
+ "part": "extension",
291
+ "type": "regex",
292
+ "pattern": "\\Asql(dump)?\\z",
293
+ "caption": "SQL dump file",
294
+ "description": null
295
+ },
296
+ {
297
+ "part": "extension",
298
+ "type": "match",
299
+ "pattern": "gnucash",
300
+ "caption": "GnuCash database file",
301
+ "description": null
302
+ },
303
+ {
304
+ "part": "filename",
305
+ "type": "regex",
306
+ "pattern": "backup",
307
+ "caption": "Contains word: backup",
308
+ "description": null
309
+ },
310
+ {
311
+ "part": "filename",
312
+ "type": "regex",
313
+ "pattern": "dump",
314
+ "caption": "Contains word: dump",
315
+ "description": null
316
+ },
317
+ {
318
+ "part": "filename",
319
+ "type": "regex",
320
+ "pattern": "password",
321
+ "caption": "Contains word: password",
322
+ "description": null
323
+ },
324
+ {
325
+ "part": "filename",
326
+ "type": "regex",
327
+ "pattern": "private.*key",
328
+ "caption": "Contains words: private, key",
329
+ "description": null
330
+ },
331
+ {
332
+ "part": "filename",
333
+ "type": "match",
334
+ "pattern": "jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml",
335
+ "caption": "Jenkins publish over SSH plugin file",
336
+ "description": null
337
+ },
338
+ {
339
+ "part": "filename",
340
+ "type": "match",
341
+ "pattern": "credentials.xml",
342
+ "caption": "Potential Jenkins credentials file",
343
+ "description": null
344
+ },
345
+ {
346
+ "part": "filename",
347
+ "type": "regex",
348
+ "pattern": "\\A\\.?htpasswd\\z",
349
+ "caption": "Apache htpasswd file",
350
+ "description": null
351
+ },
352
+ {
353
+ "part": "filename",
354
+ "type": "regex",
355
+ "pattern": "\\A\\.?netrc\\z",
356
+ "caption": "Configuration file for auto-login process",
357
+ "description": "Might contain username and password."
358
+ },
359
+ {
360
+ "part": "extension",
361
+ "type": "match",
362
+ "pattern": "kwallet",
363
+ "caption": "KDE Wallet Manager database file",
364
+ "description": null
365
+ },
366
+ {
367
+ "part": "filename",
368
+ "type": "match",
369
+ "pattern": "LocalSettings.php",
370
+ "caption": "Potential MediaWiki configuration file",
371
+ "description": null
372
+ },
373
+ {
374
+ "part": "extension",
375
+ "type": "match",
376
+ "pattern": "tblk",
377
+ "caption": "Tunnelblick VPN configuration file",
378
+ "description": null
379
+ },
380
+ {
381
+ "part": "path",
382
+ "type": "regex",
383
+ "pattern": "\\A\\.?gem/credentials\\z",
384
+ "caption": "Rubygems credentials file",
385
+ "description": "Might contain API key for a rubygems.org account."
386
+ },
387
+ {
388
+ "part": "filename",
389
+ "type": "regex",
390
+ "pattern": "\\A*\\.pubxml(\\.user)?\\z",
391
+ "caption": "Potential MSBuild publish profile",
392
+ "description": null
393
+ }
394
+ ]