1

私のプロジェクトのいくつかのライブラリに次のコードがあり、これは 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 によって報告されたこの潜在的な脆弱性を修正するには、この状況にどのように対処すればよいですか?

前もって感謝します!

4

1 に答える 1

2

All credit given to @Gumbo that suggested the use of shellescape on each parameter, the way to fix the warning explained above is to use shellescape (Shellwords::shellescape) on each argument:

"cd #{path.shellescape}; sh #{java_cmd.shellescape} silent #{report.r_file.path.shellescape}" 

And then when calling the popen3 command, we pass each parameter separately using the *%W operator to easily convert the command string into an array:

stdin, stdout, stderr = Open3.popen3(*%W(command))

(using %w instead of *%W also works in this case)

The combination of both changes solves the Brakeman warning mention before. Using just one of them didn't work for me.

于 2016-03-03T22:50:54.957 に答える