如何处理 Brakeman 报告的 rails 应用程序中的命令注入



我的项目上的某个库上有以下代码,该库在 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/

我试图找到一个解决方案,看看其他帖子和页面,但没有运气,因此这篇文章。

我应该如何处理这种情况来修复 Brakeman 报告的这个潜在漏洞?

提前感谢!

所有功劳都归功于建议在每个参数上使用shellescape的@Gumbo,修复上述警告的方法是在每个参数上使用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 也有效)

这两个变化的结合解决了之前提到的刹车员警告。只使用其中一个对我不起作用。

相关内容

  • 没有找到相关文章

最新更新