2016-03-03 3 views
0

У меня есть следующий код на какую-то библиотеку на мой проект, который выполняется на Sideqik Worker:Как бороться с Injection Command в рельсах приложение сообщенных кондуктор

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 

И когда я бегу кондуктор (3,2 0,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}")) 

И highligths этой части, я думаю вызывает предупреждение:

report['r_file'].gsub('.ric', '') 

Предупреждения также ссылки на эту страницу для получения дополнительной информации о предупреждении, но я не нашел способ борьбы с ним: http://brakemanscanner.org/docs/warning_types/command_injection/

Я пытался найти решение этой проблемы, глядя на другую должность и страницах, но без везения, отсюда этот пост.

Как я могу справиться с этой ситуацией, чтобы исправить эту потенциальную уязвимость, о которой сообщает Brakeman?

Заранее благодарен!

+1

Используйте [Shellwords :: shellescape] (http://ruby-doc.org/stdlib-2.0.0/libdoc/shellwords/rdoc/Shellwords.html#method-c-shellescape). – Gumbo

+0

Да, я пробовал это, но предупреждение остается. Я отредактирую, чтобы добавить это в код, так как вопрос остается. Спасибо за предложение. – Marco

+1

Вам нужно использовать его для каждого аргумента: '' cd # {path.shellescape}; sh # {java_cmd.shellescape} silent # {report.r_file.path.shellescape} "или просто передать аргументы отдельно:' Open3.popen3 («sh», java_cmd, «silent», report.r_file.path,: chdir => path) ' – Gumbo

ответ

0

Все кредиты дано @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 также работает в данном случае)

Комбинация обоих изменений решает предупреждающее упоминание Brakeman. Использование только одного из них не сработало для меня.