brakeman 1.5.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +3 -2
- data/bin/brakeman +3 -0
- data/lib/brakeman/checks/base_check.rb +24 -4
- data/lib/brakeman/checks/check_cross_site_scripting.rb +1 -1
- data/lib/brakeman/processors/base_processor.rb +23 -2
- data/lib/brakeman/processors/controller_processor.rb +1 -1
- data/lib/brakeman/processors/lib/find_call.rb +1 -1
- data/lib/brakeman/processors/lib/render_helper.rb +1 -0
- data/lib/brakeman/scanner.rb +4 -5
- data/lib/brakeman/version.rb +1 -1
- metadata +72 -115
data/README.md
CHANGED
@@ -39,7 +39,7 @@ To specify an output file for the results:
|
|
39
39
|
|
40
40
|
brakeman -o output_file
|
41
41
|
|
42
|
-
The output format is determined by the file extension or by using the `-f` option. Current options are: `text`, `html`, `
|
42
|
+
The output format is determined by the file extension or by using the `-f` option. Current options are: `text`, `html`, `tabs`, `json` and `csv`.
|
43
43
|
|
44
44
|
To suppress informational warnings and just output the report:
|
45
45
|
|
@@ -103,7 +103,7 @@ Brakeman will raise warnings on models that use `attr_protected`. To suppress th
|
|
103
103
|
|
104
104
|
# Warning information
|
105
105
|
|
106
|
-
See
|
106
|
+
See WARNING\_TYPES for more information on the warnings reported by this tool.
|
107
107
|
|
108
108
|
# Warning context
|
109
109
|
|
@@ -140,6 +140,7 @@ The `-c` option can be used to specify a configuration file to use.
|
|
140
140
|
The MIT License
|
141
141
|
|
142
142
|
Copyright (c) 2010-2012, YELLOWPAGES.COM, LLC
|
143
|
+
|
143
144
|
Copyright (c) 2012, Twitter, Inc.
|
144
145
|
|
145
146
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
data/bin/brakeman
CHANGED
@@ -21,6 +21,7 @@ class Brakeman::BaseCheck < SexpProcessor
|
|
21
21
|
@string_interp = false
|
22
22
|
@current_set = nil
|
23
23
|
@current_template = @current_module = @current_class = @current_method = nil
|
24
|
+
@mass_assign_disabled = nil
|
24
25
|
self.strict = false
|
25
26
|
self.auto_shift_type = false
|
26
27
|
self.require_empty = false
|
@@ -119,23 +120,42 @@ class Brakeman::BaseCheck < SexpProcessor
|
|
119
120
|
|
120
121
|
#Checks if mass assignment is disabled globally in an initializer.
|
121
122
|
def mass_assign_disabled?
|
123
|
+
return @mass_assign_disabled unless @mass_assign_disabled.nil?
|
124
|
+
|
125
|
+
@mass_assign_disabled = false
|
126
|
+
|
122
127
|
if version_between?("3.1.0", "4.0.0") and
|
123
128
|
tracker.config[:rails][:active_record] and
|
124
129
|
tracker.config[:rails][:active_record][:whitelist_attributes] == Sexp.new(:true)
|
125
130
|
|
126
|
-
|
131
|
+
@mass_assign_disabled = true
|
127
132
|
else
|
128
133
|
matches = tracker.check_initializers(:"ActiveRecord::Base", :send)
|
134
|
+
|
129
135
|
if matches.empty?
|
130
|
-
|
136
|
+
matches = tracker.check_initializers([], :attr_accessible)
|
137
|
+
|
138
|
+
matches.each do |result|
|
139
|
+
if result[1] == :ActiveRecord and result[2] == :Base
|
140
|
+
arg = result[-1][3][1]
|
141
|
+
|
142
|
+
if arg.nil? or node_type? arg, :nil
|
143
|
+
@mass_assign_disabled = true
|
144
|
+
break
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
131
148
|
else
|
132
149
|
matches.each do |result|
|
133
|
-
if result[
|
134
|
-
|
150
|
+
if result[-1][3] == Sexp.new(:arglist, Sexp.new(:lit, :attr_accessible), Sexp.new(:nil))
|
151
|
+
@mass_assign_disabled = true
|
152
|
+
break
|
135
153
|
end
|
136
154
|
end
|
137
155
|
end
|
138
156
|
end
|
157
|
+
|
158
|
+
@mass_assign_disabled
|
139
159
|
end
|
140
160
|
|
141
161
|
#This is to avoid reporting duplicates. Checks if the result has been
|
@@ -24,6 +24,22 @@ class Brakeman::BaseProcessor < SexpProcessor
|
|
24
24
|
@current_template = @current_module = @current_class = @current_method = nil
|
25
25
|
end
|
26
26
|
|
27
|
+
def process_class exp
|
28
|
+
current_class = @current_class
|
29
|
+
@current_class = class_name exp[1]
|
30
|
+
process exp[3]
|
31
|
+
@current_class = current_class
|
32
|
+
exp
|
33
|
+
end
|
34
|
+
|
35
|
+
def process_module exp
|
36
|
+
current_module = @current_module
|
37
|
+
@current_module = class_name exp[1]
|
38
|
+
process exp[2]
|
39
|
+
@current_module = current_module
|
40
|
+
exp
|
41
|
+
end
|
42
|
+
|
27
43
|
#Process a new scope. Removes expressions that are set to nil.
|
28
44
|
def process_scope exp
|
29
45
|
exp = exp.dup
|
@@ -219,8 +235,13 @@ class Brakeman::BaseProcessor < SexpProcessor
|
|
219
235
|
|
220
236
|
#Look for render :action, ... or render "action", ...
|
221
237
|
if string? args[1] or symbol? args[1]
|
222
|
-
|
223
|
-
|
238
|
+
if @current_template and @tracker.options[:rails3]
|
239
|
+
type = :partial
|
240
|
+
value = args[1]
|
241
|
+
else
|
242
|
+
type = :action
|
243
|
+
value = args[1]
|
244
|
+
end
|
224
245
|
elsif args[1].is_a? Symbol or args[1].is_a? String
|
225
246
|
type = :action
|
226
247
|
value = Sexp.new(:lit, args[1].to_sym)
|
@@ -28,7 +28,7 @@ class Brakeman::ControllerProcessor < Brakeman::BaseProcessor
|
|
28
28
|
|
29
29
|
name = class_name(exp[1])
|
30
30
|
if @current_module
|
31
|
-
name = (@current_module + "::" + name.to_s).to_sym
|
31
|
+
name = (@current_module.to_s + "::" + name.to_s).to_sym
|
32
32
|
end
|
33
33
|
@controller = { :name => name,
|
34
34
|
:parent => class_name(exp[2]),
|
@@ -96,7 +96,7 @@ class Brakeman::FindCall < Brakeman::BaseProcessor
|
|
96
96
|
if @current_template
|
97
97
|
@calls << Sexp.new(:result, @current_template, exp).line(exp.line)
|
98
98
|
else
|
99
|
-
@calls << Sexp.new(:result, @current_class, @current_method, exp).line(exp.line)
|
99
|
+
@calls << Sexp.new(:result, @current_module, @current_class, @current_method, exp).line(exp.line)
|
100
100
|
end
|
101
101
|
|
102
102
|
end
|
@@ -49,6 +49,7 @@ module Brakeman::RenderHelper
|
|
49
49
|
#Processes a template, adding any instance variables
|
50
50
|
#to its environment.
|
51
51
|
def process_template name, args, called_from = nil
|
52
|
+
Brakeman.debug "Rendering #{name} (#{called_from})"
|
52
53
|
#Get scanned source for this template
|
53
54
|
name = name.to_s.gsub(/^\//, "")
|
54
55
|
template = @tracker.templates[name.to_sym]
|
data/lib/brakeman/scanner.rb
CHANGED
@@ -229,6 +229,7 @@ class Brakeman::Scanner
|
|
229
229
|
Brakeman.notify "Processing data flow in controllers..."
|
230
230
|
|
231
231
|
tracker.controllers.each do |name, controller|
|
232
|
+
Brakeman.debug "Processing #{name}"
|
232
233
|
if @report_progress
|
233
234
|
$stderr.print " #{current}/#{total} controllers processed\r"
|
234
235
|
current += 1
|
@@ -266,6 +267,7 @@ class Brakeman::Scanner
|
|
266
267
|
total = template_files.length
|
267
268
|
|
268
269
|
template_files.each do |path|
|
270
|
+
Brakeman.debug "Processing #{path}"
|
269
271
|
if @report_progress
|
270
272
|
$stderr.print " #{count}/#{total} files processed\r"
|
271
273
|
count += 1
|
@@ -280,6 +282,7 @@ class Brakeman::Scanner
|
|
280
282
|
Brakeman.notify "Processing data flow in templates..."
|
281
283
|
|
282
284
|
tracker.templates.keys.dup.each do |name|
|
285
|
+
Brakeman.debug "Processing #{name}"
|
283
286
|
if @report_progress
|
284
287
|
count += 1
|
285
288
|
$stderr.print " #{count}/#{total} templates processed\r"
|
@@ -352,6 +355,7 @@ class Brakeman::Scanner
|
|
352
355
|
current = 0
|
353
356
|
|
354
357
|
model_files.each do |f|
|
358
|
+
Brakeman.debug "Processing #{f}"
|
355
359
|
if @report_progress
|
356
360
|
$stderr.print " #{current}/#{total} files processed\r"
|
357
361
|
current += 1
|
@@ -448,11 +452,6 @@ class Brakeman::Rails2XSSErubis < ::Erubis::Eruby
|
|
448
452
|
#src << "@output_buffer = ActiveSupport::SafeBuffer.new;"
|
449
453
|
end
|
450
454
|
|
451
|
-
def add_text(src, text)
|
452
|
-
return if text.empty?
|
453
|
-
src << "@output_buffer.safe_concat('" << escape_text(text) << "');"
|
454
|
-
end
|
455
|
-
|
456
455
|
#This is different from rails_xss - fixes some line number issues
|
457
456
|
def add_text(src, text)
|
458
457
|
if text == "\n"
|
data/lib/brakeman/version.rb
CHANGED
metadata
CHANGED
@@ -1,134 +1,101 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: brakeman
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.5.1
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 5
|
9
|
-
- 0
|
10
|
-
version: 1.5.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Justin Collins
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-03-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: activesupport
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &72282300 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: i18n
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: *72282300
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: i18n
|
27
|
+
requirement: &72282080 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
46
33
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: ruby2ruby
|
50
34
|
prerelease: false
|
51
|
-
|
35
|
+
version_requirements: *72282080
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ruby2ruby
|
38
|
+
requirement: &72281550 !ruby/object:Gem::Requirement
|
52
39
|
none: false
|
53
|
-
requirements:
|
40
|
+
requirements:
|
54
41
|
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
segments:
|
58
|
-
- 1
|
59
|
-
- 2
|
60
|
-
version: "1.2"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.2'
|
61
44
|
type: :runtime
|
62
|
-
version_requirements: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: ruport
|
65
45
|
prerelease: false
|
66
|
-
|
46
|
+
version_requirements: *72281550
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ruport
|
49
|
+
requirement: &72280450 !ruby/object:Gem::Requirement
|
67
50
|
none: false
|
68
|
-
requirements:
|
51
|
+
requirements:
|
69
52
|
- - ~>
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
segments:
|
73
|
-
- 1
|
74
|
-
- 6
|
75
|
-
version: "1.6"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.6'
|
76
55
|
type: :runtime
|
77
|
-
version_requirements: *id004
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: erubis
|
80
56
|
prerelease: false
|
81
|
-
|
57
|
+
version_requirements: *72280450
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: erubis
|
60
|
+
requirement: &72280190 !ruby/object:Gem::Requirement
|
82
61
|
none: false
|
83
|
-
requirements:
|
62
|
+
requirements:
|
84
63
|
- - ~>
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
segments:
|
88
|
-
- 2
|
89
|
-
- 6
|
90
|
-
version: "2.6"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '2.6'
|
91
66
|
type: :runtime
|
92
|
-
version_requirements: *id005
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
|
-
name: haml
|
95
67
|
prerelease: false
|
96
|
-
|
68
|
+
version_requirements: *72280190
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: haml
|
71
|
+
requirement: &72279750 !ruby/object:Gem::Requirement
|
97
72
|
none: false
|
98
|
-
requirements:
|
73
|
+
requirements:
|
99
74
|
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
|
102
|
-
segments:
|
103
|
-
- 3
|
104
|
-
- 0
|
105
|
-
version: "3.0"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3.0'
|
106
77
|
type: :runtime
|
107
|
-
version_requirements: *id006
|
108
|
-
- !ruby/object:Gem::Dependency
|
109
|
-
name: sass
|
110
78
|
prerelease: false
|
111
|
-
|
79
|
+
version_requirements: *72279750
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: sass
|
82
|
+
requirement: &72279400 !ruby/object:Gem::Requirement
|
112
83
|
none: false
|
113
|
-
requirements:
|
84
|
+
requirements:
|
114
85
|
- - ~>
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
|
117
|
-
segments:
|
118
|
-
- 3
|
119
|
-
- 0
|
120
|
-
version: "3.0"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '3.0'
|
121
88
|
type: :runtime
|
122
|
-
|
123
|
-
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *72279400
|
91
|
+
description: Brakeman detects security vulnerabilities in Ruby on Rails applications
|
92
|
+
via static analysis.
|
124
93
|
email:
|
125
|
-
executables:
|
94
|
+
executables:
|
126
95
|
- brakeman
|
127
96
|
extensions: []
|
128
|
-
|
129
97
|
extra_rdoc_files: []
|
130
|
-
|
131
|
-
files:
|
98
|
+
files:
|
132
99
|
- bin/brakeman
|
133
100
|
- WARNING_TYPES
|
134
101
|
- FEATURES
|
@@ -208,36 +175,26 @@ files:
|
|
208
175
|
- lib/brakeman/format/style.css
|
209
176
|
homepage: http://brakemanscanner.org
|
210
177
|
licenses: []
|
211
|
-
|
212
178
|
post_install_message:
|
213
179
|
rdoc_options: []
|
214
|
-
|
215
|
-
require_paths:
|
180
|
+
require_paths:
|
216
181
|
- lib
|
217
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
218
183
|
none: false
|
219
|
-
requirements:
|
220
|
-
- -
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
|
223
|
-
|
224
|
-
- 0
|
225
|
-
version: "0"
|
226
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ! '>='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
189
|
none: false
|
228
|
-
requirements:
|
229
|
-
- -
|
230
|
-
- !ruby/object:Gem::Version
|
231
|
-
|
232
|
-
segments:
|
233
|
-
- 0
|
234
|
-
version: "0"
|
190
|
+
requirements:
|
191
|
+
- - ! '>='
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
235
194
|
requirements: []
|
236
|
-
|
237
195
|
rubyforge_project:
|
238
196
|
rubygems_version: 1.8.15
|
239
197
|
signing_key:
|
240
198
|
specification_version: 3
|
241
199
|
summary: Security vulnerability scanner for Ruby on Rails.
|
242
200
|
test_files: []
|
243
|
-
|