brakeman-lib 4.3.1 → 4.4.0

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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +24 -1
  3. data/README.md +35 -6
  4. data/bin/brakeman +2 -0
  5. data/lib/brakeman.rb +5 -3
  6. data/lib/brakeman/app_tree.rb +15 -1
  7. data/lib/brakeman/call_index.rb +7 -4
  8. data/lib/brakeman/checks.rb +16 -8
  9. data/lib/brakeman/checks/base_check.rb +2 -19
  10. data/lib/brakeman/checks/check_basic_auth_timing_attack.rb +1 -1
  11. data/lib/brakeman/checks/check_content_tag.rb +4 -4
  12. data/lib/brakeman/checks/check_create_with.rb +1 -1
  13. data/lib/brakeman/checks/check_cross_site_scripting.rb +3 -3
  14. data/lib/brakeman/checks/check_default_routes.rb +3 -3
  15. data/lib/brakeman/checks/check_deserialize.rb +1 -1
  16. data/lib/brakeman/checks/check_detailed_exceptions.rb +1 -1
  17. data/lib/brakeman/checks/check_digest_dos.rb +4 -4
  18. data/lib/brakeman/checks/check_escape_function.rb +1 -1
  19. data/lib/brakeman/checks/check_execute.rb +5 -4
  20. data/lib/brakeman/checks/check_file_access.rb +13 -3
  21. data/lib/brakeman/checks/check_file_disclosure.rb +1 -1
  22. data/lib/brakeman/checks/check_filter_skipping.rb +1 -1
  23. data/lib/brakeman/checks/check_forgery_setting.rb +3 -3
  24. data/lib/brakeman/checks/check_header_dos.rb +3 -3
  25. data/lib/brakeman/checks/check_i18n_xss.rb +3 -3
  26. data/lib/brakeman/checks/check_jruby_xml.rb +1 -1
  27. data/lib/brakeman/checks/check_json_encoding.rb +3 -3
  28. data/lib/brakeman/checks/check_json_parsing.rb +8 -11
  29. data/lib/brakeman/checks/check_link_to.rb +3 -3
  30. data/lib/brakeman/checks/check_link_to_href.rb +2 -2
  31. data/lib/brakeman/checks/check_mail_to.rb +3 -3
  32. data/lib/brakeman/checks/check_mime_type_dos.rb +1 -1
  33. data/lib/brakeman/checks/check_model_attributes.rb +4 -4
  34. data/lib/brakeman/checks/check_model_serialize.rb +1 -1
  35. data/lib/brakeman/checks/check_nested_attributes.rb +3 -3
  36. data/lib/brakeman/checks/check_nested_attributes_bypass.rb +1 -1
  37. data/lib/brakeman/checks/check_number_to_currency.rb +4 -4
  38. data/lib/brakeman/checks/check_quote_table_name.rb +2 -2
  39. data/lib/brakeman/checks/check_regex_dos.rb +1 -1
  40. data/lib/brakeman/checks/check_render.rb +2 -2
  41. data/lib/brakeman/checks/check_render_dos.rb +1 -1
  42. data/lib/brakeman/checks/check_render_inline.rb +1 -1
  43. data/lib/brakeman/checks/check_response_splitting.rb +1 -1
  44. data/lib/brakeman/checks/check_route_dos.rb +1 -1
  45. data/lib/brakeman/checks/check_safe_buffer_manipulation.rb +1 -1
  46. data/lib/brakeman/checks/check_sanitize_methods.rb +3 -3
  47. data/lib/brakeman/checks/check_secrets.rb +1 -1
  48. data/lib/brakeman/checks/check_select_tag.rb +1 -1
  49. data/lib/brakeman/checks/check_select_vulnerability.rb +1 -1
  50. data/lib/brakeman/checks/check_session_manipulation.rb +1 -1
  51. data/lib/brakeman/checks/check_session_settings.rb +1 -1
  52. data/lib/brakeman/checks/check_simple_format.rb +2 -2
  53. data/lib/brakeman/checks/check_single_quotes.rb +14 -10
  54. data/lib/brakeman/checks/check_skip_before_filter.rb +2 -2
  55. data/lib/brakeman/checks/check_sprockets_path_traversal.rb +39 -0
  56. data/lib/brakeman/checks/check_sql.rb +1 -1
  57. data/lib/brakeman/checks/check_sql_cves.rb +2 -2
  58. data/lib/brakeman/checks/check_strip_tags.rb +10 -8
  59. data/lib/brakeman/checks/check_symbol_dos.rb +1 -1
  60. data/lib/brakeman/checks/check_symbol_dos_cve.rb +1 -1
  61. data/lib/brakeman/checks/check_translate_bug.rb +7 -7
  62. data/lib/brakeman/checks/check_unsafe_reflection.rb +1 -1
  63. data/lib/brakeman/checks/check_unscoped_find.rb +1 -1
  64. data/lib/brakeman/checks/check_validation_regex.rb +1 -1
  65. data/lib/brakeman/checks/check_weak_hash.rb +18 -19
  66. data/lib/brakeman/checks/check_xml_dos.rb +1 -1
  67. data/lib/brakeman/checks/check_yaml_parsing.rb +1 -1
  68. data/lib/brakeman/format/style.css +8 -0
  69. data/lib/brakeman/messages.rb +220 -0
  70. data/lib/brakeman/options.rb +13 -0
  71. data/lib/brakeman/parsers/template_parser.rb +2 -2
  72. data/lib/brakeman/processors/alias_processor.rb +7 -0
  73. data/lib/brakeman/processors/config_processor.rb +4 -1
  74. data/lib/brakeman/processors/gem_processor.rb +30 -2
  75. data/lib/brakeman/processors/lib/call_conversion_helper.rb +2 -1
  76. data/lib/brakeman/processors/lib/rails3_route_processor.rb +0 -2
  77. data/lib/brakeman/processors/lib/rails4_config_processor.rb +18 -0
  78. data/lib/brakeman/processors/lib/render_helper.rb +5 -0
  79. data/lib/brakeman/processors/lib/render_path.rb +15 -0
  80. data/lib/brakeman/processors/library_processor.rb +1 -1
  81. data/lib/brakeman/report/report_base.rb +17 -161
  82. data/lib/brakeman/report/report_csv.rb +17 -0
  83. data/lib/brakeman/report/report_html.rb +34 -31
  84. data/lib/brakeman/report/report_json.rb +21 -0
  85. data/lib/brakeman/report/report_markdown.rb +13 -6
  86. data/lib/brakeman/report/report_table.rb +157 -0
  87. data/lib/brakeman/report/report_tabs.rb +3 -1
  88. data/lib/brakeman/report/report_text.rb +16 -0
  89. data/lib/brakeman/scanner.rb +5 -1
  90. data/lib/brakeman/tracker/config.rb +1 -1
  91. data/lib/brakeman/util.rb +0 -17
  92. data/lib/brakeman/version.rb +1 -1
  93. data/lib/brakeman/warning.rb +9 -4
  94. data/lib/brakeman/warning_codes.rb +1 -0
  95. metadata +13 -10
