brakeman 1.9.3 → 1.9.4
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 +12 -0
- data/lib/brakeman/checks/base_check.rb +11 -3
- data/lib/brakeman/checks/check_jruby_xml.rb +38 -0
- data/lib/brakeman/checks/check_sanitize_methods.rb +54 -0
- data/lib/brakeman/checks/check_send.rb +0 -10
- data/lib/brakeman/checks/check_symbol_dos.rb +29 -0
- data/lib/brakeman/differ.rb +10 -1
- data/lib/brakeman/processors/alias_processor.rb +1 -15
- data/lib/brakeman/report.rb +1 -1
- data/lib/brakeman/version.rb +1 -1
- data/lib/brakeman/warning_codes.rb +5 -1
- data/lib/ruby_parser/bm_sexp.rb +24 -0
- metadata +5 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- 
         | 
| 2 2 | 
             
            SHA512: 
         | 
| 3 | 
            -
               | 
| 4 | 
            -
               | 
| 3 | 
            +
              metadata.gz: b29913808e5de71c6f0e13ab91142f730fdce339829e8fbfc91deca3eb0ce95eb24ce2e58e9fe576f121bce7f63a2015aa84866ac2bb41d07a266081c8e76293
         | 
| 4 | 
            +
              data.tar.gz: 81669ba7654b7ced4214430613064484ba5fc7ea6a331ee31dd8aeea294621fda75b23b3caee0d1effec0b3fd67c7f636ee5e0868e17d337b6ac4a180e305db6
         | 
| 5 5 | 
             
            SHA1: 
         | 
| 6 | 
            -
               | 
| 7 | 
            -
               | 
| 6 | 
            +
              metadata.gz: 1f0ed0d4abb525abf8c95b72133ea5c304325075
         | 
| 7 | 
            +
              data.tar.gz: 48837c8bdab262f44bf27c8962e13d4c9808589d
         | 
    
        data/CHANGES
    CHANGED
    
    | @@ -1,3 +1,15 @@ | |
| 1 | 
            +
            # 1.9.4
         | 
| 2 | 
            +
             
         | 
| 3 | 
            +
             * Add check for CVE-2013-1854
         | 
| 4 | 
            +
             * Add check for CVE-2013-1855
         | 
| 5 | 
            +
             * Add check for CVE-2013-1856
         | 
| 6 | 
            +
             * Add check for CVE-2013-1857
         | 
| 7 | 
            +
             * Fix `--compare` to work with older versions
         | 
| 8 | 
            +
             * Add "no-referrer' to HTML report links
         | 
| 9 | 
            +
             * Don't warn when invoking `send` on user input
         | 
| 10 | 
            +
             * Slightly faster cloning of Sexps
         | 
| 11 | 
            +
             * Detect another way to add `strong_parameters`
         | 
| 12 | 
            +
             | 
| 1 13 | 
             
            # 1.9.3
         | 
| 2 14 |  | 
| 3 15 | 
             
             * Add render path to JSON report
         | 
| @@ -211,11 +211,19 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor | |
| 211 211 | 
             
                #ActiveRecord::Base in an initializer.
         | 
| 212 212 | 
             
                if not @mass_assign_disabled and version_between?("3.1.0", "3.9.9") and tracker.config[:gems][:strong_parameters]
         | 
| 213 213 | 
             
                  matches = tracker.check_initializers([], :include)
         | 
| 214 | 
            +
                  forbidden_protection = Sexp.new(:colon2, Sexp.new(:const, :ActiveModel), :ForbiddenAttributesProtection)
         | 
| 214 215 |  | 
| 215 216 | 
             
                  matches.each do |result|
         | 
| 216 | 
            -
                    call  | 
| 217 | 
            -
             | 
| 218 | 
            -
             | 
| 217 | 
            +
                    if call? result.call and result.call.first_arg == forbidden_protection
         | 
| 218 | 
            +
                      @mass_assign_disabled = true
         | 
| 219 | 
            +
                    end
         | 
| 220 | 
            +
                  end
         | 
