brakeman-min 4.3.1 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +24 -1
- data/README.md +35 -6
- data/bin/brakeman +2 -0
- data/lib/brakeman.rb +5 -3
- data/lib/brakeman/app_tree.rb +15 -1
- data/lib/brakeman/call_index.rb +7 -4
- data/lib/brakeman/checks.rb +16 -8
- data/lib/brakeman/checks/base_check.rb +2 -19
- data/lib/brakeman/checks/check_basic_auth_timing_attack.rb +1 -1
- data/lib/brakeman/checks/check_content_tag.rb +4 -4
- data/lib/brakeman/checks/check_create_with.rb +1 -1
- data/lib/brakeman/checks/check_cross_site_scripting.rb +3 -3
- data/lib/brakeman/checks/check_default_routes.rb +3 -3
- data/lib/brakeman/checks/check_deserialize.rb +1 -1
- data/lib/brakeman/checks/check_detailed_exceptions.rb +1 -1
- data/lib/brakeman/checks/check_digest_dos.rb +4 -4
- data/lib/brakeman/checks/check_escape_function.rb +1 -1
- data/lib/brakeman/checks/check_execute.rb +5 -4
- data/lib/brakeman/checks/check_file_access.rb +13 -3
- data/lib/brakeman/checks/check_file_disclosure.rb +1 -1
- data/lib/brakeman/checks/check_filter_skipping.rb +1 -1
- data/lib/brakeman/checks/check_forgery_setting.rb +3 -3
- data/lib/brakeman/checks/check_header_dos.rb +3 -3
- data/lib/brakeman/checks/check_i18n_xss.rb +3 -3
- data/lib/brakeman/checks/check_jruby_xml.rb +1 -1
- data/lib/brakeman/checks/check_json_encoding.rb +3 -3
- data/lib/brakeman/checks/check_json_parsing.rb +8 -11
- data/lib/brakeman/checks/check_link_to.rb +3 -3
- data/lib/brakeman/checks/check_link_to_href.rb +2 -2
- data/lib/brakeman/checks/check_mail_to.rb +3 -3
- data/lib/brakeman/checks/check_mime_type_dos.rb +1 -1
- data/lib/brakeman/checks/check_model_attributes.rb +4 -4
- data/lib/brakeman/checks/check_model_serialize.rb +1 -1
- data/lib/brakeman/checks/check_nested_attributes.rb +3 -3
- data/lib/brakeman/checks/check_nested_attributes_bypass.rb +1 -1
- data/lib/brakeman/checks/check_number_to_currency.rb +4 -4
- data/lib/brakeman/checks/check_quote_table_name.rb +2 -2
- data/lib/brakeman/checks/check_regex_dos.rb +1 -1
- data/lib/brakeman/checks/check_render.rb +2 -2
- data/lib/brakeman/checks/check_render_dos.rb +1 -1
- data/lib/brakeman/checks/check_render_inline.rb +1 -1
- data/lib/brakeman/checks/check_response_splitting.rb +1 -1
- data/lib/brakeman/checks/check_route_dos.rb +1 -1
- data/lib/brakeman/checks/check_safe_buffer_manipulation.rb +1 -1
- data/lib/brakeman/checks/check_sanitize_methods.rb +3 -3
- data/lib/brakeman/checks/check_secrets.rb +1 -1
- data/lib/brakeman/checks/check_select_tag.rb +1 -1
- data/lib/brakeman/checks/check_select_vulnerability.rb +1 -1
- data/lib/brakeman/checks/check_session_manipulation.rb +1 -1
- data/lib/brakeman/checks/check_session_settings.rb +1 -1
- data/lib/brakeman/checks/check_simple_format.rb +2 -2
- data/lib/brakeman/checks/check_single_quotes.rb +14 -10
- data/lib/brakeman/checks/check_skip_before_filter.rb +2 -2
- data/lib/brakeman/checks/check_sprockets_path_traversal.rb +39 -0
- data/lib/brakeman/checks/check_sql.rb +1 -1
- data/lib/brakeman/checks/check_sql_cves.rb +2 -2
- data/lib/brakeman/checks/check_strip_tags.rb +10 -8
- data/lib/brakeman/checks/check_symbol_dos.rb +1 -1
- data/lib/brakeman/checks/check_symbol_dos_cve.rb +1 -1
- data/lib/brakeman/checks/check_translate_bug.rb +7 -7
- data/lib/brakeman/checks/check_unsafe_reflection.rb +1 -1
- data/lib/brakeman/checks/check_unscoped_find.rb +1 -1
- data/lib/brakeman/checks/check_validation_regex.rb +1 -1
- data/lib/brakeman/checks/check_weak_hash.rb +18 -19
- data/lib/brakeman/checks/check_xml_dos.rb +1 -1
- data/lib/brakeman/checks/check_yaml_parsing.rb +1 -1
- data/lib/brakeman/format/style.css +8 -0
- data/lib/brakeman/messages.rb +220 -0
- data/lib/brakeman/options.rb +13 -0
- data/lib/brakeman/parsers/template_parser.rb +2 -2
- data/lib/brakeman/processors/alias_processor.rb +7 -0
- data/lib/brakeman/processors/config_processor.rb +4 -1
- data/lib/brakeman/processors/gem_processor.rb +30 -2
- data/lib/brakeman/processors/lib/call_conversion_helper.rb +2 -1
- data/lib/brakeman/processors/lib/rails3_route_processor.rb +0 -2
- data/lib/brakeman/processors/lib/rails4_config_processor.rb +18 -0
- data/lib/brakeman/processors/lib/render_helper.rb +5 -0
- data/lib/brakeman/processors/lib/render_path.rb +15 -0
- data/lib/brakeman/processors/library_processor.rb +1 -1
- data/lib/brakeman/report/report_base.rb +17 -161
- data/lib/brakeman/report/report_csv.rb +17 -0
- data/lib/brakeman/report/report_html.rb +34 -31
- data/lib/brakeman/report/report_json.rb +21 -0
- data/lib/brakeman/report/report_markdown.rb +13 -6
- data/lib/brakeman/report/report_table.rb +157 -0
- data/lib/brakeman/report/report_tabs.rb +3 -1
- data/lib/brakeman/report/report_text.rb +16 -0
- data/lib/brakeman/scanner.rb +5 -1
- data/lib/brakeman/tracker/config.rb +1 -1
- data/lib/brakeman/util.rb +0 -17
- data/lib/brakeman/version.rb +1 -1
- data/lib/brakeman/warning.rb +9 -4
- data/lib/brakeman/warning_codes.rb +1 -0
- metadata +9 -6
@@ -25,7 +25,7 @@ class Brakeman::CheckRenderDoS < Brakeman::BaseCheck
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def warn_about_text_render
|
28
|
-
message = "
|
28
|
+
message = msg(msg_version(rails_version), " has a denial of service vulnerability ", msg_cve("CVE-2014-0082"), ". Upgrade to ", msg_version("3.2.17"))
|
29
29
|
|
30
30
|
warn :warning_type => "Denial of Service",
|
31
31
|
:warning_code => :CVE_2014_0082,
|
@@ -26,7 +26,7 @@ class Brakeman::CheckRenderInline < Brakeman::CheckCrossSiteScripting
|
|
26
26
|
warn :result => result,
|
27
27
|
:warning_type => "Cross-Site Scripting",
|
28
28
|
:warning_code => :cross_site_scripting_inline,
|
29
|
-
:message => "Unescaped
|
29
|
+
:message => msg("Unescaped ", msg_input(input), " rendered inline"),
|
30
30
|
:user_input => input,
|
31
31
|
:confidence => :high
|
32
32
|
elsif input = has_immediate_model?(render_value)
|
@@ -12,7 +12,7 @@ class Brakeman::CheckResponseSplitting < Brakeman::BaseCheck
|
|
12
12
|
|
13
13
|
warn :warning_type => "Response Splitting",
|
14
14
|
:warning_code => :CVE_2011_3186,
|
15
|
-
:message => "
|
15
|
+
:message => msg("Rails versions before 2.3.14 have a vulnerability content type handling allowing injection of headers ", msg_cve("CVE-2011-3186")),
|
16
16
|
:confidence => :medium,
|
17
17
|
:gem_info => gemfile_or_environment,
|
18
18
|
:link_path => "https://groups.google.com/d/topic/rubyonrails-security/b_yTveAph2g/discussion"
|
@@ -16,7 +16,7 @@ class Brakeman::CheckRouteDoS < Brakeman::BaseCheck
|
|
16
16
|
end
|
17
17
|
|
18
18
|
if controller_wildcards?
|
19
|
-
message = "
|
19
|
+
message = msg(msg_version(rails_version), " has a denial of service vulnerability with ", msg_code(":controller"), " routes ", msg_cve("CVE-2015-7581"), ". Upgrade to ", msg_version(fix_version))
|
20
20
|
|
21
21
|
warn :warning_type => "Denial of Service",
|
22
22
|
:warning_code => :CVE_2015_7581,
|
@@ -20,7 +20,7 @@ class Brakeman::CheckSafeBufferManipulation < Brakeman::BaseCheck
|
|
20
20
|
return
|
21
21
|
end
|
22
22
|
|
23
|
-
message = "
|
23
|
+
message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code("SafeBuffer"), ". Upgrade to ", msg_version(suggested_version), " or apply patches")
|
24
24
|
|
25
25
|
warn :warning_type => "Cross-Site Scripting",
|
26
26
|
:warning_code => :safe_buffer_vuln,
|
@@ -44,7 +44,7 @@ class Brakeman::CheckSanitizeMethods < Brakeman::BaseCheck
|
|
44
44
|
next if duplicate? result
|
45
45
|
add_result result
|
46
46
|
|
47
|
-
message = "
|
47
|
+
message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code(method), ". Upgrade to ", msg_version(@fix_version), " or patch")
|
48
48
|
|
49
49
|
warn :result => result,
|
50
50
|
:warning_type => "Cross-Site Scripting",
|
@@ -70,7 +70,7 @@ class Brakeman::CheckSanitizeMethods < Brakeman::BaseCheck
|
|
70
70
|
|
71
71
|
def check_cve_2018_8048
|
72
72
|
if loofah_vulnerable_cve_2018_8048?
|
73
|
-
message =
|
73
|
+
message = msg(msg_version(tracker.config.gem_version(:loofah), "loofah gem"), " is vulnerable (CVE-2018-8048). Upgrade to 2.1.2")
|
74
74
|
|
75
75
|
if tracker.find_call(:target => false, :method => :sanitize).any?
|
76
76
|
confidence = :high
|
@@ -94,7 +94,7 @@ class Brakeman::CheckSanitizeMethods < Brakeman::BaseCheck
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def warn_sanitizer_cve cve, link, upgrade_version
|
97
|
-
message =
|
97
|
+
message = msg(msg_version(tracker.config.gem_version(:'rails-html-sanitizer'), "rails-html-sanitizer"), " is vulnerable ", msg_cve(cve), ". Upgrade to ", msg_version(upgrade_version, "rails-html-sanitizer"))
|
98
98
|
|
99
99
|
if tracker.find_call(:target => false, :method => :sanitize).any?
|
100
100
|
confidence = :high
|
@@ -24,7 +24,7 @@ class Brakeman::CheckSecrets < Brakeman::BaseCheck
|
|
24
24
|
|
25
25
|
warn :warning_code => :secret_in_source,
|
26
26
|
:warning_type => "Authentication",
|
27
|
-
:message => "Hardcoded value for
|
27
|
+
:message => msg("Hardcoded value for ", msg_code(name), " in source code"),
|
28
28
|
:confidence => :medium,
|
29
29
|
:file => constant.file,
|
30
30
|
:line => constant.line
|
@@ -21,7 +21,7 @@ class Brakeman::CheckSelectTag < Brakeman::BaseCheck
|
|
21
21
|
|
22
22
|
@ignore_methods = Set[:escapeHTML, :escape_once, :h].merge tracker.options[:safe_methods]
|
23
23
|
|
24
|
-
@message = "Upgrade to
|
24
|
+
@message = msg("Upgrade to ", msg_version(suggested_version), ". In ", msg_version(rails_version), " ", msg_code("select_tag"), " is vulnerable ", msg_cve("CVE-2012-3463"))
|
25
25
|
|
26
26
|
calls = tracker.find_call(:target => nil, :method => :select_tag).select do |result|
|
27
27
|
result[:location][:type] == :template
|
@@ -23,7 +23,7 @@ class Brakeman::CheckSelectVulnerability < Brakeman::BaseCheck
|
|
23
23
|
return
|
24
24
|
end
|
25
25
|
|
26
|
-
@message = "Upgrade to
|
26
|
+
@message = msg("Upgrade to ", msg_version(suggested_version), ". In ", msg_version(rails_version), " ", msg_code("select"), " helper is vulnerable")
|
27
27
|
|
28
28
|
calls = tracker.find_call(:target => nil, :method => :select).select do |result|
|
29
29
|
result[:location][:type] == :template
|
@@ -26,7 +26,7 @@ class Brakeman::CheckSessionManipulation < Brakeman::BaseCheck
|
|
26
26
|
warn :result => result,
|
27
27
|
:warning_type => "Session Manipulation",
|
28
28
|
:warning_code => :session_key_manipulation,
|
29
|
-
:message =>
|
29
|
+
:message => msg(msg_input(input), " used as key in session hash"),
|
30
30
|
:code => result[:call],
|
31
31
|
:user_input => input,
|
32
32
|
:confidence => confidence
|
@@ -123,7 +123,7 @@ class Brakeman::CheckSessionSettings < Brakeman::BaseCheck
|
|
123
123
|
return
|
124
124
|
end
|
125
125
|
|
126
|
-
if secrets["production"] and secret = secrets["production"]["secret_key_base"]
|
126
|
+
if secrets && secrets["production"] and secret = secrets["production"]["secret_key_base"]
|
127
127
|
unless secret.include? "<%="
|
128
128
|
line = yaml.lines.find_index { |l| l.include? secret } + 1
|
129
129
|
|
@@ -16,7 +16,7 @@ class Brakeman::CheckSimpleFormat < Brakeman::CheckCrossSiteScripting
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def generic_warning
|
19
|
-
message = "
|
19
|
+
message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code("simple_format"), " ", msg_cve("CVE-2013-6416"), ". Upgrade to ", msg_version("4.0.2"))
|
20
20
|
|
21
21
|
warn :warning_type => "Cross-Site Scripting",
|
22
22
|
:warning_code => :CVE_2013_6416,
|
@@ -50,7 +50,7 @@ class Brakeman::CheckSimpleFormat < Brakeman::CheckCrossSiteScripting
|
|
50
50
|
warn :result => result,
|
51
51
|
:warning_type => "Cross-Site Scripting",
|
52
52
|
:warning_code => :CVE_2013_6416_call,
|
53
|
-
:message => "Values passed to simple_format are not safe in
|
53
|
+
:message => msg("Values passed to ", msg_code("simple_format"), " are not safe in ", msg_version(rails_version)),
|
54
54
|
:confidence => :high,
|
55
55
|
:link_path => "https://groups.google.com/d/msg/ruby-security-ann/5ZI1-H5OoIM/ZNq4FoR2GnIJ",
|
56
56
|
:user_input => match
|
@@ -16,17 +16,21 @@ class Brakeman::CheckSingleQuotes < Brakeman::BaseCheck
|
|
16
16
|
def run_check
|
17
17
|
return if uses_rack_escape?
|
18
18
|
|
19
|
-
|
20
|
-
|
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 #{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 #{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 #{rails_version} does not escape single quotes (CVE-2012-3464). Upgrade to 3.2.8"
|
19
|
+
if version_between? '2.0.0', '2.3.14'
|
20
|
+
message = msg("All Rails 2.x versions do not escape single quotes ", msg_cve("CVE-2012-3464"))
|
28
21
|
else
|
29
|
-
|
22
|
+
message = msg(msg_version(rails_version), " does not escape single quotes ", msg_cve("CVE-2012-3464"), ". Upgrade to ")
|
23
|
+
|
24
|
+
case
|
25
|
+
when version_between?('3.0.0', '3.0.16')
|
26
|
+
message << msg_version('3.0.17')
|
27
|
+
when version_between?('3.1.0', '3.1.7')
|
28
|
+
message << msg_version('3.1.8')
|
29
|
+
when version_between?('3.2.0', '3.2.7')
|
30
|
+
message << msg_version('3.2.8')
|
31
|
+
else
|
32
|
+
return
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
warn :warning_type => "Cross-Site Scripting",
|
@@ -26,7 +26,7 @@ class Brakeman::CheckSkipBeforeFilter < Brakeman::BaseCheck
|
|
26
26
|
warn :class => controller.name, #ugh this should be a controller warning, too
|
27
27
|
:warning_type => "Cross-Site Request Forgery",
|
28
28
|
:warning_code => :csrf_blacklist,
|
29
|
-
:message => "Use whitelist (:only => [..]) when skipping CSRF check",
|
29
|
+
:message => msg("Use whitelist (", msg_code(":only => [..]"), ") when skipping CSRF check"),
|
30
30
|
:code => filter,
|
31
31
|
:confidence => :medium,
|
32
32
|
:file => controller.file
|
@@ -35,7 +35,7 @@ class Brakeman::CheckSkipBeforeFilter < Brakeman::BaseCheck
|
|
35
35
|
warn :controller => controller.name,
|
36
36
|
:warning_code => :auth_blacklist,
|
37
37
|
:warning_type => "Authentication",
|
38
|
-
:message => "Use whitelist (:only => [..]) when skipping authentication",
|
38
|
+
:message => msg("Use whitelist (", msg_code(":only => [..]"), ") when skipping authentication"),
|
39
39
|
:code => filter,
|
40
40
|
:confidence => :medium,
|
41
41
|
:link => "authentication_whitelist",
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Brakeman::CheckSprocketsPathTraversal < Brakeman::BaseCheck
|
2
|
+
Brakeman::Checks.add self
|
3
|
+
|
4
|
+
@description = "Checks for CVE-2018-3760"
|
5
|
+
|
6
|
+
def run_check
|
7
|
+
sprockets_version = tracker.config.gem_version(:sprockets)
|
8
|
+
|
9
|
+
return unless sprockets_version
|
10
|
+
return if has_workaround?
|
11
|
+
|
12
|
+
case
|
13
|
+
when version_between?("0.0.0", "2.12.4", sprockets_version)
|
14
|
+
upgrade_version = "2.12.5"
|
15
|
+
confidence = :weak
|
16
|
+
when version_between?("3.0.0", "3.7.1", sprockets_version)
|
17
|
+
upgrade_version = "3.7.2"
|
18
|
+
confidence = :high
|
19
|
+
when version_between?("4.0.0.beta1", "4.0.0.beta7", sprockets_version)
|
20
|
+
upgrade_version = "4.0.0.beta8"
|
21
|
+
confidence = :high
|
22
|
+
else
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
message = msg(msg_version(sprockets_version, "sprockets"), " has a path traversal vulnerability ", msg_cve("CVE-2018-3760"), ". Upgrade to ", msg_version(upgrade_version, "sprockets"), " or newer")
|
27
|
+
|
28
|
+
warn :warning_type => "Path Traversal",
|
29
|
+
:warning_code => :CVE_2018_3760,
|
30
|
+
:message => message,
|
31
|
+
:confidence => confidence,
|
32
|
+
:gem_info => gemfile_or_environment(:sprockets),
|
33
|
+
:link_path => "https://groups.google.com/d/msg/rubyonrails-security/ft_J--l55fM/7roDfQ50BwAJ"
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_workaround?
|
37
|
+
false? (tracker.config.rails[:assets] and tracker.config.rails[:assets][:compile])
|
38
|
+
end
|
39
|
+
end
|
@@ -247,7 +247,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
|
|
247
247
|
warn :result => result,
|
248
248
|
:warning_type => "SQL Injection",
|
249
249
|
:warning_code => :sql_injection_limit_offset,
|
250
|
-
:message => "Upgrade to Rails >= 2.1.2 to escape :limit and
|
250
|
+
:message => msg("Upgrade to Rails >= 2.1.2 to escape ", msg_code(":limit"), " and ", msg_code("offset"), ". Possible SQL injection"),
|
251
251
|
:confidence => confidence
|
252
252
|
end
|
253
253
|
end
|
@@ -78,7 +78,7 @@ class Brakeman::CheckSQLCVEs < Brakeman::BaseCheck
|
|
78
78
|
|
79
79
|
warn :warning_type => 'SQL Injection',
|
80
80
|
:warning_code => code,
|
81
|
-
:message => "
|
81
|
+
:message => msg(msg_version(rails_version), " contains a SQL injection vulnerability ", msg_cve(cve), ". Upgrade to ", msg_version(upgrade_version)),
|
82
82
|
:confidence => :high,
|
83
83
|
:gem_info => gemfile_or_environment,
|
84
84
|
:link_path => link
|
@@ -98,7 +98,7 @@ class Brakeman::CheckSQLCVEs < Brakeman::BaseCheck
|
|
98
98
|
|
99
99
|
warn :warning_type => 'SQL Injection',
|
100
100
|
:warning_code => :CVE_2014_0080,
|
101
|
-
:message => "
|
101
|
+
:message => msg(msg_version(rails_version), " contains a SQL injection vulnerability ", msg_cve("CVE-2014-0080"), " with PostgreSQL. Upgrade to ", msg_version("4.0.3")),
|
102
102
|
:confidence => :high,
|
103
103
|
:gem_info => gemfile_or_environment(:pg),
|
104
104
|
:link_path => "https://groups.google.com/d/msg/rubyonrails-security/Wu96YkTUR6s/pPLBMZrlwvYJ"
|
@@ -25,9 +25,9 @@ class Brakeman::CheckStripTags < Brakeman::BaseCheck
|
|
25
25
|
def cve_2011_2931
|
26
26
|
if version_between?('2.0.0', '2.3.12') or version_between?('3.0.0', '3.0.9')
|
27
27
|
if rails_version =~ /^3/
|
28
|
-
message = "Versions before 3.0.10 have a vulnerability in strip_tags (CVE-2011-2931)
|
28
|
+
message = msg("Versions before 3.0.10 have a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2011-2931"))
|
29
29
|
else
|
30
|
-
message = "Versions before 2.3.13 have a vulnerability in strip_tags (CVE-2011-2931)
|
30
|
+
message = msg("Versions before 2.3.13 have a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2011-2931"))
|
31
31
|
end
|
32
32
|
|
33
33
|
warn :warning_type => "Cross-Site Scripting",
|
@@ -40,15 +40,17 @@ class Brakeman::CheckStripTags < Brakeman::BaseCheck
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def cve_2012_3465
|
43
|
+
message = msg(msg_version(rails_version), " has a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2012-3465"), ". Upgrade to ")
|
44
|
+
|
43
45
|
case
|
44
46
|
when (version_between?('2.0.0', '2.3.14') and tracker.config.escape_html?)
|
45
|
-
message = "All Rails 2.x versions have a vulnerability in strip_tags (CVE-2012-3465)
|
47
|
+
message = msg("All Rails 2.x versions have a vulnerability in ", msg_code("strip_tags"), " ", msg_cve("CVE-2012-3465"))
|
46
48
|
when version_between?('3.0.10', '3.0.16')
|
47
|
-
message
|
49
|
+
message << msg_version('3.0.17')
|
48
50
|
when version_between?('3.1.0', '3.1.7')
|
49
|
-
message
|
51
|
+
message << msg_version('3.1.8')
|
50
52
|
when version_between?('3.2.0', '3.2.7')
|
51
|
-
message
|
53
|
+
message << msg_version('3.2.8')
|
52
54
|
else
|
53
55
|
return
|
54
56
|
end
|
@@ -69,13 +71,13 @@ class Brakeman::CheckStripTags < Brakeman::BaseCheck
|
|
69
71
|
confidence = :medium
|
70
72
|
end
|
71
73
|
|
72
|
-
message = "rails-html-sanitizer
|
74
|
+
message = msg(msg_version("1.0.2", "rails-html-sanitizer"), " is vulnerable (CVE-2015-7579). Upgrade to ", msg_version("1.0.3", "rails-html-sanitizer"))
|
73
75
|
|
74
76
|
warn :warning_type => "Cross-Site Scripting",
|
75
77
|
:warning_code => :CVE_2015_7579,
|
76
78
|
:message => message,
|
77
79
|
:confidence => confidence,
|
78
|
-
:gem_info => gemfile_or_environment,
|
80
|
+
:gem_info => gemfile_or_environment(:"rails-html-sanitizer"),
|
79
81
|
:link_path => "https://groups.google.com/d/msg/rubyonrails-security/OU9ugTZcbjc/PjEP46pbFQAJ"
|
80
82
|
|
81
83
|
end
|
@@ -38,7 +38,7 @@ class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck
|
|
38
38
|
return if safe_parameter? input.match
|
39
39
|
return if symbolizing_attributes? input
|
40
40
|
|
41
|
-
message = "Symbol conversion from unsafe string (
|
41
|
+
message = msg("Symbol conversion from unsafe string in ", msg_input(input))
|
42
42
|
|
43
43
|
warn :result => result,
|
44
44
|
:warning_type => "Denial of Service",
|
@@ -20,7 +20,7 @@ class Brakeman::CheckSymbolDoSCVE < Brakeman::BaseCheck
|
|
20
20
|
if fix_version && active_record_models.any?
|
21
21
|
warn :warning_type => "Denial of Service",
|
22
22
|
:warning_code => :CVE_2013_1854,
|
23
|
-
:message => "
|
23
|
+
:message => msg(msg_version(rails_version), " has a denial of service vulnerability in ActiveRecord. Upgrade to ", msg_version(fix_version), " or patch"),
|
24
24
|
:confidence => :medium,
|
25
25
|
:gem_info => gemfile_or_environment,
|
26
26
|
:link => "https://groups.google.com/d/msg/rubyonrails-security/jgJ4cjjS8FE/BGbHRxnDRTIJ"
|
@@ -18,15 +18,15 @@ class Brakeman::CheckTranslateBug < Brakeman::BaseCheck
|
|
18
18
|
:medium
|
19
19
|
end
|
20
20
|
|
21
|
-
description = "
|
21
|
+
description = [" has a vulnerability in the translate helper with keys ending in ", msg_code("_html")]
|
22
22
|
|
23
23
|
message = if rails_version =~ /^3\.1/
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
msg(msg_version(rails_version), *description, ". Upgrade to ", msg_version("3.1.2"))
|
25
|
+
elsif rails_version =~ /^3\.0/
|
26
|
+
msg(msg_version(rails_version), *description, ". Upgrade to ", msg_version("3.0.11"))
|
27
|
+
else
|
28
|
+
msg("Rails 2.3.x using the rails_xss plugin", *description)
|
29
|
+
end
|
30
30
|
|
31
31
|
warn :warning_type => "Cross-Site Scripting",
|
32
32
|
:warning_code => :translate_vuln,
|
@@ -37,7 +37,7 @@ class Brakeman::CheckUnsafeReflection < Brakeman::BaseCheck
|
|
37
37
|
end
|
38
38
|
|
39
39
|
if confidence
|
40
|
-
message = "Unsafe reflection method
|
40
|
+
message = msg("Unsafe reflection method ", msg_code(method), " called with ", msg_input(input))
|
41
41
|
|
42
42
|
warn :result => result,
|
43
43
|
:warning_type => "Remote Code Execution",
|
@@ -37,7 +37,7 @@ class Brakeman::CheckUnscopedFind < Brakeman::BaseCheck
|
|
37
37
|
warn :result => result,
|
38
38
|
:warning_type => "Unscoped Find",
|
39
39
|
:warning_code => :unscoped_find,
|
40
|
-
:message => "Unscoped call to #{result[:target]}##{result[:method]}",
|
40
|
+
:message => msg("Unscoped call to ", msg_code("#{result[:target]}##{result[:method]}")),
|
41
41
|
:code => result[:call],
|
42
42
|
:confidence => :weak,
|
43
43
|
:user_input => input
|
@@ -89,7 +89,7 @@ class Brakeman::CheckValidationRegex < Brakeman::BaseCheck
|
|
89
89
|
warn :model => @current_model,
|
90
90
|
:warning_type => "Format Validation",
|
91
91
|
:warning_code => :validation_regex,
|
92
|
-
:message => "Insufficient validation for
|
92
|
+
:message => msg("Insufficient validation for ", msg_code(get_name validator), " using ", msg_code(regex.inspect), ". Use ", msg_code("\\A"), " and ", msg_code("\\z"), " as anchors"),
|
93
93
|
:line => value.line,
|
94
94
|
:confidence => :high
|
95
95
|
end
|
@@ -39,20 +39,19 @@ class Brakeman::CheckWeakHash < Brakeman::BaseCheck
|
|
39
39
|
confidence = :medium
|
40
40
|
end
|
41
41
|
|
42
|
+
message = msg("Weak hashing algorithm used")
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
""
|
50
|
-
end
|
44
|
+
case call.target.last
|
45
|
+
when :MD5
|
46
|
+
message << ": " << msg_lit("MD5")
|
47
|
+
when :SHA1
|
48
|
+
message << ": " << msg_lit("SHA1")
|
49
|
+
end
|
51
50
|
|
52
51
|
warn :result => result,
|
53
52
|
:warning_type => "Weak Hash",
|
54
53
|
:warning_code => :weak_hash_digest,
|
55
|
-
:message =>
|
54
|
+
:message => message,
|
56
55
|
:confidence => confidence,
|
57
56
|
:user_input => input
|
58
57
|
end
|
@@ -62,19 +61,19 @@ class Brakeman::CheckWeakHash < Brakeman::BaseCheck
|
|
62
61
|
|
63
62
|
call = result[:call]
|
64
63
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
64
|
+
message = msg("Weak hashing algorithm used in HMAC")
|
65
|
+
|
66
|
+
case call.third_arg.last
|
67
|
+
when :MD5
|
68
|
+
message << ": " << msg_lit("MD5")
|
69
|
+
when :SHA1
|
70
|
+
message << ": " << msg_lit("SHA1")
|
71
|
+
end
|
73
72
|
|
74
73
|
warn :result => result,
|
75
74
|
:warning_type => "Weak Hash",
|
76
75
|
:warning_code => :weak_hash_hmac,
|
77
|
-
:message =>
|
76
|
+
:message => message,
|
78
77
|
:confidence => :medium
|
79
78
|
end
|
80
79
|
|
@@ -90,7 +89,7 @@ class Brakeman::CheckWeakHash < Brakeman::BaseCheck
|
|
90
89
|
warn :result => result,
|
91
90
|
:warning_type => "Weak Hash",
|
92
91
|
:warning_code => :weak_hash_digest,
|
93
|
-
:message => "Weak hashing algorithm (
|
92
|
+
:message => msg("Weak hashing algorithm used: ", msg_lit(alg)),
|
94
93
|
:confidence => :medium
|
95
94
|
end
|
96
95
|
end
|