brakeman-lib 3.6.1 → 3.6.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0df5204ececcf12fbf58c9024517536da1bd573
4
- data.tar.gz: 5a03298107656214eaf8308091a3667521541526
3
+ metadata.gz: b009aece1db925bc835024219dd9728197628bc3
4
+ data.tar.gz: b4d231e1a8d98847f66c220570ddfc733b92f8f6
5
5
  SHA512:
6
- metadata.gz: 06d0807326483e035bb28e3f26cfe04d960053f30cc91270b7efbb741b174b5caa8c850226866024e890beaa77e8167e48de8f003251cfbfacc789e842258c96
7
- data.tar.gz: b4bfe784e6d0b51b4bd7d444285b7d840dec42e59058f5638f71f9debd5bd5313bcd77929947f38b55279ead29b8031cb62f23043524d24b42e625b182a7289d
6
+ metadata.gz: 9dd15326cb813bb0f2fd5bb588caaf4f7e1b30f8dc7a353a691f9490df10631aafd0218dd1c55f6e90c97d83401a6650cfb79d1afd073e7a06a9113026f95635
7
+ data.tar.gz: 7a35e0864a7c7ad084291cf9a313e404a62f4daff8fb5d4d46ad1c8a7270b6e5781a9a56a640c482ae6fdcd500a4bfcb65fcf8a71ae147b2d8fedf4c2cd4c994
data/CHANGES CHANGED
@@ -1,3 +1,18 @@
1
+ # 3.6.2
2
+
3
+ * Handle safe call operator in checks
4
+ * Better handling of `if` expressions in HAML rendering
5
+ * Remove `--rake` option
6
+ * Properly handle template names without `.html` or `.js`
7
+ * Set template file names during rendering for better errors
8
+ * Limit Slim dependency to before 3.0.8
9
+ * Catch YAML parsing errors in session settings check
10
+ * Avoid warning about SQLi with `to_s` in `exists?`
11
+ * Update RubyParser to 3.9.0
12
+ * Do not honor additional check paths in config by default
13
+ * Handle empty `if` expressions when finding return values
14
+ * Fix finding return value from empty `if`
15
+
1
16
  # 3.6.1
2
17
 
3
18
  * Fix error when using `--compare` (Sean Gransee)
@@ -28,9 +28,6 @@ elsif options[:show_help]
28
28
  elsif options[:show_version]
29
29
  puts "brakeman #{Brakeman::Version}"
30
30
  exit
31
- elsif options[:install_rake_task]
32
- Brakeman.install_rake_task
33
- exit
34
31
  end
35
32
 
36
33
  #Set application path according to the commandline arguments
@@ -114,6 +114,14 @@ module Brakeman
114
114
  # After parsing the yaml config file for options, convert any string keys into symbols.
115
115
  options.keys.select {|k| k.is_a? String}.map {|k| k.to_sym }.each {|k| options[k] = options[k.to_s]; options.delete(k.to_s) }
116
116
 
117
+ unless line_options[:allow_check_paths_in_config]
118
+ if options.include? :additional_checks_path
119
+ options.delete :additional_checks_path
120
+
121
+ notify "[Notice] Ignoring additional check paths in config file. Use --allow-check-paths-in-config to allow" unless (options[:quiet] || quiet)
122
+ end
123
+ end
124
+
117
125
  # notify if options[:quiet] and quiet is nil||false
118
126
  notify "[Notice] Using configuration in #{config}" unless (options[:quiet] || quiet)
119
127
  options
@@ -269,43 +277,6 @@ module Brakeman
269
277
  end
270
278
  end
271
279
 