| 221 | 
            +
             | 
| 222 | 
            +
                  unless @mass_assign_disabled
         | 
| 223 | 
            +
                    matches = tracker.check_initializers(:"ActiveRecord::Base", :send)
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                    matches.each do |result|
         | 
| 226 | 
            +
                      if call? result.call and result.call.second_arg == forbidden_protection
         | 
| 219 227 | 
             
                        @mass_assign_disabled = true
         | 
| 220 228 | 
             
                      end
         | 
| 221 229 | 
             
                    end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            require 'brakeman/checks/base_check'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Brakeman::CheckJRubyXML < Brakeman::BaseCheck
         | 
| 4 | 
            +
              Brakeman::Checks.add self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              @description = "Checks for versions with JRuby XML parsing backend"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def run_check
         | 
| 9 | 
            +
                return unless RUBY_PLATFORM == "java"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                fix_version = case
         | 
| 12 | 
            +
                  when version_between?('3.0.0', '3.0.99')
         | 
| 13 | 
            +
                    '3.2.13'
         | 
| 14 | 
            +
                  when version_between?('3.1.0', '3.1.11')
         | 
| 15 | 
            +
                    '3.1.12'
         | 
| 16 | 
            +
                  when version_between?('3.2.0', '3.2.12')
         | 
| 17 | 
            +
                    '3.2.13'
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    return
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                #Check for workaround
         | 
| 23 | 
            +
                tracker.check_initializers(:"ActiveSupport::XmlMini", :backend=).each do |result|
         | 
| 24 | 
            +
                  arg = result.call.first_arg
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  if string? arg and arg.value == "REXML"
         | 
| 27 | 
            +
                    return
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                warn :warning_type => "File Access",
         | 
| 32 | 
            +
                  :warning_code => :CVE_2013_1856,
         | 
| 33 | 
            +
                  :message => "Rails #{tracker.config[:rails_version]} with JRuby has a vulnerability in XML parser: upgrade to #{fix_version} or patch",
         | 
| 34 | 
            +
                  :confidence => CONFIDENCE[:high],
         | 
| 35 | 
            +
                  :file => gemfile_or_environment,
         | 
| 36 | 
            +
                  :link => "https://groups.google.com/d/msg/rubyonrails-security/KZwsQbYsOiI/5kUV7dSCJGwJ"
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            require 'brakeman/checks/base_check'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            #sanitize and sanitize_css are vulnerable:
         | 
| 4 | 
            +
            #CVE-2013-1855 and CVE-2013-1857
         | 
| 5 | 
            +
            class Brakeman::CheckSanitizeMethods < Brakeman::BaseCheck
         | 
| 6 | 
            +
              Brakeman::Checks.add self
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              @description = "Checks for versions with vulnerable sanitize and sanitize_css"
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def run_check
         | 
| 11 | 
            +
                @fix_version = case
         | 
| 12 | 
            +
                  when version_between?('2.0.0', '2.3.17')
         | 
| 13 | 
            +
                    '2.3.18'
         | 
| 14 | 
            +
                  when version_between?('3.0.0', '3.0.99')
         | 
| 15 | 
            +
                    '3.2.13'
         | 
| 16 | 
            +
                  when version_between?('3.1.0', '3.1.11')
         | 
| 17 | 
            +
                    '3.1.12'
         | 
| 18 | 
            +
                  when version_between?('3.2.0', '3.2.12')
         | 
| 19 | 
            +
                    '3.2.13'
         | 
| 20 | 
            +
                  else
         | 
| 21 | 
            +
                    return
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                check_cve_2013_1855
         | 
| 25 | 
            +
                check_cve_2013_1857
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              def check_cve_2013_1855
         | 
| 29 | 
            +
                check_for_cve :sanitize_css, :CVE_2013_1855, "https://groups.google.com/d/msg/rubyonrails-security/4_QHo4BqnN8/_RrdfKk12I4J"
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def check_cve_2013_1857
         | 
