brakeman 1.9.3 → 1.9.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA512:
3
- data.tar.gz: 957ae180d1a90244c7a6ce075c6453b9cbff5e2c9be1dd3504c87c0fc30aaa1de9fab3ca841714ac759cc9a301fe3546cb634b16d96507c5e4abbd4966ed949a
4
- metadata.gz: 7e9d7f6e4d410fee09a739fb37508988401c6e5ee976ffdf542d2048df3366b2f2874f8e5bbd739181a8a5f64b93e4153db12c0fd4678b5140903a337197e945
3
+ metadata.gz: b29913808e5de71c6f0e13ab91142f730fdce339829e8fbfc91deca3eb0ce95eb24ce2e58e9fe576f121bce7f63a2015aa84866ac2bb41d07a266081c8e76293
4
+ data.tar.gz: 81669ba7654b7ced4214430613064484ba5fc7ea6a331ee31dd8aeea294621fda75b23b3caee0d1effec0b3fd67c7f636ee5e0868e17d337b6ac4a180e305db6
5
5
  SHA1:
6
- data.tar.gz: a7db08aa0eeedcfc56a2d282f5fd27dd0a2444a7
7
- metadata.gz: 553b8352332aa17f233cb13368bfd85a2a2ff9f8
6
+ metadata.gz: 1f0ed0d4abb525abf8c95b72133ea5c304325075
7
+ data.tar.gz: 48837c8bdab262f44bf27c8962e13d4c9808589d
data/CHANGES CHANGED
@@ -1,3 +1,15 @@
1
+ # 1.9.4
2
+
3
+ * Add check for CVE-2013-1854
4
+ * Add check for CVE-2013-1855
5
+ * Add check for CVE-2013-1856
6
+ * Add check for CVE-2013-1857
7
+ * Fix `--compare` to work with older versions
8
+ * Add "no-referrer' to HTML report links
9
+ * Don't warn when invoking `send` on user input
10
+ * Slightly faster cloning of Sexps
11
+ * Detect another way to add `strong_parameters`
12
+
1
13
  # 1.9.3
2
14
 
3
15
  * Add render path to JSON report
@@ -211,11 +211,19 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
211
211
  #ActiveRecord::Base in an initializer.
212
212
  if not @mass_assign_disabled and version_between?("3.1.0", "3.9.9") and tracker.config[:gems][:strong_parameters]
213
213
  matches = tracker.check_initializers([], :include)
214
+ forbidden_protection = Sexp.new(:colon2, Sexp.new(:const, :ActiveModel), :ForbiddenAttributesProtection)
214
215
 
215
216
  matches.each do |result|
216
- call = result.call
217
- if call? call
218
- if call.first_arg == Sexp.new(:colon2, Sexp.new(:const, :ActiveModel), :ForbiddenAttributesProtection)
217
+ if call? result.call and result.call.first_arg == forbidden_protection
218
+ @mass_assign_disabled = true
219
+ end
220
+ end
221
+
222
+ unless @mass_assign_disabled
223
+ matches = tracker.check_initializers(:"ActiveRecord::Base", :send)
224
+
225
+ matches.each do |result|
226
+ if call? result.call and result.call.second_arg == forbidden_protection
219
227
  @mass_assign_disabled = true
220
228
  end
221
229
  end