@@ -39,7 +39,7 @@ class Brakeman::CheckDetailedExceptions < Brakeman::BaseCheck
39
39
 
40
40
  warn :warning_type => "Information Disclosure",
41
41
  :warning_code => :detailed_exceptions,
42
- :message => "Detailed exceptions may be enabled in 'show_detailed_exceptions?'",
42
+ :message => msg("Detailed exceptions may be enabled in ", msg_code("show_detailed_exceptions?")),
43
43
  :confidence => confidence,
44
44
  :code => src,
45
45
  :file => definition[:file]
@@ -6,14 +6,14 @@ class Brakeman::CheckDigestDoS < Brakeman::BaseCheck
6
6
  @description = "Checks for digest authentication DoS vulnerability"
7
7
 
8
8
  def run_check
9
- message = "Vulnerability in digest authentication (CVE-2012-3424). Upgrade to Rails version "
9
+ message = msg("Vulnerability in digest authentication ", msg_cve("CVE-2012-3424"), ". Upgrade to ")
10
10
 
11
11
  if version_between? "3.0.0", "3.0.15"
12
- message << "3.0.16"
12
+ message << msg_version("3.0.16")
13
13
  elsif version_between? "3.1.0", "3.1.6"
14
- message << "3.1.7"
14
+ message << msg_version("3.1.7")
15
15
  elsif version_between? "3.2.0", "3.2.5"