| 33 | 
            +
                check_for_cve :sanitize, :CVE_2013_1857, "https://groups.google.com/d/msg/rubyonrails-security/zAAU7vGTPvI/1vZDWXqBuXgJ"
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              def check_for_cve method, code, link
         | 
| 37 | 
            +
                tracker.find_call(:target => false, :method => method).each do |result|
         | 
| 38 | 
            +
                  message = "Rails #{tracker.config[:rails_version]} has a vulnerability in #{method}: upgrade to #{@fix_version} or patch"
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  if include_user_input? result[:call]
         | 
| 41 | 
            +
                    confidence = CONFIDENCE[:high]
         | 
| 42 | 
            +
                  else
         | 
| 43 | 
            +
                    confidence = CONFIDENCE[:medium]
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  warn :result => result,
         | 
| 47 | 
            +
                    :warning_type => "Cross Site Scripting",
         | 
| 48 | 
            +
                    :warning_code => code,
         | 
| 49 | 
            +
                    :message => message,
         | 
| 50 | 
            +
                    :confidence => CONFIDENCE[:high],
         | 
| 51 | 
            +
                    :link_path => link
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -28,15 +28,5 @@ class Brakeman::CheckSend < Brakeman::BaseCheck | |
| 28 28 | 
             
                    :user_input => input.match,
         | 
| 29 29 | 
             
                    :confidence => CONFIDENCE[:high]
         | 
| 30 30 | 
             
                end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                if input = has_immediate_user_input?(target)
         | 
| 33 | 
            -
                  warn :result => result,
         | 
| 34 | 
            -
                    :warning_type => "Dangerous Send",
         | 
| 35 | 
            -
                    :warning_code => :dangerous_send,
         | 
| 36 | 
            -
                    :message => "User defined target of method invocation",
         | 
| 37 | 
            -
                    :code => result[:call],
         | 
| 38 | 
            -
                    :user_input => input.match,
         | 
| 39 | 
            -
                    :confidence => CONFIDENCE[:med]
         | 
| 40 | 
            -
                end
         | 
| 41 31 | 
             
              end
         | 
| 42 32 | 
             
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require 'brakeman/checks/base_check'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck
         | 
| 4 | 
            +
              Brakeman::Checks.add self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              @description = "Checks for versions with ActiveRecord symbol denial of service" 
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def run_check
         | 
| 9 | 
            +
                fix_version = case
         | 
| 10 | 
            +
                  when version_between?('2.0.0', '2.3.17')
         | 
| 11 | 
            +
                    '2.3.18'
         | 
| 12 | 
            +
                  when version_between?('3.1.0', '3.1.11')
         | 
| 13 | 
            +
                    '3.1.12'
         | 
| 14 | 
            +
                  when version_between?('3.2.0', '3.2.12')
         | 
| 15 | 
            +
                    '3.2.13'
         | 
| 16 | 
            +
                  else
         | 
| 17 | 
            +
                    return
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                unless active_record_models.empty?
         | 
| 21 | 
            +
                  warn :warning_type => "Denial of Service",
         | 
| 22 | 
            +
                    :warning_code => :CVE_2013_1854,
         | 
| 23 | 
            +
                    :message => "Rails #{tracker.config[:rails_version]} has a denial of service vulnerability in ActiveRecord: upgrade to #{fix_version} or patch",
         | 
| 24 | 
            +
                    :confidence => CONFIDENCE[:med],
         | 
| 25 | 
            +
                    :file => gemfile_or_environment,
         | 
| 26 | 
            +
                    :link => "https://groups.google.com/d/msg/rubyonrails-security/jgJ4cjjS8FE/BGbHRxnDRTIJ"
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
    
        data/lib/brakeman/differ.rb
    CHANGED
    
    | @@ -2,6 +2,7 @@ | |
| 2 2 | 
             
            # an array of Brakeman::Warnings or plain hash representations.  
         | 
| 3 3 | 
             
            class Brakeman::Differ
         | 
| 4 4 | 
             
              DEFAULT_HASH = {:new => [], :fixed => []}
         | 