@@ -0,0 +1,38 @@
1
+ require 'brakeman/checks/base_check'
2
+
3
+ class Brakeman::CheckJRubyXML < Brakeman::BaseCheck
4
+ Brakeman::Checks.add self
5
+
6
+ @description = "Checks for versions with JRuby XML parsing backend"
7
+
8
+ def run_check
9
+ return unless RUBY_PLATFORM == "java"
10
+
11
+ fix_version = case
12
+ when version_between?('3.0.0', '3.0.99')
13
+ '3.2.13'
14
+ when version_between?('3.1.0', '3.1.11')
15
+ '3.1.12'
16
+ when version_between?('3.2.0', '3.2.12')
17
+ '3.2.13'
18
+ else
19
+ return
20
+ end
21
+
22
+ #Check for workaround
23
+ tracker.check_initializers(:"ActiveSupport::XmlMini", :backend=).each do |result|
24
+ arg = result.call.first_arg
25
+
26
+ if string? arg and arg.value == "REXML"
27
+ return
28
+ end
29
+ end
30
+
31
+ warn :warning_type => "File Access",
32
+ :warning_code => :CVE_2013_1856,
33
+ :message => "Rails #{tracker.config[:rails_version]} with JRuby has a vulnerability in XML parser: upgrade to #{fix_version} or patch",
34
+ :confidence => CONFIDENCE[:high],
35
+ :file => gemfile_or_environment,
36
+ :link => "https://groups.google.com/d/msg/rubyonrails-security/KZwsQbYsOiI/5kUV7dSCJGwJ"
37
+ end
38
+ end
@@ -0,0 +1,54 @@
1
+ require 'brakeman/checks/base_check'
2
+
3
+ #sanitize and sanitize_css are vulnerable:
4
+ #CVE-2013-1855 and CVE-2013-1857
5
+ class Brakeman::CheckSanitizeMethods < Brakeman::BaseCheck
6
+ Brakeman::Checks.add self
7
+
8
+ @description = "Checks for versions with vulnerable sanitize and sanitize_css"
9
+
10
+ def run_check
11
+ @fix_version = case
12
+ when version_between?('2.0.0', '2.3.17')
13
+ '2.3.18'
14
+ when version_between?('3.0.0', '3.0.99')
15
+ '3.2.13'
16
+ when version_between?('3.1.0', '3.1.11')
17
+ '3.1.12'
18
+ when version_between?('3.2.0', '3.2.12')
19
+ '3.2.13'
20
+ else
21
+ return
22
+ end
23
+
24
+ check_cve_2013_1855
25
+ check_cve_2013_1857
26
+ end
27
+
28
+ def check_cve_2013_1855
29
+ check_for_cve :sanitize_css, :CVE_2013_1855, "https://groups.google.com/d/msg/rubyonrails-security/4_QHo4BqnN8/_RrdfKk12I4J"
30
+ end
31
+
32
+ def check_cve_2013_1857
33
+ check_for_cve :sanitize, :CVE_2013_1857, "https://groups.google.com/d/msg/rubyonrails-security/zAAU7vGTPvI/1vZDWXqBuXgJ"
34
+ end
35
+
36
+ def check_for_cve method, code, link
37
+ tracker.find_call(:target => false, :method => method).each do |result|
38
+ message = "Rails #{tracker.config[:rails_version]} has a vulnerability in #{method}: upgrade to #{@fix_version} or patch"
39
+
40
+ if include_user_input? result[:call]
41
+ confidence = CONFIDENCE[:high]
42
+ else
43
+ confidence = CONFIDENCE[:medium]
44
+ end
45
+
46
+ warn :result => result,
47
+ :warning_type => "Cross Site Scripting",
48
+ :warning_code => code,
49
+ :message => message,
50
+ :confidence => CONFIDENCE[:high],
51
+ :link_path => link
52
+ end
53
+ end
54
+ end
@@ -28,15 +28,5 @@ class Brakeman::CheckSend < Brakeman::BaseCheck
28
28
  :user_input => input.match,
29
29
  :confidence => CONFIDENCE[:high]
30
30
  end
31
-
32
- if input = has_immediate_user_input?(target)
33
- warn :result => result,
34
- :warning_type => "Dangerous Send",
35
- :warning_code => :dangerous_send,
36
- :message => "User defined target of method invocation",
37
- :code => result[:call],
38
- :user_input => input.match,
39
- :confidence => CONFIDENCE[:med]
40
- end
41
31
  end
42
32
  end
@@ -0,0 +1,29 @@
1
+ require 'brakeman/checks/base_check'
2
+
3
+ class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck
4
+ Brakeman::Checks.add self
5
+
6
+ @description = "Checks for versions with ActiveRecord symbol denial of service"
7
+
8
+ def run_check
9
+ fix_version = case
10
+ when version_between?('2.0.0', '2.3.17')
11
+ '2.3.18'
12
+ when version_between?('3.1.0', '3.1.11')
13
+ '3.1.12'
14
+ when version_between?('3.2.0', '3.2.12')
15
+ '3.2.13'
16
+ else
17
+ return
18
+ end
19
+
20
+ unless active_record_models.empty?
21
+ warn :warning_type => "Denial of Service",
22
+ :warning_code => :CVE_2013_1854,
23
+ :message => "Rails #{tracker.config[:rails_version]} has a denial of service vulnerability in ActiveRecord: upgrade to #{fix_version} or patch",
24
+ :confidence => CONFIDENCE[:med],
25
+ :file => gemfile_or_environment,
26
+ :link => "https://groups.google.com/d/msg/rubyonrails-security/jgJ4cjjS8FE/BGbHRxnDRTIJ"
27
+ end
28
+ end
29
+ end
@@ -2,6 +2,7 @@
2
2
  # an array of Brakeman::Warnings or plain hash representations.
3
3
  class Brakeman::Differ
4
4
  DEFAULT_HASH = {:new => [], :fixed => []}
5
+ OLD_WARNING_KEYS = [:warning_type, :location, :code, :message, :file, :link, :confidence, :user_input]
5
6
  attr_reader :old_warnings, :new_warnings
6
7
 
7
8
  def initialize new_warnings, old_warnings
@@ -52,6 +53,14 @@ class Brakeman::Differ
52
53
  fixed_warning = fixed_warning.to_hash
53
54
  end
54
55
 