272
- #Installs Rake task for running Brakeman,
273
- #which basically means copying `lib/brakeman/brakeman.rake` to
274
- #`lib/tasks/brakeman.rake` in the current Rails application.
275
- def self.install_rake_task install_path = nil
276
- if install_path
277
- rake_path = File.join(install_path, "Rakefile")
278
- task_path = File.join(install_path, "lib", "tasks", "brakeman.rake")
279
- else
280
- rake_path = "Rakefile"
281
- task_path = File.join("lib", "tasks", "brakeman.rake")
282
- end
283
-
284
- if not File.exist? rake_path
285
- raise RakeInstallError, "No Rakefile detected"
286
- elsif File.exist? task_path
287
- raise RakeInstallError, "Task already exists"
288
- end
289
-
290
- require 'fileutils'
291
-
292
- if not File.exist? "lib/tasks"
293
- notify "Creating lib/tasks"
294
- FileUtils.mkdir_p "lib/tasks"
295
- end
296
-
297
- path = File.expand_path(File.dirname(__FILE__))
298
-
299
- FileUtils.cp "#{path}/brakeman/brakeman.rake", task_path
300
-
301
- if File.exist? task_path
302
- notify "Task created in #{task_path}"
303
- notify "Usage: rake brakeman:run[output_file]"
304
- else
305
- raise RakeInstallError, "Could not create task"
306
- end
307
- end
308
-
309
280
  #Output configuration to YAML
310
281
  def self.dump_config options
311
282
  require 'yaml'
@@ -534,7 +505,6 @@ module Brakeman
534
505
  end
535
506
 
536
507
  class DependencyError < RuntimeError; end
537
- class RakeInstallError < RuntimeError; end
538
508
  class NoBrakemanError < RuntimeError; end
539
509
  class NoApplication < RuntimeError; end
540
510
  class MissingChecksError < RuntimeError; end
@@ -6,6 +6,7 @@ require 'brakeman/util'
6
6
  #Basis of vulnerability checks.
7
7
  class Brakeman::BaseCheck < Brakeman::SexpProcessor
8
8
  include Brakeman::ProcessorHelper
9
+ include Brakeman::SafeCallHelper
9
10
  include Brakeman::Util
10
11
  attr_reader :tracker, :warnings
11
12
 
@@ -115,7 +115,13 @@ class Brakeman::CheckSessionSettings < Brakeman::BaseCheck
115
115
  yaml = @app_tree.read secrets_file
116
116
  require 'date' # https://github.com/dtao/safe_yaml/issues/80
117
117
  require 'safe_yaml/load'
118
- secrets = SafeYAML.load yaml
118
+ begin
119
+ secrets = SafeYAML.load yaml
120
+ rescue Psych::SyntaxError, RuntimeError => e
121
+ Brakeman.notify "[Notice] #{self.class}: Unable to parse `#{secrets_file}`"
122
+ Brakeman.debug "Failed to parse #{secrets_file}: #{e.inspect}"
123
+ return
124
+ end
119
125
 
120
126
  if secrets["production"] and secret = secrets["production"]["secret_key_base"]
121
127
  unless secret.include? "<%="
@@ -164,7 +164,9 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
164
164
  dangerous_value = case method
165
165
  when :find
166
166
  check_find_arguments call.second_arg
167
- when :exists?, :delete_all, :destroy_all
167
+ when :exists?
168
+ check_exists call.first_arg
169
+ when :delete_all, :destroy_all
168
170
  check_find_arguments call.first_arg
169
171
  when :named_scope, :scope
170
172
  check_scope_arguments call
@@ -633,6 +635,14 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
633
635
  end
634
636
  end
635
637
 
638
+ def check_exists arg
639
+ if call? arg and arg.method == :to_s
640
+ false
641
+ else
642
+ check_find_arguments arg
643
+ end
644
+ end
645
+
636
646
  #Prior to Rails 2.1.1, the :offset and :limit parameters were not
637
647
  #escaping input properly.
638
648
  #
@@ -280,6 +280,10 @@ module Brakeman::Options
280
280
  end
281
281
  end
282
282
 