| 5 | 
            +
              OLD_WARNING_KEYS = [:warning_type, :location, :code, :message, :file, :link, :confidence, :user_input]
         | 
| 5 6 | 
             
              attr_reader :old_warnings, :new_warnings
         | 
| 6 7 |  | 
| 7 8 | 
             
              def initialize new_warnings, old_warnings
         | 
| @@ -52,6 +53,14 @@ class Brakeman::Differ | |
| 52 53 | 
             
                  fixed_warning = fixed_warning.to_hash
         | 
| 53 54 | 
             
                end
         | 
| 54 55 |  | 
| 55 | 
            -
                new_warning[:fingerprint]  | 
| 56 | 
            +
                if new_warning[:fingerprint] and fixed_warning[:fingerprint]
         | 
| 57 | 
            +
                  new_warning[:fingerprint] == fixed_warning[:fingerprint]
         | 
| 58 | 
            +
                else
         | 
| 59 | 
            +
                 OLD_WARNING_KEYS.each do |attr|
         | 
| 60 | 
            +
                    return false if new_warning[attr] != fixed_warning[attr]
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  true
         | 
| 64 | 
            +
                end
         | 
| 56 65 | 
             
              end
         | 
| 57 66 | 
             
            end
         | 
| @@ -63,7 +63,7 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor | |
| 63 63 |  | 
| 64 64 | 
             
                #Generic replace
         | 
| 65 65 | 
             
                if replacement = env[exp] and not duplicate? replacement
         | 
| 66 | 
            -
                  result =  | 
| 66 | 
            +
                  result = replacement.deep_clone(exp.line)
         | 
| 67 67 | 
             
                else
         | 
| 68 68 | 
             
                  result = exp
         | 
| 69 69 | 
             
                end
         | 
| @@ -580,20 +580,6 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor | |
| 580 580 | 
             
                meth_env
         | 
| 581 581 | 
             
              end
         | 
| 582 582 |  | 
| 583 | 
            -
              #Set line nunber for +exp+ and every Sexp it contains. Used when replacing
         | 
| 584 | 
            -
              #expressions, so warnings indicate the correct line.
         | 
| 585 | 
            -
              def set_line exp, line_number
         | 
| 586 | 
            -
                if sexp? exp
         | 
| 587 | 
            -
                  exp.original_line(exp.original_line || exp.line)
         | 
| 588 | 
            -
                  exp.line line_number
         | 
| 589 | 
            -
                  exp.each do |e|
         | 
| 590 | 
            -
                    set_line e, line_number
         | 
| 591 | 
            -
                  end
         | 
| 592 | 
            -
                end
         | 
| 593 | 
            -
             | 
| 594 | 
            -
                exp
         | 
| 595 | 
            -
              end
         | 
| 596 | 
            -
             | 
| 597 583 | 
             
              #Finds the inner most call target which is not the target of a call to <<
         | 
| 598 584 | 
             
              def find_push_target exp
         | 
| 599 585 | 
             
                if call? exp and exp.method == :<<
         | 
    
        data/lib/brakeman/report.rb
    CHANGED
    
    | @@ -639,7 +639,7 @@ HEADER | |
| 639 639 | 
             
              end
         | 
| 640 640 |  | 
| 641 641 | 
             
              def with_link warning, message
         | 
| 642 | 
            -
                "<a href=\"#{warning.link}\">#{message}</a>"
         | 
| 642 | 
            +
                "<a rel=\"no-referrer\" href=\"#{warning.link}\">#{message}</a>"
         | 
| 643 643 | 
             
              end
         | 
| 644 644 |  | 
| 645 645 | 
             
              #Generated tab-separated output suitable for the Jenkins Brakeman Plugin:
         | 
    
        data/lib/brakeman/version.rb
    CHANGED
    
    
| @@ -54,7 +54,11 @@ module Brakeman::WarningCodes | |
| 54 54 | 
             
                :CVE_2013_0276 => 51,
         | 
| 55 55 | 
             
                :CVE_2013_0333 => 52,
         | 