16
- message << "3.2.7"
16
+ message << msg_version("3.2.7")
17
17
  else
18
18
  return
19
19
  end
@@ -12,7 +12,7 @@ class Brakeman::CheckEscapeFunction < Brakeman::BaseCheck
12
12
 
13
13
  warn :warning_type => 'Cross-Site Scripting',
14
14
  :warning_code => :CVE_2011_2932,
15
- :message => 'Versions before 2.3.14 have a vulnerability in escape method when used with Ruby 1.8: CVE-2011-2932',
15
+ :message => msg("Rails versions before 2.3.14 have a vulnerability in the ", msg_code("escape"), " method when used with Ruby 1.8 ", msg_cve("CVE-2011-2932")),
16
16
  :confidence => :high,
17
17
  :gem_info => gemfile_or_environment,
18
18
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/Vr_7WSOrEZU/discussion"
@@ -18,7 +18,8 @@ class Brakeman::CheckExecute < Brakeman::BaseCheck
18
18
  s(:call, s(:const, :Rails), :env),
19
19
  s(:call, s(:const, :Process), :pid)]
20
20
 
21
- SHELL_ESCAPES = [:escape, :shellescape, :join]
21
+ SHELL_ESCAPE_MODULE_METHODS = Set[:escape, :join, :shellescape, :shelljoin]
22
+ SHELL_ESCAPE_MIXIN_METHODS = Set[:shellescape, :shelljoin]
22
23
 
23
24
  SHELLWORDS = s(:const, :Shellwords)
24
25
 
@@ -82,7 +83,7 @@ class Brakeman::CheckExecute < Brakeman::BaseCheck
82
83
  warn :result => result,
83
84
  :warning_type => "Command Injection",
84
85
  :warning_code => :command_injection,
85
- :message => "Possible command injection in open()",
86
+ :message => msg("Possible command injection in ", msg_code("open")),
86
87
  :user_input => match,
87
88
  :confidence => :high
88
89
  end
@@ -178,9 +179,9 @@ class Brakeman::CheckExecute < Brakeman::BaseCheck
178
179
  def shell_escape? exp
179
180
  return false unless call? exp
180
181
 
181
- if exp.target == SHELLWORDS and SHELL_ESCAPES.include? exp.method
182
+ if exp.target == SHELLWORDS and SHELL_ESCAPE_MODULE_METHODS.include? exp.method
182
183
  true
183
- elsif exp.method == :shelljoin
184
+ elsif SHELL_ESCAPE_MIXIN_METHODS.include?(exp.method)
184
185
  true
185
186
  else
186
187
  false
@@ -29,8 +29,11 @@ class Brakeman::CheckFileAccess < Brakeman::BaseCheck
29
29
  def process_result result
30
30
  return unless original? result
31
31
  call = result[:call]
32
+
32
33
  file_name = call.first_arg
33
34
 
35
+ return if called_on_tempfile?(file_name)
36
+
34
37
  if match = has_immediate_user_input?(file_name)
35
38
  confidence = :high
36
39
  elsif match = has_immediate_model?(file_name)
@@ -47,9 +50,9 @@ class Brakeman::CheckFileAccess < Brakeman::BaseCheck
47
50
  end
48
51
  end
49
52
 
50
- if match and not temp_file? match.match
53
+ if match and not temp_file_method? match.match
51
54
 
52
- message = "#{friendly_type_of(match).capitalize} used in file name"
55
+ message = msg(msg_input(match), " used in file name")
53
56
 
54
57
  warn :result => result,
55
58
  :warning_type => "File Access",
@@ -61,7 +64,14 @@ class Brakeman::CheckFileAccess < Brakeman::BaseCheck
61
64
  end
62
65
  end
63
66
 
64
- def temp_file? exp
67
+ # When using Tempfile, there is no risk of unauthorized file access, since
68
+ # Tempfile adds a unique string onto the end of every provided filename, and
69
+ # ensures that the filename does not already exist in the system.
70
+ def called_on_tempfile? file_name
71
+ call?(file_name) && file_name.target == s(:const, :Tempfile)
72
+ end
73
+
74
+ def temp_file_method? exp
65
75
  if call? exp
66
76
  return true if exp.call_chain.include? :tempfile
67
77
 
@@ -22,7 +22,7 @@ class Brakeman::CheckFileDisclosure < Brakeman::BaseCheck
22
22
  if fix_version and serves_static_assets?
