如何处理 Brakeman 报告的 rails 应用程序中的命令注入
How to deal with the Command Injection in rails app reported by Brakeman
我在项目的某个库中有以下代码,它在 Sideqik Worker 上执行:
def self.generate_pdf(report)
file_name = report['r_file'].gsub('.ric', '')
path = "#{Rails.root}/report_files"
java_cmd = "./fileprint_linux.sh"
if %w(development test).include?(Rails.env)
command = "cd #{path}; sh #{java_cmd} silent #{report.r_file.path}"
else
temp = Tempfile.new("#{file_name}.tmp")
File.open(temp.path, 'wb') { |f| f.write(open(report.r_file.url).read) }
command = "cd #{path}; sh #{java_cmd} silent #{temp.path}"
end
stdin, stdout, stderr = Open3.popen3(command.shellescape)
if stderr.read.blank?
.......
end
end
当我在项目上 运行 Brakeman (3.2.1) 时,我收到以下安全警告:
Possible command injection near line 21: Open3.popen3(("cd #{"#{Rails.root}/report_files"}; sh #{"./fileprint_linux.sh"} silent #{report.r_file.path}" or "cd #{"#{Rails.root}/report_files"}; sh #{"./fileprint_linux.sh"} silent #{Tempfile.new("#{report["r_file"].gsub(".ric", "")}.tmp").path}"))
它突出了这部分,我猜这会导致警告:
report['r_file'].gsub('.ric', '')
警告还链接到此页面以获取有关警告的更多信息,但我没有找到处理它的方法:http://brakemanscanner.org/docs/warning_types/command_injection/
我试图通过查看其他 post 和页面找到解决此问题的方法,但没有成功,因此找到了这个 post。
我应该如何处理这种情况来修复 Brakeman 报告的这个潜在漏洞?
提前致谢!
@Gumbo 所有建议在每个参数上使用 shellescape 的功劳,解决上述警告的方法是在每个参数上使用 shellescape (Shellwords::shellescape):
"cd #{path.shellescape}; sh #{java_cmd.shellescape} silent #{report.r_file.path.shellescape}"
然后在调用popen3命令时,我们使用*%W运算符分别传递每个参数,方便地将命令字符串转换为数组:
stdin, stdout, stderr = Open3.popen3(*%W(command))
(使用 %w 而不是 *%W 也适用于这种情况)
这两个更改的组合解决了之前提到的 Brakeman 警告。只使用其中一个对我不起作用。
我在项目的某个库中有以下代码,它在 Sideqik Worker 上执行:
def self.generate_pdf(report)
file_name = report['r_file'].gsub('.ric', '')
path = "#{Rails.root}/report_files"
java_cmd = "./fileprint_linux.sh"
if %w(development test).include?(Rails.env)
command = "cd #{path}; sh #{java_cmd} silent #{report.r_file.path}"
else
temp = Tempfile.new("#{file_name}.tmp")
File.open(temp.path, 'wb') { |f| f.write(open(report.r_file.url).read) }
command = "cd #{path}; sh #{java_cmd} silent #{temp.path}"
end
stdin, stdout, stderr = Open3.popen3(command.shellescape)
if stderr.read.blank?
.......
end
end
当我在项目上 运行 Brakeman (3.2.1) 时,我收到以下安全警告:
Possible command injection near line 21: Open3.popen3(("cd #{"#{Rails.root}/report_files"}; sh #{"./fileprint_linux.sh"} silent #{report.r_file.path}" or "cd #{"#{Rails.root}/report_files"}; sh #{"./fileprint_linux.sh"} silent #{Tempfile.new("#{report["r_file"].gsub(".ric", "")}.tmp").path}"))
它突出了这部分,我猜这会导致警告:
report['r_file'].gsub('.ric', '')
警告还链接到此页面以获取有关警告的更多信息,但我没有找到处理它的方法:http://brakemanscanner.org/docs/warning_types/command_injection/
我试图通过查看其他 post 和页面找到解决此问题的方法,但没有成功,因此找到了这个 post。
我应该如何处理这种情况来修复 Brakeman 报告的这个潜在漏洞?
提前致谢!
@Gumbo 所有建议在每个参数上使用 shellescape 的功劳,解决上述警告的方法是在每个参数上使用 shellescape (Shellwords::shellescape):
"cd #{path.shellescape}; sh #{java_cmd.shellescape} silent #{report.r_file.path.shellescape}"
然后在调用popen3命令时,我们使用*%W运算符分别传递每个参数,方便地将命令字符串转换为数组:
stdin, stdout, stderr = Open3.popen3(*%W(command))
(使用 %w 而不是 *%W 也适用于这种情况)
这两个更改的组合解决了之前提到的 Brakeman 警告。只使用其中一个对我不起作用。