283
+ opts.on "--allow-check-paths-in-config", "Allow loading checks from configuration file (Unsafe)" do
284
+ options[:allow_check_paths_in_config] = true
285
+ end
286
+
283
287
  opts.separator ""
284
288
 
285
289
  opts.on "-k", "--checks", "List all available vulnerability checks" do
@@ -290,10 +294,6 @@ module Brakeman::Options
290
294
  options[:list_optional_checks] = true
291
295
  end
292
296
 
293
- opts.on "--rake", "Create rake task to run Brakeman" do
294
- options[:install_rake_task] = true
295
- end
296
-
297
297
  opts.on "-v", "--version", "Show Brakeman version" do
298
298
  options[:show_version] = true
299
299
  end
@@ -22,11 +22,11 @@ module Brakeman
22
22
  src = case type
23
23
  when :erb
24
24
  type = :erubis if erubis?
25
- parse_erb text
25
+ parse_erb path, text
26
26
  when :haml
27
- parse_haml text
27
+ parse_haml path, text
28
28
  when :slim
29
- parse_slim text
29
+ parse_slim path, text
30
30
  else
31
31
  tracker.error "Unknown template type in #{path}"
32
32
  nil
@@ -46,21 +46,21 @@ module Brakeman
46
46
  nil
47
47
  end
48
48
 
49
- def parse_erb text
49
+ def parse_erb path, text
50
50
  if tracker.config.escape_html?
51
51
  if tracker.options[:rails3]
52
52
  require 'brakeman/parsers/rails3_erubis'
53
- Brakeman::Rails3Erubis.new(text).src
53
+ Brakeman::Rails3Erubis.new(text, :filename => path).src
54
54
  else
55
55
  require 'brakeman/parsers/rails2_xss_plugin_erubis'
56
- Brakeman::Rails2XSSPluginErubis.new(text).src
56
+ Brakeman::Rails2XSSPluginErubis.new(text, :filename => path).src
57
57
  end
58
58
  elsif tracker.config.erubis?
59
59
  require 'brakeman/parsers/rails2_erubis'
60
- Brakeman::ScannerErubis.new(text).src
60
+ Brakeman::ScannerErubis.new(text, :filename => path).src
61
61
  else
62
62
  require 'erb'