23
23
  warn :warning_type => "File Access",
24
24
  :warning_code => :CVE_2014_7829,
25
- :message => "Rails #{rails_version} has a file existence disclosure. Upgrade to #{fix_version} or disable serving static assets",
25
+ :message => msg(msg_version(rails_version), " has a file existence disclosure vulnerability. Upgrade to ", msg_version(fix_version), " or disable serving static assets"),
26
26
  :confidence => :high,
27
27
  :gem_info => gemfile_or_environment,
28
28
  :link_path => "https://groups.google.com/d/msg/rubyonrails-security/23fiuwb1NBA/MQVM1-5GkPMJ"
@@ -12,7 +12,7 @@ class Brakeman::CheckFilterSkipping < Brakeman::BaseCheck
12
12
 
13
13
  warn :warning_type => "Default Routes",
14
14
  :warning_code => :CVE_2011_2929,
15
- :message => "Versions before 3.0.10 have a vulnerability which allows filters to be bypassed: CVE-2011-2929",
15
+ :message => msg("Rails versions before 3.0.10 have a vulnerability which allows filters to be bypassed", msg_cve("CVE-2011-2929")),
16
16
  :confidence => :high,
17
17
  :gem_info => gemfile_or_environment,
18
18
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/NCCsca7TEtY/discussion"
@@ -18,7 +18,7 @@ class Brakeman::CheckForgerySetting < Brakeman::BaseCheck
18
18
  if controller and not controller.protect_from_forgery?
19
19
  csrf_warning :controller => name,
20
20
  :warning_code => :csrf_protection_missing,
21
- :message => "'protect_from_forgery' should be called in #{name}",
21
+ :message => msg(msg_code("protect_from_forgery"), " should be called in ", msg_code(name)),
22
22
  :file => controller.file,
23
23
  :line => controller.top_line
24
24
  elsif version_between? "4.0.0", "100.0.0" and forgery_opts = controller.options[:protect_from_forgery]
@@ -30,7 +30,7 @@ class Brakeman::CheckForgerySetting < Brakeman::BaseCheck
30
30
  :controller => name,
31
31
  :warning_type => "Cross-Site Request Forgery",
32
32
  :warning_code => :csrf_not_protected_by_raising_exception,
33
- :message => "protect_from_forgery should be configured with 'with: :exception'",
33
+ :message => msg(msg_code("protect_from_forgery"), " should be configured with ", msg_code("with: :exception")),
34
34
  :confidence => :medium,
35
35
  :file => controller.file
36
36
  }
@@ -73,7 +73,7 @@ class Brakeman::CheckForgerySetting < Brakeman::BaseCheck
73
73
  @warned_cve_2011_0447 = true # only warn once
74
74
 
75
75
  csrf_warning :warning_code => :CVE_2011_0447,
76
- :message => "CSRF protection is flawed in unpatched versions of Rails #{rails_version} (CVE-2011-0447). Upgrade to #{new_version} or apply patches as needed",
76
+ :message => msg("CSRF protection is flawed in unpatched versions of ", msg_version(rails_version), " ", msg_cve("CVE-2011-0447"), ". Upgrade to ", msg_version(new_version), " or apply patches as needed"),
77
77
  :gem_info => gemfile_or_environment,
78
78
  :file => nil,
79
79
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/LZWjzCPgNmU/discussion"
@@ -7,12 +7,12 @@ class Brakeman::CheckHeaderDoS < Brakeman::BaseCheck
7
7
 
8
8
  def run_check
9
9
  if (version_between? "3.0.0", "3.2.15" or version_between? "4.0.0", "4.0.1") and not has_workaround?
10
- message = "Rails #{rails_version} has a denial of service vulnerability (CVE-2013-6414). Upgrade to Rails version "
10
+ message = msg(msg_version(rails_version), " has a denial of service vulnerability ", msg_cve("CVE-2013-6414"), ". Upgrade to ")
11
11
 
12
12
  if version_between? "3.0.0", "3.2.15"
13
- message << "3.2.16"
13
+ message << msg_version("3.2.16")
14
14
  else
15
- message << "4.0.2"
15
+ message << msg_version("4.0.2")
16
16
  end
17
17
 
18
18
  warn :warning_type => "Denial of Service",
