railroader 4.3.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 +7 -0
- data/CHANGES.md +1091 -0
- data/FEATURES +16 -0
- data/README.md +174 -0
- data/bin/railroader +8 -0
- data/lib/railroader/app_tree.rb +191 -0
- data/lib/railroader/call_index.rb +219 -0
- data/lib/railroader/checks/base_check.rb +505 -0
- data/lib/railroader/checks/check_basic_auth.rb +88 -0
- data/lib/railroader/checks/check_basic_auth_timing_attack.rb +33 -0
- data/lib/railroader/checks/check_content_tag.rb +200 -0
- data/lib/railroader/checks/check_create_with.rb +74 -0
- data/lib/railroader/checks/check_cross_site_scripting.rb +381 -0
- data/lib/railroader/checks/check_default_routes.rb +86 -0
- data/lib/railroader/checks/check_deserialize.rb +56 -0
- data/lib/railroader/checks/check_detailed_exceptions.rb +55 -0
- data/lib/railroader/checks/check_digest_dos.rb +38 -0
- data/lib/railroader/checks/check_divide_by_zero.rb +42 -0
- data/lib/railroader/checks/check_dynamic_finders.rb +48 -0
- data/lib/railroader/checks/check_escape_function.rb +21 -0
- data/lib/railroader/checks/check_evaluation.rb +35 -0
- data/lib/railroader/checks/check_execute.rb +189 -0
- data/lib/railroader/checks/check_file_access.rb +71 -0
- data/lib/railroader/checks/check_file_disclosure.rb +35 -0
- data/lib/railroader/checks/check_filter_skipping.rb +31 -0
- data/lib/railroader/checks/check_forgery_setting.rb +81 -0
- data/lib/railroader/checks/check_header_dos.rb +31 -0
- data/lib/railroader/checks/check_i18n_xss.rb +48 -0
- data/lib/railroader/checks/check_jruby_xml.rb +36 -0
- data/lib/railroader/checks/check_json_encoding.rb +47 -0
- data/lib/railroader/checks/check_json_parsing.rb +107 -0
- data/lib/railroader/checks/check_link_to.rb +132 -0
- data/lib/railroader/checks/check_link_to_href.rb +146 -0
- data/lib/railroader/checks/check_mail_to.rb +49 -0
- data/lib/railroader/checks/check_mass_assignment.rb +196 -0
- data/lib/railroader/checks/check_mime_type_dos.rb +39 -0
- data/lib/railroader/checks/check_model_attr_accessible.rb +55 -0
- data/lib/railroader/checks/check_model_attributes.rb +119 -0
- data/lib/railroader/checks/check_model_serialize.rb +67 -0
- data/lib/railroader/checks/check_nested_attributes.rb +38 -0
- data/lib/railroader/checks/check_nested_attributes_bypass.rb +58 -0
- data/lib/railroader/checks/check_number_to_currency.rb +74 -0
- data/lib/railroader/checks/check_permit_attributes.rb +43 -0
- data/lib/railroader/checks/check_quote_table_name.rb +40 -0
- data/lib/railroader/checks/check_redirect.rb +256 -0
- data/lib/railroader/checks/check_regex_dos.rb +68 -0
- data/lib/railroader/checks/check_render.rb +97 -0
- data/lib/railroader/checks/check_render_dos.rb +37 -0
- data/lib/railroader/checks/check_render_inline.rb +53 -0
- data/lib/railroader/checks/check_response_splitting.rb +21 -0
- data/lib/railroader/checks/check_route_dos.rb +42 -0
- data/lib/railroader/checks/check_safe_buffer_manipulation.rb +31 -0
- data/lib/railroader/checks/check_sanitize_methods.rb +112 -0
- data/lib/railroader/checks/check_secrets.rb +40 -0
- data/lib/railroader/checks/check_select_tag.rb +59 -0
- data/lib/railroader/checks/check_select_vulnerability.rb +60 -0
- data/lib/railroader/checks/check_send.rb +47 -0
- data/lib/railroader/checks/check_send_file.rb +19 -0
- data/lib/railroader/checks/check_session_manipulation.rb +35 -0
- data/lib/railroader/checks/check_session_settings.rb +176 -0
- data/lib/railroader/checks/check_simple_format.rb +58 -0
- data/lib/railroader/checks/check_single_quotes.rb +101 -0
- data/lib/railroader/checks/check_skip_before_filter.rb +60 -0
- data/lib/railroader/checks/check_sql.rb +700 -0
- data/lib/railroader/checks/check_sql_cves.rb +106 -0
- data/lib/railroader/checks/check_ssl_verify.rb +48 -0
- data/lib/railroader/checks/check_strip_tags.rb +89 -0
- data/lib/railroader/checks/check_symbol_dos.rb +71 -0
- data/lib/railroader/checks/check_symbol_dos_cve.rb +30 -0
- data/lib/railroader/checks/check_translate_bug.rb +45 -0
- data/lib/railroader/checks/check_unsafe_reflection.rb +50 -0
- data/lib/railroader/checks/check_unscoped_find.rb +57 -0
- data/lib/railroader/checks/check_validation_regex.rb +116 -0
- data/lib/railroader/checks/check_weak_hash.rb +148 -0
- data/lib/railroader/checks/check_without_protection.rb +80 -0
- data/lib/railroader/checks/check_xml_dos.rb +45 -0
- data/lib/railroader/checks/check_yaml_parsing.rb +121 -0
- data/lib/railroader/checks.rb +209 -0
- data/lib/railroader/codeclimate/engine_configuration.rb +97 -0
- data/lib/railroader/commandline.rb +179 -0
- data/lib/railroader/differ.rb +66 -0
- data/lib/railroader/file_parser.rb +54 -0
- data/lib/railroader/format/style.css +133 -0
- data/lib/railroader/options.rb +339 -0
- data/lib/railroader/parsers/rails2_erubis.rb +6 -0
- data/lib/railroader/parsers/rails2_xss_plugin_erubis.rb +48 -0
- data/lib/railroader/parsers/rails3_erubis.rb +81 -0
- data/lib/railroader/parsers/template_parser.rb +108 -0
- data/lib/railroader/processor.rb +102 -0
- data/lib/railroader/processors/alias_processor.rb +1229 -0
- data/lib/railroader/processors/base_processor.rb +295 -0
- data/lib/railroader/processors/config_processor.rb +14 -0
- data/lib/railroader/processors/controller_alias_processor.rb +278 -0
- data/lib/railroader/processors/controller_processor.rb +249 -0
- data/lib/railroader/processors/erb_template_processor.rb +77 -0
- data/lib/railroader/processors/erubis_template_processor.rb +92 -0
- data/lib/railroader/processors/gem_processor.rb +64 -0
- data/lib/railroader/processors/haml_template_processor.rb +191 -0
- data/lib/railroader/processors/lib/basic_processor.rb +37 -0
- data/lib/railroader/processors/lib/call_conversion_helper.rb +90 -0
- data/lib/railroader/processors/lib/find_all_calls.rb +224 -0
- data/lib/railroader/processors/lib/find_call.rb +183 -0
- data/lib/railroader/processors/lib/find_return_value.rb +166 -0
- data/lib/railroader/processors/lib/module_helper.rb +111 -0
- data/lib/railroader/processors/lib/processor_helper.rb +88 -0
- data/lib/railroader/processors/lib/rails2_config_processor.rb +145 -0
- data/lib/railroader/processors/lib/rails2_route_processor.rb +313 -0
- data/lib/railroader/processors/lib/rails3_config_processor.rb +132 -0
- data/lib/railroader/processors/lib/rails3_route_processor.rb +308 -0
- data/lib/railroader/processors/lib/render_helper.rb +181 -0
- data/lib/railroader/processors/lib/render_path.rb +107 -0
- data/lib/railroader/processors/lib/route_helper.rb +68 -0
- data/lib/railroader/processors/lib/safe_call_helper.rb +16 -0
- data/lib/railroader/processors/library_processor.rb +74 -0
- data/lib/railroader/processors/model_processor.rb +91 -0
- data/lib/railroader/processors/output_processor.rb +144 -0
- data/lib/railroader/processors/route_processor.rb +17 -0
- data/lib/railroader/processors/slim_template_processor.rb +111 -0
- data/lib/railroader/processors/template_alias_processor.rb +118 -0
- data/lib/railroader/processors/template_processor.rb +85 -0
- data/lib/railroader/report/config/remediation.yml +71 -0
- data/lib/railroader/report/ignore/config.rb +153 -0
- data/lib/railroader/report/ignore/interactive.rb +362 -0
- data/lib/railroader/report/pager.rb +112 -0
- data/lib/railroader/report/renderer.rb +24 -0
- data/lib/railroader/report/report_base.rb +292 -0
- data/lib/railroader/report/report_codeclimate.rb +79 -0
- data/lib/railroader/report/report_csv.rb +55 -0
- data/lib/railroader/report/report_hash.rb +23 -0
- data/lib/railroader/report/report_html.rb +216 -0
- data/lib/railroader/report/report_json.rb +45 -0
- data/lib/railroader/report/report_markdown.rb +107 -0
- data/lib/railroader/report/report_table.rb +117 -0
- data/lib/railroader/report/report_tabs.rb +17 -0
- data/lib/railroader/report/report_text.rb +198 -0
- data/lib/railroader/report/templates/controller_overview.html.erb +22 -0
- data/lib/railroader/report/templates/controller_warnings.html.erb +21 -0
- data/lib/railroader/report/templates/error_overview.html.erb +29 -0
- data/lib/railroader/report/templates/header.html.erb +58 -0
- data/lib/railroader/report/templates/ignored_warnings.html.erb +25 -0
- data/lib/railroader/report/templates/model_warnings.html.erb +21 -0
- data/lib/railroader/report/templates/overview.html.erb +38 -0
- data/lib/railroader/report/templates/security_warnings.html.erb +23 -0
- data/lib/railroader/report/templates/template_overview.html.erb +21 -0
- data/lib/railroader/report/templates/view_warnings.html.erb +34 -0
- data/lib/railroader/report/templates/warning_overview.html.erb +17 -0
- data/lib/railroader/report.rb +88 -0
- data/lib/railroader/rescanner.rb +483 -0
- data/lib/railroader/scanner.rb +321 -0
- data/lib/railroader/tracker/collection.rb +93 -0
- data/lib/railroader/tracker/config.rb +154 -0
- data/lib/railroader/tracker/constants.rb +171 -0
- data/lib/railroader/tracker/controller.rb +161 -0
- data/lib/railroader/tracker/library.rb +17 -0
- data/lib/railroader/tracker/model.rb +90 -0
- data/lib/railroader/tracker/template.rb +33 -0
- data/lib/railroader/tracker.rb +362 -0
- data/lib/railroader/util.rb +503 -0
- data/lib/railroader/version.rb +3 -0
- data/lib/railroader/warning.rb +294 -0
- data/lib/railroader/warning_codes.rb +117 -0
- data/lib/railroader.rb +544 -0
- data/lib/ruby_parser/bm_sexp.rb +626 -0
- data/lib/ruby_parser/bm_sexp_processor.rb +116 -0
- metadata +386 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
require 'railroader/checks/base_check'
|
|
2
|
+
|
|
3
|
+
#Checks for versions which do not escape single quotes.
|
|
4
|
+
#https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion
|
|
5
|
+
class Railroader::CheckSingleQuotes < Railroader::BaseCheck
|
|
6
|
+
Railroader::Checks.add self
|
|
7
|
+
RACK_UTILS = Sexp.new(:colon2, Sexp.new(:const, :Rack), :Utils)
|
|
8
|
+
|
|
9
|
+
@description = "Check for versions which do not escape single quotes (CVE-2012-3464)"
|
|
10
|
+
|
|
11
|
+
def initialize *args
|
|
12
|
+
super
|
|
13
|
+
@inside_erb = @inside_util = @inside_html_escape = @uses_rack_escape = false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def run_check
|
|
17
|
+
return if uses_rack_escape?
|
|
18
|
+
|
|
19
|
+
case
|
|
20
|
+
when version_between?('2.0.0', '2.3.14')
|
|
21
|
+
message = "All Rails 2.x versions do not escape single quotes (CVE-2012-3464)"
|
|
22
|
+
when version_between?('3.0.0', '3.0.16')
|
|
23
|
+
message = "Rails #{rails_version} does not escape single quotes (CVE-2012-3464). Upgrade to 3.0.17"
|
|
24
|
+
when version_between?('3.1.0', '3.1.7')
|
|
25
|
+
message = "Rails #{rails_version} does not escape single quotes (CVE-2012-3464). Upgrade to 3.1.8"
|
|
26
|
+
when version_between?('3.2.0', '3.2.7')
|
|
27
|
+
message = "Rails #{rails_version} does not escape single quotes (CVE-2012-3464). Upgrade to 3.2.8"
|
|
28
|
+
else
|
|
29
|
+
return
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
warn :warning_type => "Cross-Site Scripting",
|
|
33
|
+
:warning_code => :CVE_2012_3464,
|
|
34
|
+
:message => message,
|
|
35
|
+
:confidence => :medium,
|
|
36
|
+
:gem_info => gemfile_or_environment,
|
|
37
|
+
:link_path => "https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
#Process initializers to see if they use workaround
|
|
41
|
+
#by replacing Erb::Util.html_escape
|
|
42
|
+
def uses_rack_escape?
|
|
43
|
+
@tracker.initializers.each do |_name, src|
|
|
44
|
+
process src
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
@uses_rack_escape
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#Look for
|
|
51
|
+
#
|
|
52
|
+
# class ERB
|
|
53
|
+
def process_class exp
|
|
54
|
+
if exp.class_name == :ERB
|
|
55
|
+
@inside_erb = true
|
|
56
|
+
process_all exp.body
|
|
57
|
+
@inside_erb = false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
exp
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#Look for
|
|
64
|
+
#
|
|
65
|
+
# module Util
|
|
66
|
+
def process_module exp
|
|
67
|
+
if @inside_erb and exp.module_name == :Util
|
|
68
|
+
@inside_util = true
|
|
69
|
+
process_all exp.body
|
|
70
|
+
@inside_util = false
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
exp
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#Look for
|
|
77
|
+
#
|
|
78
|
+
# def html_escape
|
|
79
|
+
def process_defn exp
|
|
80
|
+
if @inside_util and exp.method_name == :html_escape
|
|
81
|
+
@inside_html_escape = true
|
|
82
|
+
process_all exp.body
|
|
83
|
+
@inside_html_escape = false
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
exp
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
#Look for
|
|
90
|
+
#
|
|
91
|
+
# Rack::Utils.escape_html
|
|
92
|
+
def process_call exp
|
|
93
|
+
if @inside_html_escape and exp.target == RACK_UTILS and exp.method == :escape_html
|
|
94
|
+
@uses_rack_escape = true
|
|
95
|
+
else
|
|
96
|
+
process exp.target if exp.target
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
exp
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'railroader/checks/base_check'
|
|
2
|
+
|
|
3
|
+
#At the moment, this looks for
|
|
4
|
+
#
|
|
5
|
+
# skip_before_filter :verify_authenticity_token, :except => [...]
|
|
6
|
+
#
|
|
7
|
+
#which is essentially a blacklist approach (no actions are checked EXCEPT the
|
|
8
|
+
#ones listed) versus a whitelist approach (ONLY the actions listed will skip
|
|
9
|
+
#the check)
|
|
10
|
+
class Railroader::CheckSkipBeforeFilter < Railroader::BaseCheck
|
|
11
|
+
Railroader::Checks.add self
|
|
12
|
+
|
|
13
|
+
@description = "Warn when skipping CSRF or authentication checks by default"
|
|
14
|
+
|
|
15
|
+
def run_check
|
|
16
|
+
tracker.controllers.each do |_name, controller|
|
|
17
|
+
controller.skip_filters.each do |filter|
|
|
18
|
+
process_skip_filter filter, controller
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def process_skip_filter filter, controller
|
|
24
|
+
case skip_except_value filter
|
|
25
|
+
when :verify_authenticity_token
|
|
26
|
+
warn :class => controller.name, #ugh this should be a controller warning, too
|
|
27
|
+
:warning_type => "Cross-Site Request Forgery",
|
|
28
|
+
:warning_code => :csrf_blacklist,
|
|
29
|
+
:message => "Use whitelist (:only => [..]) when skipping CSRF check",
|
|
30
|
+
:code => filter,
|
|
31
|
+
:confidence => :medium,
|
|
32
|
+
:file => controller.file
|
|
33
|
+
|
|
34
|
+
when :login_required, :authenticate_user!, :require_user
|
|
35
|
+
warn :controller => controller.name,
|
|
36
|
+
:warning_code => :auth_blacklist,
|
|
37
|
+
:warning_type => "Authentication",
|
|
38
|
+
:message => "Use whitelist (:only => [..]) when skipping authentication",
|
|
39
|
+
:code => filter,
|
|
40
|
+
:confidence => :medium,
|
|
41
|
+
:link => "authentication_whitelist",
|
|
42
|
+
:file => controller.file
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def skip_except_value filter
|
|
47
|
+
return false unless call? filter
|
|
48
|
+
|
|
49
|
+
first_arg = filter.first_arg
|
|
50
|
+
last_arg = filter.last_arg
|
|
51
|
+
|
|
52
|
+
if symbol? first_arg and hash? last_arg
|
|
53
|
+
if hash_access(last_arg, :except)
|
|
54
|
+
return first_arg.value
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
false
|
|
59
|
+
end
|
|
60
|
+
end
|