codesake-dawn 0.72 → 0.75

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +8 -0
  4. data/Competitive_matrix.md +8 -2
  5. data/Rakefile +1 -0
  6. data/Roadmap.md +28 -22
  7. data/bin/dawn +42 -34
  8. data/codesake-dawn.gemspec +1 -0
  9. data/lib/codesake-dawn.rb +1 -0
  10. data/lib/codesake/dawn/engine.rb +31 -13
  11. data/lib/codesake/dawn/kb/basic_check.rb +10 -1
  12. data/lib/codesake/dawn/kb/combo_check.rb +63 -0
  13. data/lib/codesake/dawn/kb/cve_2010_1330.rb +30 -0
  14. data/lib/codesake/dawn/kb/cve_2011_0446.rb +30 -0
  15. data/lib/codesake/dawn/kb/cve_2011_0995.rb +63 -0
  16. data/lib/codesake/dawn/kb/cve_2011_2929.rb +29 -0
  17. data/lib/codesake/dawn/kb/cve_2011_4815.rb +30 -0
  18. data/lib/codesake/dawn/kb/cve_2012_3424.rb +31 -0
  19. data/lib/codesake/dawn/kb/cve_2012_4522.rb +29 -0
  20. data/lib/codesake/dawn/kb/cve_2012_5380.rb +30 -0
  21. data/lib/codesake/dawn/kb/cve_2013_1655.rb +48 -12
  22. data/lib/codesake/dawn/kb/dependency_check.rb +2 -0
  23. data/lib/codesake/dawn/kb/operating_system_check.rb +97 -0
  24. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet.rb +39 -0
  25. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/command_injection.rb +26 -0
  26. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/csrf.rb +28 -0
  27. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/mass_assignment_in_model.rb +30 -0
  28. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/security_related_headers.rb +37 -0
  29. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/session_stored_in_database.rb +28 -0
  30. data/lib/codesake/dawn/kb/pattern_match_check.rb +21 -3
  31. data/lib/codesake/dawn/kb/ruby_version_check.rb +31 -7
  32. data/lib/codesake/dawn/knowledge_base.rb +24 -0
  33. data/lib/codesake/dawn/sinatra.rb +2 -2
  34. data/lib/codesake/dawn/utils.rb +10 -0
  35. data/lib/codesake/dawn/version.rb +1 -1
  36. data/spec/lib/dawn/codesake_knowledgebase_spec.rb +47 -0
  37. data/spec/lib/dawn/codesake_sinatra_engine_spec.rb +1 -0
  38. data/spec/lib/kb/codesake_cve_2013_1655_spec.rb +31 -0
  39. data/spec/lib/kb/owasp_ror_cheatsheet_spec.rb +56 -0
  40. data/spec/spec_helper.rb +3 -0
  41. data/spec/support/hello_world_3.2.13/app/helpers/application_helper.rb +8 -0
  42. data/spec/support/hello_world_3.2.13/app/models/test.rb +3 -0
  43. metadata +69 -63
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2e14d7d2bb102da1da3ef6f03f1f688d93459937
4
+ data.tar.gz: 9b33c3f62e7a99f5cabd9e25ea07d8b6aeeca526
5
+ SHA512:
6
+ metadata.gz: 27f20f4202f1cddba9cd9432ab45aa58c1204ef7d6b00afe2b09d50f5e83158e29459acfa5ce56a6b445af64ffb96ddd1df546bee0b8c8d77a97782f9c5cabe0
7
+ data.tar.gz: c33b21202f9e5f17b403e93bb8fedf0be735e2652d3d482d8980ce30de2d7fccf6ed3e2682cd9f017ba42fe2fccd8ca20409523204436daae5e638ea31a25646
@@ -1 +1 @@
1
- ruby-1.9.3-p429
1
+ ruby-2.0.0-p247
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - jruby
8
+ - rbx
@@ -68,11 +68,16 @@ applications will be supported as well.
68
68
 
69
69
  | CVE Check | Dawn | Brakeman | Excellent | ror-sec-scanner | Scanny |