@@ -7,13 +7,13 @@ class Brakeman::CheckI18nXSS < Brakeman::BaseCheck
7
7
 
8
8
  def run_check
9
9
  if (version_between? "3.0.6", "3.2.15" or version_between? "4.0.0", "4.0.1") and not has_workaround?
10
- message = "Rails #{rails_version} has an XSS vulnerability in i18n (CVE-2013-4491). Upgrade to Rails version "
11
10
  i18n_gem = tracker.config.gem_version :i18n
11
+ message = msg(msg_version(rails_version), " has an XSS vulnerability in ", msg_version(i18n_gem, "i18n"), " ", msg_cve("CVE-2013-4491"), ". Upgrade to ")
12
12
 
13
13
  if version_between? "3.0.6", "3.1.99" and version_before i18n_gem, "0.5.1"
14
- message << "3.2.16 or i18n 0.5.1"
14
+ message << msg_version("3.2.16 or i18n 0.5.1")
15
15
  elsif version_between? "3.2.0", "4.0.1" and version_before i18n_gem, "0.6.6"
16
- message << "4.0.2 or i18n 0.6.6"
16
+ message << msg_version("4.0.2 or i18n 0.6.6")
17
17
  else
18
18
  return
19
19
  end
@@ -28,7 +28,7 @@ class Brakeman::CheckJRubyXML < Brakeman::BaseCheck
28
28
 
29
29
  warn :warning_type => "File Access",
30
30
  :warning_code => :CVE_2013_1856,
31
- :message => "Rails #{rails_version} with JRuby has a vulnerability in XML parser: upgrade to #{fix_version} or patch",
31
+ :message => msg(msg_version(rails_version), " with JRuby has a vulnerability in XML parser. Upgrade to ", msg_version(fix_version), " or patch"),
32
32
  :confidence => :high,
33
33
  :gem_info => gemfile_or_environment,
34
34
  :link => "https://groups.google.com/d/msg/rubyonrails-security/KZwsQbYsOiI/5kUV7dSCJGwJ"
@@ -7,12 +7,12 @@ class Brakeman::CheckJSONEncoding < Brakeman::BaseCheck
7
7
 
8
8
  def run_check
9
9
  if (version_between? "4.1.0", "4.1.10" or version_between? "4.2.0", "4.2.1") and not has_workaround?
10
- message = "Rails #{rails_version} does not encode JSON keys (CVE-2015-3226). Upgrade to Rails version "
10
+ message = msg(msg_version(rails_version), " does not encode JSON keys ", msg_cve("CVE-2015-3226"), ". Upgrade to ")
11
11
 
12
12
  if version_between? "4.1.0", "4.1.10"
13
- message << "4.1.11"
13
+ message << msg_version("4.1.11")
14
14
  else
15
- message << "4.2.2"
15
+ message << msg_version("4.2.2")
16
16
  end
17
17
 
18
18
  if tracker.find_call(:methods => [:to_json, :encode]).any?
@@ -20,12 +20,8 @@ class Brakeman::CheckJSONParsing < Brakeman::BaseCheck
20
20
  "3.0.20"
21
21
  end
22
22
 
23
- message = "Rails #{rails_version} has a serious JSON parsing vulnerability: upgrade to #{new_version} or patch"
24
- if uses_yajl?
25
- gem_info = gemfile_or_environment(:yajl)
26
- else
27
- gem_info = gemfile_or_environment
28
- end
23
+ message = msg(msg_version(rails_version), " has a serious JSON parsing vulnerability. Upgrade to ", msg_version(new_version), " or patch")
24
+ gem_info = gemfile_or_environment
29
25
 
30
26
  warn :warning_type => "Remote Code Execution",
31
27
  :warning_code => :CVE_2013_0333,
@@ -72,19 +68,20 @@ class Brakeman::CheckJSONParsing < Brakeman::BaseCheck
72
68
 
73
69
  warning_type = "Denial of Service"
74
70
  confidence = :medium
75
- message = "#{name} gem version #{version} has a symbol creation vulnerablity: upgrade to "
71
+ gem_name = "#{name} gem"
72
+ message = msg(msg_version(version, gem_name), " has a symbol creation vulnerablity. Upgrade to ")
76
73
 
77
74
  if version >= "1.7.0"
