Sha256: 236ec52dee37430c8d97b8ab712494c22e123f7603fd2f64dc9aa70e63205804

Contents?: true

Size: 1.63 KB

Versions: 2

Compression:

Stored size: 1.63 KB

Contents

require 'brakeman/checks/base_check'

# Author: Paul Deardorff (themetric) 
# Checks models to see if important foreign keys 
# or attributes are exposed as attr_accessible when 
# they probably shouldn't be. 

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

  @description = "Reports models which have dangerous attributes defined under the attr_accessible whitelist."

  SUSP_ATTRS = {
    /admin/ => CONFIDENCE[:high], # Very dangerous unless some Rails authorization used 
    /role/ => CONFIDENCE[:med],   
    /banned/ => CONFIDENCE[:med], 
    :account_id => CONFIDENCE[:high], 
    /\S*_id(s?)\z/ => CONFIDENCE[:low] # All other foreign keys have weak/low confidence 
  }

  def run_check
    check_models do |name, model|
      accessible_attrs = model[:attr_accessible]
      accessible_attrs.each do |attribute|
        SUSP_ATTRS.each do |susp_attr, confidence|
            if susp_attr.is_a?(Regexp) and susp_attr =~ attribute.to_s or susp_attr == attribute 
              warn :model => name,    
                :file => model[:file],                          
                :warning_type => "Mass Assignment", 
                :warning_code => :mass_assign_call,
                :message => "Potentially dangerous attribute #{attribute} available for mass assignment.", 
                :confidence => confidence 
              break # Prevent from matching single attr multiple times
            end 
        end         
      end 
    end
  end

  def check_models
    tracker.models.each do |name, model|
      if !model[:attr_accessible].nil?
        yield name, model
      end
    end
  end
 
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
brakeman-min-2.1.0 lib/brakeman/checks/check_model_attr_accessible.rb
brakeman-2.1.0 lib/brakeman/checks/check_model_attr_accessible.rb