70
70
  |-----------------------|---------------|-------------------|-------------|-------------------|-------------|
71
+ | CVE-2010-1330 | YES | NO | | | |
72
+ | CVE-2011-0446 | YES | NO | | | |
71
73
  | CVE-2011-0447 | YES | NO | | | |
74
+ | CVE-2011-0995 | YES | NO | | | |
72
75
  | CVE-2011-2197 | YES | NO | | | |
76
+ | CVE-2011-2929 | YES | YES | | | |
73
77
  | CVE-2011-2931 | YES | YES | | | |
74
78
  | CVE-2011-2932 | YES | NO | | | |
75
79
  | CVE-2011-3186 | YES | NO | | | |
80
+ | CVE-2011-4815 | YES | NO | | | |
76
81
  | CVE-2012-1099 | YES | NO | | | |
77
82
  | CVE-2012-1241 | YES | NO | | | |
78
83
  | CVE-2012-2140 | YES | NO | | | |
@@ -80,14 +85,17 @@ applications will be supported as well.
80
85
  | CVE-2012-2661 | YES | YES | | | |
81
86
  | CVE-2012-2694 | YES | YES | | | |
82
87
  | CVE-2012-2695 | YES | YES | | | |
88
+ | CVE-2012-3424 | YES | YES | | | |
83
89
  | CVE-2012-3463 | YES | YES | | | |
84
90
  | CVE-2012-3464 | YES | YES | | | |
85
91
  | CVE-2012-3465 | YES | YES | | | |
86
92
  | CVE-2012-4464 | YES | NO | | | |
87
93
  | CVE-2012-4466 | YES | NO | | | |
88
94
  | CVE-2012-4481 | YES | NO | | | |
95
+ | CVE-2012-4522 | YES | NO | | | |
89
96
  | CVE-2012-5370 | YES | NO | | | |
90
97
  | CVE-2012-5371 | YES | NO | | | |
98
+ | CVE-2012-5380 | YES | NO | | | |
91
99
  | CVE-2012-6134 | YES | NO | | | |
92
100
  | CVE-2012-6496 | YES | NO | | | |
93
101
  | CVE-2012-5664 | NO | YES | | | |
@@ -99,8 +107,6 @@ applications will be supported as well.
99
107
  | CVE-2013-1857 | YES | YES | | | |
100
108
  | CVE-2013-0155 | YES | YES | | | |
101
109
  | CVE-2013-0333 | YES | YES | | | |
102
- | CVE-2011-0447 | NO | YES | | | |
103
- | CVE-2011-0446 | NO | YES | | | |
104
110
  | CVE-2013-1854 | YES | YES | | | |
105
111
  | CVE-2013-1856 | YES | YES | | | |
106
112
  | CVE-2013-0276 | YES | YES | | | |
data/Rakefile CHANGED
@@ -6,6 +6,7 @@ require 'cucumber'
6
6
  require 'cucumber/rake/task'
7
7
 
8
8
  require 'fileutils'
9
+ require "codesake/dawn/utils"
9
10
  require "codesake/dawn/knowledge_base"
10
11
 
11
12
  Cucumber::Rake::Task.new(:features) do |t|
data/Roadmap.md CHANGED
@@ -77,27 +77,7 @@ _latest update: Fri 17 May 2013 15:29:55 CEST_
77
77
 
78
78
  ## Version 0.80
79
79
 
80
- * adding test for CVE-2013-2090 _if CVE will be approved_
81
- * adding test for CVE-2013-2065 _if CVE will be approved_
82
- * adding test for CVE-2010-1330
83
- * adding test for CVE-2011-0447
84
- * adding test for CVE-2011-0446
85
- * adding test for CVE-2011-0995
86
- * adding test for CVE-2011-2197
87
- * adding test for CVE-2011-2929
88
- * adding test for CVE-2011-2932
89
- * adding test for CVE-2011-3186
90
- * adding test for CVE-2011-4815
91
- * adding test for CVE-2012-5370
92
- * adding test for CVE-2012-3424
93
- * adding test for CVE-2012-1241
94
- * adding test for CVE-2012-2140
95
- * adding test for CVE-2012-1099
96
- * adding test for CVE-2012-5380
97
- * adding test for CVE-2012-2694
98
- * adding test for CVE-2012-4522
99
- * adding test for CVE-2012-3464
100
- * adding test for CVE-2012-3463
80
+ * Fix issue #1. You can read more about it in TODO.md
101
81
  * detect sinks for XSS in Padrino applications
