Sha256: c232892333c7ed3c4a44044a4512a30c94429803f349c200342b8eb81af26e52

Contents?: true

Size: 1.98 KB

Versions: 59

Compression:

Stored size: 1.98 KB

Contents

require 'brakeman/checks/base_check'

class Brakeman::CheckModelSerialize < Brakeman::BaseCheck
  Brakeman::Checks.add self

  @description = "Report uses of serialize in versions vulnerable to CVE-2013-0277"

  def run_check
    @upgrade_version = case
                      when version_between?("2.0.0", "2.3.16")
                        "2.3.17"
                      when version_between?("3.0.0", "3.0.99")
                        "3.2.11"
                      else
                        nil
                      end

    return unless @upgrade_version

    tracker.models.each do |name, model|
      check_for_serialize model
    end
  end

  #High confidence warning on serialized, unprotected attributes.
  #Medium confidence warning for serialized, protected attributes.
  def check_for_serialize model
    if serialized_attrs = model.options[:serialize]
      attrs = Set.new

      serialized_attrs.each do |arglist|
        arglist.each do |arg|
          attrs << arg if symbol? arg
        end
      end

      if unsafe_attrs = model.attr_accessible
        attrs.delete_if { |attr| not unsafe_attrs.include? attr.value }
      elsif protected_attrs = model.attr_protected
        safe_attrs = Set.new

        protected_attrs.each do |arglist|
          arglist.each do |arg|
            safe_attrs << arg if symbol? arg
          end
        end

        attrs.delete_if { |attr| safe_attrs.include? attr }
      end

      if attrs.empty?
        confidence = CONFIDENCE[:med]
      else
        confidence = CONFIDENCE[:high]
      end

      warn :model => model.name,
        :warning_type => "Remote Code Execution",
        :warning_code => :CVE_2013_0277,
        :message => "Serialized attributes are vulnerable in Rails #{rails_version}, upgrade to #{@upgrade_version} or patch.",
        :confidence => confidence,
        :link => "https://groups.google.com/d/topic/rubyonrails-security/KtmwSbEpzrU/discussion",
        :file => model.file,
        :line => model.top_line
    end
  end
end

Version data entries

59 entries across 59 versions & 3 rubygems

Version Path
brakeman-min-3.7.2 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.7.2 lib/brakeman/checks/check_model_serialize.rb
brakeman-3.7.2 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.7.1 lib/brakeman/checks/check_model_serialize.rb
brakeman-min-3.7.1 lib/brakeman/checks/check_model_serialize.rb
brakeman-3.7.1 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.7.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-min-3.7.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-3.7.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-min-3.6.2 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.6.2 lib/brakeman/checks/check_model_serialize.rb
brakeman-3.6.2 lib/brakeman/checks/check_model_serialize.rb
brakeman-3.6.1 lib/brakeman/checks/check_model_serialize.rb
brakeman-min-3.6.1 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.6.1 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.6.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-min-3.6.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-3.6.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-min-3.5.0 lib/brakeman/checks/check_model_serialize.rb
brakeman-lib-3.5.0 lib/brakeman/checks/check_model_serialize.rb