codesake-dawn 1.0.6 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +4 -0
  4. data/.travis.yml +5 -3
  5. data/Changelog.md +70 -4
  6. data/README.md +129 -95
  7. data/Rakefile +27 -3
  8. data/Roadmap.md +47 -40
  9. data/bin/dawn +104 -86
  10. data/certs/paolo_at_codesake_dot_com.pem +21 -0
  11. data/checksum/.placeholder +0 -0
  12. data/codesake-dawn.gemspec +11 -3
  13. data/doc/codesake-dawn.yaml.sample +26 -0
  14. data/lib/codesake-dawn.rb +1 -0
  15. data/lib/codesake/dawn/core.rb +84 -51
  16. data/lib/codesake/dawn/engine.rb +66 -15
  17. data/lib/codesake/dawn/gemfile_lock.rb +2 -2
  18. data/lib/codesake/dawn/kb/basic_check.rb +109 -98
  19. data/lib/codesake/dawn/kb/combo_check.rb +4 -3
  20. data/lib/codesake/dawn/kb/cve_2011_2930.rb +1 -0
  21. data/lib/codesake/dawn/kb/cve_2011_3187.rb +1 -0
  22. data/lib/codesake/dawn/kb/cve_2011_4319.rb +1 -0
  23. data/lib/codesake/dawn/kb/cve_2011_5036.rb +28 -0
  24. data/lib/codesake/dawn/kb/cve_2012_1098.rb +1 -0
  25. data/lib/codesake/dawn/kb/cve_2012_6109.rb +27 -0
  26. data/lib/codesake/dawn/kb/cve_2013_0183.rb +27 -0
  27. data/lib/codesake/dawn/kb/cve_2013_0184.rb +27 -0
  28. data/lib/codesake/dawn/kb/cve_2013_0262.rb +28 -0
  29. data/lib/codesake/dawn/kb/cve_2013_0263.rb +1 -1
  30. data/lib/codesake/dawn/kb/cve_2013_1607.rb +27 -0
  31. data/lib/codesake/dawn/kb/cve_2013_2512.rb +28 -0
  32. data/lib/codesake/dawn/kb/cve_2013_2513.rb +27 -0
  33. data/lib/codesake/dawn/kb/cve_2013_2516.rb +28 -0
  34. data/lib/codesake/dawn/kb/cve_2013_4413.rb +29 -0
  35. data/lib/codesake/dawn/kb/cve_2013_4457.rb +1 -1
  36. data/lib/codesake/dawn/kb/cve_2013_4489.rb +30 -0
  37. data/lib/codesake/dawn/kb/cve_2013_4593.rb +29 -0
  38. data/lib/codesake/dawn/kb/cve_2013_5647.rb +1 -0
  39. data/lib/codesake/dawn/kb/cve_2013_5671.rb +28 -0
  40. data/lib/codesake/dawn/kb/cve_2013_6416.rb +1 -0
  41. data/lib/codesake/dawn/kb/cve_2014_0080.rb +30 -0
  42. data/lib/codesake/dawn/kb/dependency_check.rb +37 -13
  43. data/lib/codesake/dawn/kb/deprecation_check.rb +40 -0
  44. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/check_for_safe_redirect_and_forward.rb +3 -1
  45. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/command_injection.rb +2 -0
  46. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/csrf.rb +3 -1
  47. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/mass_assignment_in_model.rb +2 -0
  48. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/security_related_headers.rb +9 -7
  49. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/sensitive_files.rb +2 -0
  50. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/session_stored_in_database.rb +2 -0
  51. data/lib/codesake/dawn/kb/pattern_match_check.rb +16 -8
  52. data/lib/codesake/dawn/kb/ruby_version_check.rb +11 -11
  53. data/lib/codesake/dawn/kb/version_check.rb +416 -0
  54. data/lib/codesake/dawn/knowledge_base.rb +119 -59
  55. data/lib/codesake/dawn/reporter.rb +272 -0
  56. data/lib/codesake/dawn/utils.rb +11 -0
  57. data/lib/codesake/dawn/version.rb +14 -12
  58. data/spec/lib/dawn/codesake_knowledgebase_spec.rb +253 -160
  59. data/spec/lib/kb/codesake_cve_2013_0175_spec.rb +1 -1
  60. data/spec/lib/kb/codesake_dependency_version_check_spec.rb +21 -10
  61. data/spec/lib/kb/codesake_deprecation_check_spec.rb +56 -0
  62. data/spec/lib/kb/codesake_version_check_spec.rb +165 -0
  63. data/spec/lib/kb/cve_2011_2930_spec.rb +5 -6
  64. data/spec/lib/kb/cve_2011_5036_spec.rb +95 -0
  65. data/spec/lib/kb/cve_2012_6109_spec.rb +112 -0
  66. data/spec/lib/kb/cve_2013_0183_spec.rb +54 -0
  67. data/spec/lib/kb/cve_2013_0184_spec.rb +115 -0
  68. data/spec/lib/kb/cve_2013_0256_spec.rb +1 -8
  69. data/spec/lib/kb/cve_2013_0262_spec.rb +44 -0
  70. data/spec/lib/kb/cve_2013_1607_spec.rb +15 -0
  71. data/spec/lib/kb/{codesake_cve_2013_1655_spec.rb → cve_2013_1655_spec.rb} +0 -0
  72. data/spec/lib/kb/cve_2013_2090_spec.rb +0 -5
  73. data/spec/lib/kb/cve_2013_2512_spec.rb +15 -0
  74. data/spec/lib/kb/cve_2013_2513_spec.rb +15 -0
  75. data/spec/lib/kb/cve_2013_2516_spec.rb +15 -0
  76. data/spec/lib/kb/cve_2013_4413_spec.rb +16 -0
  77. data/spec/lib/kb/cve_2013_4489_spec.rb +63 -0
  78. data/spec/lib/kb/cve_2013_4593_spec.rb +16 -0
  79. data/spec/lib/kb/cve_2013_5671_spec.rb +27 -0
  80. data/spec/lib/kb/{codesake_cve_2013_6416_spec.rb → cve_2013_6416_spec.rb} +0 -0
  81. data/spec/lib/kb/cve_2014_0080_spec.rb +28 -0
  82. data/spec/spec_helper.rb +7 -3
  83. data/support/bootstrap.js +2027 -0
  84. data/support/bootstrap.min.css +9 -0
  85. data/support/codesake.css +63 -0
  86. metadata +127 -18
  87. metadata.gz.sig +0 -0