102
82
  * detect reflected XSS in Padrino applications
103
83
  * detect stored XSS in Sinatra applications
@@ -105,13 +85,27 @@ _latest update: Fri 17 May 2013 15:29:55 CEST_
105
85
  * detect insecure direct object reference in Sinatra applications
106
86
  * detect insecure direct object reference in Padrino applications
107
87
  * support ERB for in detect\_views (for both Sinatra and Padrino)
108
- * Fix issue #1. You can read more about it in TODO.md
109
88
  * integration with [codesake.com](http://codesake.com) with a public available
110
89
  APIs to be consumed by codesake beta users.
111
90
 
91
+ * adding test for CVE-2010-1330
92
+ * adding test for CVE-2011-0446
93
+ * adding test for CVE-2011-0995
94
+ * adding test for CVE-2011-2929
95
+ * adding test for CVE-2011-4815
96
+ * adding test for CVE-2012-3424
97
+ * adding test for CVE-2012-5380
98
+ * adding test for CVE-2012-4522
99
+ * adding test for RoRCheatSheet\_1
100
+ * adding test for RoRCheatSheet\_4
101
+ * adding test for RoRCheatSheet\_7
102
+ * adding test for RoRCheatSheet\_8
103
+
112
104
 
113
105
  ## Version 0.90
114
106
 
107
+ * adding test for CVE-2013-2090 _if CVE will be approved_
108
+ * adding test for CVE-2013-2065 _if CVE will be approved_
115
109
  * adding test for CVE-2011-3186
116
110
  * adding test for CVE-2011-2197
117
111
  * adding test for CVE-2011-2932
@@ -151,6 +145,18 @@ _latest update: Fri 17 May 2013 15:29:55 CEST_
151
145
  * adding test for CVE-2008-1145
152
146
  * adding test for CVE-2008-1891
153
147
  * adding test for CVE-2008-2725
148
+ * adding test for RoRCheatSheet\_2
149
+ * adding test for RoRCheatSheet\_3
150
+ * adding test for RoRCheatSheet\_5
151
+ * adding test for RoRCheatSheet\_6
152
+ * adding test for RoRCheatSheet\_9
153
+ * adding test for RoRCheatSheet\_10
154
+ * adding test for RoRCheatSheet\_11
155
+ * adding test for RoRCheatSheet\_12
156
+ * adding test for RoRCheatSheet\_13
157
+ * adding test for RoRCheatSheet\_14
158
+ * adding test for RoRCheatSheet\_15
159
+ * adding test for RoRCheatSheet\_16
154
160
  * preliminary javascript support
155
161
  * adding test for CVE-2011-4969 XSS in jquery < 1.6.2
156
162
  * detect stored XSS in Rails applications
data/bin/dawn CHANGED
@@ -67,7 +67,7 @@ def help
67
67
  printf "\n -s, --sinatra\t\t\t\tforce dawn to consider the target a sinatra application"
68
68
  printf "\n -p, --padrino\t\t\t\tforce dawn to consider the target a padrino application"
69
69
  printf "\n -f, --list-known-framework\t\t\tlist ruby MVC frameworks supported by dawn"
70
- printf "\n -k, --list-knowledgebase\t\t\tlist dawn known security checks"
70
+ printf "\n -k, --list-knowledgebase [check_name]\tlist dawn known security checks. If check_name is specified dawn says if check is present or not"
71
71
  printf "\n -o, --output [console, json. csv, html]\tthe output will be in the specified format"
72
72
  printf "\n -V, --verbose\t\t\t\tthe output will be more verbose"
73
73
  printf "\n -C, --count-only\t\t\t\tdawn will only count vulnerabilities (useful for scripts)"
@@ -82,13 +82,13 @@ APPNAME = File.basename($0)
82
82
  LIST_KNOWN_FRAMEWORK = %w(rails sinatra) #padrino)
83
83
  VALID_OUTPUT_FORMAT = %w(console json csv html)
84
84
 
85
- logger = Codesake::Commons::Logging.instance
85
+ $logger = Codesake::Commons::Logging.instance
86
86
  opts = GetoptLong.new(
87
87
  [ '--rails', '-r', GetoptLong::NO_ARGUMENT],
88
88
  [ '--sinatra', '-s', GetoptLong::NO_ARGUMENT],
89
89
  [ '--padrino', '-p', GetoptLong::NO_ARGUMENT],
90
90
  [ '--list-known-framework', '-f', GetoptLong::NO_ARGUMENT ],
91
- [ '--list-knowledgebase', '-k', GetoptLong::NO_ARGUMENT ],
91
+ [ '--list-knowledgebase', '-k', GetoptLong::OPTIONAL_ARGUMENT ],
92
92
  [ '--output', '-o', GetoptLong::REQUIRED_ARGUMENT],
93
93
  [ '--verbose', '-V', GetoptLong::NO_ARGUMENT],
94
94
  [ '--count-only', '-C', GetoptLong::NO_ARGUMENT],
@@ -98,7 +98,8 @@ opts = GetoptLong.new(
98
98
  engine = nil
99
99
  options = {:verbose=>false, :output=>"console", :count_only=>false, :dump_kb=>false, :mvc=>nil}
100
100
 
101
- trap("INT") { logger.die('[INTERRUPTED]') }
101
+ trap("INT") { $logger.die('[INTERRUPTED]') }
102
+ check = ""
102
103
 
103
104
 
104
105
  opts.each do |opt, val|
@@ -123,6 +124,7 @@ opts.each do |opt, val|
123
124
 
124
125
  when '--list-knowledgebase'
125
126
  options[:dump_kb]=true
127
+ check = val unless val.nil?
126
128
 
127
129
  when '--list-known-framework'
128
130
  puts "Ruby MVC framework supported by #{APPNAME}:"
@@ -135,24 +137,35 @@ opts.each do |opt, val|
135
137
  end
136
138
  end
137
139
 
140
+ if options[:dump_kb]
141
+ puts dump_knowledge_base(options[:verbose]) if check.empty?
142
+ if ! check.empty?
143
+ found = Codesake::Dawn::KnowledgeBase.find(nil, check)
144
+ puts "#{check} found in knowledgebase." if found
145
+ puts "#{check} not found in knowledgebase" if ! found
146
+ end
147
+
148
+ Kernel.exit(0)
149
+ end
150
+
138
151
  target=ARGV.shift
139
152
 
140
- logger.die("missing target") if target.nil?
141
- logger.die("invalid directory (#{target})") unless Codesake::Dawn::Core.is_good_target?(target)
153
+ $logger.die("missing target") if target.nil?
154
+ $logger.die("invalid directory (#{target})") unless Codesake::Dawn::Core.is_good_target?(target)
142
155
 
143
156
 
144
157
  ## MVC auto detect
145
158
  begin
146
159
  engine = Codesake::Dawn::Core.detect_mvc(target) if options[:mvc].nil?
147
160
  rescue ArgumentError => e
148
- logger.die(e.message)
161
+ $logger.die(e.message)
149
162
  end
150
163
 
151
164
  engine = Codesake::Dawn::Rails.new(target) if options[:mvc] == :force_rails
152
165
  engine = Codesake::Dawn::Sinatra.new(target) if options[:mvc] == :force_sinatra
153
166
  # engine = Codesake::Dawn::Padrino.new if options[:mvc] == :force_padrino
154
167
 
155
- logger.die("ruby framework auto detect failed. Please force if rails, sinatra or padrino with -r, -s or -p flags") if engine.nil?
168
+ $logger.die("ruby framework auto detect failed. Please force if rails, sinatra or padrino with -r, -s or -p flags") if engine.nil?
156
169
 
157
170
  if options[:count_only]
158
171
  ret = dry_run(target, engine)
@@ -167,55 +180,50 @@ if options[:output] == "json"
167
180
  Kernel.exit(0)
168
181
  end
169
182
 
170
- if options[:dump_kb]
171
- puts dump_knowledge_base(options[:verbose])
172
- Kernel.exit(0)
173
- end
174
-
175
- logger.helo "#{APPNAME} v#{Codesake::Dawn::VERSION} (C) 2013 - paolo@armoredcode.com is starting up"
176
- logger.die "missing target framework option" if engine.nil?
183
+ $logger.helo "#{APPNAME} v#{Codesake::Dawn::VERSION} (C) 2013 - paolo@armoredcode.com is starting up"
184
+ $logger.die "missing target framework option" if engine.nil?
177
185
 
178
186
  # engine.set_target(target) unless engine.nil?
179
187
  engine.load_knowledge_base
180
188
 
181
- logger.die "nothing to do on #{target}" unless engine.can_apply?
182
- logger.log "scanning #{target}"
183
- logger.log "#{engine.name} v#{engine.get_mvc_version} detected"
184
- logger.log "applying all security checks"
189
+ $logger.die "nothing to do on #{target}" unless engine.can_apply?
190
+ $logger.log "scanning #{target}"
191
+ $logger.log "#{engine.name} v#{engine.get_mvc_version} detected"
192
+ $logger.log "applying all security checks"
185
193
  if engine.apply_all
186
- logger.log "all security checks applied"
194
+ $logger.log "all security checks applied"
187
195
  else
188
- logger.err "no security checks in the knowledge base"
196
+ $logger.err "no security checks in the knowledge base"
189
197
  end
190
198
 
191
199
  if engine.count_vulnerabilities != 0
192
- logger.log "#{engine.count_vulnerabilities} vulnerabilities found"
200
+ $logger.log "#{engine.count_vulnerabilities} vulnerabilities found"
193
201
  engine.vulnerabilities.each do |vuln|
194
- logger.log "#{vuln[:name]} failed"
195
- logger.log "Description: #{vuln[:message]}" if options[:verbose]
196
- logger.log "Solution: #{vuln[:remediation]}"
197
- logger.err "Evidence:"
202
+ $logger.log "#{vuln[:name]} failed"
203
+ $logger.log "Description: #{vuln[:message]}" if options[:verbose]
204
+ $logger.log "Solution: #{vuln[:remediation]}"
205
+ $logger.err "Evidence:"
198
206
  vuln[:evidences].each do |evidence|
199
- logger.err evidence
207
+ $logger.err evidence
200
208
  end
201
209
  end
202
210
  if engine.has_reflected_xss?
203
- logger.log "#{engine.reflected_xss.count} reflected XSS found"
211
+ $logger.log "#{engine.reflected_xss.count} reflected XSS found"
204
212
  engine.reflected_xss.each do |vuln|
205
- logger.log "request parameter \"#{vuln[:sink_source]}\""
213
+ $logger.log "request parameter \"#{vuln[:sink_source]}\""
206
214
  end
207
215
  end
208
216
 
209
217
  else
210
- logger.ok "no vulnerabilities found."
218
+ $logger.ok "no vulnerabilities found."
211
219
  end
212
220
 
213
221
  if engine.mitigated_issues.count != 0
214
- logger.log "#{engine.mitigated_issues.count} mitigated vulnerabilities found"
222
+ $logger.log "#{engine.mitigated_issues.count} mitigated vulnerabilities found"
215
223
  engine.mitigated_issues.each do |vuln|
216
- logger.ok "#{vuln[:name]} mitigated"
224
+ $logger.ok "#{vuln[:name]} mitigated"
217
225
  vuln[:evidences].each do |evidence|
218
- logger.err evidence
226
+ $logger.err evidence
219
227
  end
220
228
  end
221
229
  end
@@ -223,7 +231,7 @@ end
223
231
 
224
232
 
225
233
 
226
- logger.helo "#{APPNAME} is shutting down"
234
+ $logger.helo "#{APPNAME} is shutting down"
227
235
  Kernel.exit(0)
228
236
 
229
237
 
@@ -23,6 +23,7 @@ Gem::Specification.new do |gem|
23
23
  gem.add_dependency 'parser'
24
24
  gem.add_dependency 'ptools'
25
25
  gem.add_dependency 'ruby_parser'
26
+ gem.add_dependency 'sys-uname'
26
27
 
27
28
  gem.add_dependency ('coveralls')
28
29
 
@@ -1,4 +1,5 @@
1
1
  require "codesake/dawn/core"
2
+ require "codesake/dawn/utils"
2
3
  require "codesake/dawn/version"
3
4
  require "codesake/dawn/knowledge_base"
4
5
  require "codesake/dawn/rails"
@@ -161,12 +161,19 @@ module Codesake
161
161
  @checks.each do |check|
162
162
  if check.name == name
163
163
  @applied << { :name=>name }
164
- check.ruby_version = self.ruby_version[:version]
165
- check.detected_ruby = self.ruby_version if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
164
+ check.ruby_version = @ruby_version[:version]
165
+ check.detected_ruby = @ruby_version if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
166
166
  check.dependencies = self.connected_gems if check.kind == Codesake::Dawn::KnowledgeBase::DEPENDENCY_CHECK
167
167
  check.root_dir = self.target if check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK
168
- @vulnerabilities << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences} if check.vuln?
169
- @mitigated_issues << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences} if check.mitigated?
168
+ check.options = {:detected_ruby => self.ruby_version, :dependencies => self.connected_gems, :root_dir => self.target } if check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
169
+
170
+ check_vuln = check.vuln?
171
+
172
+ @vulnerabilities << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check_vuln && check.kind != Codesake::Dawn::KnowledgeBase::COMBO_CHECK
173
+
174
+ @vulnerabilities << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>check.vulnerable_checks} if check_vuln && check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
175
+
176
+ @mitigated_issues << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check.mitigated?
170
177
  return true