78
75
  confidence = :high
79
76
  warning_type = "Remote Code Execution"
80
- message = "#{name} gem version #{version} has a remote code vulnerablity: upgrade to 1.7.7"
77
+ message = msg(msg_version(version, "json gem"), " has a remote code execution vulnerability. Upgrade to ", msg_version("1.7.7", "json gem"))
81
78
  elsif version >= "1.6.0"
82
- message << "1.6.8"
79
+ message << msg_version("1.6.8", gem_name)
83
80
  elsif version >= "1.5.0"
84
- message << "1.5.5"
81
+ message << msg_version("1.5.5", gem_name)
85
82
  else
86
83
  confidence = :weak
87
- message << "1.5.5"
84
+ message << msg_version("1.5.5", gem_name)
88
85
  end
89
86
 
90
87
  if confidence == :medium and uses_json_parse?
@@ -68,7 +68,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
68
68
  input = has_immediate_user_input?(argument)
69
69
  return false unless input
70
70
 
71
- message = "Unescaped #{friendly_type_of input} in link_to"
71
+ message = msg("Unescaped ", msg_input(input), " in ", msg_code("link_to"))
72
72
 
73
73
  warn_xss(result, message, input, :high)
74
74
  end
@@ -83,7 +83,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
83
83
 
84
84
  confidence = :medium
85
85
  confidence = :high if likely_model_attribute? match
86
- warn_xss(result, "Unescaped model attribute in link_to", match, confidence)
86
+ warn_xss(result, msg("Unescaped model attribute in ", msg_code("link_to")), match, confidence)
87
87
  end
88
88
 
89
89
  # Check if we should warn about the matched result
@@ -91,7 +91,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
91
91
  return false unless matched
92
92
  return false if matched.type == :model and tracker.options[:ignore_model_output]
93
93
 
94
- message = "Unescaped #{friendly_type_of matched} in link_to"
94
+ message = msg("Unescaped ", msg_input(matched), " in ", msg_code("link_to"))
95
95
 
96
96
  warn_xss(result, message, @matched, :medium)
97
97
  end
@@ -43,7 +43,7 @@ class Brakeman::CheckLinkToHref < Brakeman::CheckLinkTo
43
43
  return if call? url_arg and ignore_call? url_arg.target, url_arg.method
44
44
 
45
45
  if input = has_immediate_user_input?(url_arg)
46
- message = "Unsafe #{friendly_type_of input} in link_to href"
46
+ message = msg("Unsafe ", msg_input(input), " in ", msg_code("link_to"), " href")
47
47
 
48
48
  unless duplicate? result or call_on_params? url_arg or ignore_interpolation? url_arg, input.match
49
49
  add_result result
@@ -59,7 +59,7 @@ class Brakeman::CheckLinkToHref < Brakeman::CheckLinkTo
59
59
  return if ignore_model_call? url_arg, input or duplicate? result
60
60
  add_result result
61
61
 
62
- message = "Potentially unsafe model attribute in link_to href"
62
+ message = msg("Potentially unsafe model attribute in ", msg_code("link_to"), " href")
63
63
 
64
64
  warn :result => result,
65
65
  :warning_type => "Cross-Site Scripting",
@@ -11,12 +11,12 @@ class Brakeman::CheckMailTo < Brakeman::BaseCheck
11
11
 
12
12
  def run_check
13
13
  if (version_between? "2.3.0", "2.3.10" or version_between? "3.0.0", "3.0.3") and result = mail_to_javascript?
14
- message = "Vulnerability in mail_to using javascript encoding (CVE-2011-0446). Upgrade to Rails version "
14
+ message = msg("Vulnerability in ", msg_code("mail_to"), " using javascript encoding ", msg_cve("CVE-2011-0446"), ". Upgrade to ")
15
15
 
16
16
  if version_between? "2.3.0", "2.3.10"
17
- message << "2.3.11"
17
+ message << msg_version("2.3.11")
18
18
  else
19
- message << "3.0.4"
19
+ message << msg_version("3.0.4")
20
20
  end
21
21
 
22
22
  warn :result => result,
@@ -19,7 +19,7 @@ class Brakeman::CheckMimeTypeDoS < Brakeman::BaseCheck
19
19
 
20
20
  return if has_workaround?
21
21
 
