Class: Brakeman::CheckUnsafeReflection
- Inherits:
-
BaseCheck
- Object
- SexpProcessor
- BaseCheck
- Brakeman::CheckUnsafeReflection
- Defined in:
- lib/brakeman/checks/check_unsafe_reflection.rb
Overview
Checks for string interpolation and parameters in calls to String#constantize, String#safe_constantize, Module#const_get and Module#qualified_const_get.
Exploit examples at: blog.conviso.com.br/exploiting-unsafe-reflection-in-rubyrails-applications/
Constant Summary
Constants inherited from BaseCheck
Constants included from Util
Util::ALL_COOKIES, Util::ALL_PARAMETERS, Util::COOKIES, Util::COOKIES_SEXP, Util::DIR_CONST, Util::LITERALS, Util::PARAMETERS, Util::PARAMS_SEXP, Util::PATH_PARAMETERS, Util::QUERY_PARAMETERS, Util::REQUEST_COOKIES, Util::REQUEST_ENV, Util::REQUEST_PARAMETERS, Util::REQUEST_PARAMS, Util::REQUEST_REQUEST_PARAMETERS, Util::SAFE_LITERAL, Util::SESSION, Util::SESSION_SEXP, Util::SIMPLE_LITERALS
Constants inherited from SexpProcessor
Instance Attribute Summary
Attributes inherited from BaseCheck
Attributes inherited from SexpProcessor
Instance Method Summary collapse
Methods inherited from BaseCheck
#add_result, inherited, #initialize, #process_array, #process_call, #process_cookies, #process_default, #process_dstr, #process_if, #process_params
Methods included from Messages
#msg, #msg_code, #msg_cve, #msg_file, #msg_input, #msg_lit, #msg_plain, #msg_version
Methods included from Util
#all_literals?, #array?, #block?, #call?, #camelize, #class_name, #constant?, #contains_class?, #cookies?, #dir_glob?, #false?, #hash?, #hash_access, #hash_insert, #hash_iterate, #hash_values, #integer?, #kwsplat?, #literal?, #make_call, #node_type?, #number?, #params?, #pluralize, #rails_version, #recurse_check?, #regexp?, #remove_kwsplat, #request_headers?, #request_value?, #result?, #safe_literal, #safe_literal?, #safe_literal_target?, #set_env_defaults, #sexp?, #simple_literal?, #string?, #string_interp?, #symbol?, #template_path_to_name, #true?, #underscore
Methods included from ProcessorHelper
#current_file, #process_all, #process_all!, #process_call_args, #process_call_defn?, #process_class, #process_module
Methods inherited from SexpProcessor
#in_context, #initialize, #process, processors, #scope
Constructor Details
This class inherits a constructor from Brakeman::BaseCheck
Instance Method Details
#check_unsafe_reflection(result) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/brakeman/checks/check_unsafe_reflection.rb', line 20 def check_unsafe_reflection result return unless original? result call = result[:call] method = call.method case method when :constantize, :safe_constantize arg = call.target else arg = call.first_arg end if input = has_immediate_user_input?(arg) confidence = :high elsif input = include_user_input?(arg) confidence = :medium end if confidence case method when :constantize, :safe_constantize = msg("Unsafe reflection method ", msg_code(method), " called on ", msg_input(input)) else = msg("Unsafe reflection method ", msg_code(method), " called with ", msg_input(input)) end warn :result => result, :warning_type => "Remote Code Execution", :warning_code => :unsafe_constantize, :message => , :user_input => input, :confidence => confidence, :cwe_id => [470] end end |
#run_check ⇒ Object
12 13 14 15 16 17 18 |
# File 'lib/brakeman/checks/check_unsafe_reflection.rb', line 12 def run_check reflection_methods = [:constantize, :safe_constantize, :const_get, :qualified_const_get] tracker.find_call(:methods => reflection_methods, :nested => true).each do |result| check_unsafe_reflection result end end |