171
178
  end
172
179
  end
@@ -180,12 +187,18 @@ module Codesake
180
187
 
181
188
  @checks.each do |check|
182
189
  @applied << { :name => name }
183
- check.ruby_version = self.ruby_version[:version]
184
- check.detected_ruby = self.ruby_version if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
190
+
191
+ check.ruby_version = @ruby_version[:version]
192
+ check.detected_ruby = @ruby_version if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
185
193
  check.dependencies = self.connected_gems if check.kind == Codesake::Dawn::KnowledgeBase::DEPENDENCY_CHECK
186
194
  check.root_dir = self.target if check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK
187
- @vulnerabilities << {:name=> check.name, :message=>check.message, :remediation=>check.remediation , :evidences=>check.evidences} if check.vuln?
188
- @mitigated_issues << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences} if check.mitigated?
195
+ check.options = {:detected_ruby => self.ruby_version, :dependencies => self.connected_gems, :root_dir => self.target } if check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
196
+ check_vuln = check.vuln?
197
+
198
+ @vulnerabilities << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check_vuln && check.kind != Codesake::Dawn::KnowledgeBase::COMBO_CHECK
199
+
200
+ @vulnerabilities << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>check.vulnerable_checks} if check_vuln && check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
201
+ @mitigated_issues << {:name=> check.name, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check.mitigated?
189
202
  end
190
203
 
191
204
  true
@@ -204,17 +217,22 @@ module Codesake
204
217
  @vulnerabilities
205
218
  end
206
219
 
207
- def is_vulnerable_to?(name)
220
+ def find_vulnerability_by_name(name)
208
221
  apply(name) unless is_applied?(name)
209
-
210
222
  @vulnerabilities.each do |v|
211
- return true if v[:name] == name
223
+ return v if v[:name] == name
212
224
  end
213
225
 
214
- false
226
+ nil
215
227
  end
228
+
229
+ def is_vulnerable_to?(name)
230
+ return (find_vulnerability_by_name(name) != nil)
231
+ end
232
+
233
+
216
234
  def has_reflected_xss?
217
- (@reflected_xss.count != 0)
235
+ (@reflected_xss.count != 0) unless @reflected_xss.nil?
218
236
  end
219
237
 
220
238
  def count_vulnerabilities
@@ -5,6 +5,8 @@ module Codesake
5
5
  module Kb
6
6
  module BasicCheck
7
7
 
8
+ include Codesake::Dawn::Utils
9
+
8
10
  attr_reader :name
9
11
  attr_reader :cvss
10
12
  attr_reader :cwe
@@ -36,6 +38,12 @@ module Codesake
36
38
  # Vulnerability evidences
37
39
  attr_reader :evidences
38
40
 
41
+ # Check status. Returns the latest vuln? call result
42
+ attr_reader :status
43
+
44
+ # Put the check in debug mode
45
+ attr_accessor :debug
46
+
39
47
  def initialize(options={})
40
48
  @applies = []
41
49
  @ruby_version = ""
@@ -57,10 +65,11 @@ module Codesake
57
65
 
58
66
  @evidences = []
59
67
  @mitigated = false
68
+ @status = false
69
+ @debug = false
60
70
 
61
71
  end
62
72
 
63
-
64
73
  def applies_to?(name)
65
74
  ! @applies.find_index(name).nil?
66
75
  end
@@ -0,0 +1,63 @@
1
+ module Codesake
2
+ module Dawn
3
+ module Kb
4
+ module ComboCheck
5
+ include BasicCheck
6
+
7
+ attr_reader :checks
8
+ attr_accessor :options
9
+ attr_reader :vulnerable_checks
10
+
11
+
12
+ def initialize(options={})
13
+ super(options)
14
+ @vuln_if_all_fails = true
15
+ @vuln_if_all_fails = options[:vuln_if_all_fails] unless options[:vuln_if_all_fails].nil?
16
+ @checks = options[:checks]
17
+ @vulnerable_checks = []
18
+ @options = options
19
+ end
20
+
21
+ def vuln?
22
+ ret = true
23
+ at_least_one = false
24
+ @checks.each do |check|
25
+ check_vuln = false
26
+ check.detected_ruby = @options[:detected_ruby] if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
27
+ check.dependencies = @options[:dependencies] if check.kind == Codesake::Dawn::KnowledgeBase::DEPENDENCY_CHECK
28
+ check.root_dir = @options[:root_dir] if check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK
29
+
30
+ check_vuln = check.vuln? if check.respond_to?(:vuln?)
31
+
32
+ ret = ret && check_vuln
33
+ at_least_one = true if check_vuln
34
+ @evidences << check.evidences if check_vuln
35
+ @vulnerable_checks << check if check_vuln
36
+ raise "A check class doesn't respond to vuln? in combo (#{check.class})" unless check.respond_to?(:vuln?)
37
+ end
38
+
39
+ dump_status
40
+ debug_me("AVIAF = #{@vuln_if_all_fails}, RET = #{ret}, AL1= #{at_least_one}")
41
+ return ret if @vuln_if_all_fails
42
+ return at_least_one unless @vuln_if_all_fails
43
+ end
44
+
45
+ def dump_status
46
+ @checks.each do |check|
47
+ debug_me("#{File.basename(__FILE__)}@#{__LINE__}:#{check.name}: #{check.status}")
48
+ end
49
+
50
+ true
51
+ end
52
+
53
+ def self.find_vulnerable_checks_by_class(list=[], klass=Object)
54
+ list.each do |l|
55
+ return l if l.instance_of?(klass)
56
+ end
57
+ nil
58
+ end
59
+
60
+ end
61
+ end
62
+ end
63
+ end