22
- message = "Rails #{rails_version} is vulnerable to denial of service via mime type caching (CVE-2016-0751). Upgrade to Rails version #{fix_version}"
22
+ message = msg(msg_version(rails_version), " is vulnerable to denial of service via mime type caching ", msg_cve("CVE-2016-0751"), ". Upgrade to ", msg_version(fix_version))
23
23
 
24
24
  warn :warning_type => "Denial of Service",
25
25
  :warning_code => :CVE_2016_0751,
@@ -30,7 +30,7 @@ class Brakeman::CheckModelAttributes < Brakeman::BaseCheck
30
30
  warn :model => no_accessible_names.sort.join(", "),
31
31
  :warning_type => "Attribute Restriction",
32
32
  :warning_code => :no_attr_accessible,
33
- :message => "Mass assignment is not restricted using attr_accessible",
33
+ :message => msg("Mass assignment is not restricted using ", msg_code("attr_accessible")),
34
34
  :confidence => :high
35
35
  end
36
36
 
@@ -59,7 +59,7 @@ class Brakeman::CheckModelAttributes < Brakeman::BaseCheck
59
59
  :line => model.top_line,
60
60
  :warning_type => "Attribute Restriction",
61
61
  :warning_code => :no_attr_accessible,
62
- :message => "Mass assignment is not restricted using attr_accessible",
62
+ :message => msg("Mass assignment is not restricted using ", msg_code("attr_accessible")),
63
63
  :confidence => :high
64
64
  elsif not tracker.options[:ignore_attr_protected]
65
65
  message, confidence, link = check_for_attr_protected_bypass
@@ -105,11 +105,11 @@ class Brakeman::CheckModelAttributes < Brakeman::BaseCheck
105
105
  end
106
106
 
107
107
  if upgrade_version
108
- message = "attr_protected is bypassable in #{rails_version}, use attr_accessible or upgrade to #{upgrade_version}"
108
+ message = msg(msg_code("attr_protected"), " is bypassable in ", msg_version(rails_version), ". Use ", msg_code("attr_accessible"), " or upgrade to ", msg_version(upgrade_version))
109
109
  confidence = :high
110
110
  link = "https://groups.google.com/d/topic/rubyonrails-security/AFBKNY7VSH8/discussion"
111
111
  else
112
- message = "attr_accessible is recommended over attr_protected"
112
+ message = msg(msg_code("attr_accessible"), " is recommended over ", msg_code("attr_protected"))
113
113
  confidence = :medium
114
114
  link = nil
115
115
  end
@@ -57,7 +57,7 @@ class Brakeman::CheckModelSerialize < Brakeman::BaseCheck
57
57
  warn :model => model.name,
58
58
  :warning_type => "Remote Code Execution",
59
59
  :warning_code => :CVE_2013_0277,
60
- :message => "Serialized attributes are vulnerable in Rails #{rails_version}, upgrade to #{@upgrade_version} or patch.",
60
+ :message => msg("Serialized attributes are vulnerable in ", msg_version(rails_version), ", upgrade to ", msg_version(@upgrade_version), " or patch"),
61
61
  :confidence => confidence,
62
62
  :link => "https://groups.google.com/d/topic/rubyonrails-security/KtmwSbEpzrU/discussion",
63
63
  :file => model.file,
@@ -11,12 +11,12 @@ class Brakeman::CheckNestedAttributes < Brakeman::BaseCheck
11
11
  version = rails_version
12
12
 
13
13
  if (version == "2.3.9" or version == "3.0.0") and uses_nested_attributes?
14
- message = "Vulnerability in nested attributes (CVE-2010-3933). Upgrade to Rails version "
14
+ message = msg("Vulnerability in nested attributes ", msg_cve("CVE-2010-3933"), ". Upgrade to ")
15
15
 
16
16
  if version == "2.3.9"
17
- message << "2.3.10"
17
+ message << msg_version("2.3.10")
18
18
  else
19
- message << "3.0.1"
19
+ message << msg_version("3.0.1")
20
20
  end
21
21
 
22
22
  warn :warning_type => "Nested Attributes",
@@ -30,7 +30,7 @@ class Brakeman::CheckNestedAttributesBypass < Brakeman::BaseCheck
30
30
  end
31
31
 
32
32
  def warn_about_nested_attributes name, model, args