@@ -5,6 +5,8 @@ require "codesake/dawn/kb/dependency_check"
5
5
  require "codesake/dawn/kb/ruby_version_check"
6
6
  require "codesake/dawn/kb/operating_system_check"
7
7
  require "codesake/dawn/kb/combo_check"
8
+ require "codesake/dawn/kb/version_check"
9
+ require "codesake/dawn/kb/deprecation_check"
8
10
 
9
11
  # Q&A related checks
10
12
  ## Not revised code
@@ -111,6 +113,7 @@ require "codesake/dawn/kb/cve_2011_3186"
111
113
  require "codesake/dawn/kb/cve_2011_3187"
112
114
  require "codesake/dawn/kb/cve_2011_4319"
113
115
  require "codesake/dawn/kb/cve_2011_4815"
116
+ require "codesake/dawn/kb/cve_2011_5036"
114
117
 
115
118
  # CVE - 2012
116
119
  require "codesake/dawn/kb/cve_2012_1098"
@@ -134,6 +137,7 @@ require "codesake/dawn/kb/cve_2012_4522"
134
137
  require "codesake/dawn/kb/cve_2012_5370"
135
138
  require "codesake/dawn/kb/cve_2012_5371"
136
139
  require "codesake/dawn/kb/cve_2012_5380"
140
+ require "codesake/dawn/kb/cve_2012_6109"
137
141
  require "codesake/dawn/kb/cve_2012_6134"
138
142
  require "codesake/dawn/kb/cve_2012_6496"
139
143
  require "codesake/dawn/kb/cve_2012_6497"
@@ -143,8 +147,11 @@ require "codesake/dawn/kb/cve_2013_0155"
143
147
  require "codesake/dawn/kb/cve_2013_0156"
144
148
  require "codesake/dawn/kb/cve_2013_0162"
145
149
  require "codesake/dawn/kb/cve_2013_0175"
150
+ require "codesake/dawn/kb/cve_2013_0183"
151
+ require "codesake/dawn/kb/cve_2013_0184"
146
152
  require "codesake/dawn/kb/cve_2013_0233"
147
153
  require "codesake/dawn/kb/cve_2013_0256"
154
+ require "codesake/dawn/kb/cve_2013_0262"
148
155
  require "codesake/dawn/kb/cve_2013_0263"
149
156
  require "codesake/dawn/kb/cve_2013_0269"
150
157
  require "codesake/dawn/kb/cve_2013_0276"
@@ -152,6 +159,7 @@ require "codesake/dawn/kb/cve_2013_0277"
152
159
  require "codesake/dawn/kb/cve_2013_0284"
153
160
  require "codesake/dawn/kb/cve_2013_0285"
154
161
  require "codesake/dawn/kb/cve_2013_0333"
162
+ require "codesake/dawn/kb/cve_2013_1607"
155
163
  require "codesake/dawn/kb/cve_2013_1655"
156
164
  require "codesake/dawn/kb/cve_2013_1656"
157
165
  require "codesake/dawn/kb/cve_2013_1756"
@@ -173,19 +181,26 @@ require "codesake/dawn/kb/cve_2013_1948"
173
181
  require "codesake/dawn/kb/cve_2013_2065"
174
182
  require "codesake/dawn/kb/cve_2013_2090"
175
183
  require "codesake/dawn/kb/cve_2013_2119"
184
+ require "codesake/dawn/kb/cve_2013_2512"
185
+ require "codesake/dawn/kb/cve_2013_2513"
186
+ require "codesake/dawn/kb/cve_2013_2516"
176
187
  require "codesake/dawn/kb/cve_2013_2615"
177
188
  require "codesake/dawn/kb/cve_2013_2616"
178
189
  require "codesake/dawn/kb/cve_2013_2617"
179
190
  require "codesake/dawn/kb/cve_2013_3221"
180
191
  require "codesake/dawn/kb/cve_2013_4164"
181
192
  require "codesake/dawn/kb/cve_2013_4389"
193
+ require "codesake/dawn/kb/cve_2013_4413"
182
194
  require "codesake/dawn/kb/cve_2013_4457"
183
195
  require "codesake/dawn/kb/cve_2013_4478"
184
196
  require "codesake/dawn/kb/cve_2013_4479"
197
+ require "codesake/dawn/kb/cve_2013_4489"
185
198
  require "codesake/dawn/kb/cve_2013_4491"
186
199
  require "codesake/dawn/kb/cve_2013_4492"
187
200
  require "codesake/dawn/kb/cve_2013_4562"
201
+ require "codesake/dawn/kb/cve_2013_4593"
188
202
  require "codesake/dawn/kb/cve_2013_5647"