63
- src = ERB.new(text, nil, "-").src
63
+ src = ERB.new(text, nil, path).src
64
64
  src.sub!(/^#.*\n/, '') if Brakeman::Scanner::RUBY_1_9
65
65
  src
66
66
  end
@@ -71,25 +71,27 @@ module Brakeman
71
71
  tracker.config.erubis?
72
72
  end
73
73
 
74
- def parse_haml text
74
+ def parse_haml path, text
75
75
  Brakeman.load_brakeman_dependency 'haml'
76
76
  Brakeman.load_brakeman_dependency 'sass'
77
77
 
78
78
  Haml::Engine.new(text,
79
+ :filename => path,
79
80
  :escape_html => tracker.config.escape_html?).precompiled.gsub(/([^\\])\\n/, '\1')
80
81
  end
81
82
 
82
- def parse_slim text
83
+ def parse_slim path, text
83
84
  Brakeman.load_brakeman_dependency 'slim'
84
85
 
85
- Slim::Template.new(:disable_capture => true,
86
+ Slim::Template.new(path,
87
+ :disable_capture => true,
86
88
  :generator => Temple::Generators::RailsOutputBuffer) { text }.precompiled_template
87
89
  end
88
90
 
89
91
  def self.parse_inline_erb tracker, text
90
92
  fp = Brakeman::FileParser.new(nil, nil)
91
93
  tp = self.new(tracker, fp)
92
- src = tp.parse_erb text
94
+ src = tp.parse_erb '_inline_', text
93
95
  type = tp.erubis? ? :erubis : :erb
94
96
 
95
97
  return type, fp.parse_ruby(src, "_inline_")
@@ -170,6 +170,14 @@ class Brakeman::HamlTemplateProcessor < Brakeman::TemplateProcessor
170
170
  exp
171
171
  when :block, :rlist, :dstr
172
172
  exp.map! { |e| get_pushed_value e }
173
+ when :if
174
+ clauses = [get_pushed_value(exp.then_clause), get_pushed_value(exp.else_clause)].compact
175
+
176
+ if clauses.length > 1
177
+ s(:or, *clauses)
178
+ else
179
+ clauses.first
180
+ end
173
181
  else
174
182
  if call? exp and exp.target == HAML_HELPERS and exp.method == :html_escape
175
183
  add_escaped_output exp.first_arg
@@ -81,7 +81,9 @@ class Brakeman::FindReturnValue
81
81
  then_clause = exp.then_clause
82
82
  else_clause = exp.else_clause
83
83
 
84
- if then_clause.nil?
84
+ if then_clause.nil? and else_clause.nil?
85
+ nil
86
+ elsif then_clause.nil?
85
87
  last_value else_clause
86
88
  elsif else_clause.nil?
87
89
  last_value then_clause
@@ -429,7 +429,7 @@ module Brakeman::Util
429
429
  # views/test/something.html.erb -> test/something
430
430
  def template_path_to_name path
431
431
  names = path.split("/")
432
- names.last.gsub!(/(\.(html|js)\..*|\.rhtml)$/, '')
432
+ names.last.gsub!(/(\.(html|js)\..*|\.(rhtml|haml|erb|slim))$/, '')
433
433
  names[(names.index("views") + 1)..-1].join("/").to_sym
434
434
  end
435
435
 
@@ -1,3 +1,3 @@
1
1
  module Brakeman
2
- Version = "3.6.1"
2
+ Version = "3.6.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brakeman-lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.1
4
+ version: 3.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Collins
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - brakeman-public_cert.pem
12
- date: 2017-03-24 00:00:00.000000000 Z
12
+ date: 2017-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 3.8.3
34
+ version: 3.9.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 3.8.3
41
+ version: 3.9.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: ruby2ruby
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -158,7 +158,7 @@ dependencies:
158
158
  version: 1.3.6
159
159
  - - "<"
160
160
  - !ruby/object:Gem::Version
161
- version: '4.0'
161
+ version: 3.0.8
162
162
  type: :runtime
163
163
  prerelease: false
164
164
  version_requirements: !ruby/object:Gem::Requirement
@@ -168,7 +168,7 @@ dependencies:
168
168
  version: 1.3.6
169
169
  - - "<"
170
170
  - !ruby/object:Gem::Version
171
- version: '4.0'
171
+ version: 3.0.8
172
172
  description: Brakeman detects security vulnerabilities in Ruby on Rails applications
173
173
  via static analysis. This package declares gem dependencies instead of bundling
174
174
  them.
@@ -184,7 +184,6 @@ files:
184
184
  - bin/brakeman
185
185
  - lib/brakeman.rb
186
186
  - lib/brakeman/app_tree.rb
187
- - lib/brakeman/brakeman.rake
188
187
  - lib/brakeman/call_index.rb
189
188
  - lib/brakeman/checks.rb
190
189
  - lib/brakeman/checks/base_check.rb
@@ -1,17 +0,0 @@
1
- namespace :brakeman do
2
-
3
- desc "Run Brakeman"
4
- task :run, :output_files do |t, args|
5
- require 'brakeman'
6
-
7
- files = args[:output_files].split(' ') if args[:output_files]
8
- Brakeman.run :app_path => ".", :output_files => files, :print_report => true
9
- end
10
-
11
- desc "Check your code with Brakeman"
12
- task :check do
13
- require 'brakeman'
14
- result = Brakeman.run app_path: '.', print_report: true
15
- exit Brakeman::Warnings_Found_Exit_Code unless result.filtered_warnings.empty?
16
- end
17
- end