33
- message = "Rails #{rails_version} does not call :reject_if option when :allow_destroy is false (CVE-2015-7577)"
33
+ message = msg(msg_version(rails_version), " does not call ", msg_code(":reject_if"), " option when ", msg_code(":allow_destroy"), " is ", msg_code("false"), " ", msg_cve("CVE-2015-7577"))
34
34
 
35
35
  warn :model => name,
36
36
  :warning_type => "Nested Attributes",
@@ -23,12 +23,12 @@ class Brakeman::CheckNumberToCurrency < Brakeman::BaseCheck
23
23
  end
24
24
 
25
25
  def generic_warning
26
- message = "Rails #{rails_version} has a vulnerability in number helpers (CVE-2014-0081). Upgrade to Rails version "
26
+ message = msg(msg_version(rails_version), " has a vulnerability in number helpers ", msg_cve("CVE-2014-0081"), ". Upgrade to ")
27
27
 
28
28
  if version_between? "2.3.0", "3.2.16"
29
- message << "3.2.17"
29
+ message << msg_version("3.2.17")
30
30
  else
31
- message << "4.0.3"
31
+ message << msg_version("4.0.3")
32
32
  end
33
33
 
34
34
  warn :warning_type => "Cross-Site Scripting",
@@ -66,7 +66,7 @@ class Brakeman::CheckNumberToCurrency < Brakeman::BaseCheck
66
66
  warn :result => result,
67
67
  :warning_type => "Cross-Site Scripting",
68
68
  :warning_code => :CVE_2014_0081_call,
69
- :message => "Format options in #{result[:call].method} are not safe in Rails #{rails_version}",
69
+ :message => msg("Format options in ", msg_code(result[:call].method), " are not safe in ", msg_version(rails_version)),
70
70
  :confidence => :high,
71
71
  :link_path => "https://groups.google.com/d/msg/ruby-security-ann/9WiRn2nhfq0/2K2KRB4LwCMJ",
72
72
  :user_input => match
@@ -18,9 +18,9 @@ class Brakeman::CheckQuoteTableName < Brakeman::BaseCheck
18
18
  end
19
19
 
20
20
  if rails_version =~ /^3/
21
- message = "Versions before 3.0.10 have a vulnerability in quote_table_name: CVE-2011-2930"
21
+ message = msg("Rails versions before 3.0.10 have a vulnerability in ", msg_code("quote_table_name"), " ", msg_cve("CVE-2011-2930"))
22
22
  else
23
- message = "Versions before 2.3.14 have a vulnerability in quote_table_name: CVE-2011-2930"
23
+ message = msg("Rails versions before 2.3.14 have a vulnerability in ", msg_code("quote_table_name"), " ", msg_cve("CVE-2011-2930"))
24
24
  end
25
25
 
26
26
  warn :warning_type => "SQL Injection",
@@ -44,7 +44,7 @@ class Brakeman::CheckRegexDoS < Brakeman::BaseCheck
44
44
  end
45
45
 
46
46
  if match
47
- message = "#{friendly_type_of(match).capitalize} used in regex"
47
+ message = msg(msg_input(match), " used in regular expression")
48
48
 
49
49
  warn :result => result,
50
50
  :warning_type => "Denial of Service",
@@ -49,7 +49,7 @@ class Brakeman::CheckRender < Brakeman::BaseCheck
49
49
  return if input.type == :model #skip models
50
50
  return if safe_param? input.match
51
51
 
52
- message = "Render path contains #{friendly_type_of input}"
52
+ message = msg("Render path contains ", msg_input(input))
53
53
 
54
54
  warn :result => result,
55
55
  :warning_type => "Dynamic Render Path",
@@ -75,7 +75,7 @@ class Brakeman::CheckRender < Brakeman::BaseCheck
75
75
  warn :result => result,
76
76
  :warning_type => "Remote Code Execution",
77
77
  :warning_code => :dynamic_render_path_rce,
78
- :message => "Passing query parameters to render() is vulnerable in Rails #{rails_version} (CVE-2016-0752)",
78
+ :message => msg("Passing query parameters to ", msg_code("render"), " is vulnerable in ", msg_version(rails_version), " ", msg_cve("CVE-2016-0752")),
79
79
  :user_input => view,
80
80
  :confidence => :high
81
81
  end