203
+ require "codesake/dawn/kb/cve_2013_5671"
189
204
  require "codesake/dawn/kb/cve_2013_6414"
190
205
  require "codesake/dawn/kb/cve_2013_6415"
191
206
  require "codesake/dawn/kb/cve_2013_6416"
@@ -197,6 +212,7 @@ require "codesake/dawn/kb/cve_2013_7086"
197
212
  # CVE - 2014
198
213
 
199
214
  require "codesake/dawn/kb/cve_2014_0036"
215
+ require "codesake/dawn/kb/cve_2014_0080"
200
216
  require "codesake/dawn/kb/cve_2014_0081"
201
217
  require "codesake/dawn/kb/cve_2014_0082"
202
218
  require "codesake/dawn/kb/cve_2014_1233"
@@ -217,13 +233,16 @@ module Codesake
217
233
  OS_CHECK = :os_check
218
234
  COMBO_CHECK = :combo_check
219
235
 
220
- def initialize
221
- @security_checks = Codesake::Dawn::KnowledgeBase.load_security_checks
236
+ def initialize(options={})
237
+ @enabled_checks = Codesake::Dawn::Kb::BasicCheck::ALLOWED_FAMILIES
238
+ @enabled_checks = options[:enabled_checks] unless options[:enabled_check].nil?
239
+
240
+ @security_checks = load_security_checks
222
241
  end
223
242
 
224
243
  def self.find(checks=nil, name)
225
244
  return nil if name.nil? or name.empty?
226
- checks = Codesake::Dawn::KnowledgeBase.load_security_checks if checks.nil?
245
+ checks = Codesake::Dawn::KnowledgeBase.new.load_security_checks if checks.nil?
227
246
 
228
247
  checks.each do |sc|
229
248
  return sc if sc.name == name
@@ -239,6 +258,13 @@ module Codesake
239
258
  @security_checks
240
259
  end
241
260
 
261
+ # TODO - next big refactoring will include also a change in this API.
262
+ #
263
+ # So to match Semantic Version, it must bring to a major version bump.
264
+ # MVC name should be passed as constructor option, so the all_by_mvc can
265
+ #
266
+ # be called without parameter, having a nice-to-read code.
267
+ # @checks = Codesake::Dawn::KnowledgeBase.new({:enabled_checks=>@enabled_checks}).all_by_mvc(@name)
242
268
  def all_by_mvc(mvc)
243
269
  ret = []
244
270
  @security_checks.each do |sc|
@@ -263,61 +289,53 @@ module Codesake
263
289
  self.all_by_mvc("rack")
264
290
  end
265
291
 
