brakeman-lib 4.7.1 → 4.9.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.
- checksums.yaml +4 -4
- data/CHANGES.md +47 -0
- data/README.md +13 -5
- data/lib/brakeman.rb +20 -0
- data/lib/brakeman/checks/base_check.rb +13 -10
- data/lib/brakeman/checks/check_basic_auth.rb +2 -0
- data/lib/brakeman/checks/check_content_tag.rb +1 -2
- data/lib/brakeman/checks/check_csrf_token_forgery_cve.rb +28 -0
- data/lib/brakeman/checks/check_deserialize.rb +21 -1
- data/lib/brakeman/checks/check_execute.rb +40 -5
- data/lib/brakeman/checks/check_json_entity_escape.rb +38 -0
- data/lib/brakeman/checks/check_link_to.rb +1 -1
- data/lib/brakeman/checks/check_link_to_href.rb +1 -3
- data/lib/brakeman/checks/check_mass_assignment.rb +34 -4
- data/lib/brakeman/checks/check_model_attr_accessible.rb +1 -1
- data/lib/brakeman/checks/check_page_caching_cve.rb +37 -0
- data/lib/brakeman/checks/check_permit_attributes.rb +1 -1
- data/lib/brakeman/checks/check_skip_before_filter.rb +4 -4
- data/lib/brakeman/checks/check_sql.rb +24 -33
- data/lib/brakeman/checks/check_template_injection.rb +32 -0
- data/lib/brakeman/commandline.rb +25 -1
- data/lib/brakeman/differ.rb +0 -5
- data/lib/brakeman/options.rb +21 -1
- data/lib/brakeman/processor.rb +1 -1
- data/lib/brakeman/processors/alias_processor.rb +2 -3
- data/lib/brakeman/processors/lib/find_all_calls.rb +30 -14
- data/lib/brakeman/processors/lib/render_helper.rb +3 -1
- data/lib/brakeman/report.rb +4 -1
- data/lib/brakeman/report/ignore/config.rb +10 -2
- data/lib/brakeman/report/report_junit.rb +104 -0
- data/lib/brakeman/report/report_markdown.rb +0 -1
- data/lib/brakeman/report/report_text.rb +37 -16
- data/lib/brakeman/scanner.rb +4 -1
- data/lib/brakeman/tracker.rb +3 -1
- data/lib/brakeman/tracker/config.rb +4 -3
- data/lib/brakeman/tracker/constants.rb +8 -7
- data/lib/brakeman/util.rb +21 -3
- data/lib/brakeman/version.rb +1 -1
- data/lib/brakeman/warning_codes.rb +7 -0
- metadata +33 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43b7d1a166362e6f078be06194adde0e9acc6f6ee5bbe6b54212a4dddb0335ad
|
4
|
+
data.tar.gz: fd3fcf8965f5125991e51dce67d18415ca3f5db6f431a4076c16acbf1a3bd906
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a929f04cb48c9ccb434cfa3ee47791d263a1fc3d30acdea4459c25c8c7bcab7d72887369f893de1eed5418a059dd07e55a98157bd2729967f1b9e4c72a4b94f5
|
7
|
+
data.tar.gz: ead62901264f2d1230512894820ad8160ce6115a19ac32dd2ea3474ebb9b9a723e2090077ea6780b38c0b9d3f3b59e4c93ad55d8dbf613f9426475796a167ab3
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
# 4.9.0 - 2020-08-04
|
2
|
+
|
3
|
+
* Add check for CVE-2020-8166 (Jamie Finnigan)
|
4
|
+
* Avoid warning when `safe_yaml` is used via `YAML.load(..., safe: true)`
|
5
|
+
* Add check for user input in `ERB.new` (Matt Hickman)
|
6
|
+
* Add `--ensure-ignore-notes` (Eli Block)
|
7
|
+
* Remove whitelist/blacklist language, add clarifications
|
8
|
+
* Do not warn about mass assignment with `params.permit!.slice`
|
9
|
+
* Add "full call" information to call index results
|
10
|
+
* Ignore `params.permit!` in path helpers
|
11
|
+
* Treat `Dir.glob` as safe source of values in guards
|
12
|
+
* Always scan `environment.rb`
|
13
|
+
|
14
|
+
# 4.8.2 - 2020-05-12
|
15
|
+
|
16
|
+
* Add check for CVE-2020-8159
|
17
|
+
* Fix `authenticate_or_request_with_http_basic` check for passed blocks (Hugo Corbucci)
|
18
|
+
* Add `--text-fields` option
|
19
|
+
* Add check for escaping HTML entities in JSON configuration
|
20
|
+
|
21
|
+
# 4.8.1 - 2020-04-06
|
22
|
+
|
23
|
+
* Check SQL query strings using `String#strip` or `String.squish`
|
24
|
+
* Handle non-symbol keys in locals hash for render()
|
25
|
+
* Warn about global(!) mass assignment
|
26
|
+
* Index calls in render arguments
|
27
|
+
|
28
|
+
# 4.8.0 - 2020-02-18
|
29
|
+
|
30
|
+
* Add JUnit-XML report format (Naoki Kimura)
|
31
|
+
* Sort ignore files by fingerprint and line (Ngan Pham)
|
32
|
+
* Freeze call index results
|
33
|
+
* Fix output test when using newer Minitest
|
34
|
+
* Properly render confidence in Markdown report
|
35
|
+
* Report old warnings as fixed if zero warnings reported
|
36
|
+
* Catch dangerous concatenation in `CheckExecute` (Jacob Evelyn)
|
37
|
+
* Show user-friendly message when ignore config file has invalid JSON (D. Hicks)
|
38
|
+
* Initialize Rails version with `nil` (Carsten Wirth)
|
39
|
+
|
40
|
+
# 4.7.2 - 2019-11-25
|
41
|
+
|
42
|
+
* Remove version guard for `named_scope` vs. `scope`
|
43
|
+
* Find SQL injection in `String#strip_heredoc` target
|
44
|
+
* Handle more `permit!` cases
|
45
|
+
* Ensure file name is set when processing model
|
46
|
+
* Add `request.params` as query parameters
|
47
|
+
|
1
48
|
# 4.7.1 - 2019-10-29
|
2
49
|
|
3
50
|
* Check string length against limit before joining
|
data/README.md
CHANGED
@@ -16,9 +16,11 @@ Using RubyGems:
|
|
16
16
|
|
17
17
|
Using Bundler:
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
```ruby
|
20
|
+
group :development do
|
21
|
+
gem 'brakeman'
|
22
|
+
end
|
23
|
+
```
|
22
24
|
|
23
25
|
Using Docker:
|
24
26
|
|
@@ -62,7 +64,7 @@ Outside of Rails root (note that the output file is relative to path/to/rails/ap
|
|
62
64
|
|
63
65
|
# Compatibility
|
64
66
|
|
65
|
-
Brakeman should work with any version of Rails from 2.3.x to
|
67
|
+
Brakeman should work with any version of Rails from 2.3.x to 6.x.
|
66
68
|
|
67
69
|
Brakeman can analyze code written with Ruby 1.8 syntax and newer, but requires at least Ruby 2.3.0 to run.
|
68
70
|
|
@@ -74,12 +76,16 @@ To specify an output file for the results:
|
|
74
76
|
|
75
77
|
brakeman -o output_file
|
76
78
|
|
77
|
-
The output format is determined by the file extension or by using the `-f` option. Current options are: `text`, `html`, `tabs`, `json`, `markdown`, `csv`, and `codeclimate`.
|
79
|
+
The output format is determined by the file extension or by using the `-f` option. Current options are: `text`, `html`, `tabs`, `json`, `junit`, `markdown`, `csv`, and `codeclimate`.
|
78
80
|
|
79
81
|
Multiple output files can be specified:
|
80
82
|
|
81
83
|
brakeman -o output.html -o output.json
|
82
84
|
|
85
|
+
To output to both a file and to the console, with color:
|
86
|
+
|
87
|
+
brakeman --color -o /dev/stdout -o output.json
|
88
|
+
|
83
89
|
To suppress informational warnings and just output the report:
|
84
90
|
|
85
91
|
brakeman -q
|
@@ -167,6 +173,8 @@ There is a [plugin available](http://brakemanscanner.org/docs/jenkins/) for Jenk
|
|
167
173
|
|
168
174
|
For even more continuous testing, try the [Guard plugin](https://github.com/guard/guard-brakeman).
|
169
175
|
|
176
|
+
There are a couple [Github Actions](https://github.com/marketplace?type=actions&query=brakeman) available.
|
177
|
+
|
170
178
|
# Building
|
171
179
|
|
172
180
|
git clone git://github.com/presidentbeef/brakeman.git
|
data/lib/brakeman.rb
CHANGED
@@ -20,6 +20,10 @@ module Brakeman
|
|
20
20
|
#option is set
|
21
21
|
Errors_Found_Exit_Code = 7
|
22
22
|
|
23
|
+
#Exit code returned when an ignored warning has no note and
|
24
|
+
#--ensure-ignore-notes is set
|
25
|
+
Empty_Ignore_Note_Exit_Code = 8
|
26
|
+
|
23
27
|
@debug = false
|
24
28
|
@quiet = false
|
25
29
|
@loaded_dependencies = []
|
@@ -231,6 +235,8 @@ module Brakeman
|
|
231
235
|
[:to_text]
|
232
236
|
when :table, :to_table
|
233
237
|
[:to_table]
|
238
|
+
when :junit, :to_junit
|
239
|
+
[:to_junit]
|
234
240
|
else
|
235
241
|
[:to_text]
|
236
242
|
end
|
@@ -258,6 +264,8 @@ module Brakeman
|
|
258
264
|
:to_text
|
259
265
|
when /\.table$/i
|
260
266
|
:to_table
|
267
|
+
when /\.junit$/i
|
268
|
+
:to_junit
|
261
269
|
else
|
262
270
|
:to_text
|
263
271
|
end
|
@@ -494,6 +502,18 @@ module Brakeman
|
|
494
502
|
end
|
495
503
|
end
|
496
504
|
|
505
|
+
# Returns an array of alert fingerprints for any ignored warnings without
|
506
|
+
# notes found in the specified ignore file (if it exists).
|
507
|
+
def self.ignore_file_entries_with_empty_notes file
|
508
|
+
return [] unless file
|
509
|
+
|
510
|
+
require 'brakeman/report/ignore/config'
|
511
|
+
|
512
|
+
config = IgnoreConfig.new(file, nil)
|
513
|
+
config.read_from_file
|
514
|
+
config.already_ignored_entries_with_empty_notes.map { |i| i[:fingerprint] }
|
515
|
+
end
|
516
|
+
|
497
517
|
def self.filter_warnings tracker, options
|
498
518
|
require 'brakeman/report/ignore/config'
|
499
519
|
|
@@ -280,15 +280,6 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
|
|
280
280
|
return location, line
|
281
281
|
end
|
282
282
|
|
283
|
-
#Checks if an expression contains string interpolation.
|
284
|
-
#
|
285
|
-
#Returns Match with :interp type if found.
|
286
|
-
def include_interp? exp
|
287
|
-
@string_interp = false
|
288
|
-
process exp
|
289
|
-
@string_interp
|
290
|
-
end
|
291
|
-
|
292
283
|
#Checks if _exp_ includes user input in the form of cookies, parameters,
|
293
284
|
#request environment, or model attributes.
|
294
285
|
#
|
@@ -476,7 +467,7 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
|
|
476
467
|
end
|
477
468
|
|
478
469
|
def gemfile_or_environment gem_name = :rails
|
479
|
-
if gem_name and info = tracker.config.get_gem(gem_name)
|
470
|
+
if gem_name and info = tracker.config.get_gem(gem_name.to_sym)
|
480
471
|
info
|
481
472
|
elsif @app_tree.exists?("Gemfile")
|
482
473
|
@app_tree.file_path "Gemfile"
|
@@ -504,4 +495,16 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
|
|
504
495
|
|
505
496
|
@active_record_models
|
506
497
|
end
|
498
|
+
|
499
|
+
STRING_METHODS = Set[:<<, :+, :concat, :prepend]
|
500
|
+
private_constant :STRING_METHODS
|
501
|
+
|
502
|
+
def string_building? exp
|
503
|
+
return false unless call? exp and STRING_METHODS.include? exp.method
|
504
|
+
|
505
|
+
node_type? exp.target, :str, :dstr or
|
506
|
+
node_type? exp.first_arg, :str, :dstr or
|
507
|
+
string_building? exp.target or
|
508
|
+
string_building? exp.first_arg
|
509
|
+
end
|
507
510
|
end
|
@@ -57,6 +57,8 @@ class Brakeman::CheckBasicAuth < Brakeman::BaseCheck
|
|
57
57
|
|
58
58
|
# Check if the block of a result contains a comparison of password to string
|
59
59
|
def include_password_literal? result
|
60
|
+
return false if result[:block_args].nil?
|
61
|
+
|
60
62
|
@password_var = result[:block_args].last
|
61
63
|
@include_password = false
|
62
64
|
process result[:block]
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'brakeman/checks/base_check'
|
2
|
+
|
3
|
+
class Brakeman::CheckCSRFTokenForgeryCVE < Brakeman::BaseCheck
|
4
|
+
Brakeman::Checks.add self
|
5
|
+
|
6
|
+
@description = "Checks for versions with CSRF token forgery vulnerability (CVE-2020-8166)"
|
7
|
+
|
8
|
+
def run_check
|
9
|
+
fix_version = case
|
10
|
+
when version_between?('0.0.0', '5.2.4.2')
|
11
|
+
'5.2.4.3'
|
12
|
+
when version_between?('6.0.0', '6.0.3')
|
13
|
+
'6.0.3.1'
|
14
|
+
else
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
if fix_version
|
19
|
+
warn :warning_type => "Cross-Site Request Forgery",
|
20
|
+
:warning_code => :CVE_2020_8166,
|
21
|
+
:message => msg(msg_version(rails_version), " has a vulnerability that may allow CSRF token forgery. Upgrade to ", msg_version(fix_version), " or patch"),
|
22
|
+
:confidence => :medium,
|
23
|
+
:gem_info => gemfile_or_environment,
|
24
|
+
:link => "https://groups.google.com/g/rubyonrails-security/c/NOjKiGeXUgw"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -13,7 +13,23 @@ class Brakeman::CheckDeserialize < Brakeman::BaseCheck
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def check_yaml
|
16
|
-
check_methods :YAML, :
|
16
|
+
check_methods :YAML, :load_documents, :load_stream, :parse_documents, :parse_stream
|
17
|
+
|
18
|
+
# Check for safe_yaml gem use with YAML.load(..., safe: true)
|
19
|
+
if uses_safe_yaml?
|
20
|
+
tracker.find_call(target: :YAML, method: :load).each do |result|
|
21
|
+
call = result[:call]
|
22
|
+
options = call.second_arg
|
23
|
+
|
24
|
+
if hash? options and true? hash_access(options, :safe)
|
25
|
+
next
|
26
|
+
else
|
27
|
+
check_deserialize result, :YAML
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
check_methods :YAML, :load
|
32
|
+
end
|
17
33
|
end
|
18
34
|
|
19
35
|
def check_csv
|
@@ -102,4 +118,8 @@ class Brakeman::CheckDeserialize < Brakeman::BaseCheck
|
|
102
118
|
|
103
119
|
false
|
104
120
|
end
|
121
|
+
|
122
|
+
def uses_safe_yaml?
|
123
|
+
tracker.config.has_gem? :safe_yaml
|
124
|
+
end
|
105
125
|
end
|
@@ -56,8 +56,20 @@ class Brakeman::CheckExecute < Brakeman::BaseCheck
|
|
56
56
|
|
57
57
|
case call.method
|
58
58
|
when :popen
|
59
|
-
|
60
|
-
|
59
|
+
# Normally, if we're in a `popen` call, we only are worried about shell
|
60
|
+
# injection when the argument is not an array, because array elements
|
61
|
+
# are always escaped by Ruby. However, an exception is when the array
|
62
|
+
# contains two values are something like "bash -c" because then the third
|
63
|
+
# element is effectively the command being run and might be a malicious
|
64
|
+
# executable if it comes (partially or fully) from user input.
|
65
|
+
if !array?(first_arg)
|
66
|
+
failure = include_user_input?(first_arg) ||
|
67
|
+
dangerous_interp?(first_arg) ||
|
68
|
+
dangerous_string_building?(first_arg)
|
69
|
+
elsif dash_c_shell_command?(first_arg[1], first_arg[2])
|
70
|
+
failure = include_user_input?(first_arg[3]) ||
|
71
|
+
dangerous_interp?(first_arg[3]) ||
|
72
|
+
dangerous_string_building?(first_arg[3])
|
61
73
|
end
|
62
74
|
when :system, :exec
|
63
75
|
# Normally, if we're in a `system` or `exec` call, we only are worried
|
@@ -67,12 +79,18 @@ class Brakeman::CheckExecute < Brakeman::BaseCheck
|
|
67
79
|
# the third argument is effectively the command being run and might be
|
68
80
|
# a malicious executable if it comes (partially or fully) from user input.
|
69
81
|
if dash_c_shell_command?(first_arg, call.second_arg)
|
70
|
-
failure = include_user_input?(args[3]) ||
|
82
|
+
failure = include_user_input?(args[3]) ||
|
83
|
+
dangerous_interp?(args[3]) ||
|
84
|
+
dangerous_string_building?(args[3])
|
71
85
|
else
|
72
|
-
failure = include_user_input?(first_arg) ||
|
86
|
+
failure = include_user_input?(first_arg) ||
|
87
|
+
dangerous_interp?(first_arg) ||
|
88
|
+
dangerous_string_building?(first_arg)
|
73
89
|
end
|
74
90
|
else
|
75
|
-
failure = include_user_input?(args) ||
|
91
|
+
failure = include_user_input?(args) ||
|
92
|
+
dangerous_interp?(args) ||
|
93
|
+
dangerous_string_building?(args)
|
76
94
|
end
|
77
95
|
|
78
96
|
if failure and original? result
|
@@ -219,6 +237,23 @@ class Brakeman::CheckExecute < Brakeman::BaseCheck
|
|
219
237
|
false
|
220
238
|
end
|
221
239
|
|
240
|
+
#Checks if an expression contains string interpolation.
|
241
|
+
#
|
242
|
+
#Returns Match with :interp type if found.
|
243
|
+
def include_interp? exp
|
244
|
+
@string_interp = false
|
245
|
+
process exp
|
246
|
+
@string_interp
|
247
|
+
end
|
248
|
+
|
249
|
+
def dangerous_string_building? exp
|
250
|
+
if string_building?(exp) && res = dangerous?(exp)
|
251
|
+
return Match.new(:interp, res)
|
252
|
+
end
|
253
|
+
|
254
|
+
false
|
255
|
+
end
|
256
|
+
|
222
257
|
def shell_escape? exp
|
223
258
|
return false unless call? exp
|
224
259
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'brakeman/checks/base_check'
|
2
|
+
|
3
|
+
class Brakeman::CheckJSONEntityEscape < Brakeman::BaseCheck
|
4
|
+
Brakeman::Checks.add self
|
5
|
+
|
6
|
+
@description = "Check if HTML escaping is disabled for JSON output"
|
7
|
+
|
8
|
+
def run_check
|
9
|
+
check_config_setting
|
10
|
+
check_manual_disable
|
11
|
+
end
|
12
|
+
|
13
|
+
def check_config_setting
|
14
|
+
if false? tracker.config.rails.dig(:active_support, :escape_html_entities_in_json)
|
15
|
+
warn :warning_type => "Cross-Site Scripting",
|
16
|
+
:warning_code => :json_html_escape_config,
|
17
|
+
:message => msg("HTML entities in JSON are not escaped by default"),
|
18
|
+
:confidence => :medium,
|
19
|
+
:file => "config/environments/production.rb",
|
20
|
+
:line => 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_manual_disable
|
25
|
+
tracker.find_call(targets: [:ActiveSupport, :'ActiveSupport::JSON::Encoding'], method: :escape_html_entities_in_json=).each do |result|
|
26
|
+
setting = result[:call].first_arg
|
27
|
+
|
28
|
+
if false? setting
|
29
|
+
warn :result => result,
|
30
|
+
:warning_type => "Cross-Site Scripting",
|
31
|
+
:warning_code => :json_html_escape_module,
|
32
|
+
:message => msg("HTML entities in JSON are not escaped by default"),
|
33
|
+
:confidence => :medium,
|
34
|
+
:file => "config/environments/production.rb"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -34,7 +34,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
|
|
34
34
|
|
35
35
|
#Have to make a copy of this, otherwise it will be changed to
|
36
36
|
#an ignored method call by the code above.
|
37
|
-
call = result[:call]
|
37
|
+
call = result[:call]
|
38
38
|
|
39
39
|
first_arg = call.first_arg
|
40
40
|
second_arg = call.second_arg
|
@@ -30,9 +30,7 @@ class Brakeman::CheckLinkToHref < Brakeman::CheckLinkTo
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def process_result result
|
33
|
-
|
34
|
-
#an ignored method call by the code above.
|
35
|
-
call = result[:call] = result[:call].dup
|
33
|
+
call = result[:call]
|
36
34
|
@matched = false
|
37
35
|
|
38
36
|
url_arg = if result[:block]
|
@@ -17,6 +17,7 @@ class Brakeman::CheckMassAssignment < Brakeman::BaseCheck
|
|
17
17
|
def run_check
|
18
18
|
check_mass_assignment
|
19
19
|
check_permit!
|
20
|
+
check_permit_all_parameters
|
20
21
|
end
|
21
22
|
|
22
23
|
def find_mass_assign_calls
|
@@ -158,13 +159,28 @@ class Brakeman::CheckMassAssignment < Brakeman::BaseCheck
|
|
158
159
|
|
159
160
|
# Look for and warn about uses of Parameters#permit! for mass assignment
|
160
161
|
def check_permit!
|
161
|
-
tracker.find_call(:method => :permit
|
162
|
-
if params? result[:call].target
|
163
|
-
|
162
|
+
tracker.find_call(:method => :permit!, :nested => true).each do |result|
|
163
|
+
if params? result[:call].target
|
164
|
+
unless inside_safe_method? result or calls_slice? result
|
165
|
+
warn_on_permit! result
|
166
|
+
end
|
164
167
|
end
|
165
168
|
end
|
166
169
|
end
|
167
170
|
|
171
|
+
# Ignore blah_some_path(params.permit!)
|
172
|
+
def inside_safe_method? result
|
173
|
+
parent_call = result.dig(:parent, :call)
|
174
|
+
|
175
|
+
call? parent_call and
|
176
|
+
parent_call.method.match(/_path$/)
|
177
|
+
end
|
178
|
+
|
179
|
+
def calls_slice? result
|
180
|
+
result[:chain].include? :slice or
|
181
|
+
(result[:full_call] and result[:full_call][:chain].include? :slice)
|
182
|
+
end
|
183
|
+
|
168
184
|
# Look for actual use of params in mass assignment to avoid
|
169
185
|
# warning about uses of Parameters#permit! without any mass assignment
|
170
186
|
# or when mass assignment is restricted by model instead.
|
@@ -190,7 +206,21 @@ class Brakeman::CheckMassAssignment < Brakeman::BaseCheck
|
|
190
206
|
warn :result => result,
|
191
207
|
:warning_type => "Mass Assignment",
|
192
208
|
:warning_code => :mass_assign_permit!,
|
193
|
-
:message =>
|
209
|
+
:message => msg('Specify exact keys allowed for mass assignment instead of using ', msg_code('permit!'), ' which allows any keys'),
|
194
210
|
:confidence => confidence
|
195
211
|
end
|
212
|
+
|
213
|
+
def check_permit_all_parameters
|
214
|
+
tracker.find_call(target: :"ActionController::Parameters", method: :permit_all_parameters=).each do |result|
|
215
|
+
call = result[:call]
|
216
|
+
|
217
|
+
if true? call.first_arg
|
218
|
+
warn :result => result,
|
219
|
+
:warning_type => "Mass Assignment",
|
220
|
+
:warning_code => :mass_assign_permit_all,
|
221
|
+
:message => msg('Mass assignment is globally enabled. Disable and specify exact keys using ', msg_code('params.permit'), ' instead'),
|
222
|
+
:confidence => :high
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
196
226
|
end
|