brakeman 1.7.0 → 1.7.1
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.
- data/README.md +1 -1
- data/lib/brakeman/checks/check_cross_site_scripting.rb +3 -3
- data/lib/brakeman/checks/check_select_tag.rb +59 -0
- data/lib/brakeman/checks/check_select_vulnerability.rb +3 -1
- data/lib/brakeman/checks/check_single_quotes.rb +100 -0
- data/lib/brakeman/checks/check_strip_tags.rb +36 -7
- data/lib/brakeman/templates/header.html.erb +1 -0
- data/lib/brakeman/version.rb +1 -1
- metadata +6 -4
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|

|
2
2
|
|
3
|
-

|
3
|
+
 [](https://codeclimate.com/github/presidentbeef/brakeman)
|
4
4
|
|
5
5
|
# Brakeman
|
6
6
|
|
@@ -38,7 +38,7 @@ class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck
|
|
38
38
|
@ignore_methods = Set[:button_to, :check_box, :content_tag, :escapeHTML, :escape_once,
|
39
39
|
:field_field, :fields_for, :h, :hidden_field,
|
40
40
|
:hidden_field, :hidden_field_tag, :image_tag, :label,
|
41
|
-
:link_to, :mail_to, :radio_button,
|
41
|
+
:link_to, :mail_to, :radio_button, :select,
|
42
42
|
:submit_tag, :text_area, :text_field,
|
43
43
|
:text_field_tag, :url_encode, :url_for,
|
44
44
|
:will_paginate].merge tracker.options[:safe_methods]
|
@@ -54,8 +54,8 @@ class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck
|
|
54
54
|
@ignore_methods << :auto_link
|
55
55
|
end
|
56
56
|
|
57
|
-
if
|
58
|
-
@
|
57
|
+
if version_between? "2.0.0", "2.3.14"
|
58
|
+
@known_dangerous << :strip_tags
|
59
59
|
end
|
60
60
|
|
61
61
|
tracker.each_template do |name, template|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'brakeman/checks/base_check'
|
2
|
+
|
3
|
+
#Checks for CVE-2012-3463, unescaped input in :prompt option of select_tag:
|
4
|
+
#https://groups.google.com/d/topic/rubyonrails-security/fV3QUToSMSw/discussion
|
5
|
+
class Brakeman::CheckSelectTag < Brakeman::BaseCheck
|
6
|
+
Brakeman::Checks.add self
|
7
|
+
|
8
|
+
@description = "Looks for unsafe uses of select_tag() in some versions of Rails 3.x"
|
9
|
+
|
10
|
+
def run_check
|
11
|
+
|
12
|
+
if version_between? "3.0.0", "3.0.16"
|
13
|
+
suggested_version = "3.0.17"
|
14
|
+
elsif version_between? "3.1.0", "3.1.7"
|
15
|
+
suggested_version = "3.1.8"
|
16
|
+
elsif version_between? "3.2.0", "3.2.7"
|
17
|
+
suggested_version = "3.2.8"
|
18
|
+
else
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
22
|
+
@ignore_methods = Set[:escapeHTML, :escape_once, :h].merge tracker.options[:safe_methods]
|
23
|
+
|
24
|
+
@message = "Upgrade to Rails #{suggested_version}, #{tracker.config[:rails_version]} select_tag is vulnerable (CVE-2012-3463)"
|
25
|
+
|
26
|
+
calls = tracker.find_call(:target => nil, :method => :select_tag).select do |result|
|
27
|
+
result[:location][0] == :template
|
28
|
+
end
|
29
|
+
|
30
|
+
calls.each do |result|
|
31
|
+
process_result result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
#Check if select_tag is called with user input in :prompt option
|
36
|
+
def process_result result
|
37
|
+
return if duplicate? result
|
38
|
+
add_result result
|
39
|
+
|
40
|
+
#Only concerned if user input is supplied for :prompt option
|
41
|
+
last_arg = result[:call][3][-1]
|
42
|
+
|
43
|
+
if hash? last_arg
|
44
|
+
prompt_option = hash_access last_arg, :prompt
|
45
|
+
|
46
|
+
if call? prompt_option and @ignore_methods.include? prompt_option[2]
|
47
|
+
return
|
48
|
+
elsif sexp? prompt_option and input = include_user_input?(prompt_option)
|
49
|
+
|
50
|
+
warn :warning_type => "Cross Site Scripting",
|
51
|
+
:result => result,
|
52
|
+
:message => @message,
|
53
|
+
:confidence => CONFIDENCE[:high],
|
54
|
+
:user_input => input.match,
|
55
|
+
:link_path => "https://groups.google.com/d/topic/rubyonrails-security/fV3QUToSMSw/discussion"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -5,7 +5,7 @@ require 'brakeman/checks/base_check'
|
|
5
5
|
class Brakeman::CheckSelectVulnerability < Brakeman::BaseCheck
|
6
6
|
Brakeman::Checks.add self
|
7
7
|
|
8
|
-
@description = "Looks for unsafe uses of select() helper
|
8
|
+
@description = "Looks for unsafe uses of select() helper"
|
9
9
|
|
10
10
|
def run_check
|
11
11
|
|
@@ -15,6 +15,8 @@ class Brakeman::CheckSelectVulnerability < Brakeman::BaseCheck
|
|
15
15
|
suggested_version = "3.1.4"
|
16
16
|
elsif version_between? "3.2.0", "3.2.1"
|
17
17
|
suggested_version = "3.2.2"
|
18
|
+
elsif version_between? "2.0.0", "3.0.0"
|
19
|
+
suggested_version = "3 or use options_for_select"
|
18
20
|
else
|
19
21
|
return
|
20
22
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'brakeman/checks/base_check'
|
2
|
+
|
3
|
+
#Checks for versions which do not escape single quotes.
|
4
|
+
#https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion
|
5
|
+
class Brakeman::CheckSingleQuotes < Brakeman::BaseCheck
|
6
|
+
Brakeman::Checks.add self
|
7
|
+
RACK_UTILS = Sexp.new(:colon2, Sexp.new(:const, :Rack), :Utils)
|
8
|
+
|
9
|
+
@description = "Check for versions which do not escape single quotes (CVE-2012-3464)"
|
10
|
+
|
11
|
+
def initialize *args
|
12
|
+
super
|
13
|
+
@inside_erb = @inside_util = @inside_html_escape = @uses_rack_escape = false
|
14
|
+
end
|
15
|
+
|
16
|
+
def run_check
|
17
|
+
return if uses_rack_escape?
|
18
|
+
|
19
|
+
case
|
20
|
+
when version_between?('2.0.0', '2.3.14')
|
21
|
+
message = "All Rails 2.x versions do not escape single quotes (CVE-2012-3464)"
|
22
|
+
when version_between?('3.0.0', '3.0.16')
|
23
|
+
message = "Rails #{tracker.config[:rails_version]} does not escape single quotes (CVE-2012-3464). Upgrade to 3.0.17"
|
24
|
+
when version_between?('3.1.0', '3.1.7')
|
25
|
+
message = "Rails #{tracker.config[:rails_version]} does not escape single quotes (CVE-2012-3464). Upgrade to 3.1.8"
|
26
|
+
when version_between?('3.2.0', '3.2.7')
|
27
|
+
message = "Rails #{tracker.config[:rails_version]} does not escape single quotes (CVE-2012-3464). Upgrade to 3.2.8"
|
28
|
+
else
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
warn :warning_type => "Cross Site Scripting",
|
33
|
+
:message => message,
|
34
|
+
:confidence => CONFIDENCE[:med],
|
35
|
+
:file => gemfile_or_environment,
|
36
|
+
:link_path => "https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion"
|
37
|
+
end
|
38
|
+
|
39
|
+
#Process initializers to see if they use workaround
|
40
|
+
#by replacing Erb::Util.html_escape
|
41
|
+
def uses_rack_escape?
|
42
|
+
@tracker.initializers.each do |name, src|
|
43
|
+
process src
|
44
|
+
end
|
45
|
+
|
46
|
+
@uses_rack_escape
|
47
|
+
end
|
48
|
+
|
49
|
+
#Look for
|
50
|
+
#
|
51
|
+
# class ERB
|
52
|
+
def process_class exp
|
53
|
+
if exp[1] == :ERB
|
54
|
+
@inside_erb = true
|
55
|
+
process exp[-1]
|
56
|
+
@inside_erb = false
|
57
|
+
end
|
58
|
+
|
59
|
+
exp
|
60
|
+
end
|
61
|
+
|
62
|
+
#Look for
|
63
|
+
#
|
64
|
+
# module Util
|
65
|
+
def process_module exp
|
66
|
+
if @inside_erb and exp[1] == :Util
|
67
|
+
@inside_util = true
|
68
|
+
process exp[-1]
|
69
|
+
@inside_util = false
|
70
|
+
end
|
71
|
+
|
72
|
+
exp
|
73
|
+
end
|
74
|
+
|
75
|
+
#Look for
|
76
|
+
#
|
77
|
+
# def html_escape
|
78
|
+
def process_defn exp
|
79
|
+
if @inside_util and exp[1] == :html_escape
|
80
|
+
@inside_html_escape = true
|
81
|
+
process exp[-1]
|
82
|
+
@inside_html_escape = false
|
83
|
+
end
|
84
|
+
|
85
|
+
exp
|
86
|
+
end
|
87
|
+
|
88
|
+
#Look for
|
89
|
+
#
|
90
|
+
# Rack::Utils.escape_html
|
91
|
+
def process_call exp
|
92
|
+
if @inside_html_escape and exp[1] == RACK_UTILS and exp[2] == :escape_html
|
93
|
+
@uses_rack_escape = true
|
94
|
+
else
|
95
|
+
process exp[1] if exp[1]
|
96
|
+
end
|
97
|
+
|
98
|
+
exp
|
99
|
+
end
|
100
|
+
end
|
@@ -1,30 +1,59 @@
|
|
1
1
|
require 'brakeman/checks/base_check'
|
2
2
|
|
3
|
-
#
|
3
|
+
#Check for uses of strip_tags in Rails versions before 3.0.17, 3.1.8, 3.2.8 (including 2.3.x):
|
4
|
+
#https://groups.google.com/d/topic/rubyonrails-security/FgVEtBajcTY/discussion
|
5
|
+
#
|
6
|
+
#Check for uses of strip_tags in Rails versions before 2.3.13 and 3.0.10:
|
4
7
|
#http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2b9130749b74ea12
|
5
8
|
class Brakeman::CheckStripTags < Brakeman::BaseCheck
|
6
9
|
Brakeman::Checks.add self
|
7
10
|
|
8
|
-
@description = "Report strip_tags
|
11
|
+
@description = "Report strip_tags vulnerabilities CVE-2011-2931 and CVE-2012-3465"
|
9
12
|
|
10
13
|
def run_check
|
11
|
-
if
|
12
|
-
|
14
|
+
if uses_strip_tags?
|
15
|
+
cve_2011_2931
|
16
|
+
cve_2012_3465
|
17
|
+
end
|
18
|
+
end
|
13
19
|
|
20
|
+
def cve_2011_2931
|
21
|
+
if version_between?('2.0.0', '2.3.12') or version_between?('3.0.0', '3.0.9')
|
14
22
|
if tracker.config[:rails_version] =~ /^3/
|
15
|
-
message = "Versions before 3.0.10 have a vulnerability in strip_tags
|
23
|
+
message = "Versions before 3.0.10 have a vulnerability in strip_tags (CVE-2011-2931)"
|
16
24
|
else
|
17
|
-
message = "Versions before 2.3.13 have a vulnerability in strip_tags
|
25
|
+
message = "Versions before 2.3.13 have a vulnerability in strip_tags (CVE-2011-2931)"
|
18
26
|
end
|
19
27
|
|
20
28
|
warn :warning_type => "Cross Site Scripting",
|
21
29
|
:message => message,
|
22
|
-
:confidence => CONFIDENCE[:high],
|
23
30
|
:file => gemfile_or_environment,
|
31
|
+
:confidence => CONFIDENCE[:high],
|
24
32
|
:link_path => "https://groups.google.com/d/topic/rubyonrails-security/K5EwdJt06hI/discussion"
|
25
33
|
end
|
26
34
|
end
|
27
35
|
|
36
|
+
def cve_2012_3465
|
37
|
+
case
|
38
|
+
when (version_between?('2.0.0', '2.3.14') and tracker.config[:escape_html])
|
39
|
+
message = "All Rails 2.x versions have a vulnerability in strip_tags (CVE-2012-3465)"
|
40
|
+
when version_between?('3.0.10', '3.0.16')
|
41
|
+
message = "Rails #{tracker.config[:rails_version]} has a vulnerability in strip_tags (CVE-2012-3465). Upgrade to 3.0.17"
|
42
|
+
when version_between?('3.1.0', '3.1.7')
|
43
|
+
message = "Rails #{tracker.config[:rails_version]} has a vulnerability in strip_tags (CVE-2012-3465). Upgrade to 3.1.8"
|
44
|
+
when version_between?('3.2.0', '3.2.7')
|
45
|
+
message = "Rails #{tracker.config[:rails_version]} has a vulnerability in strip_tags (CVE-2012-3465). Upgrade to 3.2.8"
|
46
|
+
else
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
warn :warning_type => "Cross Site Scripting",
|
51
|
+
:message => message,
|
52
|
+
:confidence => CONFIDENCE[:high],
|
53
|
+
:file => gemfile_or_environment,
|
54
|
+
:link_path => "https://groups.google.com/d/topic/rubyonrails-security/FgVEtBajcTY/discussion"
|
55
|
+
end
|
56
|
+
|
28
57
|
def uses_strip_tags?
|
29
58
|
Brakeman.debug "Finding calls to strip_tags()"
|
30
59
|
|
data/lib/brakeman/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brakeman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 1.7.
|
9
|
+
- 1
|
10
|
+
version: 1.7.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Justin Collins
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-08-13 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activesupport
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- lib/brakeman/format/style.css
|
206
206
|
- lib/brakeman/checks/check_select_vulnerability.rb
|
207
207
|
- lib/brakeman/checks/check_escape_function.rb
|
208
|
+
- lib/brakeman/checks/check_single_quotes.rb
|
208
209
|
- lib/brakeman/checks/check_basic_auth.rb
|
209
210
|
- lib/brakeman/checks/check_safe_buffer_manipulation.rb
|
210
211
|
- lib/brakeman/checks/check_forgery_setting.rb
|
@@ -215,6 +216,7 @@ files:
|
|
215
216
|
- lib/brakeman/checks/check_response_splitting.rb
|
216
217
|
- lib/brakeman/checks/check_mail_to.rb
|
217
218
|
- lib/brakeman/checks/check_sql.rb
|
219
|
+
- lib/brakeman/checks/check_select_tag.rb
|
218
220
|
- lib/brakeman/checks/check_mass_assignment.rb
|
219
221
|
- lib/brakeman/checks/check_link_to_href.rb
|
220
222
|
- lib/brakeman/checks/check_filter_skipping.rb
|