55
- new_warning[:fingerprint] == fixed_warning[:fingerprint]
56
+ if new_warning[:fingerprint] and fixed_warning[:fingerprint]
57
+ new_warning[:fingerprint] == fixed_warning[:fingerprint]
58
+ else
59
+ OLD_WARNING_KEYS.each do |attr|
60
+ return false if new_warning[attr] != fixed_warning[attr]
61
+ end
62
+
63
+ true
64
+ end
56
65
  end
57
66
  end
@@ -63,7 +63,7 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
63
63
 
64
64
  #Generic replace
65
65
  if replacement = env[exp] and not duplicate? replacement
66
- result = set_line replacement.deep_clone, exp.line
66
+ result = replacement.deep_clone(exp.line)
67
67
  else
68
68
  result = exp
69
69
  end
@@ -580,20 +580,6 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
580
580
  meth_env
581
581
  end
582
582
 
583
- #Set line nunber for +exp+ and every Sexp it contains. Used when replacing
584
- #expressions, so warnings indicate the correct line.
585
- def set_line exp, line_number
586
- if sexp? exp
587
- exp.original_line(exp.original_line || exp.line)
588
- exp.line line_number
589
- exp.each do |e|
590
- set_line e, line_number
591
- end
592
- end
593
-
594
- exp
595
- end
596
-
597
583
  #Finds the inner most call target which is not the target of a call to <<
598
584
  def find_push_target exp
599
585
  if call? exp and exp.method == :<<
@@ -639,7 +639,7 @@ HEADER
639
639
  end
640
640
 
641
641
  def with_link warning, message
642
- "<a href=\"#{warning.link}\">#{message}</a>"
642
+ "<a rel=\"no-referrer\" href=\"#{warning.link}\">#{message}</a>"
643
643
  end
644
644
 
645
645
  #Generated tab-separated output suitable for the Jenkins Brakeman Plugin:
@@ -1,3 +1,3 @@
1
1
  module Brakeman
2
- Version = "1.9.3"
2
+ Version = "1.9.4"
3
3
  end
@@ -54,7 +54,11 @@ module Brakeman::WarningCodes
54
54
  :CVE_2013_0276 => 51,
55
55
  :CVE_2013_0333 => 52,
56
56
  :xss_content_tag => 53,
57
- :mass_assign_without_protection => 54
57
+ :mass_assign_without_protection => 54,
58
+ :CVE_2013_1854 => 55,
59
+ :CVE_2013_1855 => 56,
60
+ :CVE_2013_1856 => 57,
61
+ :CVE_2013_1857 => 58,
58
62
  }
59
63
 
60
64
  def self.code name
@@ -14,6 +14,30 @@ class Sexp
14
14
  raise NoMethodError.new("No method '#{name}' for Sexp", name, args)
15
15
  end
16
16
 
17
+ #Create clone of Sexp and nested Sexps but not their non-Sexp contents.
18
+ #If a line number is provided, also sets line/original_line on all Sexps.
19
+ def deep_clone line = nil
20
+ s = Sexp.new
21
+
22
+ self.each do |e|
23
+ if e.is_a? Sexp
24
+ s << e.deep_clone(line)
25
+ else
26
+ s << e
27
+ end
28
+ end
29
+
30
+ if line
31
+ s.original_line(self.original_line || self.line)
32
+ s.line(line)
33
+ else
34
+ s.original_line(self.original_line)
35
+ s.line(self.line)
36
+ end
37
+
38
+ s
39
+ end
40
+
17
41
  def paren
18
42
  @paren ||= false
19
43
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brakeman
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.3
4
+ version: 1.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Collins
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2013-03-01 00:00:00 Z
12
+ date: 2013-03-19 00:00:00 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ruby_parser
@@ -161,6 +161,8 @@ files:
161
161
  - lib/brakeman/checks/check_mass_assignment.rb
162
162
  - lib/brakeman/checks/check_link_to_href.rb
163
163
  - lib/brakeman/checks/check_filter_skipping.rb
164
+ - lib/brakeman/checks/check_symbol_dos.rb
165
+ - lib/brakeman/checks/check_sanitize_methods.rb
164
166
  - lib/brakeman/checks/check_file_access.rb
165
167
  - lib/brakeman/checks/base_check.rb
166
168
  - lib/brakeman/checks/check_validation_regex.rb
@@ -171,6 +173,7 @@ files:
171
173
  - lib/brakeman/checks/check_json_parsing.rb
172
174
  - lib/brakeman/checks/check_execute.rb
173
175
  - lib/brakeman/checks/check_translate_bug.rb
176
+ - lib/brakeman/checks/check_jruby_xml.rb
174
177
  - lib/brakeman/checks/check_default_routes.rb
175
178
  - lib/brakeman/checks/check_yaml_load.rb
176
179
  - lib/brakeman/checks/check_link_to.rb