| 56 56 | 
             
                :xss_content_tag => 53,
         | 
| 57 | 
            -
                :mass_assign_without_protection => 54
         | 
| 57 | 
            +
                :mass_assign_without_protection => 54,
         | 
| 58 | 
            +
                :CVE_2013_1854 => 55,
         | 
| 59 | 
            +
                :CVE_2013_1855 => 56,
         | 
| 60 | 
            +
                :CVE_2013_1856 => 57,
         | 
| 61 | 
            +
                :CVE_2013_1857 => 58,
         | 
| 58 62 | 
             
              }
         | 
| 59 63 |  | 
| 60 64 | 
             
              def self.code name
         | 
    
        data/lib/ruby_parser/bm_sexp.rb
    CHANGED
    
    | @@ -14,6 +14,30 @@ class Sexp | |
| 14 14 | 
             
                raise NoMethodError.new("No method '#{name}' for Sexp", name, args)
         | 
| 15 15 | 
             
              end
         | 
| 16 16 |  | 
| 17 | 
            +
              #Create clone of Sexp and nested Sexps but not their non-Sexp contents.
         | 
| 18 | 
            +
              #If a line number is provided, also sets line/original_line on all Sexps.
         | 
| 19 | 
            +
              def deep_clone line = nil
         | 
| 20 | 
            +
                s = Sexp.new
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                self.each do |e|
         | 
| 23 | 
            +
                  if e.is_a? Sexp
         | 
| 24 | 
            +
                    s << e.deep_clone(line)
         | 
| 25 | 
            +
                  else
         | 
| 26 | 
            +
                    s << e
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                if line
         | 
| 31 | 
            +
                  s.original_line(self.original_line || self.line)
         | 
| 32 | 
            +
                  s.line(line)
         | 
| 33 | 
            +
                else
         | 
| 34 | 
            +
                  s.original_line(self.original_line)
         | 
| 35 | 
            +
                  s.line(self.line)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                s
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 17 41 | 
             
              def paren
         | 
| 18 42 | 
             
                @paren ||= false
         | 
| 19 43 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: brakeman
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 1.9. | 
| 4 | 
            +
              version: 1.9.4
         | 
| 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 |  | 
| 12 | 
            -
            date: 2013-03- | 
| 12 | 
            +
            date: 2013-03-19 00:00:00 Z
         | 
| 13 13 | 
             
            dependencies: 
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 15 15 | 
             
              name: ruby_parser
         | 
| @@ -161,6 +161,8 @@ files: | |
| 161 161 | 
             
            - lib/brakeman/checks/check_mass_assignment.rb
         | 
| 162 162 | 
             
            - lib/brakeman/checks/check_link_to_href.rb
         | 
| 163 163 | 
             
            - lib/brakeman/checks/check_filter_skipping.rb
         | 
| 164 | 
            +
            - lib/brakeman/checks/check_symbol_dos.rb
         | 
| 165 | 
            +
            - lib/brakeman/checks/check_sanitize_methods.rb
         | 
| 164 166 | 
             
            - lib/brakeman/checks/check_file_access.rb
         | 
| 165 167 | 
             
            - lib/brakeman/checks/base_check.rb
         | 
| 166 168 | 
             
            - lib/brakeman/checks/check_validation_regex.rb
         | 
| @@ -171,6 +173,7 @@ files: | |
| 171 173 | 
             
            - lib/brakeman/checks/check_json_parsing.rb
         | 
| 172 174 | 
             
            - lib/brakeman/checks/check_execute.rb
         | 
| 173 175 | 
             
            - lib/brakeman/checks/check_translate_bug.rb
         | 
| 176 | 
            +
            - lib/brakeman/checks/check_jruby_xml.rb
         | 
| 174 177 | 
             
            - lib/brakeman/checks/check_default_routes.rb
         | 
| 175 178 | 
             
            - lib/brakeman/checks/check_yaml_load.rb
         | 
| 176 179 | 
             
            - lib/brakeman/checks/check_link_to.rb
         |