266
- def self.load_security_checks
267
- [
268
- Codesake::Dawn::Kb::NotRevisedCode.new,
269
- Codesake::Dawn::Kb::OwaspRorCheatSheet::CommandInjection.new,
270
- Codesake::Dawn::Kb::OwaspRorCheatSheet::Csrf.new,
271
- Codesake::Dawn::Kb::OwaspRorCheatSheet::SessionStoredInDatabase.new,
272
- Codesake::Dawn::Kb::OwaspRorCheatSheet::MassAssignmentInModel.new,
273
- Codesake::Dawn::Kb::OwaspRorCheatSheet::SecurityRelatedHeaders.new,
274
- Codesake::Dawn::Kb::OwaspRorCheatSheet::CheckForSafeRedirectAndForward.new,
275
- Codesake::Dawn::Kb::OwaspRorCheatSheet::SensitiveFiles.new,
276
- Codesake::Dawn::Kb::SimpleForm_Xss_20131129.new,
277
- Codesake::Dawn::Kb::NokogiriDos20131217.new,
278
- Codesake::Dawn::Kb::Nokogiri_EntityExpansion_Dos_20131217.new,
279
- Codesake::Dawn::Kb::CVE_2004_0755.new,
280
- Codesake::Dawn::Kb::CVE_2004_0983.new,
281
- Codesake::Dawn::Kb::CVE_2005_1992.new,
282
- Codesake::Dawn::Kb::CVE_2005_2337.new,
283
- Codesake::Dawn::Kb::CVE_2006_1931.new,
284
- Codesake::Dawn::Kb::CVE_2006_2582.new,
285
- Codesake::Dawn::Kb::CVE_2006_3694.new,
286
- Codesake::Dawn::Kb::CVE_2006_4112.new,
287
- Codesake::Dawn::Kb::CVE_2006_5467.new,
288
- Codesake::Dawn::Kb::CVE_2006_6303.new,
289
- Codesake::Dawn::Kb::CVE_2006_6852.new,
290
- Codesake::Dawn::Kb::CVE_2006_6979.new,
291
- Codesake::Dawn::Kb::CVE_2007_0469.new,
292
- Codesake::Dawn::Kb::CVE_2007_5162.new,
293
- Codesake::Dawn::Kb::CVE_2007_5379.new,
294
- Codesake::Dawn::Kb::CVE_2007_5380.new,
295
- Codesake::Dawn::Kb::CVE_2007_5770.new,
296
- Codesake::Dawn::Kb::CVE_2007_6077.new,
297
- Codesake::Dawn::Kb::CVE_2007_6612.new,
298
- Codesake::Dawn::Kb::CVE_2008_1145.new,
299
- Codesake::Dawn::Kb::CVE_2008_1891.new,
300
- Codesake::Dawn::Kb::CVE_2008_2376.new,
301
- Codesake::Dawn::Kb::CVE_2008_2662.new,
302
- Codesake::Dawn::Kb::CVE_2008_2663.new,
303
- Codesake::Dawn::Kb::CVE_2008_2664.new,
304
- Codesake::Dawn::Kb::CVE_2008_2725.new,
305
- Codesake::Dawn::Kb::CVE_2008_3655.new,
306
- Codesake::Dawn::Kb::CVE_2008_3657.new,
307
- Codesake::Dawn::Kb::CVE_2008_3790.new,
308
- Codesake::Dawn::Kb::CVE_2008_3905.new,
309
- Codesake::Dawn::Kb::CVE_2008_4094.new,
310
- Codesake::Dawn::Kb::CVE_2008_4310.new,
311
- Codesake::Dawn::Kb::CVE_2008_5189.new,
312
- Codesake::Dawn::Kb::CVE_2008_7248.new,
313
- Codesake::Dawn::Kb::CVE_2009_4078.new,
314
- Codesake::Dawn::Kb::CVE_2009_4124.new,
315
- Codesake::Dawn::Kb::CVE_2009_4214.new,
316
- Codesake::Dawn::Kb::CVE_2010_1330.new,
317
- Codesake::Dawn::Kb::CVE_2010_2489.new,
318
- Codesake::Dawn::Kb::CVE_2010_3933.new,
319
- Codesake::Dawn::Kb::CVE_2011_0188.new,
320
- Codesake::Dawn::Kb::CVE_2011_0446.new,
292
+ def load_security_checks
293
+
294
+ # START @cve_security_checks array
295
+ @cve_security_checks =
296
+ [
297
+ Codesake::Dawn::Kb::CVE_2004_0755.new,
298
+ Codesake::Dawn::Kb::CVE_2004_0983.new,
299
+ Codesake::Dawn::Kb::CVE_2005_1992.new,
300
+ Codesake::Dawn::Kb::CVE_2005_2337.new,
301
+ Codesake::Dawn::Kb::CVE_2006_1931.new,
302
+ Codesake::Dawn::Kb::CVE_2006_2582.new,
303
+ Codesake::Dawn::Kb::CVE_2006_3694.new,
304
+ Codesake::Dawn::Kb::CVE_2006_4112.new,
305
+ Codesake::Dawn::Kb::CVE_2006_5467.new,
306
+ Codesake::Dawn::Kb::CVE_2006_6303.new,
307
+ Codesake::Dawn::Kb::CVE_2006_6852.new,
308
+ Codesake::Dawn::Kb::CVE_2006_6979.new,
309
+ Codesake::Dawn::Kb::CVE_2007_0469.new,
310
+ Codesake::Dawn::Kb::CVE_2007_5162.new,
311
+ Codesake::Dawn::Kb::CVE_2007_5379.new,
312
+ Codesake::Dawn::Kb::CVE_2007_5380.new,
313
+ Codesake::Dawn::Kb::CVE_2007_5770.new,
314
+ Codesake::Dawn::Kb::CVE_2007_6077.new,
315
+ Codesake::Dawn::Kb::CVE_2007_6612.new,
316
+ Codesake::Dawn::Kb::CVE_2008_1145.new,
317
+ Codesake::Dawn::Kb::CVE_2008_1891.new,
318
+ Codesake::Dawn::Kb::CVE_2008_2376.new,
319
+ Codesake::Dawn::Kb::CVE_2008_2662.new,
320
+ Codesake::Dawn::Kb::CVE_2008_2663.new,
321
+ Codesake::Dawn::Kb::CVE_2008_2664.new,
322
+ Codesake::Dawn::Kb::CVE_2008_2725.new,
323
+ Codesake::Dawn::Kb::CVE_2008_3655.new,
324
+ Codesake::Dawn::Kb::CVE_2008_3657.new,
325
+ Codesake::Dawn::Kb::CVE_2008_3790.new,
326
+ Codesake::Dawn::Kb::CVE_2008_3905.new,
327
+ Codesake::Dawn::Kb::CVE_2008_4094.new,
328
+ Codesake::Dawn::Kb::CVE_2008_4310.new,
329
+ Codesake::Dawn::Kb::CVE_2008_5189.new,
330
+ Codesake::Dawn::Kb::CVE_2008_7248.new,
331
+ Codesake::Dawn::Kb::CVE_2009_4078.new,
332
+ Codesake::Dawn::Kb::CVE_2009_4124.new,
333
+ Codesake::Dawn::Kb::CVE_2009_4214.new,
334
+ Codesake::Dawn::Kb::CVE_2010_1330.new,
335
+ Codesake::Dawn::Kb::CVE_2010_2489.new,
336
+ Codesake::Dawn::Kb::CVE_2010_3933.new,
337
+ Codesake::Dawn::Kb::CVE_2011_0188.new,
338
+ Codesake::Dawn::Kb::CVE_2011_0446.new,
321
339
  Codesake::Dawn::Kb::CVE_2011_0447.new,
322
340
  Codesake::Dawn::Kb::CVE_2011_0739.new,
323
341
  Codesake::Dawn::Kb::CVE_2011_0995.new,
@@ -335,6 +353,7 @@ module Codesake
335
353
  Codesake::Dawn::Kb::CVE_2011_3187.new,
336
354
  Codesake::Dawn::Kb::CVE_2011_4319.new,
337
355
  Codesake::Dawn::Kb::CVE_2011_4815.new,
356
+ Codesake::Dawn::Kb::CVE_2011_5036.new,
338
357
  Codesake::Dawn::Kb::CVE_2012_1098.new,
339
358
  Codesake::Dawn::Kb::CVE_2012_1099.new,
340
359
  Codesake::Dawn::Kb::CVE_2012_1241.new,
@@ -356,6 +375,7 @@ module Codesake
356
375
  Codesake::Dawn::Kb::CVE_2012_5370.new,
357
376
  Codesake::Dawn::Kb::CVE_2012_5371.new,
358
377
  Codesake::Dawn::Kb::CVE_2012_5380.new,
378
+ Codesake::Dawn::Kb::CVE_2012_6109.new,
359
379
  Codesake::Dawn::Kb::CVE_2012_6134.new,
360
380
  Codesake::Dawn::Kb::CVE_2012_6496.new,
361
381
  Codesake::Dawn::Kb::CVE_2012_6497.new,
@@ -363,8 +383,11 @@ module Codesake
363
383
  Codesake::Dawn::Kb::CVE_2013_0156.new,
364
384
  Codesake::Dawn::Kb::CVE_2013_0162.new,
365
385
  Codesake::Dawn::Kb::CVE_2013_0175.new,
386
+ Codesake::Dawn::Kb::CVE_2013_0183.new,
387
+ Codesake::Dawn::Kb::CVE_2013_0184.new,
366
388
  Codesake::Dawn::Kb::CVE_2013_0233.new,
367
389
  Codesake::Dawn::Kb::CVE_2013_0256.new,
390
+ Codesake::Dawn::Kb::CVE_2013_0262.new,
368
391
  Codesake::Dawn::Kb::CVE_2013_0263.new,
369
392
  Codesake::Dawn::Kb::CVE_2013_0269.new,
370
393
  Codesake::Dawn::Kb::CVE_2013_0276.new,
@@ -372,6 +395,7 @@ module Codesake
372
395
  Codesake::Dawn::Kb::CVE_2013_0284.new,
373
396
  Codesake::Dawn::Kb::CVE_2013_0285.new,
374
397
  Codesake::Dawn::Kb::CVE_2013_0333.new,
398
+ Codesake::Dawn::Kb::CVE_2013_1607.new,
375
399
  Codesake::Dawn::Kb::CVE_2013_1655.new,
376
400
  Codesake::Dawn::Kb::CVE_2013_1656.new,
377
401
  Codesake::Dawn::Kb::CVE_2013_1756.new,
@@ -393,19 +417,26 @@ module Codesake
393
417
  Codesake::Dawn::Kb::CVE_2013_2065.new,
394
418
  Codesake::Dawn::Kb::CVE_2013_2090.new,
395
419
  Codesake::Dawn::Kb::CVE_2013_2119.new,
420
+ Codesake::Dawn::Kb::CVE_2013_2512.new,
421
+ Codesake::Dawn::Kb::CVE_2013_2513.new,
422
+ Codesake::Dawn::Kb::CVE_2013_2516.new,
396
423
  Codesake::Dawn::Kb::CVE_2013_2615.new,
397
424
  Codesake::Dawn::Kb::CVE_2013_2616.new,
398
425
  Codesake::Dawn::Kb::CVE_2013_2617.new,
399
426
  Codesake::Dawn::Kb::CVE_2013_3221.new,
400
427
  Codesake::Dawn::Kb::CVE_2013_4164.new,
401
428
  Codesake::Dawn::Kb::CVE_2013_4389.new,
429
+ Codesake::Dawn::Kb::CVE_2013_4413.new,
402
430
  Codesake::Dawn::Kb::CVE_2013_4457.new,
403
431
  Codesake::Dawn::Kb::CVE_2013_4478.new,
404
432
  Codesake::Dawn::Kb::CVE_2013_4479.new,
433
+ Codesake::Dawn::Kb::CVE_2013_4489.new,
405
434
  Codesake::Dawn::Kb::CVE_2013_4491.new,
406
435
  Codesake::Dawn::Kb::CVE_2013_4492.new,
407
436
  Codesake::Dawn::Kb::CVE_2013_4562.new,
437
+ Codesake::Dawn::Kb::CVE_2013_4593.new,
408
438
  Codesake::Dawn::Kb::CVE_2013_5647.new,
439
+ Codesake::Dawn::Kb::CVE_2013_5671.new,
409
440
  Codesake::Dawn::Kb::CVE_2013_6414.new,
410
441
  Codesake::Dawn::Kb::CVE_2013_6415.new,
411
442
  Codesake::Dawn::Kb::CVE_2013_6416.new,
@@ -414,14 +445,43 @@ module Codesake
414
445
  Codesake::Dawn::Kb::CVE_2013_6459.new,
415
446
  Codesake::Dawn::Kb::CVE_2013_7086.new,
416
447
  Codesake::Dawn::Kb::CVE_2014_0036.new,
448
+ Codesake::Dawn::Kb::CVE_2014_0080.new,
417
449
  Codesake::Dawn::Kb::CVE_2014_0081.new,
418
450
  Codesake::Dawn::Kb::CVE_2014_0082.new,
419
451
  Codesake::Dawn::Kb::CVE_2014_1233.new,
420
452
  Codesake::Dawn::Kb::CVE_2014_1234.new,
421
453
  Codesake::Dawn::Kb::CVE_2014_2322.new,
422
454
  Codesake::Dawn::Kb::CVE_2014_2538.new,
423
-
424
455
  ]
456
+ # END @cve_security_checks array
457
+ # START @owasp_ror_cheatsheet_checks array
458
+ @owasp_ror_cheatsheet_checks = [
459
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::CommandInjection.new,
460
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::Csrf.new,
461
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::SessionStoredInDatabase.new,
462
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::MassAssignmentInModel.new,
463
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::SecurityRelatedHeaders.new,
464
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::CheckForSafeRedirectAndForward.new,
465
+ Codesake::Dawn::Kb::OwaspRorCheatSheet::SensitiveFiles.new,
466
+ ]
467
+ # END @owasp_ror_cheatsheet_checks array
468
+ @code_quality_checks = [
469
+ Codesake::Dawn::Kb::NotRevisedCode.new,
470
+ ]
471
+ @aux_checks =
472
+ [
473
+ Codesake::Dawn::Kb::SimpleForm_Xss_20131129.new,
474
+ Codesake::Dawn::Kb::NokogiriDos20131217.new,
475
+ Codesake::Dawn::Kb::Nokogiri_EntityExpansion_Dos_20131217.new,
476
+ ]
477
+
478
+ ret = []
479
+ ret += @aux_checks
480
+ ret += @cve_security_checks if @enabled_checks.include?(:cve_bulletin)
481
+ ret += @owasp_ror_cheatsheet_checks if @enabled_checks.include?(:owasp_ror_cheatsheet)
482
+ ret += @code_quality_checks if @enabled_checks.include?(:code_quality)
483
+
484
+ ret
425
485
  end
426
486
  end
427
487
 
@@ -0,0 +1,272 @@
1
+ module Codesake
2
+ module Dawn
3
+ class Reporter
4
+
5
+ def initialize(options={})
6
+ @engine = nil
7
+ @ret = false
8
+
9
+ @filename = options[:filename]
10
+ @ret = options[:apply_all_code] unless options[:apply_all_code].nil?
11
+ @format = options[:format] unless options[:format].nil?
12
+ @engine = options[:engine] unless options[:engine].nil?
13
+
14
+ @format = :console unless is_valid_format?(@format)
15
+ end
16
+
17
+ def report
18
+ ascii_tabular_report if @format == :tabular
19
+ json_report if @format == :json
20
+ ascii_plain_report if @format == :console
21
+ html_report if @format == :html
22
+ end
23
+ private
24
+
25
+ def write(output)
26
+
27
+ puts output if @filename.nil?
28
+
29
+ unless @filename.nil?
30
+ $logger.warn "I will use codesake.css, bootstrap.min.css and bootstrap.js stored in ./support/ directory" if @format == :html
31
+ File.open(@filename, "w") do |f|
32
+ f.puts output
33
+ end
34
+ $logger.ok "#{@filename} created (#{output.length} bytes)"
35
+ end
36
+ end
37
+ def is_valid_format?(format)
38
+ return false if format.nil?
39
+ return true if (format == :console) || (format == :tabular) || (format == :json) || (format == :html) || (format == :csv)
40
+ return false # otherwise
41
+ end
42
+
43
+ def html_report
44
+ html_head = "<!doctype html>\n<html>\n<head>\n<title>Codesake::Dawn report for #{File.basename(@engine.target)}</title>"
45
+ html_head += "<script src=\"./support/bootstrap.js\"></script>\n"
46
+ html_head += "<link href=\"./support/codesake.css\" media=\"all\" rel=\"stylesheet\" />\n"
47
+ html_head += "<link href=\"./support/bootstrap.min.css\" media=\"all\" rel=\"stylesheet\" />\n"
48
+ html_head += "</head>\n"
49
+ html_body = "<body>\n"
50
+ html_body += ""
51
+ html_body += "<div id=\"wrap\">\n"
52
+ html_body += "<div class=\"container-narrow\">\n"
53
+ html_body += "<div class=\"masthead\">\n"
54
+ html_body += "<ul class=\"nav nav-pills pull-right\">\n"
55
+ html_body += "<li class=\"\"><a href=\"https://dawn.codesake.com\">Home</a></li>\n"
56
+ html_body += "<li class=\"active\"><a href=\"https://github.com/codesake/codesake-dawn\">Github repo</a></li>\n"
57
+ html_body += "</ul>\n"
58
+ html_body += "<h3 class=\"muted\">Codesake::Dawn</h3>\n"
59
+ html_body += "</div>\n"
60
+ html_body += "<h1>Security code review results for \"#{File.basename(@engine.target)}\"</h1>\n"
61
+ html_body += "<hr />\n"
62
+ html_body += "<h2>Scan detail</h2>\n"
63
+ html_body += "<div class=\"row\">\n"
64
+ html_body += "<p>The scan was last executed #{@engine.scan_start.strftime("%d %b %Y - %T")} and Codesake::Dawn founds #{@engine.count_vulnerabilities} vulnerabilities</p>\n"
65
+ html_body += "</div>\n"
66
+ html_body += "<hr />\n"
67
+ html_body += "<h2>Scan details</h2>\n"
68
+ html_body += "<table class=\"table-striped table-bordered table\">\n"
69
+ html_body += "<thead><tr><td>Key</td><td>Value</td></tr></thead>\n"
70
+ html_body += "<tbody>\n"
71
+ html_body += "<tr><td>Dawn version</td><td>#{Codesake::Dawn::VERSION}</td></tr>" unless Codesake::Dawn::RELEASE == "(development)\n"
72
+ html_body += "<tr><td>Dawn development version</td><td>#{Codesake::Dawn::VERSION}</td></tr>" if Codesake::Dawn::RELEASE == "(development)\n"
73
+ html_body += "<tr><td>Scan duration</td><td>#{@engine.scan_time.round(3)} sec</td></tr>\n"
74
+ html_body += "<tr><td>Target</td><td>#{@engine.target}</td></tr>\n"
75
+ html_body += "<tr><td>MVC detected framework</td><td>#{@engine.name} v#{@engine.get_mvc_version}</td></tr>" unless @engine.name == "Gemfile.lock\n"
76
+ html_body += "<tr><td>MVC detected framework</td><td>#{@engine.force} v#{@engine.get_mvc_version}</td></tr>" if @engine.name == "Gemfile.lock\n"
77
+ if @ret
78
+ html_body += "<tr><td>Applied checks</td><td>#{@engine.applied_checks} security checks</td></tr>\n"
79
+ html_body += "<tr><td>Skipped checks</td><td>#{@engine.skipped_checks} security checks</td></tr>\n"
80
+ else
81
+ html_body += "<tr><td>Applied checks</td><td>No security checks in the knowledge base</td></tr>\n"
82
+ end
83
+
84
+ html_body+="<tr><td>Vulnerabilities found</td><td>#{@engine.count_vulnerabilities}</td></tr>\n"
85
+ html_body+="<tr><td>Mitigated issues found</td><td>#{@engine.mitigated_issues.count}</td></tr>\n"
86
+ html_body+="<tr><td>Reflected XSS</td><td>#{@engine.reflected_xss.count}</td></tr>\n"
87
+ html_body += "</tbody>\n"
88
+ html_body += "</table>\n"
89
+
90
+
91
+ if @engine.count_vulnerabilities > 0
92
+ html_body += "<hr />\n"
93
+ html_body += "<h2>Vulnerabilities found</h2>\n"
94
+ html_body += "<table class=\"table-striped table-bordered table\">\n"
95
+ html_body += "<thead><tr><td>Name</td><td>Severity</td><td>Priority</td><td>CVSS score</td><td>Description</td><td>Remediation</td></tr></thead>\n"
96
+
97
+ @engine.vulnerabilities.each do |vuln|
98
+ html_body += "<tr><td><a href=\"#{vuln[:cve_link]}\">#{vuln[:name]}</a></td><td>#{vuln[:severity]}</td><td>#{vuln[:priority]}</td><td>#{vuln[:cvss_score]}</td><td>#{vuln[:message]}</td><td>#{vuln[:remediation]}</td></tr>\n"
99
+ end
100
+ html_body += "</tbody>\n"
101
+ html_body += "</table>\n"
102
+ end
103
+ html_body += "<div id=\"push\"></div>\n"
104
+ html_body += "<div id=\"footer\">\n"
105
+ html_body += "<div class=\"container\">\n"
106
+ html_body += "<p class=\"muted credit\">&copy; <a href=\"http://dawn.codesake.com\">Codesake::Dawn</a> &mdash; #{Time.now.strftime("%Y")} &mdash; engine v#{Codesake::Dawn::VERSION} (#{Codesake::Dawn::RELEASE})</p>\n"
107
+ html_body += "</div>\n"
108
+ html_body += "</div>\n"
109
+ html_body += "</div>\n"
110
+ html_body += "</div>\n"
111
+
112
+ html_body += "</body>\n"
113
+ html_body += "</html>"
114
+
115
+
116
+ html = html_head + html_body
117
+
118
+ write(html)
119
+ true
120
+ end
121
+
122
+ def ascii_tabular_report
123
+
124
+ # 0_First table: executive summary
125
+ rows = []
126
+ rows << ['Dawn version', Codesake::Dawn::VERSION] unless Codesake::Dawn::RELEASE == "(development)"
127
+ rows << ['Dawn development version', Codesake::Dawn::VERSION] if Codesake::Dawn::RELEASE == "(development)"
128
+ rows << ['Scan started', @engine.scan_start]
129
+ rows << ['Scan duration', "#{@engine.scan_time.round(3)} sec"]
130
+ rows << ['Target', @engine.target]
131
+ rows << ['MVC detected framework', "#{@engine.name} v#{@engine.get_mvc_version}" ] unless @engine.name == "Gemfile.lock"
132
+ rows << ['MVC detected framework', "#{@engine.force} v#{@engine.get_mvc_version}" ] if @engine.name == "Gemfile.lock"
133
+ if @ret
134
+ rows << ['Applied checks', "#{@engine.applied_checks} security checks"]
135
+ rows << ['Skipped checks', "#{@engine.skipped_checks} security checks"]
136
+ else
137
+ rows << ['Applied checks', "No security checks in the knowledge base"]
138
+ end
139
+ rows << ['Vulnerabilities found', @engine.count_vulnerabilities]
140
+ rows << ['Mitigated issues found', @engine.mitigated_issues.count]
141
+ rows << ['Reflected XSS', @engine.reflected_xss.count]
142
+ table = Terminal::Table.new :title=>'Scan summary', :rows => rows
143
+ puts table
144
+
145
+
146
+ if @engine.count_vulnerabilities > 0
147
+
148
+ # 1_Vulnerabilities
149
+ rows = []
150
+ @engine.vulnerabilities.each do |vuln|
151
+ rows << [vuln[:name].justify(10), vuln[:severity], vuln[:priority], vuln[:message].justify(50), vuln[:remediation].justify(15), vuln[:evidences].join.justify(15)]
152
+ rows << :separator
153
+ end
154
+ table = Terminal::Table.new :title=>"Vulnerabilities", :headings=>['Issue', 'Severity', 'Priority', 'Description', 'Solution', 'Evidences'], :rows=>rows
155
+ puts table
156
+
157
+ rows = []
158
+ if @engine.has_reflected_xss?
159
+ @engine.reflected_xss.each do |vuln|
160
+ rows << [vuln[:sink_source], vuln[:sink_view], "#{vuln[:sink_file]}@#{vuln[:sink_line]}",vuln[:sink_evidence]]
161
+ rows << :separator
162
+ end
163
+ table = Terminal::Table.new :title=>"Reflected Cross Site Scripting", :headings=>['Sink name', 'View', 'Location the sink was read', 'Evidences'], :rows=>rows
164
+ puts table
165
+
166
+ end
167
+
168
+ end
169
+
170
+ if @engine.mitigated_issues.count > 0
171
+ # 2_Mitigated issues
172
+ rows = []
173
+ @engine.mitigated_issues.each do |vuln|
174
+ rows << [vuln[:name].justify(10), vuln[:message].justify(50), vuln[:evidences].join.justify(15)]
175
+ rows << :separator
176
+ end
177
+ table = Terminal::Table.new :title=>"Mitigated issues", :headings=>['Issue', 'Description', 'Evidences'], :rows=>rows
178
+ puts table
179
+ end
180
+
181
+ true
182
+ end
183
+
184
+
185
+ def json_report
186
+ result = {}
187
+ return {:status=>"KO", :message=>"BUG at #{__FILE__}@#{__LINE__}: target is empty or engine is nil."}.to_json if @engine.target.empty? or @engine.nil?
188
+ return {:status=>"KO", :message=>"#{target} doesn't exist"}.to_json if ! Dir.exist?(@engine.target)
189
+ return {:status=>"KO", :message=>"no security checks applied"}.to_json unless @ret
190
+
191
+ result[:status]="OK"
192
+ result[:dawn_version] = Codesake::Dawn::VERSION
193
+ result[:dawn_status] = "Develoment version" if Codesake::Dawn::RELEASE == "(development)"
194
+ result[:scan_started] = @engine.scan_start
195
+ result[:scan_duration] = "#{@engine.scan_time.round(3)} sec"
196
+ result[:target]=@engine.target
197
+ result[:mvc]=@engine.name unless @engine.name == "Gemfile.lock"
198
+ result[:mvc]=@engine.force if @engine.name == "Gemfile.lock"
199
+ result[:mvc_version]=@engine.get_mvc_version
200
+
201
+ result[:applied_checks_count] = @engine.applied_checks
202
+ result[:skipped_checks_count] = @engine.skipped_checks
203
+ result[:vulnerabilities_count]=@engine.count_vulnerabilities
204
+
205
+ result[:mitigated_issues_count] = @engine.mitigated_issues.count
206
+ result[:reflected_xss_count] = @engine.reflected_xss.count
207
+ result[:vulnerabilities]=[]
208
+ @engine.vulnerabilities.each do |v|
209
+ result[:vulnerabilities] << v[:name]
210
+ end
211
+ result[:mitigated_vuln] = @engine.mitigated_issues
212
+ result[:reflected_xss] = []
213
+ @engine.reflected_xss.each do |r|
214
+ result[:reflected_xss] << "request parameter \"#{r[:sink_source]}\""
215
+ end
216
+
217
+ write(result.to_json)
218
+ true
219
+ end
220
+
221
+ def ascii_plain_report
222
+
223
+ $logger.log "scanning #{@engine.target}"
224
+ $logger.log "#{@engine.name} v#{@engine.get_mvc_version} detected" unless @engine.name == "Gemfile.lock"
225
+ $logger.log "#{@engine.force} v#{@engine.get_mvc_version} detected" if @engine.name == "Gemfile.lock"
226
+ $logger.log "applying all security checks"
227
+ if @ret
228
+ $logger.log "#{@engine.applied_checks} security checks applied - #{@engine.skipped_checks} security checks skipped"
229
+ else
230
+ $logger.err "no security checks in the knowledge base"
231
+ end
232
+
233
+ if @engine.count_vulnerabilities != 0
234
+ $logger.log "#{@engine.count_vulnerabilities} vulnerabilities found"
235
+ @engine.vulnerabilities.each do |vuln|
236
+ $logger.err "#{vuln[:name]} check failed"
237
+ $logger.log "Severity: #{vuln[:severity]}"
238
+ $logger.log "Priority: #{vuln[:priority]}"
239
+ $logger.log "Description: #{vuln[:message]}"
240
+ $logger.log "Solution: #{vuln[:remediation]}"
241
+ $logger.log "Evidence:"
242
+ vuln[:evidences].each do |evidence|
243
+ $logger.log "\t#{evidence}"
244
+ end
245
+ end
246
+ if @engine.has_reflected_xss?
247
+ $logger.log "#{@engine.reflected_xss.count} reflected XSS found"
248
+ @engine.reflected_xss.each do |vuln|
249
+ $logger.log "request parameter \"#{vuln[:sink_source]}\" is used without escaping in #{vuln[:sink_view]}. It was read here: #{vuln[:sink_file]}@#{vuln[:sink_line]}"
250
+ $logger.err "evidence: #{vuln[:sink_evidence]}"
251
+ end
252
+ end
253
+
254
+ else
255
+ $logger.ok "no vulnerabilities found."
256
+ end
257
+
258
+ if @engine.mitigated_issues.count != 0
259
+ $logger.log "#{@engine.mitigated_issues.count} mitigated vulnerabilities found"
260
+ @engine.mitigated_issues.each do |vuln|
261
+ $logger.ok "#{vuln[:name]} mitigated"
262
+ vuln[:evidences].each do |evidence|
263
+ $logger.err evidence
264
+ end
265
+ end
266
+ end
267
+
268
+ true
269
+ end
270
+ end
271
+ end
272
+ end