提交 e62cf7e8 编写于 作者: J Justin

Merge pull request #327 from presidentbeef/add_method_for_input_type_output

Factor out dangerous input type in messages and normalize
...@@ -516,4 +516,23 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor ...@@ -516,4 +516,23 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
@active_record_models @active_record_models
end end
def friendly_type_of input_type
if input_type.is_a? Match
input_type = input_type.type
end
case input_type
when :params
"parameter value"
when :cookies
"cookie value"
when :request
"request value"
when :model
"model attribute"
else
"user input"
end
end
end end
...@@ -45,7 +45,7 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting ...@@ -45,7 +45,7 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting
call = result[:call] = result[:call].dup call = result[:call] = result[:call].dup
args = call.arglist args = call.arglist
tag_name = args[1] tag_name = args[1]
content = args[2] content = args[2]
...@@ -94,19 +94,12 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting ...@@ -94,19 +94,12 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting
end end
if input = has_immediate_user_input?(arg) if input = has_immediate_user_input?(arg)
case input.type message = "Unescaped #{friendly_type_of input} in content_tag"
when :params
message = "Unescaped parameter value in content_tag"
when :cookies
message = "Unescaped cookie value in content_tag"
else
message = "Unescaped user input value in content_tag"
end
add_result result add_result result
warn :result => result, warn :result => result,
:warning_type => "Cross Site Scripting", :warning_type => "Cross Site Scripting",
:warning_code => :xss_content_tag, :warning_code => :xss_content_tag,
:message => message, :message => message,
:user_input => input.match, :user_input => input.match,
...@@ -126,7 +119,7 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting ...@@ -126,7 +119,7 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting
end end
warn :result => result, warn :result => result,
:warning_type => "Cross Site Scripting", :warning_type => "Cross Site Scripting",
:warning_code => :xss_content_tag, :warning_code => :xss_content_tag,
:message => "Unescaped model attribute in content_tag", :message => "Unescaped model attribute in content_tag",
:user_input => match, :user_input => match,
...@@ -135,28 +128,14 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting ...@@ -135,28 +128,14 @@ class Brakeman::CheckContentTag < Brakeman::CheckCrossSiteScripting
end end
elsif @matched elsif @matched
message = "Unescaped " return if @matched.type == :model and tracker.options[:ignore_model_output]
case @matched.type
when :model
return if tracker.options[:ignore_model_output]
message << "model attribute"
when :params
message << "parameter"
when :cookies
message << "cookie"
when :session
message << "session"
else
message << "user input"
end
message << " value in content_tag" message = "Unescaped #{friendly_type_of @matched} in content_tag"
add_result result add_result result
warn :result => result, warn :result => result,
:warning_type => "Cross Site Scripting", :warning_type => "Cross Site Scripting",
:warning_code => :xss_content_tag, :warning_code => :xss_content_tag,
:message => message, :message => message,
:user_input => @matched.match, :user_input => @matched.match,
......
...@@ -104,16 +104,7 @@ class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck ...@@ -104,16 +104,7 @@ class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck
if input = has_immediate_user_input?(out) if input = has_immediate_user_input?(out)
add_result exp add_result exp
case input.type message = "Unescaped #{friendly_type_of input}"
when :params
message = "Unescaped parameter value"
when :cookies
message = "Unescaped cookie value"
when :request
message = "Unescaped request value"
else
message = "Unescaped user input value"
end
warn :template => @current_template, warn :template => @current_template,
:warning_type => "Cross Site Scripting", :warning_type => "Cross Site Scripting",
...@@ -194,15 +185,8 @@ class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck ...@@ -194,15 +185,8 @@ class Brakeman::CheckCrossSiteScripting < Brakeman::BaseCheck
message = nil message = nil
if @matched if @matched
case @matched.type unless @matched.type and tracker.options[:ignore_model_output]
when :model message = "Unescaped #{friendly_type_of @matched}"
unless tracker.options[:ignore_model_output]
message = "Unescaped model attribute"
end
when :params
message = "Unescaped parameter value"
when :cookies
message = "Unescaped cookie value"
end end
if message and not duplicate? exp if message and not duplicate? exp
......
...@@ -48,20 +48,7 @@ class Brakeman::CheckFileAccess < Brakeman::BaseCheck ...@@ -48,20 +48,7 @@ class Brakeman::CheckFileAccess < Brakeman::BaseCheck
end end
if match if match
case match.type message = "#{friendly_type_of(match).capitalize} used in file name"
when :params
message = "Parameter"
when :cookies
message = "Cookie"
when :request
message = "Request"
when :model
message = "Model attribute"
else
message = "User input"
end
message << " value used in file name"
warn :result => result, warn :result => result,
:warning_type => "File Access", :warning_type => "File Access",
......
...@@ -68,14 +68,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting ...@@ -68,14 +68,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
input = has_immediate_user_input?(argument) input = has_immediate_user_input?(argument)
return false unless input return false unless input
case input.type message = "Unescaped #{friendly_type_of input} in link_to"
when :params
message = "Unescaped parameter value in link_to"
when :cookies
message = "Unescaped cookie value in link_to"
else
message = "Unescaped user input value in link_to"
end
warn_xss(result, message, input.match, CONFIDENCE[:high]) warn_xss(result, message, input.match, CONFIDENCE[:high])
end end
...@@ -96,15 +89,11 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting ...@@ -96,15 +89,11 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
# Check if we should warn about the matched result # Check if we should warn about the matched result
def check_matched(result, matched = nil) def check_matched(result, matched = nil)
return false unless matched return false unless matched
message = nil return false if matched.type == :model and not tracker.options[:ignore_model_output]
if matched.type == :model and not tracker.options[:ignore_model_output] message = "Unescaped #{friendly_type_of matched} in link_to"
message = "Unescaped model attribute in link_to"
elsif matched.type == :params
message = "Unescaped parameter value in link_to"
end
message ? warn_xss(result, message, @matched.match, CONFIDENCE[:med]) : false warn_xss(result, message, @matched.match, CONFIDENCE[:med])
end end
# Create a warn for this xss # Create a warn for this xss
......
...@@ -42,14 +42,7 @@ class Brakeman::CheckLinkToHref < Brakeman::CheckLinkTo ...@@ -42,14 +42,7 @@ class Brakeman::CheckLinkToHref < Brakeman::CheckLinkTo
if input = has_immediate_user_input?(url_arg) if input = has_immediate_user_input?(url_arg)
case input.type message = "Unsafe #{friendly_type_of input} in link_to href"
when :params
message = "Unsafe parameter value in link_to href"
when :cookies
message = "Unsafe cookie value in link_to href"
else
message = "Unsafe user input value in link_to href"
end
unless duplicate? result unless duplicate? result
add_result result add_result result
......
...@@ -47,22 +47,9 @@ class Brakeman::CheckRender < Brakeman::BaseCheck ...@@ -47,22 +47,9 @@ class Brakeman::CheckRender < Brakeman::BaseCheck
return return
end end
message = "Render path contains " return if input.type == :model #skip models
case input.type
when :params
message << "parameter value"
when :cookies
message << "cookie value"
when :request
message << "request value"
when :model
#Skip models
return
else
message << "user input value"
end
message = "Render path contains #{friendly_type_of input}"
warn :result => result, warn :result => result,
:warning_type => "Dynamic Render Path", :warning_type => "Dynamic Render Path",
......
...@@ -52,20 +52,7 @@ class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck ...@@ -52,20 +52,7 @@ class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck
end end
if confidence if confidence
input_type = case input.type message = "Symbol conversion from unsafe string (#{friendly_type_of input})"
when :params
"parameter value"
when :cookies
"cookies value"
when :request
"request value"
when :model
"model attribute"
else
"user input"
end
message = "Symbol conversion from unsafe string (#{input_type})"
warn :result => result, warn :result => result,
:warning_type => "Denial of Service", :warning_type => "Denial of Service",
......
...@@ -38,20 +38,7 @@ class Brakeman::CheckUnsafeReflection < Brakeman::BaseCheck ...@@ -38,20 +38,7 @@ class Brakeman::CheckUnsafeReflection < Brakeman::BaseCheck
end end
if confidence if confidence
input_type = case input.type message = "Unsafe Reflection method #{method} called with #{friendly_type_of input}"
when :params
"parameter value"
when :cookies
"cookies value"
when :request
"request value"
when :model
"model attribute"
else
"user input"
end
message = "Unsafe Reflection method #{method} called with #{input_type}"
warn :result => result, warn :result => result,
:warning_type => "Remote Code Execution", :warning_type => "Remote Code Execution",
......
...@@ -28,20 +28,7 @@ class Brakeman::CheckYAMLLoad < Brakeman::BaseCheck ...@@ -28,20 +28,7 @@ class Brakeman::CheckYAMLLoad < Brakeman::BaseCheck
end end
if confidence if confidence
input_type = case input.type message = "YAML.#{method} called with #{friendly_type_of input}"
when :params
"parameter value"
when :cookies
"cookies value"
when :request
"request value"
when :model
"model attribute"
else
"user input"
end
message = "YAML.#{method} called with #{input_type}"
warn :result => result, warn :result => result,
:warning_type => "Remote Code Execution", :warning_type => "Remote Code Execution",
......
...@@ -1036,7 +1036,7 @@ class Rails3Tests < Test::Unit::TestCase ...@@ -1036,7 +1036,7 @@ class Rails3Tests < Test::Unit::TestCase
assert_warning :type => :warning, assert_warning :type => :warning,
:warning_type => "Remote Code Execution", :warning_type => "Remote Code Execution",
:line => 125, :line => 125,
:message => /^YAML\.load\ called\ with\ cookies\ value/, :message => /^YAML\.load\ called\ with\ cookie\ value/,
:confidence => 1, :confidence => 1,
:file => /home_controller\.rb/ :file => /home_controller\.rb/
end end
...@@ -1064,7 +1064,7 @@ class Rails3Tests < Test::Unit::TestCase ...@@ -1064,7 +1064,7 @@ class Rails3Tests < Test::Unit::TestCase
assert_warning :type => :warning, assert_warning :type => :warning,
:warning_type => "Remote Code Execution", :warning_type => "Remote Code Execution",
:line => 131, :line => 131,
:message => /^YAML\.load_stream\ called\ with\ cookies\ val/, :message => /^YAML\.load_stream\ called\ with\ cookie\ value/,
:confidence => 0, :confidence => 0,
:file => /home_controller\.rb/ :file => /home_controller\.rb/
end end
......
...@@ -718,7 +718,7 @@ class Rails31Tests < Test::Unit::TestCase ...@@ -718,7 +718,7 @@ class Rails31Tests < Test::Unit::TestCase
assert_warning :type => :warning, assert_warning :type => :warning,
:warning_type => "File Access", :warning_type => "File Access",
:line => 109, :line => 109,
:message => /^Model attribute\ value\ used\ in\ file\ name/, :message => /^Model attribute\ used\ in\ file\ name/,
:confidence => 1, :confidence => 1,
:file => /users_controller\.rb/ :file => /users_controller\.rb/
end end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册